mybatis-plus中wrapper的用法实例详解

目录
  • 一、条件构造器关系介绍
    • 条件构造器关系介绍 :
    • wapper介绍 :
  • 二、项目实例
    • 1、根据主键或者简单的查询条件进行查询
    • 2、MyBatis-Plus还提供了Wrapper条件构造器,具体使用看如下代码:
  • 三、具体使用操作
    • 1、ge、gt、le、lt、isNull、isNotNull
    • 2、eq、ne
    • 3、between、notBetween
    • 4、allEq
    • 5、like、notLike、likeLeft、likeRight
    • 6、in、notIn、inSql、notinSql、exists、notExists
    • 7、or、and
    • 8、嵌套or、嵌套and
    • 9、orderBy、orderByDesc、orderByAsc
    • 10、last
    • 11、指定要查询的列
    • 12、set、setSql

用到了wrapper,整理资料记录一下,以备后续复习。

一、条件构造器关系介绍

条件构造器关系介绍 :

上图绿色框为抽象类abstract
蓝色框为正常class类,可new对象
黄色箭头指向为父子类关系,箭头指向为父类

wapper介绍 :

Wrapper : 条件构造抽象类,最顶端父类

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

QueryWrapper : Entity 对象封装操作类,不是用lambda语法

UpdateWrapper : Update 条件封装,用于Entity对象更新操作

AbstractLambdaWrapper : Lambda 语法使用 Wrapper统一处理解析 lambda 获取 column。

LambdaQueryWrapper :看名称也能明白就是用于Lambda语法使用的查询Wrapper

LambdaUpdateWrapper : Lambda 更新封装Wrapper

二、项目实例

