4.2 实体类设计
4.3mapper.xml 代码
<resultMap type="teacher" id="mymap">
<id column="id" property="id1" />
<result column="name" property="name1"/>
resultMap>
<select id="selAll" resultMap="mymap"> select * from teacher select>
5. 使用 resultMap 实现关联单个对象(N+1 方式)
5.1N+1 查询方式,先查询出某个表的全部信息,根据这个表的信息
查询另一个表的信息.
5.2 与业务装配的区别:
5.3.1 在 service 里面写的代码,由 mybatis 完成装配
5.3 实现步骤:
5.3.1 在 Student 实现类中包含了一个 Teacher 对象
public class Student {
private int id;
private String name;
private int age;
private int tid;
private Teacher teacher;
}
5.3.2 在 TeacherMapper 中提供一个查询
<select id="selById" resultType="teacher" parameterType="int"> select * from teacher where id=#{0} select>
5.3.3 在 StudentMapper 中
5.3.3.1
5.3.3.2property: 对象在类中的属性名
5.3.3.3select:通过哪个查询查询出这个对象的信息
5.3.3.4column: 把当前表的哪个列的值做为参数传递给另
一个查询
5.3.3.5 大前提使用 N+1 方式.时如果列名和属性名相同可
以不配置,使用 Automapping 特性.但是 mybatis 默认只会给列
专配一次
<resultMap type="student" id="stuMap">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
<result property="tid" column="tid"/>
<association property="teacher" select="com.bjsxt.mapper.TeacherMapper.selById" column="tid">
association>
resultMap>
<select id="selAll" resultMap="stuMap"> select * from student select>
5.3.3.6 把上面代码简化成
<resultMap type="student" id="stuMap">
<result column="tid" property="tid"/>
<association property="teacher" select="com.bjsxt.mapper.TeacherMapper.selById" column="tid">
association>
resultMap>
<select id="selAll" resultMap="stuMap"> select * from student select>
6. 使用 resultMap 实现关联单个对象(联合查询方式)
6.1 只需要编写一个 SQL,在 StudentMapper 中添加下面效果
6.1.1
6.1.2 此时把
6.1.3javaType 属性:
的对象.取值是一个类(或类的别名)
<resultMap type="Student" id="stuMap1">
<id column="sid" property="id"/>
<result column="sname" property="name"/>
<result column="age" property="age"/>
<result column="tid" property="tid"/>
<association property="teacher"javaType="Teacher" >
<id column="tid" property="id"/>
<result column="tname" property="name"/>
association> resultMap>
<select id="selAll1" resultMap="stuMap1"> select s.id sid,s.name sname,age age,t.id tid,t.name tname FROM student s left outer join teacher t on s.tid=t.id select>
7. N+1 方式和联合查询方式对比
7.1N+1:需求不确定时.
7.2 联合查询:需求中确定查询时两个表一定都查询.
7. N+1 名称由来
7.1 举例:学生中有 3 条数据
7.2 需求:查询所有学生信息级授课老师信息
7.3 需要执行的 SQL 命令
7.3.1 查询全部学生信息:select*from 学生
7.3.2 执行 3 遍 select*from 老师 whereid=学生的外键
7.4 使用多条 SQl 命令查询两表数据时,如果希望把需要的数据都
查询出来,需要执行 N+1 条 SQl 才能把所有数据库查询出来.
7.5 缺点:
7.5.1 效率低
7.6 优点:
7.6.1 如果有的时候不需要查询学生是同时查询老师.只需要
执行一个 select*fromstudent;
7.7 适用场景: 有的时候需要查询学生同时查询老师,有的时候只
需要查询学生.
7.8 如果解决 N+1 查询带来的效率低的问题
7.8.1 默认带的前提: 每次都是两个都查询.
7.8.2 使用两表联合查询.
使用
public class Teacher {
private int id;
private String name;
private List<Student> list;
}
<select id="selByTid" parameterType="int" resultType="student"> select * from student where tid=#{0} select>
3. 在 TeacherMapper.xml 中添加查询全部
3.1
<resultMap type="teacher" id="mymap">
<id column="id" property="id"/>
<result column="name" property="name"/>
<collection property="list" select="com.bjsxt.mapper.StudentMapper.selByTid" column="id">
collection>
resultMap>
<select id="selAll" resultMap="mymap"> select * from teacher select>
使用
1.在 teacherMapper.xml 中添加
1.1mybatis 可以通过主键判断对象是否被加载过.
1.2 不需要担心创建重复 Teacher
<resultMap type="teacher" id="mymap1">
<id column="tid" property="id"/>
<result column="tname" property="name"/>
<collection property="list" ofType="student" >
<id column="sid" property="id"/>
<result column="sname" property="name"/>
<result column="age" property="age"/>
<result column="tid" property="tid"/>
collection>
resultMap>
<select id="selAll1" resultMap="mymap1"> select t.id tid,t.name tname,s.id sid,s.name sname,age,tid from teacher t LEFT JOIN student s on t.id=s.tid; select>
使用 AutoMapping 结合别名实现多表查 询
5.1 只能使用多表联合查询方式.
5.2 要求:查询出的列别和属性名相同.
5.3 实现方式
5.3.1.在 SQL 是关键字符,两侧添加反单引号.
<select id="selAll" resultType="student">select t.id `teacher.id`,t.name `teacher.name`,s.id id,s.name name,age,tid from student s LEFT JOIN teacher t on t.id=s.tid select>