MyBatis使用PageHelper && MyBatis的注解式开发
- 十六、MyBatis使用PageHelper
- 16.1 limit分页
- 16.3 PageHelper插件
- 第一步:引入依赖
- 第二步:在mybatis-config.xml文件中配置插件
- 第三步:编写Java代码
- 十七、MyBatis的注解式开发
- 17.1 @Insert
- 17.2 @Delete
- 17.3 @Update
- 17.4 @Select
十六、MyBatis使用PageHelper
16.1 limit分页
mysql的limit后面两个数字:
- 第一个数字:startIndex(起始下标。下标从0开始。)
- 第二个数字:pageSize(每页显示的记录条数)
假设已知页码pageNum,还有每页显示的记录条数pageSize,第一个数字可以动态的获取吗?
- startIndex = (pageNum - 1) * pageSize
所以,标准通用的mysql分页SQL:
select*fromtableName......limit(pageNum-1)*pageSize,pageSize使用mybatis应该怎么做?
模块名:mybatis-012-page
packagecom.powernode.mybatis.mapper;importcom.powernode.mybatis.pojo.Car;importorg.apache.ibatis.annotations.Param;importjava.util.List;publicinterfaceCarMapper{/** * 通过分页的方式获取Car列表 * @param startIndex 页码 * @param pageSize 每页显示记录条数 * @return */List<Car>selectAllByPage(@Param("startIndex")IntegerstartIndex,@Param("pageSize")IntegerpageSize);}<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPEmapperPUBLIC"-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mappernamespace="com.powernode.mybatis.mapper.CarMapper"><selectid="selectAllByPage"resultType="Car">select * from t_car limit #{startIndex},#{pageSize}</select></mapper>packagecom.powernode.mybatis.test;importcom.powernode.mybatis.mapper.CarMapper;importcom.powernode.mybatis.pojo.Car;importorg.apache.ibatis.io.Resources;importorg.apache.ibatis.session.SqlSession;importorg.apache.ibatis.session.SqlSessionFactory;importorg.apache.ibatis.session.SqlSessionFactoryBuilder;importorg.junit.Test;importjava.util.List;publicclassPageTest{@TestpublicvoidtestPage()throwsException{SqlSessionFactorysqlSessionFactory=newSqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));SqlSessionsqlSession=sqlSessionFactory.openSession();CarMappermapper=sqlSession.getMapper(CarMapper.class);// 页码IntegerpageNum=2;// 每页显示记录条数IntegerpageSize=3;// 起始下标IntegerstartIndex=(pageNum-1)*pageSize;List<Car>cars=mapper.selectAllByPage(startIndex,pageSize);cars.forEach(car->System.out.println(car));sqlSession.commit();sqlSession.close();}}执行结果:
获取数据不难,难的是获取分页相关的数据比较难。可以借助mybatis的PageHelper插件。
16.3 PageHelper插件
使用PageHelper插件进行分页,更加的便捷。
第一步:引入依赖
<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.3.1</version></dependency>第二步:在mybatis-config.xml文件中配置插件
typeAliases标签下面进行配置:
<plugins><plugininterceptor="com.github.pagehelper.PageInterceptor"></plugin></plugins>第三步:编写Java代码
List<Car>selectAll();<selectid="selectAll"resultType="Car">select * from t_car</select>关键点:
- 在查询语句之前开启分页功能。
- 在查询语句之后封装PageInfo对象。(PageInfo对象将来会存储到request域当中。在页面上展示。)
@TestpublicvoidtestPageHelper()throwsException{SqlSessionFactorysqlSessionFactory=newSqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));SqlSessionsqlSession=sqlSessionFactory.openSession();CarMappermapper=sqlSession.getMapper(CarMapper.class);// 开启分页PageHelper.startPage(2,2);// 执行查询语句List<Car>cars=mapper.selectAll();// 获取分页信息对象PageInfo<Car>pageInfo=newPageInfo<>(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]}
对执行结果进行格式化:
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。
模块名:mybatis-013-annotation
打包方式:jar
依赖:mybatis,mysql驱动,junit,logback
配置文件:jdbc.properties、mybatis-config.xml、logback.xml
pojo:com.powernode.mybatis.pojo.Car
mapper接口:com.powernode.mybatis.mapper.CarMapper
17.1 @Insert
packagecom.powernode.mybatis.mapper;importcom.powernode.mybatis.pojo.Car;importorg.apache.ibatis.annotations.Insert;publicinterfaceCarMapper{@Insert(value="insert into t_car values(null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})")intinsert(Carcar);}packagecom.powernode.mybatis.test;importcom.powernode.mybatis.mapper.CarMapper;importcom.powernode.mybatis.pojo.Car;importorg.apache.ibatis.io.Resources;importorg.apache.ibatis.session.SqlSession;importorg.apache.ibatis.session.SqlSessionFactory;importorg.apache.ibatis.session.SqlSessionFactoryBuilder;importorg.junit.Test;publicclassAnnotationTest{@TestpublicvoidtestInsert()throwsException{SqlSessionFactorysqlSessionFactory=newSqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));SqlSessionsqlSession=sqlSessionFactory.openSession();CarMappermapper=sqlSession.getMapper(CarMapper.class);Carcar=newCar(null,"1112","卡罗拉",30.0,"2000-10-10","燃油车");intcount=mapper.insert(car);System.out.println("插入了几条记录:"+count);sqlSession.commit();sqlSession.close();}}17.2 @Delete
@Delete("delete from t_car where id = #{id}")intdeleteById(Longid);@TestpublicvoidtestDelete()throwsException{SqlSessionFactorysqlSessionFactory=newSqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));SqlSessionsqlSession=sqlSessionFactory.openSession();CarMappermapper=sqlSession.getMapper(CarMapper.class);mapper.deleteById(89L);sqlSession.commit();sqlSession.close();}17.3 @Update
@Update("update t_car set car_num=#{carNum},brand=#{brand},guide_price=#{guidePrice},produce_time=#{produceTime},car_type=#{carType} where id=#{id}")intupdate(Carcar);@TestpublicvoidtestUpdate()throwsException{SqlSessionFactorysqlSessionFactory=newSqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));SqlSessionsqlSession=sqlSessionFactory.openSession();CarMappermapper=sqlSession.getMapper(CarMapper.class);Carcar=newCar(88L,"1001","凯美瑞",30.0,"2000-11-11","新能源");mapper.update(car);sqlSession.commit();sqlSession.close();}17.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")})CarselectById(Longid);@TestpublicvoidtestSelectById()throwsException{SqlSessionFactorysqlSessionFactory=newSqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));SqlSessionsqlSession=sqlSessionFactory.openSession();CarMappercarMapper=sqlSession.getMapper(CarMapper.class);Carcar=carMapper.selectById(88L);System.out.println(car);}执行结果: