MyBatis的注解实现复杂映射开发

xml 配置方式实现复杂映射回顾

实现复杂映射我们之前可以在映射文件中通过配置来实现,使用注解开发后,我们可以通过 @Results 注解,@Result 注解,@One 注解和 @Many 注解组合完成复杂关系的配置。

注解 说明
@Results
代替的是标签 <ResultMap>,该注解中可以使用单个的 @Result 注解,也可以使用 @Result 集合。
使用方式:@Results({@Result(), @Result()}) 或者 @Results(@Result())
@Result
代替了 <id> 标签和 <result> 标签
@Result 中的属性介绍
column:数据库中的列名
property:要装配的属性名
one:需要使用 @One 注解( @Result(one=@One)()
many:需要使用 @Many 注解( @Result(many=@many)()
@One(一对一) 代替了 <assocation> 标签,是多表查询的关键,在注解中用来指定子查询返回单一对象。
@One 注解属性介绍
select:指定用来多表查询的 sqlmapper
使用格式:@Result(column="", property="", one=(select=""))
@Many(多对一) 代替了 <collection> 标签,是多表查询的关键,在注解中用来指定子查询返回对象集合。
使用格式:@Result(property="", column="", many=@many(select=""))

Terwer...大约 10 分钟MyBatis后端开发开源框架注解mybatiscomplexframeworkmybatis-14mapping
MyBatis常用注解及基本增删改查的注解实现

MyBatis 的常用注解

注解可以减少 Mapper 文件的编写,常用注解如下;

@Insert:实现新增

@Update:实现更新

@Delete:实现删除

@Select:实现查询

@Result:实现结果集封装

@Results:可以和@Result 一起使用,封装多个结果集

@One:实现一对一结果集封装


Terwer...大约 4 分钟MyBatis后端开发开源框架mybatisannotationframeworkmybatis-13
MyBatis复杂映射开发之多对多查询

多对多查询的模型

用户表和角色表的关系为,一个用户有多个角色,一个角色被多个用户使用。

多对多查询的需求:查询所有用户的同时查询出该用户对应的所有角色。

@startuml

!theme plain
top to bottom direction
skinparam linetype ortho

class sys_role {
   rolename: varchar(255)
   roleDesc: varchar(255)
   id: int(11)
}
class sys_user_role {
   userid: int(11)
   roleid: int(11)
}
class node2 as "user  /* 用户表 */" {
   username: varchar(50)
   password: varchar(50)
   birthday: varchar(50)
   id: int(11)
}

sys_user_role  ^-[#595959,plain]-  sys_role      : "roleid:id"
sys_user_role  ^-[#595959,plain]-  node2         : "userid:id"
@enduml

Terwer...大约 3 分钟MyBatis后端开发开源框架mybatisframework多对多many-to-manymybatis-12
MyBatis复杂映射开发之一对多查询

一对多查询模型

用户和订单表的关系为,一个用户有多个订单,一个订单只能属于一个用户。

一对多查询需求:查询多有用户,与此同时查询用户具有的订单信息。

一对多查询语句

对应的sql语句

select u.*,o.ordertime,o.total,o.uid from user u left join orders o on u.id = o.uid;

Terwer...大约 3 分钟MyBatis后端开发开源框架mybatisframeworkone-to-manymappingmybatis-11
MyBatis复杂映射开发之一对一查询

一对一查询需求

用户表和订单表的关系为:一个用户可以有多个订单,一个订单只能从属于一个用户

一对一查询需求:查询一个订单,同时查询出该订单所对应的用户

对应的sql语句:select * from orders o,user u where o.uid=u.id

查询结果如下:

id ordertime total uid id username password birthday
1 2022-03-17 17:15:33 3000 1 1 lucy 123 2022-03-17 17:15:56
2 2022-03-17 17:15:33 4000 1 1 lucy 123 2022-03-17 17:15:56
3 2022-03-17 17:15:33 5000 2 2 tom 123 2022-03-17 17:15:56

Terwer...大约 3 分钟MyBatis后端开发开源框架frameworkmybatisquerymybatis-10
Mybatis基本流程及配置文件解析

Mybatis基本流程

1、利用Resources工具类加载配置文件,并转换成输入输出流

2、利用解析的配置,创建SqlSessionFactory工厂

3、生产SqlSession

4、SqlSession调用方法

Mybatis配置文件分析

sqlMapConfig.xml

MyBatis核心配置文件层级


Terwer...大约 5 分钟MyBatis后端开发开源框架配置事务mybatisconfigcfgmybatis-9framework
MyBatis的基本使用

快速入门

Mybatis的官网:https://mybatis.org/mybatis-3/

MyBatis的开发步骤

添加MyBatis的坐标

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
    <java.version>1.8</java.version>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>

<dependencies>
    <!--mybatis坐标-->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.5</version>
    </dependency>
    <!--mysql驱动坐标-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.6</version>
        <scope>runtime</scope>
    </dependency>
    <!--单元测试坐标-->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
    <!--⽇志坐标-->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.12</version>
    </dependency>
</dependencies>

Terwer...大约 5 分钟MyBatis后端开发开源框架mybatisbasicuseframeworkmybatis-8
MyBatis的基本介绍及优势

MyBatis 的历史由来

Mybatis 原本是 Apache 软件基金会的一个开源项目叫做 iBatis ,2010 年这个项目由 Apache 迁移到了 google code 管理才改名为 Mybatis,2013 年又迁移到了 GitHub。

iBatis 一词来源于 internetabatis 的组合,是一个由 Clinton Begin 在 2001 年发起的开放源代码项目。

Mybatis 简介


Terwer...大约 2 分钟MyBatis后端开发开源框架mybatisframeworkbasicmybatis-6
使用getMapper方式对自定义持久层框架进行优化

问题分析

1、Dao层使用持久层框架,存在代码重复,整个操作过程模板重复(加载配置文件、创建SqlSessionFactory、生产SqlSession)

2、存在硬编码(statementId)

解决思路

getMapper+动态代理方式优化

使用代理模式生成Dao层接口的实现类


Terwer...大约 2 分钟MyBatis后端开发开源框架customdaopersistenceframeworkmybatismybatis-5mapper
自定义持久层框架的代码实现二

代码实现续

核心执行引擎Executor的实现

运行效果

问题修复

1、selectList打印的全部是同一个值

/Library/Java/JavaVirtualMachines/jdk1.8.0_291.jdk/Contents/Home/bin/java -... com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 com.terwergreen.test.IPersistenceTest,test2
Connected to the target VM, address: '127.0.0.1:50317', transport: 'socket'
log4j:WARN No appenders could be found for logger (com.mchange.v2.log.MLog).
log4j:WARN Please initialize the log4j system properly.
User{id=5, username='dali'}
User{id=5, username='dali'}
User{id=5, username='dali'}
User{id=5, username='dali'}
Disconnected from the target VM, address: '127.0.0.1:50317', transport: 'socket'

Process finished with exit code 0


Terwer...大约 3 分钟MyBatis后端开发开源框架customdaoframeworkpersistencemybatismybatis-4
2