Spring Boot学习随笔- 集成MyBatis-Plus(三)自定义SQL、分页实现(PaginationInterceptor )、更新和删除详细方法

学习视频:【编程不良人】Mybatis-Plus整合SpringBoot实战教程,提高的你开发效率,后端人员必备!

自定义SQL

自定义mapper文件是为了应对一些更复杂的查询场景,首先先配置映射路径

yaml 复制代码
mybatis-plus:
  mapper-locations: com/mp/dao/xml/*

由于这里的mapper文件放在java文件夹中,所以要在pom.xml里进行配置

xml 复制代码
<build>
  <resources>
      <resource>
          <!-- xml放在java目录下-->
          <directory>src/main/java</directory>
          <includes>
              <include>**/*.xml</include>
          </includes>
      </resource>
      <!--指定资源的位置(xml放在resources下,可以不用指定)-->
      <resource>
          <directory>src/main/java</directory>
      </resource>
  </resources>
</build>
  • mapper

    java 复制代码
    public interface UserMapper extends BaseMapper<User> {
        List<User> selectAll(@Param(Constants.WRAPPER) Wrapper<User> wrapper);
    }
    xml 复制代码
    <?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="com.mp.dao.UserMapper">
        <select id="selectAll" resultType="com.mp.entity.User">
            select * FROM `mp_user` ${ew.customSqlSegment}
        </select>
    </mapper>
  • 测试

    java 复制代码
    @Test
        public void selectMy() {
            LambdaQueryWrapper<User> lambda= Wrappers.<User>lambdaQuery();
            lambda.likeRight(User::getName,"刘")
                    .and(lqw->lqw.lt(User::getAge,30)
                            .or().isNotNull(User::getEmail));
            List<User> userList = userMapper.selectAll(lambda);
            userList.forEach(System.out::println);
        }

分页

在MyBatis Plus中,物理分页内存分页是两种不同的分页方式。

**物理分页【推荐】是在数据库层面进行分页操作,通过SQL语句的 LIMIT OFFSET**关键字来实现。这种分页方式直接在数据库中进行数据的截取和返回,因此适用于大数据量的分页查询。

**内存分页【了解】**是在应用程序内存中进行分页操作,即先将所有数据查询出来,然后在内存中进行分页处理。这种分页方式适用于数据量较小的情况,因为需要将所有数据加载到内存中,可能会导致内存占用过高。

  • 配置插件

    java 复制代码
    @Configuration
    public class MybatisPlusConfig {
        @Bean
        public PaginationInterceptor paginationInterceptor() {
            return new PaginationInterceptor();
        }
    }
  • 分页实现

    java 复制代码
    @Test
    public void selectPage() {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.ge("age", 30);
        Page<User> page = new Page<User>(1, 2,false);// fasle指的是不查询总记录数,提高性能
    //        IPage<User> iPage = userMapper.selectPage(page, queryWrapper);
    //        List<User> userList = iPage.getRecords();
    		// selectMapsPage 
        IPage<Map<String, Object>> iPage = userMapper.selectMapsPage(page, queryWrapper);
        System.out.println("总页数 = " + iPage.getPages());
        System.out.println("总记录数 = " + iPage.getTotal());
        List<Map<String, Object>> userList = iPage.getRecords();
        userList.forEach(System.out::println);
    }
  • 自定义分页

    • UserMapper

      java 复制代码
      IPage<User> selectUserPage(Page<User> page, @Param(Constants.WRAPPER) Wrapper<User> wrapper);
      }
    • UserMapper.xml

      xml 复制代码
      <select id="selectUserPage" resultType="com.mp.entity.User">
          select * from mp_user ${ew.customSqlSegment}
      </select>
    • 测试

      java 复制代码
      @Test
      public void selectMyPage() {
          QueryWrapper<User> queryWrapper = new QueryWrapper<>();
          queryWrapper.ge("age", 30);
          Page<User> page = new Page<User>(1, 2);
          IPage<User> iPage = userMapper.selectUserPage(page, queryWrapper);
          System.out.println("总页数 = " + iPage.getPages());
          System.out.println("总记录数 = " + iPage.getTotal());
          List<User> userList = iPage.getRecords();
          userList.forEach(System.out::println);
      }

