MyBatisPlus学习笔记【part2】

导读:本篇文章讲解 MyBatisPlus学习笔记【part2】,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

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 查询字段
where WHERE 语句,拼接 + WHERE 条件
and AND 语句,拼接 + AND 字段=值
andNew AND 语句,拼接 + AND (字段=值)
or OR 语句,拼接 + OR 字段=值
orNew OR 语句,拼接 + OR (字段=值)
eq 等于=
allEq 基于 map 内容等于=
ne 不等于<>
gt 大于>
ge 大于等于>=
lt 小于<
le 小于等于<=
like 模糊查询 LIKE
notLike 模糊查询 NOT LIKE
in IN 查询
notIn NOT IN 查询
isNull NULL 值查询
isNotNull IS NOT NULL
groupBy 分组 GROUP BY
having HAVING 关键词
orderBy 排序 ORDER BY
orderAsc ASC 排序 ORDER BY
orderDesc DESC 排序 ORDER BY
exists EXISTS 条件语句
notExists NOT EXISTS 条件语句
between BETWEEN 条件语句
notBetween NOT BETWEEN 条件语句
addFilter 自由拼接 SQL
last 拼接在最后,例如:last(“LIMIT 1”)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/84468.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!