MyBatis快速入门(下)
- 六、MyBatis-缓存机制
- 1、一级缓存(Local Cache)
- 2、二级缓存(Global Cache)
- 二级缓存标签属性介绍
- 缓存相关设置
- 3、第三方缓存
- Mybatis整合ehcache示例
- 七、MyBatis-逆向工程
- 1、targetRuntime 值简述
- 2、简单示例(MyBatis3Simple 版)
- 3、示例(MyBatis3版)
- 八、MyBatis-分页插件
- 1、使用方法
官方文档
六、MyBatis-缓存机制
1、一级缓存(Local Cache)
一级缓存 是
SqlSession
级别的缓存,默认开启,生命周期与SqlSession
的生命周期相同。一级缓存
会缓存SQL 查询
的结果,在同一个SqlSession
内多次执行相同的查询时,MyBatis
会直接从一级缓存中读取数据,而不是重新执行SQL
查询。
一级缓存
失效
情况:
SqlSession
不同SqlSession
相同,查询条件不同SqlSession
相同,两次查询之间执行了增、删、改
操作SqlSession
相同,在调用clearCache()
方法或SqlSession
关闭,一级缓存会被清除
SqlSession session = sqlSessionFactory.openSession();
User user1 = session.selectOne("com.example.UserMapper.selectUser", 1); // 查询缓存
User user2 = session.selectOne("com.example.UserMapper.selectUser", 1); // 缓存命中
- 示例
/**
* 测试一级缓存: 根据 员工id查询员工信息
*/
@Test
public void testLocalCache() {
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
CacheMapper cacheMapper = sqlSession.getMapper(CacheMapper.class);
Emp emp1 = cacheMapper.getEmpById(6);
System.out.println("emp1查询结果:" + emp1);
Emp emp2 = cacheMapper.getEmpById(6);
System.out.println("emp2查询结果:" + emp2);
sqlSession.clearCache();
Emp emp3 = cacheMapper.getEmpById(6);
System.out.println("emp3查询结果:" + emp3);
}
2、二级缓存(Global Cache)
- 二级缓存 的作用范围是一个
SqlSessionFactory
,通过同一个SqlSessionFactory
创建的所有SqlSession
对象可以共享二级缓存
。二级缓存
的实现需要在配置文件中启用,并且每个Mapper
都需要配置缓存。- 二级缓存不会存储
SqlSession
的内部数据,只会缓存SQL
查询的结果。默认
情况下二级缓存是禁用
的。- 二级缓存跨
SqlSession
有效,不同的SqlSession
可以共享缓存内容。
二级缓存开启的条件:
- 在
mybatis-config.xml
中启用全局缓存,默认开启(true),无需配置
- 在
mapper
接口的xml映射文件
中加上<cache/>
,设置使用二级缓存。
二级缓存
必须在SqlSession
关闭或提交之后,才会生效POJO
实体类必须实现序列化接口
- 示例
/**
* 测试二级缓存: 根据 员工id 查询员工信息
*/
@Test
public void testGlobalCache() {
//因为二级缓存 的作用范围是一个 SqlSessionFactory,
//通过同一个 SqlSessionFactory 创建的所有 SqlSession 对象可以共享二级缓存。
//【因此此处测试二级缓存时不要使用 SqlSessionUtils工具类,
//因为该工具类每次都会创建一个新的 sqlSessionFactory】
SqlSession sqlSession1 = null;
SqlSession sqlSession2 = null;
try {
//获取配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
//获取 sqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//获取 sqlSession
sqlSession1 = sqlSessionFactory.openSession(true);
CacheMapper cacheMapper1 = sqlSession1.getMapper(CacheMapper.class);
Emp emp1 = cacheMapper1.getEmpById(6);
System.out.println("emp1查询结果:" + emp1);
sqlSession1.close();
sqlSession2 = sqlSessionFactory.openSession(true);
CacheMapper cacheMapper2 = sqlSession2.getMapper(CacheMapper.class);
Emp emp2 = cacheMapper2.getEmpById(6);
System.out.println("emp2查询结果:" + emp2);
sqlSession2.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
二级缓存失效情况:
- 两次查询之间执行了
增、删、改
操作
二级缓存标签属性介绍
<cache type="LRU"/>
<cache eviction="FIFO"/>
<cache flushInterval="60000"/> <!-- 每隔 60 秒刷新缓存 -->
<cache size="100"/> <!-- 最大缓存容量为 100 个对象 -->
<cache readOnly="true"/>
<cache blocking="true"/>
- 综合示例
<cache
type="LRU"
eviction="FIFO"
flushInterval="30000"
size="200"
readOnly="false"
blocking="true"
/>
- 含义:
- 使用
LRU
缓存策略。 - 按先进先出(
FIFO
)规则移除超出的缓存项。 - 每
30
秒刷新缓存。 - 最大缓存容量为
200
个对象。 - 缓存为读写模式。
- 启用阻塞缓存,防止并发加载相同数据。
缓存相关设置
cacheEnabled
- 配置二级缓存的开关(默认
true
:开启)
<setting name="cacheEnabled" value="true"/>
select
标签的useCache
属性
- 指定某个
select
查询是否使用二级缓存 useCache="false":
查询结果不会存入二级缓存
,但会存入一级缓存
- 默认值(
useCache="true"
),查询结果存入一级缓存
和二级缓存
(如果启用了二级服务器)。
select
标签的flushCache
属性
flushCache="true"
:执行查询时,会清空一级缓存
和二级缓存
(如果启用了二级服务器),确保从数据库获取最新数据。- 默认值(
flushCache="false"
):缓存数据不会被清空,查询时可能返回缓存数据。 - 增删改默认
true
,查询默认false
sqlSession.clearCache()
示例
- 只是用来清除
一级缓存
某一作用域内(一级缓存
或二级缓存
)执行了增、删、改
操作后,该作用域下所有select
中的缓存都会被clear
掉
3、第三方缓存
使用
第三方缓存(如 Redis、EhCache、Caffeine)
,可以提供更高的性能、灵活的失效策略和分布式支持,解决MyBatis
默认缓存在高并发和扩展性上的不足。同时,第三方缓存还支持持久化、丰富的监控工具和多样化的配置,适合复杂生产环境。
Ehcache
是一种广泛使用的java
分布式缓存,用于通用缓存,Java EE
和轻量级容器。MyBatis Ehcache 适配器 - 参考文档
Ehcache
集成建立在Ehcache
之上,没有任何Ehcache
第三方应用程序。 如果您需要插件,请参考Ehcache
官方文档 。
要在应用程序中使用Ehcache
,请下载zip
包 ,解压缩它并将jar
添加到Classpath
中。
如果您使用的是 Maven,则只需将以下依赖项添加到您的依赖项中pom.xml
Mybatis整合ehcache示例
步骤 1: 在
pom.xml
中引入第三方缓存依赖
<!--mybatis-ehcache 整合依赖包-->
<dependency>
<groupId>org.mybatis.caches</groupId>
<artifactId>mybatis-ehcache</artifactId>
<version>1.2.1</version>
</dependency>
<!--slf4j日志门面的一个具体实现
存在 SLF4 时,作为建议日志的 log4j 将会失效,此时我们需要借助 SLF4
的具体实现 logback 来打印日志
-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
步骤 2: 创建
EhcacheCache
的配置文件ehcache.xml
<?xml version="1.0" encoding="UTF-8" ?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
<!--磁盘保存路径-->
<diskStore path="D:\workspace\ehcache"/>
<!--
maxEntriesLocalHeap="1"
这个属性指定了缓存中在内存堆中的最大条目数。
这里设为 1,表示缓存的条目数非常少,可能是用来存储少量的热数据。
一般来说,如果数据量很大,这个值会设置得更高。
maxEntriesLocalDisk="10000000"
这个属性指定了缓存中在磁盘上的最大条目数。
设置为 10000000 表示缓存的条目数可以非常大,当内存不足时,缓存数据会转移到磁盘。
eternal="false"
如果设置为 true,则缓存条目会永不过期。此处设置为 false,意味着缓存条目会有有效期。
overflowToDisk="true"
当缓存的内存空间不足时,启用此选项,数据会溢出到磁盘中,以避免缓存溢出错误。
timeToIdleSeconds="120"
该属性定义了缓存项在空闲状态下的存活时间。空闲指的是自上次访问以来没有进行任何操作的时间。
如果超过 120 秒没有访问该缓存项,它会被移除。
timeToLiveSeconds="120"
该属性定义了缓存项的最大生存时间。即使缓存项在这段时间内被频繁访问,它也会在 120 秒后过期并被移除。
diskExpiryThreadIntervalSeconds="120"
这是一个后台线程定时清理过期缓存数据的时间间隔。设置为 120 秒,意味着每隔 120 秒后台线程会检查一次过期数据。
memoryStoreEvictionPolicy="LRU"
该属性指定了内存中缓存项被驱逐时的策略。LRU(Least Recently Used)表示最久未使用的条目会被优先移除。
-->
<defaultCache
maxEntriesLocalHeap="1"
maxEntriesLocalDisk="10000000"
eternal="false"
overflowToDisk="true"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
</defaultCache>
</ehcache>
步骤 3: 设置二级缓存类型,指定使用第三方缓存
<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
步骤 4: 加入logback日志
logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
<!-- 定义日志输出的位置 -->
<appender name="STDOUT"
class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- 日志输出的格式
按照顺序分别是:时间、日志级别、线程名称、打印日志的类、日志主题内容、换行-->
<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] [%logger] [%msg]%n</pattern>
</encoder>
</appender>
<!--设置全局日志级别。日志级别按顺序分别是:DEBUG、INFO、WARN、ERROR-->
<!--指定任何一个日志级别都只打印当前级别和后面级别的日志-->
<root level="DEBUG">
<!--指定打印日志的appender,这里通过"STDOUT"引用了前面配置的appender-->
<appender-ref ref="STDOUT"/>
</root>
<!--根据特殊需求指定局部日志级别-->
<logger name="com.ningxia.crowd.mapper" level="DEBUG"/>
</configuration>
测试
/**
* 测试二级缓存: 根据 员工id 查询员工信息
*/
@Test
public void testGlobalCache() {
//因为二级缓存 的作用范围是一个 SqlSessionFactory,
//通过同一个 SqlSessionFactory 创建的所有 SqlSession 对象可以共享二级缓存。
//【因此此处测试二级缓存时不要使用 SqlSessionUtils工具类,
//因为该工具类每次都会创建一个新的 sqlSessionFactory】
SqlSession sqlSession1 = null;
SqlSession sqlSession2 = null;
try {
//获取配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
//获取 sqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//获取 sqlSession
sqlSession1 = sqlSessionFactory.openSession(true);
CacheMapper cacheMapper1 = sqlSession1.getMapper(CacheMapper.class);
Emp emp1 = cacheMapper1.getEmpById(6);
System.out.println("emp1查询结果:" + emp1);
sqlSession1.close();
sqlSession2 = sqlSessionFactory.openSession(true);
CacheMapper cacheMapper2 = sqlSession2.getMapper(CacheMapper.class);
Emp emp2 = cacheMapper2.getEmpById(6);
System.out.println("emp2查询结果:" + emp2);
sqlSession2.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
七、MyBatis-逆向工程
MyBatis
的逆向工程(Reverse Engineering
)是指从数据库表结构自动生成相应的Java
类、XML
映射文件以及数据库操作代码(例如Mapper
接口和SQL
映射)。这大大简化了开发流程,尤其是在数据库设计已经完成的情况下。
官方文档地址
官方工程地址
1、targetRuntime 值简述
在
MyBatis Generator(MBG)
中,targetRuntime
用于指定生成的代码的风格和适配的MyBatis
版本。不同的targetRuntime
值会生成不同风格的代码,以适应不同的使用场景和版本需求。
targetRuntime的常见值:
MyBatis3
生成兼容 MyBatis 3.x 的代码。
这是最常用的目标,支持 MyBatis 的基础功能,生成 Example 类、SQL 语句和常规的 Mapper 接口。
适用于大多数 MyBatis 3.x 项目。
使用场景:当使用 MyBatis 3.x 时,这是最常见的选择。
MyBatis3Simple
生成更加简化的代码,省略了 Example 类和其他复杂功能。
适用于需要最基本的 CRUD 操作,不需要额外的 Example 或 Criteria 等功能的场景。
使用场景:当项目不需要复杂查询或额外的功能时,可以选择该选项,以减少生成的代码量。
Ibatis2
生成适配 MyBatis 2.x 版本的代码。
在 MyBatis 2.x 中,很多功能与 MyBatis 3.x 有差异,因此该选项主要是为了兼容旧版本的 MyBatis 项目。
使用场景:如果你正在维护一个使用 MyBatis 2.x 的旧项目,可以选择这个目标来生成代码。
MyBatis3DynamicSQL
生成使用 MyBatis3 风格的动态 SQL 的代码。
该选项支持通过 MyBatis 提供的动态 SQL 功能(如 Example 类、Criteria 和动态 SQL 构建器)生成更加灵活和复杂的 SQL 查询。
使用场景:如果你需要动态生成复杂的 SQL 语句,并使用 MyBatis 3.x 的动态 SQL 构建功能,选择该选项。
2、简单示例(MyBatis3Simple 版)
在
pom.xml
中添加依赖和插件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ningxia.mybatis</groupId>
<artifactId>mybatis_MBG</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!--mybatis核心文件-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!-- MyBatis Generator 逆向工程的核心依赖 -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.2</version>
</dependency>
<!--MySQL连接池-->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.4</version>
</dependency>
<!--MySQL驱动链接-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.32</version>
</dependency>
</dependencies>
<!--maven 在构建过程中的相关配置-->
<build>
<plugins>
<!--具体插件,逆向工程的操作是以构建过程中插件形式出现的-->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.0</version>
</plugin>
</plugins>
</build>
</project>
创建逆向工程的配置文件
generatorConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"https://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<!--
targetRuntime的常见值:
MyBatis3
生成兼容 MyBatis 3.x 的代码。
这是最常用的目标,支持 MyBatis 的基础功能,生成 Example 类、SQL 语句和常规的 Mapper 接口。
适用于大多数 MyBatis 3.x 项目。
使用场景:当使用 MyBatis 3.x 时,这是最常见的选择。
MyBatis3Simple
生成更加简化的代码,省略了 Example 类和其他复杂功能。
适用于需要最基本的 CRUD 操作,不需要额外的 Example 或 Criteria 等功能的场景。
使用场景:当项目不需要复杂查询或额外的功能时,可以选择该选项,以减少生成的代码量。
Ibatis2
生成适配 MyBatis 2.x 版本的代码。
在 MyBatis 2.x 中,很多功能与 MyBatis 3.x 有差异,因此该选项主要是为了兼容旧版本的 MyBatis 项目。
使用场景:如果你正在维护一个使用 MyBatis 2.x 的旧项目,可以选择这个目标来生成代码。
MyBatis3DynamicSQL
生成使用 MyBatis3 风格的动态 SQL 的代码。
该选项支持通过 MyBatis 提供的动态 SQL 功能(如 Example 类、Criteria 和动态 SQL 构建器)生成更加灵活和复杂的 SQL 查询。
使用场景:如果你需要动态生成复杂的 SQL 语句,并使用 MyBatis 3.x 的动态 SQL 构建功能,选择该选项。
-->
<context id="DB2Tables" targetRuntime="MyBatis3Simple">
<!-- 数据库连接配置 -->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mybatis"
userId="root"
password="886688">
</jdbcConnection>
<!-- JavaModel生成配置 -->
<javaModelGenerator targetPackage="com.ningxia.mybatis.model" targetProject=".\src\main\java">
<!--使用子包,表示上面"com.ningxia.mybatis.model"每个.前后一层目录-->
<property name="enableSubPackages" value="true"/>
<!--去掉字符串前后空格-->
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- SQL映射文件生成配置 -->
<sqlMapGenerator targetPackage="com.ningxia.mybatis.mapper" targetProject=".\src\main\resources">
<!--使用子包,表示上面"com.ningxia.mybatis.mapper"每个.前后一层目录-->
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!-- Java客户端接口(mapper接口)生成配置 -->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.ningxia.mybatis.mapper"
targetProject=".\src\main\java">
<!--使用子包,表示上面"com.ningxia.mybatis.mapper"每个.前后一层目录-->
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/1024aee8fd0143d7a8cd1520ebae4062.png)
<!-- 指定生成的表
tableName 值为 * 表示对应所有表,此时就不用写 domainObjectName;
domainObjectName:指定生成出来的实体类的名称
-->
<table tableName="t_emp" domainObjectName="Emp"/>
<table tableName="t_dept" domainObjectName="Dept"/>
</context>
</generatorConfiguration>
双击构建逆向工程
3、示例(MyBatis3版)
在
pom.xml
中添加依赖和插件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ningxia.mybatis</groupId>
<artifactId>mybatis_MBG</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!--mybatis核心文件-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!--Log4j2日志 以下是Log4j2 完整的日志记录实现所必需的-->
<!--log4j-core 是实际处理日志输出的核心实现-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.17.1</version>
</dependency>
<!--log4j-api 只是定义了日志记录的接口-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.17.1</version>
</dependency>
<!--junit测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.1</version>
<scope>test</scope>
</dependency>
<!-- MyBatis Generator 逆向工程的核心依赖 -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.2</version>
</dependency>
<!--MySQL驱动链接-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.32</version>
</dependency>
<!--MySQL连接池-->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.4</version>
</dependency>
</dependencies>
<!--maven 在构建过程中的相关配置-->
<build>
<plugins>
<!--具体插件,逆向工程的操作是以构建过程中插件形式出现的-->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.0</version>
</plugin>
</plugins>
</build>
</project>
创建逆向工程的配置文件
generatorConfig.xml
,双击构建逆向工程
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"https://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<!--
targetRuntime的常见值:
MyBatis3
生成兼容 MyBatis 3.x 的代码。
这是最常用的目标,支持 MyBatis 的基础功能,生成 Example 类、SQL 语句和常规的 Mapper 接口。
适用于大多数 MyBatis 3.x 项目。
使用场景:当使用 MyBatis 3.x 时,这是最常见的选择。
MyBatis3Simple
生成更加简化的代码,省略了 Example 类和其他复杂功能。
适用于需要最基本的 CRUD 操作,不需要额外的 Example 或 Criteria 等功能的场景。
使用场景:当项目不需要复杂查询或额外的功能时,可以选择该选项,以减少生成的代码量。
Ibatis2
生成适配 MyBatis 2.x 版本的代码。
在 MyBatis 2.x 中,很多功能与 MyBatis 3.x 有差异,因此该选项主要是为了兼容旧版本的 MyBatis 项目。
使用场景:如果你正在维护一个使用 MyBatis 2.x 的旧项目,可以选择这个目标来生成代码。
MyBatis3DynamicSQL
生成使用 MyBatis3 风格的动态 SQL 的代码。
该选项支持通过 MyBatis 提供的动态 SQL 功能(如 Example 类、Criteria 和动态 SQL 构建器)生成更加灵活和复杂的 SQL 查询。
使用场景:如果你需要动态生成复杂的 SQL 语句,并使用 MyBatis 3.x 的动态 SQL 构建功能,选择该选项。
-->
<context id="DB2Tables" targetRuntime="MyBatis3">
<!-- 数据库连接配置 -->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mybatis"
userId="root"
password="123456">
</jdbcConnection>
<!-- JavaModel生成配置 -->
<javaModelGenerator targetPackage="com.ningxia.mybatis.model" targetProject=".\src\main\java">
<!--使用子包,表示上面"com.ningxia.mybatis.model"每个.前后一层目录-->
<property name="enableSubPackages" value="true"/>
<!--去掉字符串前后空格-->
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- SQL映射文件生成配置 -->
<sqlMapGenerator targetPackage="com.ningxia.mybatis.mapper" targetProject=".\src\main\resources">
<!--使用子包,表示上面"com.ningxia.mybatis.mapper"每个.前后一层目录-->
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!-- Java客户端接口(mapper接口)生成配置 -->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.ningxia.mybatis.mapper"
targetProject=".\src\main\java">
<!--使用子包,表示上面"com.ningxia.mybatis.mapper"每个.前后一层目录-->
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!-- 指定生成的表
tableName 值为 * 表示对应所有表,此时就不用写 domainObjectName;
domainObjectName:指定生成出来的实体类的名称
-->
<table tableName="t_emp" domainObjectName="Emp"/>
<table tableName="t_dept" domainObjectName="Dept"/>
</context>
</generatorConfiguration>
测试方法
package com.ningxia.mybatis;
import com.ningxia.mybatis.mapper.EmpMapper;
import com.ningxia.mybatis.model.Emp;
import com.ningxia.mybatis.model.EmpExample;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class MBGTest {
/**
* (targetRuntime="MyBatis3"版)逆向工程测试
*/
@Test
public void testMBG() {
SqlSession sqlSession = null;
try {
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
sqlSession = build.openSession(true);
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
//1.查询所有数据
// List<Emp> emps = mapper.selectByExample(null);
// emps.forEach(System.out::println);
//2.条件查询 :
// (1)查询员工名字中带 'n'并且性别为'男'的所有员工信息
// EmpExample example = new EmpExample();
// example.createCriteria().andEmpNameLike("%n%").andSexEqualTo("男");
// List<Emp> empList = mapper.selectByExample(example);
// empList.forEach(System.out::println);
// (2)查询部门id=1并且员工名字中带 'n'或 'j'的所有员工信息
EmpExample example = new EmpExample();
example.createCriteria().andDidEqualTo(1).andEmpNameLike("%n%");
example.or().andSexEqualTo("男");
List<Emp> empList = mapper.selectByExample(example);
empList.forEach(System.out::println);
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
if (sqlSession != null) {
sqlSession.close();
}
}
}
}
八、MyBatis-分页插件
1、使用方法
在
pom.xml
中添加依赖
<!--mybatis 分页插件-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.3.1</version>
</dependency>
在核心配置文件
mybatis-config.xml
中配置分页插件(注意位置顺序)
<!--分页插件-->
<plugins>
<plugin interceptor="com.github.pagehelper.PageHelper"/>
</plugins>
测试方法
在查询之前开启分页功能:PageHelper.startPage(int pageNum, int pageSize);
package com.ningxia.mybatis;
import com.github.pagehelper.PageHelper;
import com.ningxia.mybatis.mapper.EmpMapper;
import com.ningxia.mybatis.model.Emp;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class PageHelperTest {
/**
* mybatis分页测试
* <p>
* limit
* index:当前页的起始索引 index = (pageNum-1)*pageSize
* pageSize:每页条目数
* pageNum:当前页码
* <p>
* 步骤:
* 使用mybatis分页插件实现分页功能
* 在查询之前开启分页功能:PageHelper.startPage(int pageNum, int pageSize);
*/
@Test
public void testPageHelper() {
SqlSession sqlSession = null;
try {
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
sqlSession = build.openSession(true);
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
//1.查询所有数据
//开启分页功能:PageHelper.startPage(int pageNum, int pageSize);
PageHelper.startPage(1, 2);
List<Emp> emps = mapper.selectByExample(null);
emps.forEach(System.out::println);
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
if (sqlSession != null) {
sqlSession.close();
}
}
}
}