只要你可以保证在PageHelper方法调用后紧跟 MyBatis 查询方法,这就是安全的。因为PageHelper在finally代码段中自动清除了ThreadLocal存储的对象。
项目实战
1、依赖
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!-- mysql-connector-java 连接数据库,版本最好和数据库的版本一致 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.2.0</version>
</dependency>
2、编写 mybatis 配置文件 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">
<configuration>
<!-- 分页插件 -->
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<property name="helperDialect" value="mysql"/>
</plugin>
</plugins>
<!-- 运行环境的配置 可以配置很多个 (mybatis连接数据库)environments中每个environment都是一个运行环境 default 默认启用的运行环境 -->
<environments default="development">
<environment id="development">
<!-- 事务管理器 -->
<transactionManager type="JDBC" />
<!-- 配置数据源 type="POOLED" 以连接池的方式连接-->
<dataSource type="POOLED">
<!-- 驱动 -->
<property name="driver" value="com.mysql.cj.jdbc.Driver" />
<!-- 数据库的地址 -->
<property name="url" value="jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=true" />
<!-- 数据库用户名 -->
<property name="username" value="root" />
<!-- 数据库密码 -->
<property name="password" value="admin" />
</dataSource>
</environment>
</environments>
<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers>
<mapper class="com.hkp.mapper.UserMapper"/>
</mappers>
</configuration>
3、编写实体类
@Data
public class User {
private int id;
private String name;
private String password;
}
4、编写接口
public interface UserMapper {
@Select("select * from user")
List<User> getAll();
}
5、编写测试代码
@Test
public void test() throws Exception {
//读取mybatis 核心配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
//创建工厂构建器
SqlSessionFactoryBuilder sqlSessionFactoryBuilder=new SqlSessionFactoryBuilder();
//使用 mybatis 核心配置文件 构建工厂
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
//打开 sql 会话(跟数据库打开了一个会话)
SqlSession sqlSession = sqlSessionFactory.openSession();
//使用sql会话执行sql语句
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 分页设置(主要要和查询语句紧挨着,中间不许有其他代码)
// 第一个参数是页码,第二个参数是每页的数量
PageHelper.startPage(1,3);
// PageInfo{pageNum=1, pageSize=3, size=3, startRow=1, endRow=3, total=5, pages=2, list=Page{count=true, pageNum=1, pageSize=3, startRow=0, endRow=3, total=5, pages=2, reasonable=false, pageSizeZero=false}[User(id=1, name=Jone, password=18), User(id=3, name=Tom, password=28), User(id=11, name=1, password=1)], prePage=0, nextPage=2, isFirstPage=true, isLastPage=false, hasPreviousPage=false, hasNextPage=true, navigatePages=8, navigateFirstPage=1, navigateLastPage=2, navigatepageNums=[1, 2]}
List<User> user = mapper.getAll();
// 把查询出来的集合变成分页的对象
PageInfo<User> pageInfo = new PageInfo<>(user);
System.out.println(pageInfo);
System.out.println("查询出来的数据 :"+pageInfo.getList());
//查询出来的数据 :Page{count=true, pageNum=1, pageSize=3, startRow=0, endRow=3, total=5, pages=2, reasonable=false, pageSizeZero=false}[User(id=1, name=Jone, password=18), User(id=3, name=Tom, password=28), User(id=11, name=1, password=1)]
System.out.println("数据总条数 :"+pageInfo.getTotal());// 5
//关闭会话,释放资源
sqlSession.close();
}
在 Springboot 中项目实战
1、导入依赖
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
<!-- mysql-connector-java 连接数据库,版本最好和数据库的版本一致 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
</dependency>
<!-- PageHelper -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.0</version>
</dependency>
2、在 application.properties 文件中配置连接数据库的信息
#连接驱动
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#配置数据库连接地址
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf-8&useSSL=false
#配置数据库连接用户名
spring.datasource.username=root
#配置数据库连接密码
spring.datasource.password=admin
#配置日志信息
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
3、创建实体
@Data
public class User {
private int id;
private String name;
private String password;
}
4、创建接口
public interface UserMapper {
@Select("select * from user")
List<User> getAll();
}
5、编写springboot启动类
@MapperScan("com.hkp.mapper")
@SpringBootApplication
public class PageApplication {
public static void main(String[] args) {
SpringApplication.run(PageApplication.class,args);
}
}
6、编写Controller
注意,这里一切从简了,正常应该还有一层 service ,我这边就省略了
@RestController
public class UserController {
@Autowired
private UserMapper userMapper;
@GetMapping("/")
public PageInfo<User> getAll(){
//1、调用PageHelper的startPage方法设置参数,其中page为当前页,size为每页显示条数
PageHelper.startPage(1,3);
//2、调用Mapper层查询全部的方法
List<User> all = userMapper.getAll();
//3、构造pageInfo返回值
return new PageInfo(all);
}
}
启动测试
浏览器输入 localhost:8080