具体实现(student项目) 创建数据库 1 2 3 4 5 6 7 8 9 10 11 create table teacher( id int(10) primary key auto_increment, name varchar(20) ); create table student( id int(10) primary key auto_increment, name varchar(20), age int(3), tid int(10) );
数据库情况:
学生表添加外键:
搭建环境 1. 导入相关jar包
2. 准备mybatis.xml全局配置文件(里面利用package标签找那个接口!!!!)
3. 准备student实体类
4. 准备teacher实体类
5. 准备pageInfo分页实体类
6. 准备实现类接口StudentMapper
...
Mybatis实现多表查询方式 多表查询三种方式 1. 业务装配:
两表单表查询 -- 在业务(service)将查询结果关联
2. 通过Auto Mapping特性
两表联合查询 -- 通过别名完成映射
3. 使用Mybatis的resultMap标签进行实现
类中(其他类) 分类 1. 单个对象
2. 集合对象
单表resultMap resultMap标签(mapper.xml中)
程序员控制sql查询结果与实体类的映射关系 默认:Mybatis使用Auto Mapping特性(resultType属性) 更改:Mybatis使用resultMap属性引用resultMap标签(不写resultType属性)
具体操作 1. 数据库(id和name两列):
2. 实体类(我们用id1和name1区别)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 public class Teacher { private int id1; private String name1; public int getId1() { return id1; } public void setId1(int id1) { this.id1 = id1; } public String getName1() { return name1; } public void setName1(String name1) { this.name1 = name1; } }
3. 在TeacherMapper.xml配置文件中使用resultMap标签:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 <mapper namespace="com.bjsxt.mapper.TeacherMapper"> <resultMap type="teacher" id="mymap"> <!-- 主键用id --> <id column="id" property="id1"/> <!-- 其他列用result --> <result column="name" property="name1"/> </resultMap> <select id="selAll" resultMap="mymap"> select * from teacher </select> </mapper>
单表总结使用 1. 实体类去写需要映射的名称(id和name 实体类就写id1和name1)
2. 配置文件中select里面把resultType改成使用resultMap属性
注: resultMap属性值 == resultMap标签的id值
3. 书写resultMap标签
注: resultMap两个属性一个是类型 一个是和select里面属性匹配的id
主键使用id标签 其他列用result标签
里面column写的是数据库的名称 property写的是映射的实体类名称
resultMap实现关联单个对象(N+1方式) association标签
就是先查询出一个表的全部信息 然后根据这个表的信息再查另外一个表的信息(两个表合并 )
具体操作 1. 学生数据库的tid是刚才老师id的外键
2. 学生实体类除了自己的属性还要有一个老师的对象
1 2 3 4 5 6 //只列举了变量 private int id; private String name; private int age; private int tid; private Teacher teacher; //老师类的对象!!!!!!
3. 学生配置文件(通过association标签把tid给老师的sql语句中当做id)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <mapper namespace="com.bjsxt.mapper.StudentMapper"> <resultMap type="student" id="linahe"> <id column="id" property="id"/> <result column="name" property="name"/> <result column="age" property="age"/> <result column="tid" property="tid"/> <association property="teacher" select="com.bjsxt.com.TeacherMapper.selById" column="tid"></association> </resultMap> <select id="selAll" resultMap="lianhe"> select * from student </select> </mapper>
4. 老师配置文件(只写根据id查老师信息的sql语句)
1 2 3 4 5 6 7 <mapper namespace="com.bjsxt.mapper.TeacherMapper"> <select id="selById" resultType="teacher" parameterType="int"> //只需要写好根据id查老师的sql操作 select * from teacher where id=#{id} </select> </mapper>
结果分析 图例分析流程:
具体实现过程:
1. 准备老师和学生类(要有老师类对象)
2. 准备老师的配置文件(通过id查询结果)
3. 准备学生的配置文件
3.1 先写自己的sql语句 -- resultMap属性连接到resultMap标签的id -- id标签写学生的主键映射 result标签写学生的其他列映射
3.2 一定要用association标签!!!(column属性把学生的tid拿过来 select去掉老师配置文件的sql语句的方法名一定是全路径!!)
resultMap实现关联集合对象(N+1方式) colloction标签
其实关联 集合对象(老师返回学生的list集合) / 单个对象(学生传老师一个对象) 只是从不同角度来看!!!!!!
具体操作 1. teacher实体类(放的就是list集合)
1 2 3 private int id; private String name; private List<Student> list; //list集合返回结果
2. student配置文件(只需要写简单的sql语句让老师传过来id当tid用)
1 2 3 4 5 6 7 <mapper namespace="com.bjsxt.mapper.StudentMapper"> <select id="selByTid" resultType="student" parameterType="int"> select * from student where tid=#{id} </select> </mapper>
3. teacher老师配置文件(通过collection标签将id传过去当tid查)
1 2 3 4 5 6 7 8 9 10 11 12 13 <mapper namespace="com.bjsxt.mapper.TeacherMapper"> <resultMap type="teacher" id="mymap"> <id column="id" property="id"/> <result column="name" property="name"/> <collection property="list" ofType="student" select="com.bjsxt.mapper.StudentMapper.selByTid" column="id"></collection> </resultMap> <select id="selAll" resultMap="mymap"> select * from teacher </select> </mapper>
结果分析 图例分析流程:
具体实现过程:
1. 准备老师类(要有list集合返回学生类信息)和学生类
2. 准备学生的配置文件(只需要sql语句通过id查所有信息)
3. 准备老师的配置文件
3.1 通过查询的sql语句去找resultMap标签 然后标签去找学生配置文件的方法查处结果(将id传过去当tid用)
多表resultMap加载集合对象联合查询方式
假设老师1有多个学生(数据库会一下子很多行) – 我们现在让老师1 后面跟学生(减少重复每次都要出现老师1)
具体操作 1. teacher实体类(放的就是list集合)
1 2 3 private int id; private String name; private List<Student> list; //list集合返回结果
2. 只在teacher配置文件改
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 <mapper namespace="com.bjsxt.mapper.TeacherMapper"> <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> <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> </mapper>
结果分析 图例分析流程:
具体实现过程:
1. 准备老师类(要有list集合返回学生类信息)和学生类
2. 准备学生的配置文件(只需要sql语句通过id查所有信息)
3. 准备老师的配置文件
3.1 通过查询的sql语句去找resultMap标签 然后标签去找学生配置文件的方法查处结果(将id传过去当tid用)
3.2 因为他返回的结果我需要一个老师对应很多学生 -- 所以我们要再写一个resultMap标签去映射list(一行一行给) --最终通过这个标签返回答案
AutoMapping加载单个对象 ( 添加反单引号 )
使用多表联合查询(起别名!!)
具体操作 1. 学生实体类(老师类对象)
1 2 3 4 5 6 //只列举了变量 private int id; private String name; private int age; private int tid; private Teacher teacher; //老师类的对象!!!!!!
2. teacher配置文件(一个是student)
1 2 3 4 5 6 <mapper namespace="com.bjsxt.mapper.TeacherMapper"> <select id="selAll" resultType="teacher"> select t.id id,t.name name,s.id `list.id`,s.name `list.name`,age `list.age`,tid `list.tid` from teacher t LEFT JOIN student s on t.id=s.tid //展示的是list集合输出 </select> </mapper>
3. student配置文件(里面通过老师对象(反单引号) teacher.id等传过来用)
1 2 3 4 5 6 7 <mapper namespace="com.bjsxt.mapper.StudentMapper"> <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 //里面通过老师对象(反单引号) teacher.id等传过来用) </select> </mapper>