第 3-2 课:SpringBoot如何优雅地使⽤ MyBatis XML 配置版

 
MyBatis 是现如今最流⾏的 ORM 框架之⼀,我们先来了解⼀下什么是 ORM 框架。
 

ORM 框架

 
对象关系映射( Object Relational Mapping ORM )模式是⼀种为了解决⾯向对象与关系数据库存在的互不
匹配的现象的技术。简单的说, ORM 是通过使⽤描述对象和数据库之间映射的元数据,将程序中的对象⾃动
持久化到关系数据库中。
 

为什么需要 ORM

 
当你开发⼀个应⽤程序的时候(不使⽤ O/R Mapping ),可能会写不少数据访问层代码,⽤来从数据库保
存、删除、读取对象信息等;在 DAL 中写了很多的⽅法来读取对象数据、改变状态对象等任务,⽽这些代码
写起来总是重复的。针对这些问题 ORM 提供了解决⽅案,简化了将程序中的对象持久化到关系数据库中的
操作。
 
ORM 框架的本质是简化编程中操作数据库的编码,在 Java 领域发展到现在基本上就剩两家最为流⾏,⼀个
是宣称可以不⽤写⼀句 SQL Hibernate ,⼀个是以动态 SQL ⻅⻓的 MyBatis ,两者各有特点。在企业级系
统开发中可以根据需求灵活使⽤,会发现⼀个有趣的现象:传统企业⼤都喜欢使⽤ Hibernate ,⽽互联⽹⾏业
通常使⽤ MyBatis
 

MyBatis 介绍

 
MyBatis 是⼀款标准的 ORM 框架,被⼴泛的应⽤于各企业开发中。 MyBatis 最早是 Apache 的⼀个开源项⽬
iBatis 2010 年这个项⽬由 Apache Software Foundation 迁移到了 Google Code ,并且改名为 MyBatis
2013 11 ⽉⼜迁移到 Github 。从 MyBatis 的迁移史,也可以看出源码托管平台的发展史, GitHub ⽬前已
经成为世界上最⼤的开源软件托管平台,建议⼤家多多关注这个全球最⼤的同性社交⽹站。
 
MyBatis ⽀持普通的 SQL 查询,存储过程和⾼级映射的优秀持久层框架。 MyBatis 消除了⼏乎所有的 JDBC
代码和参数的⼿⼯设置以及对结果集的检索封装。 MaBatis 可以使⽤简单的 XML 或注解⽤于配置和原始映
射,将接⼝和 Java POJO Plain Old Java Objects ,普通的 Java 对象)映射成数据库中的记录。
作为⼀款使⽤⼴泛的开源软件,它的特点有哪些呢?
 

优点

  • SQL 被统⼀提取出来,便于统⼀管理和优化
  • SQL 和代码解耦,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰、更易维护、更易单元测试
  • 提供映射标签,⽀持对象与数据库的 ORM 字段关系映射
  • 提供对象关系映射标签,⽀持对象关系组件维护
  • 灵活书写动态 SQL,⽀持各种条件来动态⽣成不同的 SQL

缺点

  • 编写 SQL 语句时⼯作量很⼤,尤其是字段多、关联表多时,更是如此
  • SQL 语句依赖于数据库,导致数据库移植性差

MyBatis ⼏个重要的概念

 
Mapper 配置 可以使⽤基于 XML Mapper 配置⽂件来实现,也可以使⽤基于 Java 注解的 MyBatis 注解来
实现,甚⾄可以直接使⽤ MyBatis 提供的 API 来实现。
 
Mapper 接⼝ 是指⾃⾏定义的⼀个数据操作接⼝,类似于通常所说的 DAO 接⼝。早期的 Mapper 接⼝需要⾃
定义去实现,现在 MyBatis 会⾃动为 Mapper 接⼝创建动态代理对象。 Mapper 接⼝的⽅法通常与 Mapper
配置⽂件中的 select insert update delete XML 结点存在⼀⼀对应关系。
 
Executor MyBatis 中所有的 Mapper 语句的执⾏都是通过 Executor 进⾏的, Executor MyBatis 的⼀个
核⼼接⼝。
 
