使用MyBatisPlus进行增删改查

谁践踏了优雅 2024-03-26 04:30 163阅读 0赞

代码及文档地址

官方地址: MyBatis-Plus

代码发布地址 :

Github: https://github.com/baomidou/mybatis-plus

Gitee: https://gitee.com/baomidou/mybatis-plus

文档发布地址 : https://baomidou.com/pages/24112f

目录

二、基本CRUD

1.插入

2.删除

(1)deleteById()

(2)deleteBatchByIds()

(3)deleteByMap(Map var1),>

3.修改

(1)updateById()

4.查询

(1)selectById()

(2)selectBatchIds()

(3)selectByMap(Map),>

(4)selectList()

5.通用Service

三、常用注解

1.@TableId

(1)value

(2)type

2.@TableField

3.@TableLogic

四、条件构造器和常用接口

1、wapper介绍

2、QueryWrapper

(1)组转查询条件

(2)组装排序条件

(3)组装删除条件

(4)条件优先级

(5)组装select子句

(6)实现子查询

3.UpdateWrapper

4、condition

思路一:

思路二:

5、LambdaQueryWrapper

6、LambdaUpdateWrapper

五、分页功能

1.分页插件

(1)配置

(2)测试

2.xml自定义分页

(1)UserMapper中定义接口方法

(2)UserMapper.xml中编写SQL

(3)测试


一、前期准备

1.依赖引入(springboot):

  1. <!-- MyBatisPlus -->
  2. <dependency>
  3. <groupId>com.baomidou</groupId>
  4. <artifactId>mybatis-plus-boot-starter</artifactId>
  5. <version>3.5.1</version>
  6. </dependency>

注意

引入 MyBatis-Plus 之后请不要再次引入 MyBatis 以及 MyBatis-Spring,以避免因版本差异导1.致的问题

