一、PageHelper简介
1.什么是分页
分页是一种数据展示技术,用于将大量数据分成若干页显示,每页显示指定数量的数据,以提高用户体验和数据浏览的效率。当数据量很大时,一次性将所有数据加载到页面上可能会导致页面加载缓慢,甚至使浏览器崩溃。而使用分页的方式,可以将数据划分成多个页面,只加载当前页的数据,避免了因数据量过大而导致的性能问题。
分页通常在网页应用程序中使用得较多,例如电商网站的商品列表、新闻网站的文章列表等。用户可以通过翻页或点击页码来切换不同的页面,从而浏览更多的数据。
2.PageHelper是什么
PageHelper是一个开源的Java分页插件,它可以帮助我们在数据库查询中实现分页功能。在传统的数据库查询中,我们需要手动编写SQL语句来实现分页,而PageHelper可以简化这个过程。 使用PageHelper,我们只需要在查询方法中添加少量的代码,就可以实现分页功能。它可以自动解析我们的查询语句,并根据我们指定的页码和每页显示的数量来生成相应的分页SQL语句。同时,PageHelper还提供了一些其他的功能,比如排序、统计等。
3.使用PageHelper的优点
1. 简单易用:PageHelper提供了简洁的API,使用起来非常方便。只需要在查询方法中添加少量的代码,就可以实现分页功能,无需手动编写复杂的分页SQL语句。
2. 兼容性强:PageHelper支持多种数据库,包括MySQL、Oracle、SQL Server等常见的数据库。无论你使用哪种数据库,都可以轻松地集成和使用PageHelper。
3. 功能丰富:除了基本的分页功能,PageHelper还提供了其他实用的功能,比如排序、统计等。你可以根据自己的需求灵活地使用这些功能,提高查询的灵活性和效率。
4. 性能优化:PageHelper在分页查询时,会自动优化SQL语句,减少数据库的查询开销。它会根据查询的条件和分页的设置,生成最优化的SQL语句,提高查询的性能。
5. 开源免费:PageHelper是一个开源的项目,可以免费使用。你可以在项目中直接引入PageHelper的依赖,无需额外的费用。
二、PageHelper插件的使用
<select id="selectByLikeBname" resultMap="BaseResultMap" resultType="java.util.Map"> select <include refid="Base_Column_List"/> from t_mvc_book where bname like #{bname} limit #{start},#{end} </select>
上述可以看到我们可以根据MySQL中的limit关键字进行分页查询,这样也是可以的。但是当需求过大,表过多的情况下,我们又通过逆向工程生成mapper,那么对于每张表分页问题就不好解决了,还需要每次传入的start页码和end条目,那将会显得相当繁琐。
接下来将给大家介绍pageHelper分页插件的使用
1. 导入pom依赖
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.2.0</version> </dependency>
<plugins> <plugin interceptor="com.github.pagehelper.PageInterceptor"/> </plugins>
3. 使用PageHelper进行分页
以书籍表为例:
BookMapper.xml
<select id="selectByBname" resultType="com.ctb.model.Book" parameterType="java.lang.String"> select <include refid="Base_Column_List"/> from t_mvc_book where bname like concat('%',#{bname},'%') </select>
BookMapper.java
List<Book> selectByBname(@Param("bname")String bname);
bookBiz.java
List<Book> selectByBname(@Param("bname")String bname);
bookBizImpl.java
@Override public List<Book> selectByBname(String bname, PageBean pageBean) { if (pageBean!=null && pageBean.isPagination()){ PageHelper.startPage(pageBean.getPage(),pageBean.getRows()); } List<Book> books = bookBiz.selectByBname(bname); if (pageBean!=null && pageBean.isPagination()){ PageInfo<Book> info = new PageInfo<>(books); pageBean.setTotal((int)info.getTotal()); System.out.println("当前页:"+info.getPageNum()+"展示记录数:"+ info.getPageSize()+"符合查询条件的总记录数:"+info.getTotal()); } return books; }
测试类
@Test public void testBname(){ PageBean pageBean=new PageBean(); pageBean.setPage(1); pageBean.setRows(15); bookBiz.selectByBname("圣墟",pageBean).forEach(System.out::println); }
测试结果
注: 这里也是引用了之前的一个工具类--PageBean
工具类实现分页的要素:
- 每页显示的数据量:决定每页显示多少条数据,根据用户需求和系统性能进行设定。
- 当前页码:表示用户当前所处的页码。一般情况下,我们使用数字或者页码链接来显示当前页。
- 总记录数:表示数据总共有多少条。
- 总页数:根据总记录数和每页显示的数据量计算出的总页数。
三、特殊字符的处理
1.SQL注入:
为了防止SQL注入攻击,我们需要对特殊字符进行转义或者使用参数绑定。在使用MyBatis进行数据库查询时,应该尽量使用参数绑定,而不是直接拼接SQL语句。参数绑定可以通过使用#{}
或${}
来实现。其中,#{}
会将参数值转义后作为预编译参数传递给数据库,而${}
则会直接将参数值拼接到SQL语句中,所以在使用${}
时需要特别注意防止SQL注入。
2.XML转义:
在MyBatis的XML配置文件中,如果我们需要在SQL语句中使用特殊字符(如<、>、&等),需要进行XML转义,以避免解析错误。常见的转义字符如下:
特殊字符 | 转义字符 |
< | < |
> | > |
& | & |
" | " |
’ | ' |
<= | <= |
>= | >= |
显示详细信息
示例
<select id="queryminmax" resultType="com.ctb.model.Book" parameterType="com.ctb.dto.BookDto"> select <include refid="Base_Column_List"/> from t_mvc_book where price > #{min} and price < #{max} </select>
3.使用CDATA 区段
<![CDATA[ ]]>是xml语法,在<![CDATA[ ]]>内部的所有内容都会被解析器忽略,不进行转义。CDATA区段可以用来包含一些特殊字符或标记,而不会被XML解析器解析。
特殊字符 | <![CDATA[ ]]> |
< | <![CDATA[<]]> |
> | <![CDATA[>]]> |
& | <![CDATA[&]]> |
" | <![CDATA["]]> |
’ | <![CDATA[']]> |
<= | <![CDATA[<=]]> |
>= | <![CDATA[>=]]> |
!= | <![CDATA[!=]]> |
显示详细信息
<select id="queryminmax" resultType="com.ctb.model.Book" parameterType="com.ctb.dto.BookDto"> select <include refid="Base_Column_List"/> from t_mvc_book where <![CDATA[ price < #{max} and price >#{min} ]]> </select>
两者测试结果一致 ---最常用的是CDATA
MyBatis分页插件PageHelper的使用及特殊字符的处理到这就结束啦!!😊
祝各位友友们身体健康,工作顺利!!