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>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM