Mybatis映射关系
目录
多对一
方式一:一条sql语句(级连属性映射)
方式二:一条sql语句(association)
方式三:两条sql语句,分步查询
一对多
方式一:collection
方式二:分步查询
多对一、一对多,谁在前,谁就是主表
注意:
班级类如果有学生类private List<Student> stus;
测试时会报错(栈溢出),toString方法反复调用
双向映射不要用toString,使用get方法@Test public void m1() { User user = userMapper.getUserById(1); System.out.println(user.getId() + " " + user.getName()); List<Pet> pets = user.getPets(); for (Pet pet : pets) { System.out.println(pet.getId() + pet.getNickname()); } }
多对一
三种方式:
第一种方式:一条SQL语句,级联属性映射。
第二种方式:一条SQL语句,association:关联对象
第三种方式:两条SQL语句,分步查询。优点:可复用、支持懒加载(用到的时候再执行查询语句)
多个学生对应一个班级
方式一:一条sql语句(级连属性映射)
public interface StudentMapper {
Student selectById(Integer id);
}
把主表的每个字段指定一下,对象属性通过(对象名.属性名)来指定
<resultMap id="stuResultMap" type="Student">
<id property="sid" column="sid"/>
<result property="sname" column="sname"/>
<result property="clazz.cid" column="cid"/>
<result property="clazz.cname" column="cname"/>
</resultMap>
<select id="selectById" resultMap="stuResultMap">
select
s.sid,s.sname,s.cid,c.cname
from
t_stu s left join t_clazz c
on
s.cid=c.cid
where
s.sid = #{sid}
</select>
方式二:一条sql语句(association)
<resultMap id="stuResultMapAssociation" type="student">
<id property="sid" column="sid"/>
<result property="sname" column="sname"/>
<association property="clazz" javaType="Clazz">
<id property="cid" column="cid"/>
<result property="cname" column="cname"/>
</association>
</resultMap>
<select id="selectById" resultMap="stuResultMapAssociation">
select
s.sid,s.sname,s.cid,c.cname
from
t_stu s left join t_clazz c on s.cid=c.cid
where
s.sid = #{sid}
</select>
方式三:两条sql语句,分步查询
public interface StudentMapper {
Student selectByIdStep1(Integer id);
}
public interface ClazzMapper {
Clazz selectByIdStep2(Integer id);
}
局部懒加载
一般在mybatis-config.xml中设置:全局懒加载,不想要再局部关闭
<settings>
<!--开启全局延迟加载-->
<setting name="lazyLoadingEnabled" value="true"/>
</settings>
一对多
两种方式:
第一种方式:collection
第二种方式:分步查询
一个班级对应多个学生
方式一:collection
public interface ClazzMapper {
Clazz selectClazzAndStusByCid(Integer cid);
}
ofType:指定集合中元素的类型
<resultMap id="clazzResultMap" type="Clazz">
<id property="cid" column="cid"/>
<result property="cname" column="cname"/>
<collection property="stus" ofType="Student">
<id property="sid" column="sid"/>
<result property="sname" column="sname"/>
</collection>
</resultMap>
<select id="selectClazzAndStusByCid" resultMap="clazzResultMap">
select * from t_clazz c join t_student s on c.cid = s.cid where c.cid = #{cid}
</select>
方式二:分步查询
public interface ClazzMapper {
Clazz selectByIdStep1(Integer id);
}
public interface StudentMapper {
List<Student> selectByCidStep2(Integer cid);
}