SqlSession ,是 MyBatis 的关键对象,是执⾏持久化操作的独享,类似于 JDBC 中的 Connection
SqlSession 对象完全包含以数据库为背景的所有执⾏ SQL 操作的⽅法,它的底层封装了 JDBC 连接,可以
SqlSession 实例来直接执⾏被映射的 SQL 语句。
 
SqlSessionFactory ,是 MyBatis 的关键对象,它是单个数据库映射关系经过编译后的内存镜像。
SqlSessionFactory 对象的实例可以通过 SqlSessionFactoryBuilder 对象类获得,⽽
SqlSessionFactoryBuilder 则可以从 XML 配置⽂件或⼀个预先定制的 Confifiguration 的实例构建出。
 
MyBatis 的⼯作流程如下:
  • ⾸先加载 Mapper 配置的 SQL 映射⽂件,或者是注解的相关 SQL 内容。
  • 创建会话⼯⼚,MyBatis 通过读取配置⽂件的信息来构造出会话⼯⼚(SqlSessionFactory)。
  • 创建会话。根据会话⼯⼚,MyBatis 就可以通过它来创建会话对象(SqlSession),会话对象是⼀个接 ⼝,该接⼝中包含了对数据库操作的增、删、改、查⽅法。
  • 创建执⾏器。因为会话对象本身不能直接操作数据库,所以它使⽤了⼀个叫做数据库执⾏器 Executor)的接⼝来帮它执⾏操作。
  • 封装 SQL 对象。在这⼀步,执⾏器将待处理的 SQL 信息封装到⼀个对象中(MappedStatement),该 对象包括 SQL 语句、输⼊参数映射信息(Java 简单类型、HashMap POJO)和输出结果映射信息 Java 简单类型、HashMap POJO)。
  • 操作数据库。拥有了执⾏器和 SQL 信息封装对象就使⽤它们访问数据库了,最后再返回操作结果,结 束流程。
在我们具体的使⽤过程中,就是按照上述的流程来执⾏。
 

什么是 MyBatis-Spring-Boot-Starter

 
mybatis-spring-boot-starter MyBatis 帮助我们快速集成 Spring Boot 提供的⼀个组件包,使⽤这个组件可
以做到以下⼏点:
  • 构建独⽴的应⽤
  • ⼏乎可以零配置
  • 需要很少的 XML 配置
mybatis-spring-boot-starter 依赖于 MyBatis-Spring Spring Boot ,最新版 1.3.2 需要 MyBatis-Spring
1.3 以上, Spring Boot 版本 1.5 以上。
 
注意 mybatis-spring-boot-starter MyBatis 官⽅开发的 Starter ,⽽不是 Spring Boot 官⽅开发的启动包,
其实是 MyBatis Spring Boot 市场使⽤度⾮常⾼,因此主动开发出 Starter 包进⾏集成,但这⼀集成确实解
决了很多问题,使⽤起来⽐以前简单很多。 mybatis-spring-boot-starter 主要提供了两种解决⽅案,⼀种是简
化后的 XML 配置版,⼀种是使⽤注解解决⼀切问题。
 
MyBatis 以前只有 XML 配置这种使⽤的形式,到了后来注解使⽤特别⼴泛, MyBatis 也顺应潮流提供了注解
的⽀持,从这⾥可以看出 MyBatis ⼀直都跟随着主流技术的变化来完善⾃⼰。接下来给⼤家介绍⼀下如何使
XML 版本。
 
XML 版本保持映射⽂件的⽅式,最新版的使⽤主要体现在不需要实现 Dao 的实现层,系统会⾃动根据⽅法
名在映射⽂件中找到对应的 SQL
 

初始化脚本

为了⽅便项⽬演示,需要在 test 仓库创建 users 表,脚本如下:

DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
 `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',
 `userName` varchar(32) DEFAULT NULL COMMENT '⽤户名',
 `passWord` varchar(32) DEFAULT NULL COMMENT '密码',
 `user_sex` varchar(32) DEFAULT NULL,
 `nick_name` varchar(32) DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

关键依赖包

 
当然任何模式都需要⾸先引⼊ mybatis-spring-boot-starter pom ⽂件,现在最新版本是 1.3.2
<dependency>
 <groupId>org.mybatis.spring.boot</groupId>
 <artifactId>mybatis-spring-boot-starter</artifactId>
 <version>1.3.2</version>
</dependency>

application 配置

 
application.properties 添加相关配置:
mybatis.config-location=classpath:mybatis/mybatis-config.xml
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
mybatis.type-aliases-package=com.neo.model
spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnico
de=true&characterEncoding=utf-8&useSSL=true
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
其中:
 
  • mybatis.confifig-location,配置 mybatis-confifig.xml 路径,mybatis-confifig.xml 中配置 MyBatis 基础属 性;
  • mybatis.mapper-locations,配置 Mapper 对应的 XML ⽂件路径;
  • mybatis.type-aliases-package,配置项⽬中实体类包路径;
  • spring.datasource.*,数据源配置。
Spring Boot 启动时数据源会⾃动注⼊到 SqlSessionFactory 中,使⽤ SqlSessionFactory 构建
SqlSessionFactory ,再⾃动注⼊到 Mapper 中,最后我们直接使⽤ Mapper 即可。

 

 

启动类

 
在启动类中添加对 Mapper 包扫描 @MapperScan Spring Boot 启动的时候会⾃动加载包路径下的
Mapper
 
@Spring BootApplication
@MapperScan("com.neo.mapper")
public class Application {
 public static void main(String[] args) {
 SpringApplication.run(Application.class, args);
 }
}
或者直接在 Mapper 类上⾯添加注解 @Mapper ,建议使⽤上⾯那种,不然每个 mapper 加个注解也挺麻烦
的。
 

示例演示

MyBatis 公共属性

 
mybatis-confifig.xml 主要配置常⽤的 typeAliases ,设置类型别名,为 Java 类型设置⼀个短的名字。它只和
XML 配置有关,存在的意义仅在于⽤来减少类完全限定名的冗余。
 
<configuration>
 <typeAliases>
 <typeAlias alias="Integer" type="java.lang.Integer" />
 <typeAlias alias="Long" type="java.lang.Long" />
 <typeAlias alias="HashMap" type="java.util.HashMap" />
 <typeAlias alias="LinkedHashMap" type="java.util.LinkedHashMap" />
 <typeAlias alias="ArrayList" type="java.util.ArrayList" />
 <typeAlias alias="LinkedList" type="java.util.LinkedList" />
 </typeAliases>
</configuration>
这样我们在使⽤ Mapper.xml 的时候,需要引⼊可以直接这样写:
resultType="Integer" 
//或者
parameterType="Long"

添加 User 的映射⽂件

 
第⼀步,指明对应⽂件的 Mapper 类地址:
<mapper namespace="com.neo.mapper.UserMapper" >
第⼆部,配置表结构和类的对应关系:
<resultMap id="BaseResultMap" type="com.neo.model.User" >
 <id column="id" property="id" jdbcType="BIGINT" />
 <result column="userName" property="userName" jdbcType="VARCHAR" />
 <result column="passWord" property="passWord" jdbcType="VARCHAR" />
 <result column="user_sex" property="userSex" javaType="com.neo.enums.UserSexEn
um"/>
 <result column="nick_name" property="nickName" jdbcType="VARCHAR" />
</resultMap>
这⾥为了更好的贴近⼯作情况,将类的两个字段和数据库字段设置为不⼀致,其中⼀个使⽤了枚举。使⽤枚
举有⼀个⾮常⼤的优点,插⼊此属性的数据会⾃动进⾏校验,如果不是枚举的内容会报错。
 
第三步,写具体的 SQL 语句,⽐如这样:
<select id="getAll" resultMap="BaseResultMap" >
 SELECT 
 *
 FROM users
</select>
MyBatis XML 有⼀个特点是可以复⽤ XML ,⽐如我们公⽤的⼀些 XML ⽚段可以提取出来,在其他 SQL 中去

引⽤。例如:

<sql id="Base_Column_List" >
 id, userName, passWord, user_sex, nick_name
</sql>
<select id="getAll" resultMap="BaseResultMap" >
 SELECT 
 <include refid="Base_Column_List" />
 FROM users
</select> 
这个例⼦就是,上⾯定义了需要查询的表字段,下⾯ SQL 使⽤ include 引⼊,避免了写太多重复的配置内
容。
下⾯是常⽤的增、删、改、查的例⼦:
<select id="getOne" parameterType="Long" resultMap="BaseResultMap" >
 SELECT 
 <include refid="Base_Column_List" />
 FROM users
 WHERE id = #{id}
</select>
<insert id="insert" parameterType="com.neo.model.User" >
 INSERT INTO 
 users
 (userName,passWord,user_sex) 
 VALUES
 (#{userName}, #{passWord}, #{userSex})
</insert>
<update id="update" parameterType="com.neo.model.User" >
 UPDATE 
 users 
 SET 
 <if test="userName != null">userName = #{userName},</if>
 <if test="passWord != null">passWord = #{passWord},</if>
 nick_name = #{nickName}
 WHERE 
 id = #{id}
</update>
<delete id="delete" parameterType="Long" >
 DELETE FROM
 users 
 WHERE 
 id =#{id}
</delete>
上⾯ update SQL 使⽤了 if 标签,可以根据不同的条件⽣产动态 SQL ,这就是 MyBatis 最⼤的特点。

 

编写 Dao 层的代码

 
public interface UserMapper {
 
 List<UserEntity> getAll();
 
 UserEntity getOne(Long id);
 void insert(UserEntity user);
 void update(UserEntity user);
 void delete(Long id);
}
注意:这⾥的⽅法名需要和 XML 配置中的 id 属性⼀致,不然会找不到⽅法去对应执⾏的 SQL
 

测试使⽤

 
按照 Spring ⼀贯使⽤形式,直接将对应的 Mapper 注⼊即可。
@Resource
private UserMapper userMapper;
如果使⽤的是 Idea ,这块的注解经常会报 “could not autowire” Eclipse 却没有问题,其实代码是正确的,这
Idea 的误报。可以选择降低 Autowired 检测的级别,不要提示就好。
File | Settings | Editor | Inspections 选项中使⽤搜索功能找到 Autowiring for Bean Class ,将 Severity
级别由之前的 error 改成 warning即可。

接下来直接使⽤ userMapper 进⾏数据库操作即可。
@Test
public void testUser() {
 //增加
 userMapper.insert(new User("aa", "a123456", UserSexEnum.MAN));
 //删除
 int count=userMapper.delete(2l);
 User user = userMapper.getOne(1l);
 user.setNickName("smile");
 //修改
 userMapper.update(user);
 //查询
 List<User> users = userMapper.getAll();
}
在示例代码中,写了两份的使⽤示例,⼀个是 Test ,⼀个在 Controller 层,⽅便⼤家下载查看。
 

分⻚查询

 
多条件分⻚查询是实际⼯作中最常使⽤的功能之⼀, MyBatis 特别擅⻓处理这类的问题。在实际⼯作中,会
对分⻚进⾏简单的封装,⽅便前端使⽤。另外在 Web 开发规范使⽤中, Web 层的参数会以 param 为后缀的 GitChat
对象进⾏传参,以 result 结尾的实体类封装返回的数据。
 
下⾯给⼤家以 User 多条件分⻚查询为例进⾏讲解。
 
先定义⼀个分⻚的基础类:
public class PageParam {
 private int beginLine; //起始⾏
 private Integer pageSize = 3;
 private Integer currentPage=0; // 当前⻚
 //getter setter省略
 public int getBeginLine() {
 return pageSize*currentPage;//⾃动计算起始⾏
 }
}
默认每⻚ 3 条记录,可以根据前端传参进⾏修改。
 
user 的查询条件参数类继承分⻚基础类:
public class UserParam extends PageParam{
 private String userName;
 private String userSex;
 //getter setter省略
}
接下来配置具体的 SQL ,先将查询条件提取出来。
<sql id="Base_Where_List">
 <if test="userName != null and userName != ''">
 and userName = #{userName}
 </if>
 <if test="userSex != null and userSex != ''">
 and user_sex = #{userSex}
 </if>
</sql>
从对象 UserParam 中获取分⻚信息和查询条件,最后进⾏组合。 GitChat
<select id="getList" resultMap="BaseResultMap" parameterType="com.neo.param.UserPa
ram">
 select
 <include refid="Base_Column_List" />
 from users
 where 1=1
 <include refid="Base_Where_List" />
 order by id desc
 limit #{beginLine} , #{pageSize}
</select>
前端需要展示总共的⻚码,因此需要统计出查询结果的总数。
<select id="getCount" resultType="Integer" parameterType="com.neo.param.UserParam"
>
 select
 count(1)
 from users
 where 1=1
 <include refid="Base_Where_List" />
</select>
Mapper 中定义的两个⽅法和配置⽂件相互对应。
public interface UserMapper {
 List<UserEntity> getList(UserParam userParam);
 int getCount(UserParam userParam);
}
具体使⽤:
@Test
public void testPage() {
 UserParam userParam=new UserParam();
 userParam.setUserSex("WOMAN");
 userParam.setCurrentPage(1);
 List<UserEntity> users=userMapper.getList(userParam);
 long count=userMapper.getCount(userParam);
 Page page = new Page(userParam,count,users);
 System.out.println(page);
}
在实际使⽤中,只需要传⼊ CurrentPage 参数即可,默认 0 就是第⼀⻚,传 1 就是第⼆⻚的内容,最后将结
果封装为 Page 返回给前端。
public class Page<E> implements Serializable {
 private int currentPage = 0; //当前⻚数
 private long totalPage; //总⻚数
 private long totalNumber; //总记录数
 private List<E> list; //数据集
}
Page 将分⻚信息和数据信息进⾏封装,⽅便前端显示第⼏⻚、总条数和数据,这样分⻚功能就完成了。
 

多数据源处理

 
接下来为⼤家介绍如何使⽤ MyBatis 配置多数据源使⽤。
 

配置⽂件

 
⾸先我们需要配置两个不同的数据源:
mybatis.config-location=classpath:mybatis/mybatis-config.xml
spring.datasource.one.jdbc-url=jdbc:mysql://localhost:3306/test1?serverTimezone=UT
C&useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.one.username=root
spring.datasource.one.password=root
spring.datasource.one.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.two.jdbc-url=jdbc:mysql://localhost:3306/test2?serverTimezone=UT
C&useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.two.username=root
spring.datasource.two.password=root
spring.datasource.two.driver-class-name=com.mysql.cj.jdbc.Driver
注意,需要提前在 test1 test2 库中创建好 User 表结构。
 
第⼀个数据源以 spring.datasource.one.* 为前缀连接数据库 test1 ,第⼆个数据源以 spring.datasource.two.*
为前缀连接数据库 test2
 
同时需要将上述的 UserMapper.xml ⽂件复制两份到 resources/mybatis/mapper/one
resources/mybatis/mapper/two ⽬录下各⼀份。
 

数据源配置

 
为两个数据源创建不同的 Mapper 包路径,将以前的 UserMapper 复制到包 com.neo.mapper.one
com.neo.mapper.two 路径下,并且分别重命名为: User1Mapper User2Mapper
配置第⼀个数据源,新建 DataSource1Confifig
⾸先加载配置的数据源:
@Bean(name = "oneDataSource")
@ConfigurationProperties(prefix = "spring.datasource.one")
@Primary
public DataSource testDataSource() {
 return DataSourceBuilder.create().build();
}
注意,在多数据源中只能指定⼀个 @Primary 作为默认的数据源使⽤。
根据创建的数据源,构建对应的 SqlSessionFactory
 
 
@Bean(name = "oneSqlSessionFactory")
@Primary
public SqlSessionFactory testSqlSessionFactory(@Qualifier("oneDataSource") DataSou
rce dataSource) throws Exception {
 SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
 bean.setDataSource(dataSource);
 bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources
("classpath:mybatis/mapper/one/*.xml"));
 return bean.getObject();
}
代码中需要指明需要加载的 Mapper xml ⽂件。
同时将数据源添加到事务中。
 
@Bean(name = "oneTransactionManager")
@Primary
public DataSourceTransactionManager testTransactionManager(@Qualifier("oneDataSour
ce") DataSource dataSource) {
 return new DataSourceTransactionManager(dataSource);
}
接下来将上⾯创建的 SqlSessionFactory 注⼊,创建我们在 Mapper 中需要使⽤的 SqlSessionTemplate
@Bean(name = "oneSqlSessionTemplate")
@Primary
public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("oneSqlSessionFactory"
) SqlSessionFactory sqlSessionFactory) throws Exception {
 return new SqlSessionTemplate(sqlSessionFactory);
}
最后将上⾯创建的 SqlSessionTemplate 注⼊到对应的 Mapper 包路径下,这样这个包下⾯的 Mapper 都会使
⽤第⼀个数据源来进⾏数据库操作。
@Configuration
@MapperScan(basePackages = "com.neo.mapper.one", sqlSessionTemplateRef = "oneSqlS
essionTemplate")
public class OneDataSourceConfig {
 ...
}
  • basePackages 指明 Mapper 地址。
  • sqlSessionTemplateRef 指定 Mapper 路径下注⼊的 sqlSessionTemplate

第⼆个数据源配置

DataSource2Confifig 的配置和上⾯类似,⽅法上需要去掉 @Primary 注解,替换对应的数据源和 Mapper
径即可。下⾯是 DataSource2Confifig 完整示例:
@Configuration
@MapperScan(basePackages = "com.neo.mapper.two", sqlSessionTemplateRef = "twoSqlS
essionTemplate")
public class DataSource2Config {
 @Bean(name = "twoDataSource")
 @ConfigurationProperties(prefix = "spring.datasource.two")
 public DataSource testDataSource() {
 return DataSourceBuilder.create().build();
 }
 @Bean(name = "twoSqlSessionFactory")
 public SqlSessionFactory testSqlSessionFactory(@Qualifier("twoDataSource") Dat
aSource dataSource) throws Exception {
 SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
 bean.setDataSource(dataSource);
 bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResou
rces("classpath:mybatis/mapper/two/*.xml"));
 return bean.getObject();
 }
 @Bean(name = "twoTransactionManager")
 public DataSourceTransactionManager testTransactionManager(@Qualifier("twoData
Source") DataSource dataSource) {
 return new DataSourceTransactionManager(dataSource);
 }
 @Bean(name = "twoSqlSessionTemplate")
 public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("twoSqlSessionFact
ory") SqlSessionFactory sqlSessionFactory) throws Exception {
 return new SqlSessionTemplate(sqlSessionFactory);
 }
}
从上⾯的步骤我们可以总结出来,创建多数据源的过程就是:⾸先创建 DataSource ,注⼊到 SqlSessionFactory 中,再创建事务,将 SqlSessionFactory 注⼊到创建的 SqlSessionTemplate 中,最后将 SqlSessionTemplate 注⼊到对应的 Mapper 包路径下。其中需要指定分库的 Mapper 包路径。
 
注意,在多数据源的情况下,我们不需要在启动类添加: @MapperScan("com.xxx.mapper") 的注解。
这样 MyBatis 多数据源的配置就完成了,如果有更多的数据源请参考第⼆个数据源的配置即可。

 

测试

 
配置好多数据源之后,在项⽬中想使⽤哪个数据源就把对应数据源注⼊到类中使⽤即可。
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserMapperTest {
 @Autowired
 private User1Mapper user1Mapper;
 @Autowired
 private User2Mapper user2Mapper;
 @Test
 public void testInsert() throws Exception {
 user1Mapper.insert(new User("aa111", "a123456", UserSexEnum.MAN));
 user1Mapper.insert(new User("bb111", "b123456", UserSexEnum.WOMAN));
 user2Mapper.insert(new User("cc222", "b123456", UserSexEnum.MAN));
 }
}
上⾯的测试类中注⼊了两个不同的 Mapper ,对应了不同的数据源。在第⼀个数据源中插⼊了两条数据,第
⼆个数据源中插⼊了⼀条信息,运⾏测试⽅法后查看数据库 1 有两条数据,数据库 2 有⼀条数据,证明多数据
源测试成功。
 

总结

 
这节课介绍了 ORM 框架 和 MyBatis 框架相关概念介绍,以⽤户数据为例演示了 MyBatis 的增、删、改、
查,以及分⻚查询、多数据源处理等常⻅场景。通过上⾯的示例可以发现 MyBatis 将执⾏ SQL 和代码做了隔
离,保证代码处理和 SQL 的相对独⽴,层级划分⽐较清晰, MyBatis 对动态 SQL ⽀持⾮常友好,可以在
XML ⽂件中复⽤代码⾼效编写动态 SQL
发布了91 篇原创文章 · 获赞 20 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/qq_34227896/article/details/103820335