一、分页
mysql 的 limit 后面两个数字:
-
第一个数字:startIndex(起始下标。下标从0开始。)
-
第二个数字:pageSize(每页显示的记录条数)
假设已知页码 pageNum,还有每页显示的记录条数 pageSize,第一个数字可以动态的获取吗?
所以,标准通用的 mysql 分页 SQL:
select
*
from
tableName ......
limit
(pageNum - 1) * pageSize, pageSize
使用 mybatis 应该怎么做?
package com.powernode.mybatis.mapper;
import org.qiu.mybatis.pojo.Car;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface CarMapper {
/**
* 通过分页的方式获取Car列表
* @param startIndex 页码
* @param pageSize 每页显示记录条数
* @return
*/
List<Car> selectAllByPage(@Param("startIndex") Integer startIndex, @Param("pageSize") Integer pageSize);
}
<?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="org.qiu.mybatis.mapper.CarMapper">
<select id="selectAllByPage" resultType="Car">
select * from t_car limit #{startIndex},#{pageSize}
</select>
</mapper>
package com.qiu.mybatis.test;
import org,qiu.mybatis.mapper.CarMapper;
import org.qiu.mybatis.pojo.Car;
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.util.List;
public class PageTest {
@Test
public void testPage()throws Exception{
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession();
CarMapper mapper = sqlSession.getMapper(CarMapper.class);
// 页码
Integer pageNum = 2;
// 每页显示记录条数
Integer pageSize = 3;
// 起始下标
Integer startIndex = (pageNum - 1) * pageSize;
List<Car> cars = mapper.selectAllByPage(startIndex, pageSize);
// cars.forEach(car -> System.out.println(car));
cars.forEach(System.out::println);
sqlSession.commit();
sqlSession.close();
}
}
获取数据不难,难的是获取分页相关的数据比较难。可以借助 mybatis 的 PageHelper 插件。
二、PageHelper 插件
- 引入依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.3.1</version>
</dependency>
- 在 mybatis-config.xml 文件中配置插件
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>
- 编写 Java 代码
List<Car> selectAll();
<select id="selectAll" resultType="Car">
select * from t_car
</select>
关键点:
-
在查询语句之前开启分页功能
-
在查询语句之后封装 PageInfo 对象(PageInfo 对象将来会存储到 request 域当中,在页面上展示)
@Test
public void testPageHelper() throws Exception{
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession();
CarMapper mapper = sqlSession.getMapper(CarMapper.class);
// 开启分页
PageHelper.startPage(2, 2);
// 执行查询语句
List<Car> cars = mapper.selectAll();
// 获取分页信息对象
PageInfo<Car> pageInfo = new PageInfo<>(cars, 5);
System.out.println(pageInfo);
}
执行结果:
PageInfo{
pageNum=2, pageSize=2, size=2, startRow=3, endRow=4, total=6, pages=3,
list=Page{count=true, pageNum=2, pageSize=2, startRow=2, endRow=4, total=6, pages=3, reasonable=false, pageSizeZero=false}
[Car{id=86, carNum='1234', brand='丰田霸道', guidePrice=50.5, produceTime='2020-10-11', carType='燃油车'},
Car{id=87, carNum='1234', brand='丰田霸道', guidePrice=50.5, produceTime='2020-10-11', carType='燃油车'}],
prePage=1, nextPage=3, isFirstPage=false, isLastPage=false, hasPreviousPage=true, hasNextPage=true,
navigatePages=5, navigateFirstPage=1, navigateLastPage=3, navigatepageNums=[1, 2, 3]
}
三、MyBatis 注解式开发
Mybatis 中也提供了注解式开发方式,采用注解可以减少 Sql 映射文件的配置
当然,使用注解式开发的话,Sql 语句是写在 java 程序中的,这种方式也会给 Sql 语句的维护带来成本
官方是这么说的:
使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂一点的语句,Java 注解不仅力不从心,还会让你本就复杂的 SQL 语句更加混乱不堪。 因此,如果你需要做一些很复杂的操作,最好用 XML 来映射语句。
使用注解编写复杂的 SQL 是这样的:
原则:简单 sql 可以注解,复杂 sql 使用 xml
1、@Insert
package com.qiu.mybatis.mapper;
import org.qiu.mybatis.pojo.Car;
import org.apache.ibatis.annotations.Insert;
public interface CarMapper {
@Insert(value="insert into t_car values(null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})")
int insert(Car car);
}
2、@Delete
@Delete("delete from t_car where id = #{id}")
int deleteById(Long id);
3、@Update
@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);
4、@Select
@Select("select * from t_car where id = #{id}")
@Results({
@Result(column = "id", property = "id", id = true),
@Result(column = "car_num", property = "carNum"),
@Result(column = "brand", property = "brand"),
@Result(column = "guide_price", property = "guidePrice"),
@Result(column = "produce_time", property = "produceTime"),
@Result(column = "car_type", property = "carType")
})
Car selectById(Long id);
5、@Result
若在 mybatis-config.xml 文件中没有配置启动驼峰命名则在查询时会出现 null,此时除了添加配置还可以使用 @Result 注解解决此问题
一 叶 知 秋,奥 妙 玄 心