2.application.yml配置信息

  1. spring:
  2. datasource:
  3. # 注意MySQL驱动器的版本
  4. driver-class-name: com.mysql.cj.jdbc.Driver
  5. # 数据库账号名
  6. username root
  7. # 密码
  8. password: xxxx
  9. url: jdbc:mysql://localhost:3306/数据库名字?characterEncoding=utf-8
  10. mybatis-plus:
  11. configuration:
  12. # 打印SQL信息
  13. log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  14. # 指定mapper.xml 位置何处
  15. mapper-locations:
  16. classpath: mapper/**Mapper.xml
  1. MySQL数据表中添加User表

    DROP TABLE IF EXISTS user;

    CREATE TABLE user
    (

    1. id BIGINT(20) NOT NULL COMMENT '主键ID',
    2. name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
    3. age INT(11) NULL DEFAULT NULL COMMENT '年龄',
    4. email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
    5. PRIMARY KEY (id)

    );

    DELETE FROM user;

    INSERT INTO user (id, name, age, email) VALUES
    (1, ‘Jone’, 18, ‘test1@baomidou.com’),
    (2, ‘Jack’, 20, ‘test2@baomidou.com’),
    (3, ‘Tom’, 28, ‘test3@baomidou.com’),
    (4, ‘Sandy’, 21, ‘test4@baomidou.com’),
    (5, ‘Billie’, 24, ‘test5@baomidou.com’);

  2. 项目中添加实体类(需要注入依赖lombok)

1aeabd32e1c74b3d922e11d419b82893.png

5.创建UserMapper.xml( resources 目录下)

45656ac558154a1cbee36a5d171730d2.png

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  4. <mapper namespace="com.example.mybatisplus.mapper.UserMapper">
  5. </mapper>

6.创建UserMapper接口,接口继承MyBatisPlus提供的BaseMapper

de29f3b318c8403b9d05cb65d394d9e9.png

2195bdbfe3554b9db4cba544c2b26c78.png

7.测试

到这里,前期工作就做好了,我们测试一下是否成功配置好了

1ff36114505e4c6abad5d7272b47537e.png

到这个test目录下面创建一个selectTest类,代码如下:

  1. // 标记为测试类
  2. @SpringBootTest
  3. public class selectTest {
  4. // 依赖注入
  5. @Resource
  6. private UserMapper userMapper;
  7. // 标记为测试方法
  8. @Test
  9. public void selectAll(){
  10. List<User> list = userMapper.selectList(null);
  11. list.forEach(System.out::println);
  12. }
  13. }

找到左方的启动按钮

1cbdd7da76c04ac593638eeda60dbff8.png

如果是一下情况就说明成功配置好MyBatisPlus,可以正常使用了7d5602d880ba4a44a54ffbf5a3479d1f.png

二、基本CRUD

BaseMapper 接口所提供的方法

6ecadd7cc6b34489912c1ccb656b7cc6.png

1.插入

insert方法

  1. @Test
  2. public void insertTest(){
  3. // 创建user实例
  4. User user = new User();
  5. // 设置姓名
  6. user.setName("张三");
  7. // 设置年龄
  8. user.setAge(18);
  9. // 设置邮箱
  10. user.setEmail("adfaf@aa.com");
  11. // INSERT INTO user ( id, `name`, age, email ) VALUES ( ?, ?, ?, ? )
  12. userMapper.insert(user);
  13. }

INSERT INTO user ( id, `name`, age, email ) VALUES ( ?, ?, ?, ? )

这条语句是insert所对应的SQL语句,这个insert方法是从BaseMapper中继承过来的

98e2da9fb49f420e84492650a35d2ebe.png

25a1e070784d4540879e7c572ba82f42.png

在上面代码中,我们没有设置id值,所以在插入数据的时候,MyBatisPlus使用了默认的雪花算法,雪花算法是基于时间戳+机器ID+流水号实现的,这样以保证id尽量不存在相同的

e6249d344a034f8ea00542b283b478ae.png

2.删除

(1)deleteById()

通过id删除数据

  1. @Test
  2. public void testDeleteById(){
  3. //通过id删除用户信息
  4. //DELETE FROM user WHERE id=?
  5. int result = userMapper.deleteById( 1628657874697723905L);
  6. System.out.println("受影响行数:"+result);
  7. }

结果:

abba065e44414ea088c944830577d736.png

(2)deleteBatchByIds()

通过id列表批量删除表中数据

  1. @Test
  2. public void testDeleteBatchIds(){
  3. //通过多个id批量删除
  4. //DELETE FROM user WHERE id IN ( ? , ? , ? )
  5. List<Long> idList = Arrays.asList(1L, 2L, 3L);
  6. int result = userMapper.deleteBatchIds(idList);
  7. System.out.println("受影响行数:"+result);
  8. }

结果:

52c93db872f245cd91fb9c3f0b5b6797.png

0527b278fd96463fa0ce897c2ed1969f.png

(3)deleteByMap(Map var1)

这个方法是实现条件删除,使用Map来构建条件语句

  1. @Test
  2. public void testDeleteByMap(){
  3. //根据map集合中所设置的条件删除记录
  4. //DELETE FROM user WHERE name = ? AND age = ?
  5. Map<String, Object> map = new HashMap<>();
  6. map.put("age", 23);
  7. map.put("name", "李四");
  8. int result = userMapper.deleteByMap(map);
  9. System.out.println("受影响行数:"+result);
  10. }

从上面代码中,可以看到,map中所设置的就where后面的条件,map的key就是表中的字段,value就是筛选值

结果:

71473060c7184c909a4ea222e5a867b6.png

3.修改

(1)updateById()

根据id值来更新数据,这个方法的参数是T, 将user传入方法中,updateById 会根据对象中的id值为条件,其他值为更新内容来进行更新数据

  1. @Test
  2. public void testUpdateById(){
  3. User user = new User(4L, "admin", 22, null);
  4. //UPDATE user SET name=?, age=? WHERE id=?
  5. int result = userMapper.updateById(user);
  6. System.out.println("受影响行数:"+result);
  7. }

结果:

0387d807a5cb49f6bc8a151101619bb6.png

4.查询

(1)selectById()

根据Id查询数据

  1. @Test
  2. public void testSelectById(){
  3. //根据id查询用户信息
  4. //SELECT id,name,age,email FROM user WHERE id=?
  5. User user = userMapper.selectById(4L);
  6. System.out.println(user);
  7. }

(2)selectBatchIds()

根据Id列表查询数据

  1. @Test
  2. public void testSelectBatchIds(){
  3. //根据多个id查询多个用户信息
  4. //SELECT id,name,age,email FROM user WHERE id IN ( ? , ? )
  5. List<Long> idList = Arrays.asList(4L, 5L);
  6. List<User> list = userMapper.selectBatchIds(idList);
  7. list.forEach(System.out::println);
  8. }

(3)selectByMap(Map)

根据设置条件来进行查询数据

  1. @Test
  2. public void testSelectByMap(){
  3. //通过map条件查询用户信息
  4. //SELECT id,name,age,email FROM user WHERE name = ? AND age = ?
  5. Map<String, Object> map = new HashMap<>();
  6. map.put("age", 22);
  7. map.put("name", "admin");
  8. List<User> list = userMapper.selectByMap(map);
  9. list.forEach(System.out::println);
  10. }

(4)selectList()

直接查询所有数据

  1. @Test
  2. public void testSelectList(){
  3. //查询所有用户信息
  4. //SELECT id,name,age,email FROM user
  5. List<User> list = userMapper.selectList(null);
  6. list.forEach(System.out::println);
  7. }

在这里我们可以注意到这个方法传进去的参数为null,实际上参数类型为: Wrapper,这个参数的意义是传入一个条件构造器(这个条件构造器,我们在后面会介绍),在这里,由于我们传进去的是一个null,默认为没有条件,所以就直接查询所有了

5.通用Service

  • 通用 Service CRUD 封装IService接口,进一步封装 CRUD 采用 get 查询单行 remove 删除 list 查询集合 page 分页 前缀命名方式区分 Mapper 层避免混淆,
  • 泛型 T 为任意实体对象
  • 建议如果存在自定义通用 Service 方法的可能,请创建自己的 IBaseService 继承 Mybatis-Plus 提供的基类
  • 官网地址:https://baomidou.com/pages/49cc81/\#service-crud-%E6%8E%A5%E5%8F%A3

MyBatis-Plus中有一个接口 IService 和其实现类 ServiceImpl ,封装了常见的业务层逻辑

39d132aa0c194948b1cfc25e06d50678.png

  1. /**
  2. * UserService继承IService模板提供的基础功能
  3. */
  4. public interface UserService extends IService<User> {
  5. }
  6. /**
  7. * ServiceImpl实现了IService,提供了IService中基础功能的实现
  8. * 若ServiceImpl无法满足业务需求,则可以使用自定的UserService定义方法,并在实现类中实现
  9. */
  10. @Service
  11. public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements
  12. UserService {
  13. }

测试查询记录数

  1. @Autowired
  2. private UserService userService;
  3. @Test
  4. public void testGetCount(){
  5. long count = userService.count();
  6. System.out.println("总记录数:" + count);
  7. }

测试批量插入

  1. @Test
  2. public void testSaveBatch(){
  3. // SQL长度有限制,海量数据插入单条SQL无法实行,
  4. // 因此MP将批量插入放在了通用Service中实现,而不是通用Mapper
  5. ArrayList<User> users = new ArrayList<>();
  6. for (int i = 0; i < 5; i++) {
  7. User user = new User();
  8. user.setName("ybc" + i);
  9. user.setAge(20 + i);
  10. users.add(user);
  11. }
  12. //SQL:INSERT INTO t_user ( username, age ) VALUES ( ?, ? )
  13. userService.saveBatch(users);
  14. }

三、常用注解

1.@TableId

5c7446d50866498980b6449014e9eb62.png

我们可以从TableId源码中可以看到,我们可以设置两个值,一个是value,一个 type,












value 设置字段名
type 设置主键模式

(1)value

回顾到我们之前所创建的User实体中的id属性,在我们MySQL表中,user表的第一列也是id,假如我们把user表中的id修改为uid,再执行插入代码时,看看会出现什么结果

d7e1efdfc1c249508baf2ef4637750e1.png

16b6b204cacf4021a2d3c07b0fe99018.png

不出意外,发现我们SQL语句使用的是id字段,由于user表中是uid,所以就无法执行语句,在开发中,也会出现设置的实体类属性和表字段不一致的情况,所有为了解决这种情况,MyBatisPlus提供了@TableId注解












我们可以使用value属性,将User实体类的id属性改名为user表中对应的uid

  1. public class User {
  2. @TableId(value="uid")
  3. private Long id;
  4. private String name;
  5. private Integer age;
  6. private String email;
  7. }

此时我们再次调用方法

e10b42a367244730b61fb4d2b8f31533.png

这时就通过了修改,而mybatisplus所生成是SQL语句也发生了变化

(2)type

在前面的插入时,我们可以注意到表中的主键生成是利用的雪花算法,如果不想使用使用雪花算法,就可以使用type属性中的不同主键模式

0f495ed9283142f695d337d3b114ca03.png

如果我们想使用自增,那么就需要选择IdType.AUTO来实现自增效果,于此同时,user表也要将主键uid修改为自增模式,然后执行insert方法

7746e53829584bc9b1861e3c0eac0f26.png

查看数据库数据:

69e806a2f23c4fae956765e5cb0e2127.png

这个时候id值也不在是雪花算法计算出来的了。

type的其他模式,感兴趣可以去官网查看,这里不做过多赘述

2.@TableField

同样的,既然有对主键进行备注数据库中字段名的修饰,对于一般字段来说,可以使用TableField来进行备注数据库中字段名

1666833b8a79452d84983a2d296f8aa6.png

  1. @Data
  2. public class User {
  3. @TableId(type = IdType.AUTO)
  4. private Long id;
  5. @TableField("username")
  6. private String name;
  7. private Integer age;
  8. private String email
  9. }

结果:

470b70f88f9743acb48a5ba9df81b3cb.png

SQL语句使用的是TabelField所备注的字段username

3.@TableLogic

这个注释标注的是逻辑删除

所以我们需要对User实体和user表进行添加字段,

user表:

38dad7c3a6e840c4812b361181655881.png

User实体:

  1. @Data
  2. public class User {
  3. @TableId(type = IdType.AUTO)
  4. private Long id;
  5. private String name;
  6. private Integer age;
  7. private String email;
  8. @TableLogic
  9. private Boolean is_delete;
  10. }

执行的删除操作

8ed28a7a98b7498582ad124f91d3f3ee.png

这时可以发现,删除操作生成的是update语句,而不再是delete。使用update语句实现逻辑删除。

  • 73904292229546f49d5ba3f4ed853768.png

四、条件构造器和常用接口

1**wapper介绍**

cc3d84a2b6fb4b97bb8260998dae7dd1.png 图片来源于尚硅谷

  • Wrapper : 条件构造抽象类,最顶端父类

    • AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件

      • QueryWrapper : 查询条件封装
      • UpdateWrapper : Update 条件封装
      • AbstractLambdaWrapper : 使用Lambda 语法

        • LambdaQueryWrapper :用于Lambda语法使用的查询Wrapper
        • LambdaUpdateWrapper : Lambda 更新封装Wrapper

2****QueryWrapper

QueryWrapper的每个方法返回的值都是QueryWrapper对象,所有每次后面直接‘.’即可

ab1e23d1691149978df8f867e5d1ae11.png

(1)组转查询条件

  1. @Test
  2. public void test01(){
  3. //查询用户名包含a,年龄在20到30之间,并且邮箱不为null的用户信息
  4. // SELECT id,username AS name,age,email,is_deleted FROM user WHERE
  5. // is_deleted=0 AND (username LIKE ? AND age BETWEEN ? AND ? AND email IS NOT NULL)
  6. QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  7. queryWrapper.like("username", "a")
  8. .between("age", 20, 30)
  9. .isNotNull("email");
  10. List<User> list = userMapper.selectList(queryWrapper);
  11. list.forEach(System.out::println);
  12. }

(2)组装排序条件

  1. @Test
  2. public void test02(){
  3. //按年龄降序查询用户,如果年龄相同则按id升序排列
  4. //SELECT id,username AS name,age,email,is_deleted FROM t_user WHERE
  5. //is_deleted=0 ORDER BY age DESC,id ASC
  6. QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  7. queryWrapper
  8. .orderByDesc("age")
  9. .orderByAsc("id");
  10. List<User> users = userMapper.selectList(queryWrapper);
  11. users.forEach(System.out::println);
  12. }

(3)组装删除条件

  1. @Test
  2. public void test03(){
  3. //删除email为空的用户
  4. //DELETE FROM user WHERE (email IS NULL)
  5. QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  6. queryWrapper.isNull("email");
  7. //条件构造器也可以构建删除语句的条件
  8. int result = userMapper.delete(queryWrapper);
  9. System.out.println("受影响的行数:" + result);
  10. }

(4)条件优先级

  1. @Test
  2. public void test04() {
  3. QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  4. //将(年龄大于20并且用户名中包含有a)或邮箱为null的用户信息修改
  5. //UPDATE user SET age=?, email=? WHERE (username LIKE ? AND age > ? OR email IS NULL)
  6. queryWrapper
  7. .like("username", "a")
  8. // gt表示大于
  9. .gt("age", 20)
  10. .or()
  11. .isNull("email");
  12. User user = new User();
  13. user.setAge(18);
  14. user.setEmail("user@atguigu.com");
  15. int result = userMapper.update(user, queryWrapper);
  16. System.out.println("受影响的行数:" + result);
  17. }

(5)组装select子句

  1. @Test
  2. public void test05() {
  3. //查询用户信息的username和age字段
  4. //SELECT username,age FROM t_user
  5. QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  6. queryWrapper.select("username", "age");
  7. //selectMaps()返回Map集合列表,通常配合select()使用,避免User对象中没有被查询到的列值
  8. //为null
  9. List<Map<String, Object>> maps = userMapper.selectMaps(queryWrapper);
  10. maps.forEach(System.out::println);
  11. }

(6)实现子查询

  1. @Test
  2. public void test06() {
  3. // 查询id小于等于3的用户信息
  4. // SELECT id,username AS name,age,email,is_deleted FROM user WHERE (id IN (select id from t_user where id <= 3))
  5. QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  6. queryWrapper.inSql("id", "select id from t_user where id <= 3");
  7. List<User> list = userMapper.selectList(queryWrapper);
  8. list.forEach(System.out::println);
  9. }

3.UpdateWrapper

  1. @Test
  2. public void test07() {
  3. //将(年龄大于20或邮箱为null)并且用户名中包含有a的用户信息修改
  4. //组装set子句以及修改条件
  5. UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
  6. //lambda表达式内的逻辑优先运算
  7. updateWrapper
  8. .set("age", 18)
  9. .set("email", "user@atguigu.com")
  10. .like("username", "a")
  11. .and(i -> i.gt("age", 20).or().isNull("email"));
  12. //这里必须要创建User对象,否则无法应用自动填充。如果没有自动填充,可以设置为null
  13. //UPDATE user SET username=?, age=?,email=? WHERE (username LIKE ? AND
  14. //(age > ? OR email IS NULL))
  15. //User user = new User();
  16. //user.setName("张三");
  17. //int result = userMapper.update(user, updateWrapper);
  18. //UPDATE t_user SET age=?,email=? WHERE (username LIKE ? AND (age > ? OR
  19. //email IS NULL))
  20. int result = userMapper.update(null, updateWrapper);
  21. System.out.println(result);
  22. }

4****condition

在真正开发的过程中,组装条件是常见的功能,而这些条件数据来源于用户输入,是可选的,因 此我们在组装这些条件时,必须先判断用户是否选择了这些条件,若选择则需要组装该条件,若没有选择则一定不能组装,以免影响SQL 执行的结果

思路一:

  1. @Test
  2. public void test08() {
  3. //定义查询条件,有可能为null(用户未输入或未选择)
  4. String username = null;
  5. Integer ageBegin = 10;
  6. Integer ageEnd = 24;
  7. QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  8. //StringUtils.isNotBlank()判断某字符串是否不为空且长度不为0且不由空白符(whitespace)
  9. //构成
  10. if(StringUtils.isNotBlank(username)){
  11. queryWrapper.like("username","a");
  12. }
  13. if(ageBegin != null){
  14. queryWrapper.ge("age", ageBegin);
  15. }
  16. if(ageEnd != null){
  17. queryWrapper.le("age", ageEnd);
  18. }
  19. //SELECT id,username AS name,age,email,is_deleted FROM t_user
  20. //WHERE (age >=? AND age <= ?)
  21. List<User> users = userMapper.selectList(queryWrapper);
  22. users.forEach(System.out::println);
  23. }

思路二:

上面的实现方案没有问题,但是代码比较复杂,我们可以使用带condition 参数的重载方法构建查询条件,简化代码的编写

  1. @Test
  2. public void test08UseCondition() {
  3. //定义查询条件,有可能为null(用户未输入或未选择)
  4. String username = null;
  5. Integer ageBegin = 10;
  6. Integer ageEnd = 24;
  7. QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  8. //StringUtils.isNotBlank()判断某字符串是否不为空且长度不为0且不由空白符(whitespace)
  9. //构成
  10. queryWrapper
  11. .like(StringUtils.isNotBlank(username), "username", "a")
  12. .ge(ageBegin != null, "age", ageBegin)
  13. .le(ageEnd != null, "age", ageEnd);
  14. //SELECT id,username AS name,age,email,is_deleted FROM t_user WHERE (age >=
  15. //? AND age <= ?)
  16. List<User> users = userMapper.selectList(queryWrapper);
  17. users.forEach(System.out::println);
  18. }

