Mybatis----resultMap与注解方式实现单表、联表查询、MyBatis源码及运行原理

一、MyBatis实现多表查询的方式

1)业务装配.对两个表编写单表查询语句,在业务(Service)把查询的两个结果进行关联

2)使用 Auto Mapping 特性,在实现两表联合查询时通过别名完成映射.

3)使用 MyBatis 的标签进行实现.

 

多表查询时,类中包含另一个类的对象的情况:1.单个对象  2.集合对象

二、resultMap标签

1)标签写在mapper.xml中,由程序员控制SQL查询结果与实体类的映射关系.(MyBatis默认使用 Auto Mapping特性

在使用标签时, select * from teacher

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 中添加下面效果

只要专配一个对象就用这个标签,此时把小的看待,javaType 属性:专配完后返回一个什么类型的对象.取值是一个类(或类的别名)。






    
    
    
    

N+1 方式和联合查询方式对比

N+1:需求不确定时。使用多条 SQl 命令查询两表数据时,如果希望把需要的数据都查询出来,需要执行 N+1 条 SQl 才能把所有数据库查询出来.
缺点: 效率低

联合查询:需求中确定查询时两个表一定都查询

4)使用查询关联集合对象(N+1)

在 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 结合别名实现多表查询

只能使用多表联合查询方式 且查询出的列别和属性名相同.

在内部别的对象的字段起别名,在两侧添加反单引号

三、MyBatis注解

使用注解 和 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 中异常工厂

你可能感兴趣的:(SSM框架)