MyBatis CURD操作 Druid连接池 PageHelper分页
Author:Exchanges
Version:9.0.2
一、引言
1.1 什么是框架?
软件的半成品,解决了软件开发过程当中的普适性问题,从而简化了开发步骤,提供了开发的效率。
1.2 什么是ORM框架?
- ORM(Object Relational Mapping)对象关系映射,将程序中的一个对象与表中的一行数据一一对应。
- ORM框架提供了持久化类与表的映射关系,在运行时参照映射文件的信息,把对象持久化到数据库中`。
1.3 使用JDBC完成ORM操作的缺点?
存在大量的冗余代码。
手工创建 Connection、Statement 等。
手工将结果集封装成实体对象。
查询效率低,没有对数据访问进行过优化(Not Cache)。
二、MyBatis框架
2.1 概念
- MyBatis本是Apache软件基金会的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了Google Code,并且改名为MyBatis 。2013年11月迁移到Github。
- MyBatis是一个优秀的基于Java的持久层框架,支持自定义SQL,存储过程和高级映射。
- MyBatis对原有JDBC操作进行了封装,几乎消除了所有JDBC代码,使开发者只需关注 SQL 本身。
- MyBatis可以使用简单的XML或Annotation来配置执行SQL,并自动完成ORM操作,将执行结果返回。
2.2 访问与下载
官方网站:http://www.mybatis.org/mybatis-3/
下载地址:https://github.com/mybatis/mybatis-3/releases/tag/mybatis-3.5.1
三、构建Maven项目
3.1 新建项目
使用IDEA打开已创建的文件夹目录 |
---|
3.2 选择Maven目录
选择Maven项目 |
---|
3.3 GAV坐标
GAV坐标 |
---|
四、MyBatis入门案例【重点
】
4.1 建表
create table t_user(
id int primary key auto_increment,
name varchar(50),
password varchar(50)
)default charset = utf8;
INSERT INTO t_user(NAME,PASSWORD) VALUES("jack","123");
INSERT INTO t_user(NAME,PASSWORD) VALUES("tom","456");
INSERT INTO t_user(NAME,PASSWORD) VALUES("rose","789");
4.2 pom.xml中引入MyBatis核心依赖
在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.qf</groupId>
<artifactId>mybatis-02</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13-beta-3</version>
<scope>test</scope>
</dependency>
<!-- 日志 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
</project>
4.3 创建db.properties配置文件
在resources目录下创建db.properties
db.username=root
db.password=root
db.url=jdbc:mysql://localhost:3306/db_name?serverTimezone=Asia/Shanghai&characterEncoding=UTF8
db.driver=com.mysql.cj.jdbc.Driver
4.4 创建log4j.properties配置文件
在resources目录下创建log4j.properties
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
级别 | 描述 |
---|---|
ALL LEVEL | 打开所有日志记录开关;是最低等级的,用于打开所有日志记录。 |
DEBUG | 输出调试信息;指出细粒度信息事件对调试应用程序是非常有帮助的。 |
INFO | 输出提示信息;消息在粗粒度级别上突出强调应用程序的运行过程。 |
WARN | 输出警告信息;表明会出现潜在错误的情形。 |
ERROR | 输出错误信息;指出虽然发生错误事件,但仍然不影响系统的继续运行。 |
FATAL | 输出致命错误;指出每个严重的错误事件将会导致应用程序的退出。 |
OFF LEVEL | 关闭所有日志记录开关;是最高等级的,用于关闭所有日志记录。 |
4.5 创建mybatis-config.xml配置文件
在resources目录下创建并配置mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- mybatis的主配置文件 -->
<configuration>
<!-- 配置外部文件 -->
<properties resource="db.properties"></properties>
<!-- 配置日志(log4j官方配置) -->
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
<!-- 配置别名 -->
<typeAliases>
<!-- <typeAlias type="com.qf.entity.User" alias="user"></typeAlias>-->
<package name="com.qf.entity"/>
</typeAliases>
<!-- 配置环境 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<!-- 配置数据源(连接池) -->
<dataSource type="POOLED">
<property name="driver" value="${db.driver}"/>
<property name="url" value="${db.url}"/>
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}"/>
</dataSource>
</environment>
</environments>
</configuration>
4.6 定义实体类
定义所需CURD操作的实体类
package com.qf.entity;
import lombok.Data;
import java.io.Serializable;
@Data
public class User implements Serializable {
private Integer id;
private String name;
private String password;
}
4.7 定义DAO接口
根据所需DAO定义接口、以及方法
package com.qf.dao;
import com.qf.entity.User;
public interface UserDao {
public List<User> findAll();
}
4.8 编写Mapper.xml
在resources目录中下创建与Dao对应的路径和Mapper.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace = 所需实现的接口全限定名-->
<mapper namespace="com.qf.dao.UserDao">
<!--配置查询所有-->
<!--id = 所需重写的接口抽象方法名,resultType = 查询后所需返回的对象类型-->
<select id="findAll" resultType="user">
select id,name,password from t_user
</select>
</mapper>
4.9 注册Mapper
将Mapper.xml注册到mybatis-config.xml中
<!-- 指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件 -->
<mappers>
<!--<mapper resource="com/qf/dao/UserDao.xml"/>-->
<!--<mapper class="com.qf.dao.UserDao"/>-->
<package name="com.qf.dao"/>
</mappers>
4.10测试
在\src\test\java目录下创建测试类进行测试
package com.qf.demo;
import com.qf.dao.UserDao;
import com.qf.entity.User;
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.InputStream;
import java.util.List;
public class MybatisTest {
//查询所有
@Test
public void testfindAll()throws Exception {
//1.读取配置文件
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//2.创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//3.使用工厂生产SqlSession对象
SqlSession session = factory.openSession();
//4.使用SqlSession创建Dao接口的代理对象
UserDao userDao = session.getMapper(UserDao.class);
//5.使用代理对象执行方法
List<User> users = userDao.findAll();
for(User user : users){
System.out.println(user);
}
//6.释放资源
session.close();
in.close();
}
}
4.11 工作原理
如下图:
总结:
1、读取 MyBatis 配置文件:mybatis-config.xml 为 MyBatis 的全局配置文件,配置了 MyBatis 的运行环境等信息,例如数据库连接信息。
2、加载映射文件。映射文件即 SQL 映射文件,该文件中配置了操作数据库的 SQL 语句,需要在 MyBatis 配置文件 mybatis-config.xml 中加载。mybatis-config.xml 文件可以加载多个映射文件,每个文件对应数据库中的一张表。
3、构造会话工厂:通过 MyBatis 的环境等配置信息构建会话工厂 SqlSessionFactory。
4、创建会话对象:由会话工厂创建 SqlSession 对象,该对象中包含了执行 SQL 语句的所有方法。
5、Executor 执行器:MyBatis 底层定义了一个 Executor 接口来操作数据库,它将根据 SqlSession 传递的参数动态地生成需要执行的 SQL 语句,同时负责查询缓存的维护。
6、MappedStatement 对象:在 Executor 接口的执行方法中有一个 MappedStatement 类型的参数,该参数是对映射信息的封装,用于存储要映射的 SQL 语句的 id、参数等信息。
7、输入参数映射:输入参数类型可以是 Map、List 等集合类型,也可以是基本数据类型和 POJO 类型。输入参数映射过程类似于 JDBC 对 preparedStatement 对象设置参数的过程。
8、输出结果映射:输出结果类型可以是 Map、 List 等集合类型,也可以是基本数据类型和 POJO 类型。输出结果映射过程类似于 JDBC 对结果集的解析过程。
五、MyBatis的CRUD操作【重点
】
5.1 在Dao添加方法
在src\main\java\com\qf\dao\UserDao.java中添加方法
package com.qf.dao;
import com.qf.entity.User;
import org.apache.ibatis.annotations.Param;
import java.util.HashMap;
import java.util.List;
public interface UserDao {
public List<User> findAll();
public User findById(@Param("id") Integer id);
public void add(User user);
public void update(User user);
public void delete(String id);
//模糊查询1
public List<User> findByUserName1(String username);
//模糊查询2
public List<User> findByUserName2(String username);
//模糊查询3
public List<User> findByUserName3(String username);
//获取总记录数
public Integer getTotalCount();
//获取分页数据
public List<User> findPageData(HashMap<String,Integer> hashMap);
}
5.2 在Mapper.xml中添加对应的方法
在\src\main\resources\com\qf\dao\UserDao.xml中写对应的sql
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.qf.dao.UserDao">
<!--配置查询所有-->
<select id="findAll" resultType="user">
select * from t_user
</select>
<!-- 查询单个对象 -->
<select id="findById" resultType="com.qf.entity.User">
select * from t_user where id = #{id}
</select>
<insert id="add">
<selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
select last_insert_id();
</selectKey>
insert into t_user(name,password) values( #{name},#{password} )
</insert>
<update id="update">
update t_user set name = #{name} where id = #{id}
</update>
<delete id="delete">
delete from t_user where id = #{id}
</delete>
<!-- 模糊查询1 -->
<select id="findByUserName1" resultType="user">
SELECT * FROM t_user
WHERE name LIKE concat('%',#{name},'%') <!-- 拼接'%' -->
</select>
<!-- 模糊查询2 -->
<select id="findByUserName2" resultType="com.qf.entity.User">
select * from t_user where name like #{name}
</select>
<!-- 模糊查询3 -->
<select id="findByUserName3" resultType="com.qf.entity.User">
select * from t_user where name like "%"'${value}'"%"
</select>
<!-- 查询总记录数 -->
<select id="getTotalCount" resultType="java.lang.Integer">
select count(id) from t_user
</select>
<!-- 查询总记录数 -->
<select id="findPageData" resultType="com.qf.entity.User">
select * from t_user limit #{first},#{second}
</select>
</mapper>
5.3 测试
在\src\test\java目录下测试类中添加方法进行测试
package com.qf.demo;
import com.qf.dao.UserDao;
import com.qf.entity.User;
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.InputStream;
import java.util.HashMap;
import java.util.List;
public class MybatisTest {
//查询所有
@Test
public void testfindAll()throws Exception {
//1.读取配置文件
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//2.创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//3.使用工厂生产SqlSession对象
SqlSession session = factory.openSession();
//4.使用SqlSession创建Dao接口的代理对象
UserDao userDao = session.getMapper(UserDao.class);
//5.使用代理对象执行方法
List<User> users = userDao.findAll();
for(User user : users){
System.out.println(user);
}
//6.释放资源
session.close();
in.close();
}
//查询单个
@Test
public void testfindById()throws Exception {
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
SqlSession session = factory.openSession();
//---------------------------------------------
UserDao userDao = session.getMapper(UserDao.class);
//5.使用代理对象执行方法
User user = userDao.findById(1);
System.out.println(user);
//---------------------------------------------
session.close();
in.close();
}
//添加
@Test
public void testadd()throws Exception {
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
SqlSession session = factory.openSession();
//---------------------------------------------
UserDao userDao = session.getMapper(UserDao.class);
User user = new User();
user.setName("张三");
user.setPassword("123");
userDao.add(user);
System.out.println(user.getId());
//提交
session.commit();
//---------------------------------------------
session.close();
in.close();
}
//修改
@Test
public void testupdate()throws Exception {
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
SqlSession session = factory.openSession();
//---------------------------------------------
UserDao userDao = session.getMapper(UserDao.class);
User user = userDao.findById(4);
//user.setId(5);
user.setName("李四");
user.setPassword("456");
userDao.update(user);
//提交
session.commit();
//---------------------------------------------
session.close();
in.close();
}
//删除
@Test
public void testdelete()throws Exception {
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
SqlSession session = factory.openSession();
//---------------------------------------------
UserDao userDao = session.getMapper(UserDao.class);
userDao.delete("4");
//提交
session.commit();
//---------------------------------------------
session.close();
in.close();
}
//模糊查询
@Test
public void testfindByUserName()throws Exception {
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
SqlSession session = factory.openSession();
//---------------------------------------------
String name = "张";
UserDao userDao = session.getMapper(UserDao.class);
//List<User> users = userDao.findByUserName1(name);
//List<User> users = userDao.findByUserName2("%" + name + "%");
List<User> users = userDao.findByUserName3(name);
for(User user : users){
System.out.println(user);
}
//---------------------------------------------
session.close();
in.close();
}
//查询总记录数
@Test
public void testgetTotalCount()throws Exception {
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
SqlSession session = factory.openSession();
//---------------------------------------------
UserDao userDao = session.getMapper(UserDao.class);
System.out.println(userDao.getTotalCount());
//---------------------------------------------
session.close();
in.close();
}
//查询分页数据
@Test
public void testfindPageData()throws Exception {
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
SqlSession session = factory.openSession();
//---------------------------------------------
UserDao userDao = session.getMapper(UserDao.class);
HashMap<String, Integer> hashMap = new HashMap<>();
hashMap.put("first",0);
hashMap.put("second",3);
List<User> users = userDao.findPageData(hashMap);
for(User user : users){
System.out.println(user);
}
//---------------------------------------------
session.close();
in.close();
}
}
5.4 MybatisUtil工具类封装
package com.qf.utils;
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 java.io.IOException;
import java.io.Reader;
//考虑问题:多个用户获取SqlSession对象时,线程安全问题
public class MybatisUtil {
//声明SqlSessionFactory
private static SqlSessionFactory sqlSessionFactory;
//ThreadLocal线程副本:给每个线程创建变量副本,用于保证一个线程对某个变量的修改不会影响其他线程对该变量的使用
private static final ThreadLocal<SqlSession> THREAD_LOCAL = new ThreadLocal<SqlSession>();
//实例化SqlSessionFactory
static {
try {
//读取主配置文件
Reader resourceAsReader = Resources.getResourceAsReader("mybatis-config.xml");
//实例化
sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsReader);
} catch (IOException e) {
e.printStackTrace();//显示到控制台
}
}
//获取SqlSession对象
public static SqlSession getSqlSession(){
//获取sqlSession
SqlSession sqlSession = THREAD_LOCAL.get();
//判断
if(sqlSession == null){
sqlSession = sqlSessionFactory.openSession();
//设置当前线程副本中的值
THREAD_LOCAL.set(sqlSession);
}
return sqlSession;
}
//关闭
public static void close(){
//获取sqlSession
SqlSession sqlSession = THREAD_LOCAL.get();
if(sqlSession!=null){
sqlSession.close();
//删除当前线程副本中的值,为了防止内存溢出(OOM)和内存泄漏而导致程序报错
THREAD_LOCAL.remove();
}
}
//提交事务
public static void commit(){
getSqlSession().commit();
close();
}
//回滚事务
public static void rollback(){
getSqlSession().rollback();
close();
}
}
使用工具类测试
@Test
public void testMybatisUtilFindAll() throws Exception{
//获取SqlSession
SqlSession sqlSession = MybatisUtil.getSqlSession();
//获取Mapper接口的代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//测试方法
List<User> userList = userMapper.findAll();
System.out.println(userList);
//释放资源
MybatisUtil.close();
}
5.5 注解方式【了解】
MyBatis除了使用xml方式操作数据库,也可以通过在接口中直接添加MyBatis注解,进行操作
@Select("select * from t_user where id = #{id}")
public User findById(Integer id);
@Select("select * from t_user")
public List<User> findAll();
@Insert("insert into t_user(name) values( #{name} )")
public void add(User user);
@Update("update t_user set name = #{name} where id = #{id}")
public void update(User user);
@Delete("delete from t_user where id = #{id}")
public void delete(Integer id);
//获取总记录数
@Select("select count(id) from t_user")
public Integer getTotalCount();
//获取分页数据
@Select("select * from t_user limit #{first},#{second}")
public List<User> findPageData(@Param("first") Integer first,@Param("second") Integer second);
六、Druid连接池
6.1 概念
Druid 是阿里巴巴开源平台上的一个项目,整个项目由数据库连接池、插件框架和 SQL 解析器组成。该项目主要是为了扩展 JDBC 的一些限制,可以让程序员实现一些特殊的需求,比如向密钥服务请求凭证、统计 SQL 信息、SQL 性能收集、SQL 注入检查、SQL 翻译等,程序员可以通过定制来实现自己需要的功能。
6.2基准测试结果对比
JDBC-Conn Pool | 1 Thread | 2 threads | 5 threads | 10 threads | 20 threads | 50 threads |
---|---|---|---|---|---|---|
Druid | 898 | 1,191 | 1,324 | 1,362 | 1,325 | 1,459 |
tomcat-jdbc | 1,269 | 1,378 | 2,029 | 2,103 | 1,879 | 2,025 |
DBCP | 2,324 | 5,055 | 5,446 | 5,471 | 5,524 | 5,415 |
BoneCP | 3,738 | 3,150 | 3,194 | 5,681 | 11,018 | 23,125 |
jboss-datasource | 4,377 | 2,988 | 3,680 | 3,980 | 32,708 | 37,742 |
C3P0 | 10,841 | 13,637 | 10,682 | 11,055 | 14,497 | 20,351 |
Proxool | 16,337 | 16,187 | 18,310(Ex) | 25,945 | 33,706(Ex) | 39,501 (Ex) |
6.3 测试结论
- Druid 是性能最好的数据库连接池,tomcat-jdbc 和 druid 性能接近。
- Proxool 在激烈并发时会抛异常,不适用。
- C3P0 和 Proxool 都相当慢,影响 sql 执行效率。
- BoneCP 性能并不优越,采用 LinkedTransferQueue 并没有能够获得性能提升。
- 除了 bonecp,其他的在 JDK 7 上跑得比 JDK 6 上快。
- jboss-datasource 虽然稳定,但性能很糟糕。
6.4 配置pom.xml
引入Druid依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.9</version>
</dependency>
6.5 创建DruidDataSourceFactory
在\src\main\java\com\qf\utils目录创建MyDruidDataSourceFactory来替换数据源
package com.qf.config;
import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.datasource.pooled.PooledDataSourceFactory;
public class MyDruidDataSourceFactory extends PooledDataSourceFactory {
public MyDruidDataSourceFactory() {
this.dataSource = new DruidDataSource();//替换数据源
}
}
6.6修改mybatis-config.xml
修改mybatis-config.xml中连接池的相关配置,指定Druid数据源
<!--连接池-->
<dataSource type="com.qf.config.MyDruidDataSourceFactory">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
注意:< property name="属性名" />属性名必须与com.alibaba.druid.pool.DruidAbstractDataSource中一致。
七、PageHelper
7.1 概念
PageHelper是适用于MyBatis框架的一个分页插件,使用方式极为便捷,支持任何复杂的单表、多表分页查询操作。
7.2 访问与下载
7.3 开发步骤
1.在pom.xml中引入PageHelper依赖。
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.3.0</version>
</dependency>
2.在MyBatis-config.xml中添加< plugins >
<configuration>
<typeAliases></typeAliases>
<plugins>
<!-- com.github.pagehelper为PageHelper类所在包名 -->
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<property name="reasonable" value="true"/>
<property name="supportMethodsArguments" value="true"/>
</plugin>
</plugins>
<environments>...</environments>
</configuration>
3.在测试类中添加方法进行测试
//查询分页
@Test
public void testfindByPage()throws Exception {
//1.读取配置文件
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//2.创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//3.使用工厂生产SqlSession对象
SqlSession session = factory.openSession();
//4.使用SqlSession创建Dao接口的代理对象
UserDao userDao = session.getMapper(UserDao.class);
//5.使用代理对象执行方法
PageHelper.startPage(1,2);//设置当前页和每页显示记录数
List<User> users = userDao.findAll();
PageInfo<User> userPageInfo = new PageInfo<>(users);//封装到PageInfo对象中
System.out.println(userPageInfo);
//6.释放资源
session.close();
in.close();
}
7.4 PageInfo对象
PageInfo对象中包含了分页操作中的所有相关数据。
PageInfo结构图 |
---|
7.5 注意事项
- 只有在PageHelper.startPage()方法之后的第一个查询会有执行分页。
- 分页插件不支持带有“for update”的查询语句。
- 分页插件不支持“嵌套查询”,由于嵌套结果方式会导致结果集被折叠,所以无法保证分页结果数量正确。