5****LambdaQueryWrapper

  1. @Test
  2. public void test09() {
  3. //定义查询条件,有可能为null(用户未输入)
  4. String username = "a";
  5. Integer ageBegin = 10;
  6. Integer ageEnd = 24;
  7. LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
  8. //避免使用字符串表示字段,防止运行时错误
  9. queryWrapper
  10. .like(StringUtils.isNotBlank(username), User::getName, username)
  11. .ge(ageBegin != null, User::getAge, ageBegin)
  12. .le(ageEnd != null, User::getAge, ageEnd);
  13. List<User> users = userMapper.selectList(queryWrapper);
  14. users.forEach(System.out::println);
  15. }

6****LambdaUpdateWrapper

  1. @Test
  2. public void test10() {
  3. //组装set子句
  4. LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>();
  5. updateWrapper
  6. .set(User::getAge, 18)
  7. .set(User::getEmail, "user@atguigu.com")
  8. .like(User::getName, "a")
  9. .and(i -> i.lt(User::getAge, 24).or().isNull(User::getEmail));
  10. //lambda表达式内的逻辑优先运算
  11. User user = new User();
  12. int result = userMapper.update(user, updateWrapper);
  13. System.out.println("受影响的行数:" + result);
  14. }

五、分页功能

1.分页插件

(1)配置

在项目目录下创建config文件夹,在config文件夹中创建MybatisPlusConfig类,配置拦截器

  1. @Configuration
  2. public class MybatisPlusConfig {
  3. // 分页插件
  4. @Bean
  5. public MybatisPlusInterceptor mybatisPlusInterceptor() {
  6. MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
  7. interceptor.addInnerInterceptor(new
  8. PaginationInnerInterceptor(DbType.MYSQL));
  9. return interceptor;
  10. }
  11. }

(2)测试

  1. @Test
  2. public void testPage(){
  3. //设置分页参数
  4. Page<User> page = new Page<>(1, 5);
  5. userMapper.selectPage(page, null);
  6. //获取分页数据
  7. List<User> list = page.getRecords();
  8. list.forEach(System.out::println);
  9. System.out.println("当前页:"+page.getCurrent());
  10. System.out.println("每页显示的条数:"+page.getSize());
  11. System.out.println("总记录数:"+page.getTotal());
  12. System.out.println("总页数:"+page.getPages());
  13. System.out.println("是否有上一页:"+page.hasPrevious());
  14. System.out.println("是否有下一页:"+page.hasNext());
  15. }

833453f8468e4fb396f3966e72a4d98e.png

2.xml自定义分页

(1)UserMapper**中定义接口方法**

  1. /**
  2. * 根据年龄查询用户列表,分页显示
  3. * @param page 分页对象,xml中可以从里面进行取值,传递参数 Page 即自动分页,必须放在第一位
  4. * @param age 年龄
  5. * @return 返回分页对象IPage
  6. */
  7. IPage<User> selectPageVo(@Param("page") Page<User> page, @Param("age")Integer age);

(2)UserMapper.xml**中编写**SQL

  1. <!--SQL片段,记录基础字段-->
  2. <sql id="BaseColumns">id,name,age,email</sql>
  3. <!--IPage<User> selectPageVo(Page<User> page, Integer age);-->
  4. <select id="selectPageVo" resultType="User">
  5. SELECT <include refid="BaseColumns"></include> FROM t_user WHERE age > #
  6. {age}
  7. </select>

(3)测试

  1. @Test
  2. public void testSelectPageVo(){
  3. //设置分页参数
  4. Page<User> page = new Page<>(1, 5);
  5. userMapper.selectPageVo(page, 20);
  6. //获取分页数据
  7. List<User> list = page.getRecords();
  8. list.forEach(System.out::println);
  9. System.out.println("当前页:"+page.getCurrent());
  10. System.out.println("每页显示的条数:"+page.getSize());
  11. System.out.println("总记录数:"+page.getTotal());
  12. System.out.println("总页数:"+page.getPages());
  13. System.out.println("是否有上一页:"+page.hasPrevious());
  14. System.out.println("是否有下一页:"+page.hasNext());
  15. }

aa50899085f74e78852c3137d070e759.png

======THE END======

感谢阅读,本文章仅为个人学习笔记使用

发表评论

表情:
评论列表 (有 0 条评论,163人围观)

还没有评论,来说两句吧...

相关阅读

    相关 JDBC进行增删

    JDBC进行增删改查 本篇博客较为基础,只作学习记录之用。 本篇分为: 下载JDBC的jar包 导入JDBC的jar包 封装数据库连接和关闭