MyBatis01:创建、运行、测试一个mybatis项目
MyBatis02:使用MyBatis查询数据
MyBatis03:嵌套查询、嵌套结果、延迟加载
MyBatis04:动态SQL
MyBatis05:类型转换器
MyBatis06:分页插件、MyBatis配置文件中的标签
MyBatis07:MyBatis注解
本文继续介绍MyBatis框架下如何使用框架实现分页。以及对MyBatis配置文件中的一些标签进行了讲解。
在MyBatis的主配置文件夹下添加该拦截器插件。
<configuration>
<plugins>
<plugin interceptor="com.github.pagehelper.PageHelper">
<property name="dialect" value="mysql"/>
<property name="reasonable" value="true"/>
plugin>
plugins>
configuration>
拦截器的作用:在某程序要执行之前先捕获该程序,对该程序执行一定的操作。
使用分页插件后,查询总记录数和查询要显示的数据集合的工作就由分页插件来帮我们做。
这个是根据条件查询学生信息,然后对查询到的数据集合进行分页。这里只需要根据条件查询数据就可以了。
// 通过分页插件实现分页
List<Student> selectByPagePlug(Student student);
只需要查询到所有满足条件的数据集合即可
<select id="selectByPagePlug" resultMap="baseMap">
select <include refid="Base_Column_List">include> from student
<where>
<if test="name != null">
name like concat("%",#{name},"%")
if>
<if test="sex != null">
and sex = #{sex}
if>
<if test="birthday != null">
and birthday = #{birthday}
if>
<if test="age != null and age > 0">
and age = #{age}
if>
<if test="classid != null and classid > 0">
and classid = #{classid}
if>
where>
select>
通过分页信息对象 PageInfo
获取分页信息和查询到的数据集合。
// 通过分页插件实现分页
PageInfo<Student> selectByPagePlug(Student student, int pageNum, int pageSize);
这里通过PageHelper拦截器来拦截dao层SQL语句。使得可以查询总记录数和指定的记录。
@Override
public PageInfo<Student> selectByPagePlug(Student student, int pageNum, int pageSize) {
// 当调用dao层查询方法之前,必须先设置分页的相关信息,针对马上执行的下一条select语句进行分页
// 先设置分页信息,再获取查询结果
// PageHelper是一个拦截器,用于拦截紧邻的一条dao层语句,在执行查询之前,会先查询到总记录数,以及使用limit查询到指定条数据
// id desc指定按什么字段以及排序规则,可写可不写
PageHelper.startPage(pageNum, pageSize, "id desc");
List<Student> students = this.studentMapper.selectByPagePlug(student);
// PageInfo的作用是
PageInfo<Student> pageInfo = new PageInfo<>(students);
return pageInfo;
}
注意:如果这里要使用排序 id desc,需要明确是对哪个字段进行排序
PageInfo 是分页插件类,包含分页的所有信息 。
插件属性 | 含义 |
---|---|
pageNum | 当前页 |
pageSize | 每页的数量 |
size | 当前页的数量 |
total | 总记录数(在这里也就是查询到的用户总数) |
pages | 总页数 (这个页数也很好算,每页5条,总共有11条,需要3页才可以显示完) |
orderBy | 排序 |
startRow | 当前页面第一个元素在数据库中的行号 |
endRow | 当前页面最后一个元素在数据库中的行号 |
list | 结果集 |
prePage | 前一页 |
nextPage | 下一页 |
isFirstPage | 是否为第一页 |
isLastPage | 是否为最后一页 |
hasPreviousPage | 是否有前一页 |
hasNextPage | 是否有下一页 |
navigatePages | 导航页码数 |
navigatepageNums | 所有导航页号 |
navigateFirstPage | 导航第一页 |
navigateLastPage | 导航最后一页 |
firstPage | 第一页 |
lastPage | 最后一页 |
这里再次说明一下 PageInfo
对象中同时包含着分页信息和集合信息。
@Test
public void selectByPagePlug() {
// 获取PageInfo对象
PageInfo<Student> stusInfo = this.studentService.selectByPagePlug(new Student(), 2, 2);
// 获取集合信息
List<Student> students = stusInfo.getList();
// 输出集合信息
students.forEach((student)->{
System.out.println(student.getId() + "\t" + student.getName());
});
// 输出分页信息
System.out.println("总记录数:" + stusInfo.getTotal() + "\t总页数" + stusInfo.getPages() + "\t当前第"
+ stusInfo.getPageNum() + "页");
}
PageHelper拦截器的作用:拦截紧邻的SQL语句,并对其进行一定的处理。
dao层的SQL语句是 select * from student
拦截器的第一个处理是:根据这个SQL语句,查询总记录数 select count(*) from student
拦截器的第二个处理是:根据这个SQL语句,查询要显示的集合数据 select * from student limit ?, ?
使用了分页插件后,我们只需要需要查询的SQL语句即可,记录总数和要显示的数据集合都是由插件来获取的。
dao层的SQL语句是 select * from student where classid = ?
拦截器的第一个处理是:根据这个SQL语句,查询总记录数 select count(*) from student where classid = ?
拦截器的第二个处理是:根据这个SQL语句,查询要显示的集合数据 select * from student where classid = ? (order by xxx) limit ?, ?
从以上对比可以看出拦截器的两个操作:
第一个操作:使用 count(*)
查询记录总数
第二个操作:使用 limit ?, ?
查询要显示的数据集合
MyBatis配置文件中的标签是有顺序的,标签顺序错误,配置文件会报错。
标签 | 作用 |
---|---|
properties | 配置文件中的属性值 |
setting | 修改MyBatis在运行时的行为方式 |
typeAliases | 为java类起别名 |
typeHandlers | 类型处理器 |
objectFactory | 对象工厂 |
plugins | 插件 |
environments | 环境 |
mappers | 映射器 |
DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="dbconfig.properties">properties>
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
settings>
<typeAliases>
<typeAlias type="com.tentact.bean.Student" alias="Student">typeAlias>
<package name="com.tentact.bean"/>
typeAliases>
<typeHandlers>
<typeHandler handler="com.common.StringArrayTypeHandler" javaType="[Ljava.lang.String;" jdbcType="VARCHAR">typeHandler>
typeHandlers>
<plugins>
<plugin interceptor="com.github.pagehelper.PageHelper">
<property name="dialect" value="mysql"/>
<property name="reasonable" value="true"/>
plugin>
plugins>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
dataSource>
environment>
environments>
<mappers>
<mapper resource="com/mapping/HealhistoryMapper.xml">mapper>
<mapper resource="com/mapping/PetMapper.xml">mapper>
<mapper resource="com/mapping/PettypeMapper.xml">mapper>
mappers>
configuration>
在JavaSE项目中properties文件直接放在src文件夹下即可。
在JavaWeb项目中properties文件需要放在resource文件夹下。
properties文件存储的是键值对。在xml文件中需要通过${}来引用属性。
在xml文件中:&等符号在xml文件中需要用字符实体来代替。
在properties文件中:则直接使用&符号
举例:dbconfig.properties文件
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/pet?useUnicode=true&characterEncoding=utf-8
username=root
password=123456
今天学习了如何使用MyBatis框架中的分页插件,相比使用之前的分页工具类而言,插件简化很多操作,使用也更加方便。还介绍了一下MyBatis配置文件中的标签,对MyBatis框架的标签也有进一步的理解。