MyBatisPlus学习笔记【part2】

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代表TRUE,0代表FALSE,boolean类型在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的Wrapper,LambdaWrapper使用时用的是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”)
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Parker7

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值