MyBatisPlus学习笔记【part2】

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

MyBatisPlus学习笔记【part2】

一、查询操作

1.通过多个id批量查询

调用selectBatchIds方法。

@Test
public void testSelect1(){
    List<User> users = userMapper.selectBatchIds(Arrays.asList(1,2,3));
    System.out.println(users);
}

2.简单的条件查询

通过map来封装查询条件调用selectByMap方法。

注意map中的key对应数据库中的列名。如数据库user_id实体类是userId这时map的key需要填写数据库的user_id 。

@Test void testSelect2(){
    Map<String,Object> map = new HashMap<>();
    map.put("name","zhangsan7");
    map.put("age",18);
    List<User> users = userMapper.selectByMap(map);
    System.out.println(users);
}

3.分页查询

MyBatis Plus自带分页插件只要简单的配置即可实现分页功能。

第一步配置类中添加分页插件。

@Configuration
@MapperScan(basePackages = "com.ichuang.swz.mapper")
public class MybatisPlusConfig {
    
    /*
     * 分页插件
     */
    @Bean
    public MybatisPlusInterceptor paginationInnerInterceptor(){
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return mybatisPlusInterceptor;
    }
}

第二步通过page对象获取相关数据。

@Test
public void testSelect3(){
    Page page = new Page(1,5);
    Page userPage = userMapper.selectPage(page, null); //返回对象得到所有分页数据
    long pages = userPage.getPages(); //总页数
    long pageCurrent = userPage.getCurrent(); //当前页
    List records = userPage.getRecords(); //查询出来的数据集合
    long total = userPage.getTotal(); //总记录数
    boolean hasNext = userPage.hasNext(); //是否有上一页
    boolean hasPrevious = userPage.hasPrevious(); //是否有上一页

    log.info("总页数{}页",String.valueOf(pages));
    log.info("当前页{}页",String.valueOf(pageCurrent));
    log.info("数据集------{}",String.valueOf(records));
    log.info("总记录数{}",String.valueOf(total));
    log.info("是否有下一页---{}",String.valueOf(hasNext));
    log.info("是否有上一页---{}",String.valueOf(hasPrevious));

    /*输出结果
    3-01-13 15:55:14.235  INFO 13852 --- [           main] com.ichuang.swz.SwzApplicationTests      : 总页数2页
    2023-01-13 15:55:14.235  INFO 13852 --- [           main] com.ichuang.swz.SwzApplicationTests      : 当前页1页
    2023-01-13 15:55:14.235  INFO 13852 --- [           main] com.ichuang.swz.SwzApplicationTests      : 数据集------[User(id=1, name=Jone, age=18, email=test1@baomidou.com, createTime=null, updateTime=null, version=null), User(id=2, name=Jack, age=20, email=test2@baomidou.com, createTime=null, updateTime=null, version=null), User(id=3, name=Tom, age=28, email=test3@baomidou.com, createTime=null, updateTime=null, version=null), User(id=4, name=Sandy, age=21, email=test4@baomidou.com, createTime=null, updateTime=null, version=null), User(id=5, name=Billie, age=24, email=test5@baomidou.com, createTime=null, updateTime=null, version=null)]
    2023-01-13 15:55:14.235  INFO 13852 --- [           main] com.ichuang.swz.SwzApplicationTests      : 总记录数8
    2023-01-13 15:55:14.236  INFO 13852 --- [           main] com.ichuang.swz.SwzApplicationTests      : 是否有下一页---true
    2023-01-13 15:55:14.236  INFO 13852 --- [           main] com.ichuang.swz.SwzApplicationTests      : 是否有上一页---false
     */
}

分页查询也可以用 selectMapsPage方法 此时返回的结果集是Map类型但使用情况较少。

二、删除操作

1.根据id删除

@Test
public void testDeleteById(){
    userMapper.deleteById(1613780561515573250L);
}

2.批量删除

根据存放id的集合进行批量删除。

@Test
public void testDeleteBatchIds() {
    userMapper.deleteBatchIds(Arrays.asList(1, 2, 3));
}

3.简单条件删除

通过map封装条件来进行条件删除。

@Test
public void testDeleteByMap() {
    HashMap<String, Object> map = new HashMap<>();
    map.put("name", "zhangsan");
    map.put("age", 25);
    userMapper.deleteByMap(map);
}

4.逻辑删除

物理删除真实删除将对应数据从数据库中删除之后查询不到此条被删除数据。

逻辑删除假删除将对应数据中代表是否被删除字段状态修改为“被删除状态”之后在数据库中仍旧能看到此条数据记录。

逻辑删除的使用场景可以进行数据恢复或有关联数据不便直接删除。

