1. PageHelper分页插件
PageHelper是Mybatis通用的分页插件,更加详细地用法参考官方文档。
下面演示一下该插件的一些功能的用法。
1.1 步骤
先导入需要的Jar包,可以在官方文档地址处下载。
在全局配置文件中,配置插件。
演示PageHelper类代码:
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
public void test() throws IOException {
//1.根据MyBatis的配置文件,即mybatis-config.xml创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
//2.获取session实例,能直接执行*已经映射的SQL语句*
SqlSession session = sqlSessionFactory.openSession();
try {
//3.获取接口的实现类对象
EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);
//第一个参数为页码,第二个参数为每页显示的数量
Page<Object> page = PageHelper.startPage(1, 4);
//查询获取所有的员工对象
List<Employee> emps = mapper.getAllEmps();
//输出所有员工的数据
for (Employee emp : emps) {
System.out.println(emp);
}
//获取全部查询的员工数据数量
long total = page.getTotal();
System.out.println("员工数据数量:" + total);
//获取所有页码数量
int pages = page.getPages();
System.out.println("所有页码数量" + pages);
int pageSize = page.getPageSize();
System.out.println("每页大小:" + pageSize);
int pageNum = page.getPageNum();
System.out.println("当前页号:" + pageNum);
int startRow = page.getStartRow();//从0开始算
System.out.println("当前页的开始行号:" + startRow);
} finally {
//4.关闭会话session
session.close();
}
}
public SqlSessionFactory getSqlSessionFactory() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
return sqlSessionFactory;
}注意:PageHelper的调用需要在查询数据库之前,否则不会分页显示数据的。
演示PageInfo类代码:
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
public void test() throws IOException {
//1.根据MyBatis的配置文件,即mybatis-config.xml创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
//2.获取session实例,能直接执行*已经映射的SQL语句*
SqlSession session = sqlSessionFactory.openSession();
try {
//3.获取接口的实现类对象
EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);
PageHelper.startPage(4, 1);//分页
//查询获取所有的员工对象
List<Employee> emps = mapper.getAllEmps();
//输出所有员工的数据
for (Employee emp : emps) {
System.out.println(emp);
}
// PageInfo<Employee> pageInfo = new PageInfo<>(emps);
//第二个参数为页码,表示要连续显示几页
PageInfo<Employee> pageInfo = new PageInfo<>(emps,4);
int[] navigatepageNums = pageInfo.getNavigatepageNums();
System.out.println("连续显示的页码:");
for (int i : navigatepageNums) {
System.out.print(i + " ");
}
System.out.println();
//获取所有页码数量
int pages = pageInfo.getPages();
System.out.println("所有页码数量:" + pages);
int pageSize = pageInfo.getPageSize();
System.out.println("每页大小:" + pageSize);
int pageNum = pageInfo.getPageNum();
System.out.println("当前页号:" + pageNum);
int startRow = pageInfo.getStartRow();//从0开始算
System.out.println("当前页的开始行号:" + startRow);
boolean isFirstPage = pageInfo.isIsFirstPage();
System.out.println("是否为第一页:" + isFirstPage);
long total = pageInfo.getTotal();
System.out.println("员工数据总数量:" + total);
} finally {
//4.关闭会话session
session.close();
}
}运行结果:
2. 批量操作
之前我们执行批量插入的时候,通常调用数据库进行如下的SQL语句格式的操作:
1
21. insert into 表名 values(xxx,xxx,xxx),values(xxx,xxx,xxx),...
2. insert into 表名 values(xxx,xxx,xxx);insert into 表名 values(xxx,xxx,xxx);
但是以上的做法可能形成冗长的SQL语句,从而超出数据库的限制,下面我们可以通过设置BatchExector配置的形式来处理。
假如映射器定义有如下方法:
1 | //增加员工方法 |
对应的映射器文件配置如下:
1 | <insert id="addEmp" useGeneratedKeys="true" keyProperty="id"> |
测试代码如下:
运行结果如下:
如果我们改用之前的sqlSession对象,也就是通过如下语句获取创建的:
1 | SqlSession session = sqlSessionFactory.openSession(false); |
其运行结果如下所示:
从以上两次运行结果可以明显得知,使用ExectorType.BATCH配置来执行批量插入耗时更短,它只预编译一次并执行一次SQL语句。而原本的方式则每次都会预编译一次SQL语句,并且每次都会执行一次SQL语句,也就说我每插入100条数据,数据库就会执行100百次SQL语句。显然,这是不可取的。