MyBatis笔记(5)-代码生成与分页插件

代码生成

在前面的过程中,我们都是按照一定的流程来使用MyBatis的。我们首先会创建数据库表,然后自己按照规范来书写实体类,Mapper接口以及对应的映射文件。这个过程要遵循一定的规范。

实际上,我们可以利用MyBatis的代码生成器插件来进行代码生成。具体来说,我们在数据库中准备好了数据表之后,可以利用生成器根据数据库表来生成其他必要资源,包括Java实体类、Mapper接口以及Mapper映射文件。下面就简单记录代码生成器的使用。

首先我们需要创建一个Maven项目,然后在其中添加必要的依赖和插件,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<dependencies>
<!--MyBatis核心-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!--Junit测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<!--MySQL驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
<!--log4j日志-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>

<!--控制Maven在构建过程中的相关配置-->
<build>
<!--构建过程中需要用到的插件-->
<plugins>
<!--具体插件-->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.0</version>
<!--插件的依赖-->
<dependencies>
<!--生成器的核心依赖-->
<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.28</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>

第二步需要创建MyBatis的核心配置文件。由于核心配置文件不是由生成器生成的,这里直接按照正常流程创建即可。

第三步需要创建生成器的配置文件,文件名称必须是generatorConfig.xml,其中的内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<context id="DB2Tables" targetRuntime="MyBatis3">
<!-- 数据库的连接信息 -->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/ssm_data"
userId="root"
password="123123">
</jdbcConnection>
<!-- javaBean的生成策略-->
<javaModelGenerator targetPackage="com.syh.bean"
targetProject=".\src\main\java">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- SQL映射文件的生成策略 -->
<sqlMapGenerator targetPackage="com.syh.mapper"
targetProject=".\src\main\resources">
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!-- Mapper接口的生成策略 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.syh.mapper" targetProject=".\src\main\java">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!-- 逆向分析的表 -->
<!-- tableName设置为*号,可以对应所有表,此时不写domainObjectName -->
<!-- domainObjectName属性指定生成出来的实体类的类名 -->
<table tableName="users" domainObjectName="User"/>
</context>
</generatorConfiguration>
  • context标签中需要指定targetRuntime,表示执行使用生成器的版本,可选值为MyBatis3Simple | MyBatis3
    • MyBatis3Simple:简易版生成器,生成的接口中只有基本的CRUD操作
    • MyBatis3:完整版生成器,生成的接口中拥有大量的方法,基本上涵盖了对单表的所有操作
  • 之后我们需要指定数据的连接信息、实体类,映射文件以及Mapper接口的生成策略,在其中指定目标包以及目标路径
  • 然后指定我们的目标数据来源表,以及生成出来的实体类的类名

完成上面的准备操作后,执行Maven插件的mybatis-genrator

生成完毕后可以发现在工程项目中已经出现了对应的实体类,Mapper接口以及映射文件等。

分页插件

在前端列表展示功能中,经常会遇到分页功能的实现。可以考虑常见的分页导航栏,在最底端有首页、上一页、xxx页、下一页、末页等超链接,在每一个页面这些链接对应的实际URL都不同,需要动态变化。我们可以通过SQL中的关键字limit,以及一些条件判断来完成对应的功能,但是较为复杂。对于这种通用的功能,我们可以使用分页插件来完成对应的效果,下面就介绍分页插件的使用。

首先我们需要在Maven工程中添加依赖,如下所示:

1
2
3
4
5
6
<!--分页插件-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.2.0</version>
</dependency>

然后在MyBatis的核心配置文件中设置插件,之后就可以进行使用了。

1
2
3
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor"/>
</plugins>

首先我们准备一个查询所有记录的方法,并实现映射文件中对应的SQL语句:

1
2
3
4
5
<!-- List<User> getUserList()-->
<select id="getUserList" resultType="com.syh.bean.User">
select *
from users
</select>

正常情况下,我们调用方法得到的输出是数据库中全部的记录。但是开启分页功能之后,就只会输出当前页的内容。

1
2
3
PageHelper.startPage(2, 4); // 开启分页功能
List<User> userList = userMapper.getUserList();
userList.forEach(System.out::println);

输出如下,这里设置了开启分页,并设置当前页码(从1开始)以及每页的大小。

1
2
3
4
User{id=6, username='a', password='b', age=0, gender='null', email='null'}
User{id=7, username='a', password='b', age=0, gender='null', email='null'}
User{id=8, username='b', password='c', age=0, gender='null', email='null'}
User{id=9, username='c', password='d', age=0, gender='null', email='null'}

上面startPage方法实际上是有一个返回对象的,返回的就是当前页面的信息,我们可以输出其中的内容进行查看:

1
2
3
Page<Object> page = PageHelper.startPage(2, 4);
List<User> userList = userMapper.getUserList();
System.out.println(page);

输出信息如下,可以看到该页面更加详细的信息,包括页码数,单页的项目总数,开始行,结束行,总数,页数等等。中括号[]中保存的正是当前页面中的所有内容。

1
2
Page{count=true, pageNum=2, pageSize=4, startRow=4, endRow=8, total=10, pages=3, reasonable=false, pageSizeZero=false}
[User{id=6, username='a', password='b', age=0, gender='null', email='null'}, User{id=7, username='a', password='b', age=0, gender='null', email='null'}, User{id=8, username='b', password='c', age=0, gender='null', email='null'}, User{id=9, username='c', password='d', age=0, gender='null', email='null'}]

我们还可以利用一个PageInfo对象来获取分页相关的其他数据:

1
2
3
4
Page<Object> page = PageHelper.startPage(2, 4);
List<User> userList = userMapper.getUserList();
PageInfo<User> userPageInfo = new PageInfo<>(userList, 2);
System.out.println(userPageInfo);

在上面我们给定其中导航栏中的页码数,输出内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
PageInfo{
pageNum=2, pageSize=4, size=4, startRow=5, endRow=8, total=10, pages=3,
list=
Page{count=true, pageNum=2, pageSize=4, startRow=4, endRow=8, total=10, pages=3, reasonable=false, pageSizeZero=false}
[User{id=6, username='a', password='b', age=0, gender='null', email='null'},
User{id=7, username='a', password='b', age=0, gender='null', email='null'},
User{id=8, username='b', password='c', age=0, gender='null', email='null'},
User{id=9, username='c', password='d', age=0, gender='null', email='null'}],
prePage=1,
nextPage=3,
isFirstPage=false,
isLastPage=false,
hasPreviousPage=true,
hasNextPage=true,
navigatePages=2,
navigateFirstPage=1,
navigateLastPage=2,
navigatepageNums=[1, 2]}

其中包括该页以及导航的更多信息:

  • pageNum:当前页的页码
  • pageSize:每页显示的条数
  • size:当前页显示的真实条数
  • startRow:开始行
  • endRow:结束行
  • total:总记录数
  • pages:总页数
  • list:当前页的实际内容
  • prePage:上一页的页码
  • nextPage:下一页的页码
  • isFirstPage:当前页是否为第一页
  • isLastPage:当前页是否为最后一页
  • hasPreviousPage:是否有前一页
  • hasNextPage:是否有下一页
  • navigatePages:导航分页的页码数
  • navigateFirstPage:导航分页的首页
  • navigateLastPage:导航分页的末页
  • navigatepageNums:导航分页的页码

MyBatis笔记(5)-代码生成与分页插件
http://example.com/2022/10/12/MyBatis笔记-5-代码生成与分页插件/
作者
EverNorif
发布于
2022年10月12日
许可协议