MybatisPlus实现逻辑删除第一步在数据库中添加 deleted 字段。

ALTERTABLE `user` ADD COLUMN `deleted` boolean DEFAULT false

注MySQL保存Boolean值时用1代表TRUE0代表FALSEboolean类型在MySQL里的类型为tinyint(1)。

第二步实体类中添加@TableLogic注解。

@TableLogic
private Integer delete;

第三步application.properties 加入以下配置此为默认值如果你的默认值和mp默认的一样该配置可无。

mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0

第四步单元测试。

测试后发现数据并没有被删除deleted字段的值由0变成了1。

注意经过上面的配置记录被删除前数据的deleted 字段的值必须是 0才能被选取出来执行逻辑删除的操作。

@Test
public void testLogicDelete(){
    userMapper.deleteById(1613776095357759489L);
}

此时查询所有时id为已不会被查到。

@Test
public void testLogicDeleteSelect() {
    List<User> users = userMapper.selectList(null);
    users.forEach(System.out::println);
}

三、条件构造器

1.Wrapper 条件构造抽象类

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

​ QueryWrapper 查询条件封装

​ UpdateWrapper Update 条件封装

AbstractLambdaWrapper 使用Lambda 语法

​ LambdaQueryWrapper 用于Lambda语法使用的查询Wrapper

​ LambdaUpdateWrapper Lambda 更新封装Wrapper

一般会使用Lambda的WrapperLambdaWrapper使用时用的是Lambda表达式来表示字段名而Wrapper使用时需要我们自己填写String类型的字段名容易写错。LambdaWrapper在编写代码时若字段名写错就会报红而Wrapper不能只能在编译时发现。

2.ge、gt、le、lt、isNull、isNotNul

代码如下。

@Test
public void testQuery1(){
    LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper();
    queryWrapper.isNotNull(User::getName)
        .gt(User::getAge,20);
    List<User> users = userMapper.selectList(queryWrapper);
    users.forEach(System.out::println);
}

3.eq、ne

代码如下。其中selectOne方法只能返回一条记录多余一条则抛出异常。

@Test
public void testQuery2(){
    LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper();
    queryWrapper.eq(User::getName,"zhangsan");
    User user = userMapper.selectOne(queryWrapper);
    System.out.println(user);
}

4.between、notBetween

包含大小边界。selectCount方法返回的为记录数量。

@Test
public void testQuery3(){
    LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper();
    queryWrapper.between(User::getAge,20,25);
    Integer count = userMapper.selectCount(queryWrapper);
    System.out.println(count);
}

5.like、notLike、likeLeft、likeRight

selectMaps方法返回Map集合列表通常配合select方法使用。select方法选取列。

@Test
public void testQuery4(){
    LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper();
    queryWrapper.select(User::getName,User::getAge)
        .like(User::getName,"zhangsan")
        .likeLeft(User::getEmail,"@qq.com");
    List<Map<String, Object>> maps = userMapper.selectMaps(queryWrapper);
    maps.forEach(System.out::println);
}

/*拼接出的sql语句
==>  Preparing: SELECT name,age FROM user WHERE deleted=0 AND (name LIKE ? AND email LIKE ?)
==> Parameters: %zhangsan%(String), %@qq.com(String)
*/
/* 输出的map集合
{name=zhangsan, age=30}
*/

6.orderBy、orderByDesc、orderByAsc

代码如下。

@Test
public void testQuery5(){
    LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper();
    queryWrapper.orderByDesc(User::getAge,User::getName);
    List<User> users = userMapper.selectList(queryWrapper);
    users.forEach(System.out::println);
}

7.查询方式速查

查询方式说明
setSqlSelect设置 SELECT 查询字段
whereWHERE 语句拼接 + WHERE 条件
andAND 语句拼接 + AND 字段=值
andNewAND 语句拼接 + AND (字段=值)
orOR 语句拼接 + OR 字段=值
orNewOR 语句拼接 + OR (字段=值)
eq等于=
allEq基于 map 内容等于=
ne不等于<>
gt大于>
ge大于等于>=
lt小于<
le小于等于<=
like模糊查询 LIKE
notLike模糊查询 NOT LIKE
inIN 查询
notInNOT IN 查询
isNullNULL 值查询
isNotNullIS NOT NULL
groupBy分组 GROUP BY
havingHAVING 关键词
orderBy排序 ORDER BY
orderAscASC 排序 ORDER BY
orderDescDESC 排序 ORDER BY
existsEXISTS 条件语句
notExistsNOT EXISTS 条件语句
betweenBETWEEN 条件语句
notBetweenNOT BETWEEN 条件语句
addFilter自由拼接 SQL
last拼接在最后例如last(“LIMIT 1”)
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6