一、概述
🌔 1、如何理解分页?
🌔 2、准备工作
-
创建一个新模块:mybatis-014-page
-
除了CarMapper、CarMapper.xml、CarMapperTest三兄弟,其他的文件都是从之前的模块拷贝过来的
-
操作的还是我们的 t_car 表
-
本篇的主要内容:
-
通过 limit 关键字我们自己模拟一下分页输出的效果
-
导入并使用 PageHelper 插件
二、limit 分页
🌔 1、什么是 limit 关键字,如何使用?
-
在mysql中limit关键字用来强制 SELECT 语句返回指定的记录数
-
该关键字后一版跟着两个数:
-
第一个数 startIndex 代表数据的起始位置
-
第二个数 pageSize 代表显示的数据条数
-
当该关键字后只有一个数的时候,代表起始位置是从 0 开始的
🌔 2、我们手写一个利用 limit 关键字的 SQL:
(1)接口中的方法:【此处使用了@Param注解提高可读性】
/**
* 分页查询
* @param startIndex 起始下标
* @param pageSize 每页显示的记录条数
* @return
*/
List<Car> selectByPage(@Param("startIndex") int startIndex, @Param("pageSize") int pageSize);
(2)映射文件中的SQL语句:
<select id="selectByPage" resultType="Car">
select * from t_car limit #{
startIndex}, #{
pageSize}
</select>
(3)测试类中的测试方法:
@Test
public void testSelectByPage() throws Exception{
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession();
CarMapper mapper = sqlSession.getMapper(CarMapper.class);
// 固定我们的每页显示记录条数和起始位置
int pageNum = 2; //第几页
int pageSize = 2;
int startIndex = (pageNum - 1) * pageSize;
// 调用我们分页查询SQL
List<Car> cars = mapper.selectByPage(startIndex, pageSize);
cars.forEach(car -> System.out.println(car));
sqlSession.close();
}
我们查看表中的数据,确实显示的是第二页的两条数据
三、 PageHelper 插件
🌔 1、什么是PageHelper插件?
- 是一个很好的 mybatis 分页插件
- 通过一些简单的配置就可以使用这个插件
🌔 2、使用这个插件的流程是什么?
(1)在 pom.xml 文件中引入相关依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.3.1</version>
</dependency>
(2)在mybatis核心配置文件 mybatis-config.xml 中进行配置
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>
(3)编写我们的接口方法
/**
* 利用分页插件查询
* @return
*/
List<Car> selectAll();
(4)编写我们的 SQL 语句:【此处只需要查询全部数据,分页显示依靠插件完成】
<select id="selectAll" resultType="Car">
select * from t_car
</select>
(5)编写我们的测试方法
@Test
public void testSelectAll(){
SqlSession sqlSession = SqlSessionUtil.openSession();
CarMapper mapper = sqlSession.getMapper(CarMapper.class);
int pageNum = 2;
int pageSize = 2;
// 开启我们的分页插件
PageHelper.startPage(pageNum, pageSize);
List<Car> cars = mapper.selectAll();
cars.forEach(car -> System.out.println(car));
PageInfo<Car> carPageInfo = new PageInfo<>(cars, 2);
System.out.println(carPageInfo);
sqlSession.close();
}
- 想要使用我们的分页插件,只需要在执行查询之前开启我们的分页功能【传递两个参数,第几页、页大小】
- 查询语句之后封装PageInfo对象。【将来会存储到request域当中,进而在前端页面上展示】
- PageInfo 中的属性含义如下:
属性名 | 含义 |
---|---|
pageNum | 代表当前页号 |
pageSize | 代表每页的数量 |
size | 代表当前页的数量 |
startRow | 代表当前页面第一个元素的行号 |
endRow | 代表当前页面最后一个元素的行号 |
total | 代表总记录数 |
pages | 代表总记录数 |
list | 代表查询结果集 |
prePage | 上一页页号 |
nextPage | 下一页页号 |
isFirstPage | 是否为第一页 |
isLastPage | 是否为最后一页 |
hasPreviousPage | 是否有前一页 |
hasNextPage | 是否有下一页 |
navigatePages | 导航页码数 |
navigatepageNums | 所有导航页号 |
navigateFirstPage | 导航条上的第一页 |
navigateLastPage | 导航条的最后一页 |
四、注解开发
🌔 1、注解开发的应用场景?
- 适用于简单的SQL语句,内嵌在接口方法上,提高了维护成本
- 注解映射看起来更简洁,但是对于复杂的语句并不适用
🌔 2、准备工作?
- 创建新模块: mybatis-015-annotation
- 操作的表:t_car
- 其他不变,只是此次三兄弟变成了两兄弟:CarMapper接口、CarMapperTest测试方法
- 目录结构
🌔 3、@Insert 注解
(1)接口方法
@Insert(value = "insert into t_car values(null, #{carNum}, #{brand}, #{guidePrice}, #{produceTime}, #{carType})")
int insert(Car car);
(2)测试方法
@Test
public void testInsert() throws Exception{
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = build.openSession();
CarMapper mapper = sqlSession.getMapper(CarMapper.class);
// 创建我们要插入的汽车对象
Car car = new Car(null, "103", "路虎", 200.0, "2022-11-09", "燃油车");
int count = mapper.insert(car);
System.out.println(count);
sqlSession.commit();
sqlSession.close();
}
(3)测试结果: 插入数据成功
🌔 4、@Delete注解
(1)接口方法
@Delete("delete from t_car where id = #{id}")
int deleteById(Long id);
(2)测试方法
@Test
public void testDeleteById() throws Exception{
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession();
CarMapper mapper = sqlSession.getMapper(CarMapper.class);
int count = mapper.deleteById(29L);
System.out.println(count);
sqlSession.commit();
sqlSession.close();
}
(3)测试结果 >> 删除数据成功
🌔 5、@Update 注解
(1)接口方法
@Update("update t_car set car_num = #{carNum}, brand = #{brand}, guide_price = #{guidePrice}, produce_time = #{produceTime}, car_type = #{carType} where id = #{id}")
int update(Car car);
(2)测试方法
@Test
public void testUpdate() throws Exception{
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession();
CarMapper mapper = sqlSession.getMapper(CarMapper.class);
Car car = new Car(32L, "", "宾利飞驰", 222.0, "2022-11-09", "燃油车");
int count = mapper.update(car);
System.out.println(count);
sqlSession.commit();
sqlSession.close();
}
(3)测试结果:更新数据成功
🌔 6、@Select 注解
(1)接口方法
@Select("select * from t_car where id = #{id}")
Car selectById(Long id);
(2)测试方法
@Test
public void testSelectById() throws Exception{
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession();
CarMapper mapper = sqlSession.getMapper(CarMapper.class);
Car car = mapper.selectById(37L);
System.out.println(car);
sqlSession.close();
}
(3)测试结果:输出指定id的数据
- 通过观察我们可以发现,此处select语句直接使用了 select *,可以正常输出是因为我们开启了驼峰自动映射机制
- 如果我们没有开启,需要怎么处理呢?
我们可以通过 @Result 注解来完成属性名与字段名的映射:【只需要在Select注解和方法间添加@result注解】
@Results({
@Result(property = "id", column = "id"),
@Result(property = "carNum", column = "car_num"),
@Result(property = "brand", column = "brand"),
@Result(property = "guidePrice", column = "guide_price"),
@Result(property = "produceTime", column = "produce_time"),
@Result(property = "carType", column = "car_type"),
})