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);
}
相关推荐
梦云澜4 小时前
论文阅读(五):乳腺癌中的高斯图模型和扩展网络推理
论文阅读·人工智能·深度学习·学习
王磊鑫4 小时前
计算机组成原理(2)王道学习笔记
笔记·学习
汉克老师4 小时前
GESP2024年3月认证C++六级( 第三部分编程题(1)游戏)
c++·学习·算法·游戏·动态规划·gesp6级
幸好我会魔法4 小时前
人格分裂(交互问答)-小白想懂Elasticsearch
大数据·spring boot·后端·elasticsearch·搜索引擎·全文检索
危险、4 小时前
Spring Boot 无缝集成SpringAI的函数调用模块
人工智能·spring boot·函数调用·springai
何中应5 小时前
从管道符到Java编程
java·spring boot·后端
东京老树根5 小时前
Excel 技巧21 - Excel中整理美化数据实例,Ctrl+T 超级表格(★★★)
笔记·学习·excel
customer086 小时前
【开源免费】基于SpringBoot+Vue.JS贸易行业crm系统(JAVA毕业设计)
java·vue.js·spring boot·后端·spring cloud·开源
CPU NULL7 小时前
新版IDEA创建数据库表
java·数据库·spring boot·sql·学习·mysql·intellij-idea
jacob~7 小时前
c++学习第十二天
学习