1、根据主键或者简单的查询条件进行查询

 /**
     * 通过单个ID主键进行查询
     */
    @Test
    public void selectById() {
        User user = userMapper.selectById(1094592041087729666L);
        System.out.println(user);
    }

    /**
     * 通过多个ID主键查询
    public void selectByList() {
        List<Long> longs = Arrays.asList(1094592041087729666L, 1094590409767661570L);
        List<User> users = userMapper.selectBatchIds(longs);
        users.forEach(System.out::println);
     * 通过Map参数进行查询
    public void selectByMap() {
        Map<String, Object> params = new HashMap<>();
        params.put("name", "张雨琪");
        List<User> users = userMapper.selectByMap(params);

2、MyBatis-Plus还提供了Wrapper条件构造器,具体使用看如下代码:

/**
     * 名字包含雨并且年龄小于40
     * <p>
     * WHERE name LIKE '%雨%' AND age < 40
     */
    @Test
    public void selectByWrapperOne() {
        QueryWrapper<User> wrapper = new QueryWrapper();
        wrapper.like("name", "雨").lt("age", 40);
        List<User> users = userMapper.selectList(wrapper);
        users.forEach(System.out::println);
    }

    /**
     * 名字包含雨
     * 年龄大于20小于40
     * 邮箱不能为空
     * WHERE name LIKE '%雨%' AND age BETWEEN 20 AND 40 AND email IS NOT NULL
    public void selectByWrapperTwo() {
        QueryWrapper<User> wrapper = Wrappers.query();
        wrapper.like("name", "雨").between("age", 20, 40).isNotNull("email");
     * 名字为王性
     * 或者年龄大于等于25
     * 按照年龄降序排序,年龄相同按照id升序排序
     * WHERE name LIKE '王%' OR age >= 25 ORDER BY age DESC , id ASC
    public void selectByWrapperThree() {
        wrapper.likeRight("name", "王").or()
                .ge("age", 25).orderByDesc("age").orderByAsc("id");
     * 查询创建时间为2019年2月14
     * 并且上级领导姓王
     * WHERE date_format(create_time,'%Y-%m-%d') = '2019-02-14' AND manager_id IN (select id from user where name like '王%')
    public void selectByWrapperFour() {
        wrapper.apply("date_format(create_time,'%Y-%m-%d') = {0}", "2019-02-14")
                .inSql("manager_id", "select id from user where name like '王%'");
     * 查询王姓
     * 并且年龄小于40或者邮箱不为空
     * WHERE name LIKE '王%' AND ( age < 40 OR email IS NOT NULL )
    public void selectByWrapperFive() {
        wrapper.likeRight("name", "王").and(qw -> qw.lt("age", 40).or().isNotNull("email"));
     * 并且年龄大于20 、年龄小于40、邮箱不能为空
     * WHERE name LIKE ? OR ( age BETWEEN ? AND ? AND email IS NOT NULL )
    public void selectByWrapperSix() {
        wrapper.likeRight("name", "王").or(
                qw -> qw.between("age", 20, 40).isNotNull("email")
        );
     * (年龄小于40或者邮箱不为空) 并且名字姓王
     * WHERE ( age < 40 OR email IS NOT NULL ) AND name LIKE '王%'
    public void selectByWrapperSeven() {
        wrapper.nested(qw -> qw.lt("age", 40).or().isNotNull("email"))
                .likeRight("name", "王");
     * 查询年龄为30、31、32
     * WHERE age IN (?,?,?)
    public void selectByWrapperEight() {
        wrapper.in("age", Arrays.asList(30, 31, 32));
     * 查询一条数据
     * limit 1
    public void selectByWrapperNine() {
        wrapper.in("age", Arrays.asList(30, 31, 32)).last("limit 1");

三、具体使用操作

注意:以下条件构造器的方法入参中的 column 均表示数据库字段

1、ge、gt、le、lt、isNull、isNotNull

@Test
public void testDelete() {

    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper
        .isNull("name")
        .ge("age", 12)
        .isNotNull("email");
    int result = userMapper.delete(queryWrapper);
    System.out.println("delete return count = " + result);
}
SQL:UPDATE user SET deleted=1 WHERE deleted=0 AND name IS NULL AND age >= ? AND email IS NOT NULL

2、eq、ne

注意:seletOne返回的是一条实体记录,当出现多条时会报错

@Test
public void testSelectOne() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("name", "Tom");

    User user = userMapper.selectOne(queryWrapper);
    System.out.println(user);
}

3、between、notBetween

包含大小边界

@Test
public void testSelectCount() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.between("age", 20, 30);

    Integer count = userMapper.selectCount(queryWrapper);
    System.out.println(count);
}
SELECT COUNT(1) FROM user WHERE deleted=0 AND age BETWEEN ? AND ? 

4、allEq

@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);9
    queryWrapper.allEq(map);
    List<User> users = userMapper.selectList(queryWrapper);
    users.forEach(System.out::println);
}
SELECT id,name,age,email,create_time,update_time,deleted,version FROM user WHERE deleted=0 AND name = ? AND id = ? AND age = ? 

5、like、notLike、likeLeft、likeRight

selectMaps返回Map集合列表

@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);
}
SELECT id,name,age,email,create_time,update_time,deleted,version FROM user WHERE deleted=0 AND name NOT LIKE ? AND email LIKE ? 

6、in、notIn、inSql、notinSql、exists、notExists

in、notIn:

notIn("age",{1,2,3})--->age not in (1,2,3)
notIn("age", 1, 2, 3)--->age not in (1,2,3)

inSql、notinSql:可以实现子查询

例: inSql("age", "1,2,3,4,5,6")--->age in (1,2,3,4,5,6)
例: inSql("id", "select id from table where id < 3")--->id in (select id from table where id < 3)
SELECT id,name,age,email,create_time,update_time,deleted,version FROM user WHERE deleted=0 AND id IN (select id from user where id < 3) 

7、or、and

注意:这里使用的是 UpdateWrapper 不调用or则默认为使用 and 连

@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);
}
UPDATE user SET name=?, age=?, update_time=? WHERE deleted=0 AND name LIKE ? OR age BETWEEN ? AND ?

8、嵌套or、嵌套and

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

@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);
}
UPDATE user SET name=?, age=?, update_time=?
WHERE deleted=0 AND name LIKE ?
OR ( name = ? AND age <> ? ) 

9、orderBy、orderByDesc、orderByAsc

@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);
}
SELECT id,name,age,email,create_time,update_time,deleted,version
FROM user WHERE deleted=0 ORDER BY id DESC

10、last

直接拼接到 sql 的最后

注意:只能调用一次,多次调用以最后一次为准 有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);
}
SELECT id,name,age,email,create_time,update_time,deleted,version
FROM user WHERE deleted=0 limit 1

11、指定要查询的列

@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);
}
SELECT id,name,age FROM user WHERE deleted=0

12、set、setSql

最终的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);
}
UPDATE user SET age=?, update_time=?, name=?, email = '123@qq.com' WHERE deleted=0 AND name LIKE ?

参考文档

1、https://blog.csdn.net/m0_37034294/article/details/82917234

2、https://blog.csdn.net/kepengs/article/details/112345870

3、https://blog.csdn.net/weixin_39615889/article/details/107086931

4、https://blog.csdn.net/weixin_38111957/article/details/91447509

到此这篇关于mybatis-plus中wrapper的用法(详细)的文章就介绍到这了,更多相关mybatis-plus中wrapper用法内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • MyBatis-Plus实现2种分页方法(QueryWrapper查询分页和SQL查询分页)

    目录 1 MyBatisPlusConfig 2 UserPagination 3 Mapper 3.1 UserMapper.java 3.2 UserMapper.xml 4 Service 4.1 UserService 4.2 UserServiceImpl 5 UserController 6 调试结果 6.1 QueryWrapper查询分页 6.2 SQL查询分页 1 MyBatisPlusConfig MyBatisPlus配置类. package com.config; imp

  • Mybatis-Plus 条件构造器 QueryWrapper 的基本用法

    前言 记录下Mybatis-Plus中条件构造器Wrapper 的一些基本用法. 查询示例 表结构 CREATE TABLE `product` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL, `create_time` datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`)

  • Mybatis-Plus Wrapper条件构造器超详细使用教程

    目录 Wrapper条件构造器 1 queryWrapper构造器 1.1 组装删改查条件 1.2 条件优先级 1.3 实现子查询 2 updateWrapper构造器 2.1 升级修改方法(无需创建对象) 2.2 实际开发时的应用 3 lambdaXxxWrapper构造器 3.1 lambdaQueryWrapper构造器 3.2 lambdaUpdateWrapper构造器 Wrapper条件构造器 条件构造器wrapper就是用来封装CRUD方法参数条件的一个接口,其底层有很多的子类,最

  • mybatis-plus QueryWrapper 添加limit方式

    目录 QueryWrapper 添加limit mybatis分页出现limit错误 QueryWrapper 添加limit 其实是在sql的最后加上 limit 相关的语句. QueryWrapper wrapper = new QueryWrapper<>(); wrapper.last("limit 1"); mybatis分页出现limit错误 在反复没有问题代码时,请检查你的SQL语句!!!!(细心检查) <mapper namespace="c

  • 基于mybatis-plus QueryWrapper 排序的坑

    目录 QueryWrapper排序的坑 条件构造器QueryWrapper 案例一 案例二 案例三 案例四 QueryWrapper排序的坑 大致可以总结成上面的两句话. 条件构造器QueryWrapper 我们再搞几个实例来深入理解下条件构造器QueryWrapper的用法: 案例一 查询姓李的,并且出生日期范围是1993-02-09到1994-04-09的员工 sql实现: SELECT * FROM t_employee WHERE DATE_FORMAT(birthday,'%Y-%m-

  • mybatis-plus QueryWrapper and or 连用并且实现分页

    目录 QueryWrapper and or 连用并分页 and or 拼完后的结果是这样的 使用or和and的问题 比如下面这种 QueryWrapper and or 连用并分页 Page<TestEntity> rpage = baseMapper.selectPage( new Page<>(pageBean.getPageSize(), pageBean.getPageNum()), new QueryWrapper<TestEntity>() .eq(&qu

  • mybatis-plus QueryWrapper自定义查询条件的实现

    mybatis-plus框架功能很强大,把很多功能都集成了,比如自动生成代码结构,mybatis crud封装,分页,动态数据源等等,附上官网链接https://mp.baomidou.com/,github上有代码例子,国内小伙伴推荐码云https://gitee.com/baomidou/mybatis-plus.  但是,其中还是有些小坑,文档也没有涉及的很全面,碰到问题,百度或者发issue,能力强的还是直接看源码好,一切答案都在源码中. 版本推荐用3.1.0,3.1.1及以上版本有bu

  • 详解MyBatis-Plus Wrapper条件构造器查询大全

    一.引言 那么那么那么今天来说下MP中强大的条件查询功能. 本章是基于上个案例来讲的:MyBaits-Plus 快速入门案例 二.具体操作 首先来说说基本的查询吧,根据主键或者简单的查询条件进行查询. /** * 通过单个ID主键进行查询 */ @Test public void selectById() { User user = userMapper.selectById(1094592041087729666L); System.out.println(user); } /** * 通过多

  • MyBatis-Plus QueryWrapper及LambdaQueryWrapper的使用详解

    目录 QueryWrapper LambdaQueryWrapper 链式查询 假如我们有一张banner_item表,现需要通过banner_id查出所有数据(查询List) @Data public class BannerItem {     private Long id;     private String name;     private String img;     private String keyword;     private Integer type;     p

  • mybatis-plus中wrapper的用法实例详解

    目录 一.条件构造器关系介绍 条件构造器关系介绍 : wapper介绍 : 二.项目实例 1.根据主键或者简单的查询条件进行查询 2.MyBatis-Plus还提供了Wrapper条件构造器,具体使用看如下代码: 三.具体使用操作 1.ge.gt.le.lt.isNull.isNotNull 2.eq.ne 3.between.notBetween 4.allEq 5.like.notLike.likeLeft.likeRight 6.in.notIn.inSql.notinSql.exists

  • MySQL数据类型中DECIMAL的用法实例详解

    MySQL数据类型中DECIMAL的用法实例详解 在MySQL数据类型中,例如INT,FLOAT,DOUBLE,CHAR,DECIMAL等,它们都有各自的作用,下面我们就主要来介绍一下MySQL数据类型中的DECIMAL类型的作用和用法. 一般赋予浮点列的值被四舍五入到这个列所指定的十进制数.如果在一个FLOAT(8, 1)的列中存储1. 2 3 4 5 6,则结果为1. 2.如果将相同的值存入FLOAT(8, 4) 的列中,则结果为1. 2 3 4 6. 这表示应该定义具有足够位数的浮点列以便

  • Python中optparser库用法实例详解

    本文研究的主要是Python中optparser库的相关内容,具体如下. 一直以来对optparser不是特别的理解,今天就狠下心,静下心研究了一下这个库.当然了,不敢说理解的很到位,但是足以应付正常的使用了.废话不多说,开始今天的分享吧. 简介 optparse模块主要用来为脚本传递命令参数功能. 引入 在IDE中引入optparser是很方便的. from optparser import OptionParser 初始化 相对而言,初始化需要我们多注意一点点了. 因为我们有两种不同的方式来

  • MySQL中Replace语句用法实例详解

    目录 前言 一.replace into函数 二.replace into .insert ignore 和 insert into的区别 三.replace函数 总结 前言 replace into平时在开发中很少用到,这次是因为在做一个生成分布式ID的开源项目,调研雅虎推出的一个基于数据库生成唯一id生成方案:flickr 碰到的一个知识盲点,仅以此篇记录一下. 一.replace into函数 表结构 CREATE TABLE `id_generator` ( `id` bigint(20

  • Jquery中基本选择器用法实例详解

    本文实例讲述了Jquery中基本选择器用法.分享给大家供大家参考.具体如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head

  • java中Calendar类用法实例详解

    本文实例讲述了java中Calendar类用法.分享给大家供大家参考,具体如下: java中的Calendar在开发中经常被忽略,这篇博客总结一下这个类,对后面项目中使用时期的时候有帮助. Calendar常量(field)的作用 Calendar cal = Calendar.getInstance(); cal.get(Calendar.DATE);//-----------------------当天 1-31 cal.get(Calendar.DAY_OF_MONTH);//------

  • Python3.2中Print函数用法实例详解

    本文实例讲述了Python3.2中Print函数用法.分享给大家供大家参考.具体分析如下: 1. 输出字符串 >>> strHello = 'Hello World' >>> print (strHello) Hello World 2. 格式化输出整数 支持参数格式化,与C语言的printf类似 >>> strHello = "the length of (%s) is %d" %('Hello World',len('Hello

  • python中urllib模块用法实例详解

    本文实例讲述了python中urllib模块用法.分享给大家供大家参考.具体分析如下: 一.问题: 近期公司项目的需求是根据客户提供的api,我们定时去获取数据, 之前的方案是用php收集任务存入到redis队列,然后在linux下做一个常驻进程跑某一个php文件, 该php文件就一个无限循环,判断redis队列,有就执行,没有就break. 二.解决方法: 最近刚好学了一下python, python的urllib模块或许比php的curl更快,而且简单. 贴一下代码 复制代码 代码如下: #

  • python中字典(Dictionary)用法实例详解

    本文实例讲述了python中字典(Dictionary)用法.分享给大家供大家参考.具体分析如下: 字典(Dictionary)是一种映射结构的数据类型,由无序的"键-值对"组成.字典的键必须是不可改变的类型,如:字符串,数字,tuple:值可以为任何python数据类型. 1.新建字典 >>> dict1={} #建立一个空字典 >>> type(dict1) <type 'dict'> 2.增加字典元素:两种方法 >>&g

  • Python中subprocess模块用法实例详解

    本文实例讲述了Python中subprocess模块用法.分享给大家供大家参考.具体如下: 执行命令: >>> subprocess.call(["ls", "-l"]) 0 >>> subprocess.call("exit 1", shell=True) 1 测试调用系统中cmd命令,显示命令执行的结果: x=subprocess.check_output(["echo", "

随机推荐