1)业务装配.对两个表编写单表查询语句,在业务(Service)把查询的两个结果进行关联
2)使用 Auto Mapping 特性,在实现两表联合查询时通过别名完成映射.
3)使用 MyBatis 的
多表查询时,类中包含另一个类的对象的情况:1.单个对象 2.集合对象
1)
在使用
2)使用resultMap实现单表映射关系
在mapper.xml文件中
3)使用 resultMap 实现关联单个对象(N+1 方式)
N+1 查询方式:先查询出某个表的全部信息,根据这个表的信息查询另一个表的信息.
在实体类Student中的定义
public class Student {
private int id;
private String name;
private int age;
private int tid;
private Teacher teacher;
在TeacherMapper中提供一个查询
在StudentMapper中
要传的参数(上表查询除出的结果)放到 association的column中,可以简化代码,但第二次查询需要用到的字段必须单独再resultMap中列出来。大前提使用 N+1 方式.时如果列名和属性名相同可以不配置,使用 Auto mapping 特性.但是 mybatis 默认只会给列专配一次
property: 对象在类中的属性名
select:通过哪个查询查询出这个对象的信息
column: 把当前表的哪个列的值做为参数传递给另一个查询
4)使用 resultMap 实现关联单个对象(联合查询方式)
只需要编写一个 SQL,在 StudentMapper 中添加下面效果
N+1 方式和联合查询方式对比
N+1:需求不确定时。使用多条 SQl 命令查询两表数据时,如果希望把需要的数据都查询出来,需要执行 N+1 条 SQl 才能把所有数据库查询出来.
缺点: 效率低
联合查询:需求中确定查询时两个表一定都查询
4)使用
在 Teacher 中添加 List
public class Teacher {
private int id;
private String name;
private List list;
在 StudentMapper.xml 中添加通过 tid 查询
在 TeacherMapper.xml 中添加查询全部
5)使用
在 teacherMapper.xml 中添加
mybatis 可以通过主键判断对象是否被加载过,不需要担心创建重复 Teacher
6)使用 Auto Mapping 结合别名实现多表查询
只能使用多表联合查询方式 且查询出的列别和属性名相同.
在内部别的对象的字段起别名,在两侧添加反单引号
使用注解 和 mapper.xml 作用相同,且两者可以共存。不过需要使用接口绑定,在接口的方法上写注解
在MyBatis.xml的mappers标签中可以使用
实现查询
@Select("select * from teacher")
List selAll();
实现新增
@Insert("insert into teacher
values(default,#{name})")
int insTeacher(Teacher teacher)
实现修改
@Update("update teacher set name=#{name} where
id=#{id}")
int updTeacher(Teacher teacher);
实现删除
@Delete("delete from teacher where id=#{0}")
int delById(int id);
使用注解实现
在 StudentMapper 接口添加查询
@Select("select * from student where tid=#{0}")
List selByTid(int tid);
在@Select上面加@Results注解
@Results() 相当于
Result() 相当于
@Result(id=true) 相当与
@Many() 相当于
@One() 相当于
@Results(value={
@Result(id=true,property="id",column="id"),
@Result(property="name",column="name"),
@Result(property="list",column="id",many=@Many(sele
ct="com.bjsxt.mapper.StudentMapper.selByTid"))
})
@Select("select * from teacher")
List selTeacher();
1) 运行过程中涉及到的类
1 Resources MyBatis 中 IO 流的工具类 作用 :加载配置文件
2.SqlSessionFactoryBuilder() 构建器 作用:创建 SqlSessionFactory 接口的实现类
3 XMLConfigBuilder MyBatis 全局配置文件内容构建器类 作用:负责读取流内容并转换为 JAVA 代码.
4 Configuration 封装了全局配置文件所有配置信息. 作用:全局配置文件内容存放在 Configuration 中
5 DefaultSqlSessionFactory 是SqlSessionFactory接口的实现类
6 Transaction 事务类 每一个 SqlSession 会带有一个 Transaction 对象.
7 TransactionFactory 事务工厂 作用:负责生产 Transaction
8 Executor MyBatis 执行器 作用:负责执行 SQL 命令 相当于 JDBC 中 statement 对象(或 PreparedStatement或 CallableStatement) 默认的执行器 SimpleExcutor 批量操作 BatchExcutor 通过 openSession(参数控制)
9 DefaultSqlSession 是 SqlSession 接口的实现类
10 ExceptionFactory MyBatis 中异常工厂