<返回更多

MyBatis-Plus条件构造器,从此优雅写SQL

2022-10-25  今日头条  添甄
加入收藏

前言

本章主要介绍MyBatis-Plus的条件构造器,条件构造器是MyBatis-Plus的核心,可以使用面向对象的方式来实现查询,本文内容涵盖开发的90%以上查询场景,我们慢慢往下看


一、条件构造器

1.1、官网的弊端

MyBatis-plus官网 一上来对条件构造器的介绍比较模糊,看不懂,不信您看一下

 


并且下方的案例中也没有创建WrApper对象的步骤,初学者在刚接触时比较抽象,看完这篇文章之后再去看官网就会比较清晰了。

 

1.2、条件构造器到底是什么

条件构造器就是可以帮助我们使用面向对象的方式实现数据库操作的where条件,在MyBatis-Plus中将它封装成了一个Wrapper对象,在使用时我们创建条件构造器对象。Wrapper对象的体系的结构大致如下:

 


其中 Wrapper 和 AbstractWrapper是两个抽象类不能直接实例化,我们在使用时常用的具体实现是QueryWrapper 和 UpdateWrapper,看名字好像是QueryWapper是查询时使用而UpdateWrapper是修改时使用,其实我在使用过程中无论修改还是查询用的都是QueryWrapper。它们还是有些许不同的,并不是很重要本文就先不介绍了。反正直接用QueryWrapper就完事

注意:如果您JDK1.8中的Lambda玩的比较溜,也可以使用 LambdaQueryWrapper 和 LambdaUpdateWrapper

 

二、代码实现

在操作sql时条件包含 等于,不等于,大于,小于,区间,模糊查询,limit等等,接下来我会演示一些常用的,基本上包含了工作中的99.99%场景。

2.1、创建构造器语法

// 其中泛型填充要操作的Entity
QueryWrapper<User> queryWrapper = new QueryWrapper<>();

2.2、ge、gt、le、lt、isNull、isNotNull

@Test
public void testDelete() {
	// 创建QueryWrapper对象
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    // 直接.即可其中isNull = where name IS NULL,查询名字部位空的
    queryWrapper
        .isNull("name")
        // 如果继续.说明条件使用 AND 连接,ge为大于等于的意思sql为:and age >= 12
        .ge("age", 12)
        // isNotNull就和isNull相反啦
        .isNotNull("email");
        // 调用delete方法说明要根据条件进行数据删除
    int result = userMapper.delete(queryWrapper);
    System.out.println("delete return count = " + result);
}

以上语法sql 如下

DELETE FROM tb_user WHERE name IS NULL AND age >= 12 AND email IS NOT NULL;

你品,你细品,很简单吧,其他的操作都一样,无非就是不同的方法有不同的功能,这里您可以自己写一写思考一下,我继续往下码字。

2.3、eq、ne

@Test
public void testSelectOne() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("name", "Tom");
    User user = userMapper.selectOne(queryWrapper);
    System.out.println(user);
}

2.4、between、notBetween

根据边界查询,包含边界大小

@Test
public void testSelectCount() { 
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.between("age", 20, 30);
    Long count = userMapper.selectCount(queryWrapper);
    System.out.println(count);
}

2.5、allEq

传入map,多个条件都必须成立,与无限eq效果相同

@Test
public void testSelectList() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    Map<String, Object> map = new HashMap<>();
    map.put("id", 2);
    map.put("name", "Jack");
    map.put("age", 20);
    queryWrapper.allEq(map);
    List<User> users = userMapper.selectList(queryWrapper);
    users.forEach(System.out::println);
}

// 等同于
@Test
public void testSelectList() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("id", 2).eq("name", "Jack").eq("age", 20);
    List<User> users = userMapper.selectList(queryWrapper);
    users.forEach(System.out::println);
}

2.6、like、notLike、likeLeft、likeRight

selectMaps返回Map集合列表,此处当然也可以使用selectList()来返回List集合

@Test
public void testSelectMaps() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper
        .notLike("name", "e")
        .likeRight("email", "t");
    List<Map<String, Object>> maps = userMapper.selectMaps(queryWrapper);
    // 返回值是Map列表
    maps.forEach(System.out::println);
}

2.7、in、notIn、inSql、notinSql、exists、notExists

这里可以通过 inSql 来实现子查询

@Test
public void testSelectObjs() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    //queryWrapper.in("id", 1, 2, 3);
    queryWrapper.inSql("id", "select id from user where id < 3");
    List<Object> objects = userMapper.selectObjs(queryWrapper);
    //返回值 是 Object 列表
    objects.forEach(System.out::println);
}

2.8、or、and

注意:这里使用的是UpdateWrapper不调用or则默认为使用and连,QueryWrapper也是同理

@Test
public void testUpdate1() {
    //修改值
    User user = new User();
    user.setAge(99);
    user.setName("Andy");
    //修改条件
    UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
    userUpdateWrapper
        .like("name", "h")
        .or()
        .between("age", 20, 30);
    int result = userMapper.update(user, userUpdateWrapper);
    System.out.println(result);
}

2.9、嵌套or、嵌套and

这里使用了lambda表达式,or中的表达式最后翻译成sql时会被加上圆括号

@Test
public void testUpdate2() {
    //修改值
    User user = new User();
    user.setAge(99);
    user.setName("Andy");
    //修改条件
    UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
    userUpdateWrapper
        .like("name", "h")
        .or(i -> i.eq("name", " 李白 ").ne("age", 20));
    int result = userMapper.update(user, userUpdateWrapper);
    System.out.println(result);
}

2.10、orderBy、orderByDesc、orderByAsc

排序嘛

@Test
public void testSelectListOrderBy() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.orderByDesc("id");
    List<User> users = userMapper.selectList(queryWrapper);
    users.forEach(System.out::println);
}

2.11、last

直接拼接到sql的最后,MySQL中实现查询指定条数数据时频繁使用

注意:只能调用一次,多次调用以最后一次为准,有sql注入的风险,请谨慎使用

@Test
public void testSelectListLast() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.last("limit 1");
    List<User> users = userMapper.selectList(queryWrapper);
    users.forEach(System.out::println);
}

2.12、指定要查询的列

@Test
public void testSelectListColumn() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.select("id", "name", "age");
    List<User> users = userMapper.selectList(queryWrapper);
    users.forEach(System.out::println);
}

2.13、set、setSql

这两个是UpdateWrapper特有的,最终的sql会合并user.setAge(),以及userUpdateWrapper.set()和setSql()中的字段

@Test
public void testUpdateSet() {
    //修改值
    User user = new User();
    user.setAge(99);
    //修改条件
    UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
    userUpdateWrapper
        .like("name", "h")
        .set("name", " 老李头 ")
        // 除了可以查询还可以使用set设置修改的字段
        .setSql(" email = '123@qq.com'");
    // 可以有子查询
    int result = userMapper.update(user, userUpdateWrapper);
}

总结

以上就是本文介绍的MyBatis-Plus所有内容,主要是条件构造器的体系和使用,其中案例部分几乎涵盖了所有的应用场景,大家可以根据具体的需求灵活组合,单表脱离xml文件岂不是爽。接下来还会继续带来MyBatis-Plus系列文章,敬请期待!

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>