Update,更新方法详解

java 复制代码
@Test
public void updateById() {
    User user = new User();
    user.setUserId(3L);
    user.setAge(28);
    user.setEmail("xiao@163.com");
    // 传入实体对象作为参数,自动根据id字段定位对应的记录,根据其他set的值进行更新
    int rows = userMapper.updateById(user);
    System.out.println("rows = " + rows);
}
/**
 * 条件构造器更新
 */
@Test
public void updateByWrapper() {
    UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
    updateWrapper.eq("name", "小刚").eq("age", 18); // where条件
    // set更新条件
    User user = new User();
    user.setAge(28);
    user.setEmail("xiao@163.com");
    // 传入实体对象作为参数,自动根据id字段定位对应的记录,根据其他set的值进行更新
    int rows = userMapper.update(user, updateWrapper);
    System.out.println("rows = " + rows);
}
/**
 * 快速更新少量字段
 */
@Test
public void updateByWrapper2() {
    UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
    updateWrapper.eq("name", "李刚").eq("age", 29).set("age", 30);
    int rows = userMapper.update(null,updateWrapper);
    System.out.println("rows = " + rows);
}
/**
 * lambda表达式
 */
@Test
public void updateByWrapper3() {
    LambdaUpdateWrapper<User> lambdaUpdate = Wrappers.lambdaUpdate();
    lambdaUpdate.eq(User::getName, "小刚").eq(User::getAge, 28).set(User::getAge, 31);
    int rows = userMapper.update(null,lambdaUpdate);
    System.out.println("rows = " + rows);
}

/**
 * lambda表达式链式调用
 */
@Test
public void updateByWrapper4() {
    boolean update = new LambdaUpdateChainWrapper<User>(userMapper)
            .eq(User::getName, "小刚").eq(User::getAge, 31).set(User::getAge,28).update();
    System.out.println("update = " + update);
}

Delete 删除

java 复制代码
@Test
public void deleteById() {
    int rows = userMapper.deleteById(1739970502337392641L);
    System.out.println("rows = " + rows);
}

@Test
public void deleteByMap() {
    Map<String,Object> map = new HashMap<>();
    map.put("name", "小刚");
    map.put("age", "25");
    // DELETE FROM mp_user WHERE name = ? AND age = ?
    int rows = userMapper.deleteByMap(map);
    System.out.println("rows = " + rows);
}

@Test
public void deleteBatchIds() {
    int rows = userMapper.deleteBatchIds(Arrays.asList(121111123010L, 126372731123L, 127381787813L));
    // 相当于 where id in(?,?,?)
    System.out.println("rows = " + rows);
}

@Test
public void deleteByWrapper() {
    LambdaQueryWrapper<User> lambdaQuery = Wrappers.lambdaQuery();
    lambdaQuery.eq(User::getAge, 28)
            .or().gt(User::getAge, 41);
    int rows = userMapper.delete(lambdaQuery);
    System.out.println("rows = " + rows);
}
相关推荐
用户83071968408216 小时前
Spring Boot 集成 RabbitMQ :8 个最佳实践,杜绝消息丢失与队列阻塞
spring boot·后端·rabbitmq
Java水解16 小时前
Spring Boot 视图层与模板引擎
spring boot·后端
Java水解17 小时前
一文搞懂 Spring Boot 默认数据库连接池 HikariCP
spring boot·后端
洋洋技术笔记20 小时前
Spring Boot Web MVC配置详解
spring boot·后端
初次攀爬者2 天前
Kafka 基础介绍
spring boot·kafka·消息队列
用户8307196840822 天前
spring ai alibaba + nacos +mcp 实现mcp服务负载均衡调用实战
spring boot·spring·mcp
Java水解2 天前
SpringBoot3全栈开发实战:从入门到精通的完整指南
spring boot·后端
初次攀爬者3 天前
RocketMQ在Spring Boot上的基础使用
java·spring boot·rocketmq
花花无缺3 天前
搞懂@Autowired 与@Resuorce
java·spring boot·后端
Derek_Smart3 天前
从一次 OOM 事故说起:打造生产级的 JVM 健康检查组件
java·jvm·spring boot