zoukankan      html  css  js  c++  java
  • QueryWrapper、UpdateWrapper和LambdaWrapper

    PS:所有示例中的userService接口 为 IUserService继承了MP中的 IService

    1. QueryWrapper

    说明:

    继承自 AbstractWrapper ,自身的内部属性 entity 也用于生成 where 条件
    LambdaQueryWrapper, 可以通过 new QueryWrapper().lambda() 方法获取

    1.1 select函数

    select(String... sqlSelect)
    select(Predicate<TableFieldInfo> predicate)
    select(Class<T> entityClass, Predicate<TableFieldInfo> predicate)
    
    • 设置查询字段

    说明:

    以上方分法为两类.
    第二类方法为:过滤查询字段(主键除外),入参不包含 class 的调用前需要wrapper内的entity属性有值! 这两类方法重复调用以最后一次为准

    • 实战
    /**
     * 设置所要查询的字段
     */
    @Test
    public void test01(){
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.select("name","age");
        List<User> users = userMapper.selectList(queryWrapper);
        users.forEach(System.out::println);
    }
    
    • 上述代码对应执行的sql语句
    SELECT name,age FROM tb_user WHERE is_deleted=0
    
    -------查询结果:user对象只封装了name和age属性-------------
    
    User(id=null, name=222222, age=12, email=null, version=null, isDeleted=null, mgtCreated=null, mgtModified=null)
    
    User(id=null, name=eqw, age=32, email=null, version=null, isDeleted=null, mgtCreated=null, mgtModified=null)
    ......
    
    • 第二种方法的使用(可以排除或指定查询字段)
    QueryWrapper<Admin> wrapper = new QueryWrapper<>();
    // 下列构造方式指定排除password字段
    wrapper.select(Admin.class,i -> !i.getColumn().equals("password"));
    

    2. UpdateWrapper

    说明:

    继承自 AbstractWrapper ,自身的内部属性 entity 也用于生成 where 条件
    LambdaUpdateWrapper, 可以通过 new UpdateWrapper().lambda() 方法获取!

    2.1 set函数

    set(String column, Object val)
    set(boolean condition, String column, Object val)
    
    • SQL SET 字段的属性值

      • 例: set("name", "老李头")
      • 例: set("name", "")--->数据库字段值变为空字符串
      • 例: set("name", null)--->数据库字段值变为null
    • 实战

    /**
     * 插入或更新
     */
    @Test
    public void test03(){
        UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
        updateWrapper.in("age",Arrays.asList(20,30,40));
        updateWrapper.set("name","jack");
        updateWrapper.set("age",43);
        updateWrapper.set("email","sakara@qq.top");
        userService.update(updateWrapper);
    }
    
    • 执行的SQL

    age = 20/30/40 的 user 其姓名,age ,email设置为:jack ,43,sakara@qq.top

    UPDATE tb_user SET name='jack',age=43,email='sakara@qq.top' WHERE is_deleted=0 AND (age IN (20,30,40))
    

    2.2 setSql函数

    setSql(String sql)
    
    • 设置 SET 部分 SQL

    • 例: setSql("name = '老李头'")

    • 实战

     /**
      * 根据 UpdateWrapper 条件,更新记录 需要设置 sqlset
      */
    @Test
    public void test06(){
        UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
        // 设置 set sql语句部分
        updateWrapper.setSql("age = 18");
        updateWrapper.eq("name","jason");
        userService.update(updateWrapper);
    }
    
    • 执行的sql
     UPDATE tb_user SET age = 18 WHERE is_deleted=0 AND (name = 'jason')
    

    3. LambdaWrapper

    获取 LambdaWrapper
    QueryWrapper中是获取LambdaQueryWrapper
    UpdateWrapper中是获取LambdaUpdateWrapper

    3.1 LambdaQueryWrapper

    /**
     * lambda链式编程
     */
    @Test
    public void test88(){
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.lambda()
                .between(User::getAge,30,60)
                .orderByDesc(User::getId);
        List<User> list = userService.list(queryWrapper);
        list.forEach(System.out::println);
    }
    
    • 执行的SQL语句
    SELECT id,name,age,email,version,is_deleted,mgt_created,mgt_modified FROM tb_user WHERE is_deleted=0 AND (age BETWEEN 30 AND 60) ORDER BY id DESC
    

    3.2 LambdaUpdateWrapper

    /**
     * 测试链式编程更新操作
     */
    @Test
    public void test99(){
        UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
        updateWrapper.lambda()
                .le(User::getAge, 30)
                .setSql("email = 'le30@duck.top'");
        userService.update(updateWrapper);
    }
    
    • 执行的SQL语句
    UPDATE tb_user SET email = 'le30@duck.top' WHERE is_deleted=0 AND (age <= 30)
    

    4. 使用 Wrapper 自定义SQL

    需求来源:

    在使用了mybatis-plus之后, 自定义SQL的同时也想使用Wrapper的便利应该怎么办? 在mybatis-plus版本3.0.7得到了完美解决 版本需要大于或等于3.0.7, 以下两种方案取其一即可

    • Service.java
    mysqlMapper.getAll(Wrappers.<MysqlData>lambdaQuery().eq(MysqlData::getGroup, 1));
    
    • 方案一 注解方式 Mapper.java
    @Select("select * from mysql_data ${ew.customSqlSegment}")
    List<MysqlData> getAll(@Param(Constants.WRAPPER) Wrapper wrapper);
    
    • 方案二 XML形式 Mapper.xml
    <select id="getAll" resultType="MysqlData">
    	SELECT * FROM mysql_data ${ew.customSqlSegment}
    </select>
    
  • 相关阅读:
    [计算机视觉]算法
    [python]python中**是什么
    ubuntu16.04增大swap空间
    conda查看某个安装包的依赖项
    conda install -c anaconda
    conda安装指定版本的指定包
    ValueError: Unable to determine SOCKS version from socks://127.0.0.1:1080/
    [ubuntu]卸载老版并安装最新版firefox
    使用anaconda创建tensorflow环境后如何在jupyter notebook中使用
    [python]numpy.mean()用法
  • 原文地址:https://www.cnblogs.com/code-duck/p/13433809.html
Copyright © 2011-2022 走看看