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);
}
相关推荐
DKPT24 分钟前
Java桥接模式实现方式与测试方法
java·笔记·学习·设计模式·桥接模式
DuelCode3 小时前
Windows VMWare Centos Docker部署Springboot 应用实现文件上传返回文件http链接
java·spring boot·mysql·nginx·docker·centos·mybatis
优创学社23 小时前
基于springboot的社区生鲜团购系统
java·spring boot·后端
好好研究3 小时前
学习栈和队列的插入和删除操作
数据结构·学习
幽络源小助理3 小时前
SpringBoot基于Mysql的商业辅助决策系统设计与实现
java·vue.js·spring boot·后端·mysql·spring
猴哥源码3 小时前
基于Java+springboot 的车险理赔信息管理系统
java·spring boot
新中地GIS开发老师4 小时前
新发布:26考研院校和专业大纲
学习·考研·arcgis·大学生·遥感·gis开发·地理信息科学
SH11HF4 小时前
小菜狗的云计算之旅,学习了解rsync+sersync实现数据实时同步(详细操作步骤)
学习·云计算
Frank学习路上5 小时前
【IOS】XCode创建firstapp并运行(成为IOS开发者)
开发语言·学习·ios·cocoa·xcode
Code blocks5 小时前
使用Jenkins完成springboot项目快速更新
java·运维·spring boot·后端·jenkins