Java - LambdaQueryWrapper の一般的なメソッド

1. mybatisPlus の jar パッケージがプロジェクトにインポートされているかどうかを確認します。

2. サービス層と実装クラスは mybatisPlus と統合する必要があります

サービスは IService<> を継承します

ここに画像の説明を挿入します実装クラスは、IService の実装クラス ServiceImpl<mapper,entity class> を継承する必要があります。

ここに画像の説明を挿入します

3. マッパーにいくつかのメソッドが必要な場合、マッパーは BaseMapper<entity class> を継承する必要があります。

ここに画像の説明を挿入します

4. 実装クラスにメソッドを実装する場合、xmlにメソッドを記述する必要はありません。

要約すると次のようになります。

【1】ページ

参数1是分页起始位置,一般是1,参数2:结束位置,    一般都是前端传过来的,查询的数量
Page<LandLossAllowance> page1 = new Page<LandLossAllowance>(参数1,参数2);
LambdaQueryWrapper<LandLossAllowance> queryWrapper = new LambdaQueryWrapper<>();
条件 eq 指的是相等
queryWrapper.eq(LandLossAllowance::getCountrySide,landLossAllowanceOption.getCountrySide());
执行page方法 page(参数1,参数2)
    参数1:上面的new的分页对象,参数2是lambda表达式查询条件
IPage<LandLossAllowance> iPage = page(page1, queryWrapper);

(1) PageHelper と IPage の違い

説明書:

PageHelper.startPage() を実行し、その後 SQL を記述します。次の SQL は機能します。
IPage は、IPage を実装する dao 層で IPage 実装クラス Page オブジェクトを渡す必要があります。

違い:

PageHelper の内部原理は、受信したページ番号と記事番号を Page オブジェクトに割り当て、それをローカル スレッド ThreadLoacl に保存し、Mybatis のインターセプタに入るというものです。
    次に、インターセプターのローカル スレッドに保存されているページング パラメーターを取得します。最後に、これらのページング パラメータが元の SQL と内部定義された SQL と結合され、SQL ページング処理が完了します。
    途中で、SQLの種類がクエリであるか、変更操作であるかを判断します。クエリの場合は、ページング ロジックに入り、カプセル化された Page オブジェクトが null であるかどうかを判断します。null の場合はページングは​​行われず、それ以外の場合はページングが行われます。

IPage の内部原理もインターセプタに基づいていますが、これはメソッドとメソッド内のパラメータをインターセプトするため、これがクエリ操作であるかどうかも判断されます。クエリ操作の場合は、ページング処理ロジックが入ります。
ページング ロジック処理に入った後、インターセプターはリフレクションを通じてメソッドのパラメーターを取得し、IPage オブジェクトの実装クラスが存在するかどうかを判断します。存在しない場合はページングは​​実行されず、存在する場合はパラメータが IPage オブジェクトに割り当てられます。
次に、スプ​​ライシング SQL 処理を実行して、ページング操作を完了します。
ただし、IPage を使用するには、Bean インターセプターを挿入し、Spring にそれを管理させる必要があります。次のように。そうしないと傍受は行われません。

Ipage を使用した後、いくつかの構成を挿入する必要があります。

@Configuration
@MapperScan(value={"com.XX.**.mapper*"})
public class MybatisPlusConfig {

    /**
     * 分页插件
     */
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        // 设置sql的limit为无限制,默认是500
        return new PaginationInterceptor().setLimit(-1);
    }
}

(2) よく使われるラムダ式の定義

ここに画像の説明を挿入します

com.baomidou.mybatisplus.core.conditions.query.QueryWrapper は、クエリ条件を構築するために MybatisPlus フレームワークで一般的に使用されるオブジェクトです。

ラムダ式を使用すると、より明確かつ簡潔になります。

 QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  queryWrapper.lambda().eq(User::getName,"aa");
  queryWrapper.lambda().ge(User::getAge,20);

デフォルトでは、複数の条件は接続です。上記の記述方法に対応する SQL は次のとおりです。 where name like '%aa%' and age >= 20

または接続したい場合の方法は次のとおりです。

queryWrapper.lambda().and(wq->{
    wq.like(User::getName,"aa");
    wq.or().like(User::getName,"bb);
});

以下は、私が遭遇したシナリオの拡張です。OR 接続する必要があるのは、コレクション内のすべての要素です。

List<String> nameList = Lists.newArrayList("aa","bb","cc");
String firstName = nameList.get(0);
nameList.remove(0);
queryWrapper.lambda().and(wq->{
    wq.like(User::getName,firstName);
    for(String name : nameList){
        wq.or().like(User::getName,name);
    }
});

クエリ条件
allEq
条件は Map でカプセル化されます

「名前」→「張三」

「年齢」 -> 20

public void testAllEq() {     QueryWrapper<User> queryWrapper = new QueryWrapper<>();     // カプセル化条件     Map<String, Object> hashMap = new HashMap<>();     hashMap.put("name", "Zhang San" );     hashMap.put("年齢", 20);     queryWrapper.allEq(hashMap);     List<User> userList = userMapper.selectList(queryWrapper);     userList.forEach(user -> {         System.out.println(user);     }); } eq eq("列名", 値) -> 列名 = 値





 

 






    public List<Dict> listByDictCode(DictCode dictCode) {         LambdaQueryWrapper<Dict> ラッパー = Wrappers.lambdaQuery();         Wrapper.eq(Dict::getDictCode, dictCode.getCode())                .eq(Dict::getEnabled, DictEnableEnum.VALID.getType());         this.baseMapper.selectList(wrapper) を返します。     } ne ne("列名", 值) -> 列名 != 值






    public List<Dict> listByDictCode(DictCode dictCode) {         LambdaQueryWrapper<Dict> ラッパー = Wrappers.lambdaQuery();         Wrapper.ne(Dict::getDictCode, dictCode.getCode())                .ne(Dict::getEnabled, DictEnableEnum.VALID.getType());         this.baseMapper.selectList(wrapper) を返します。     } gt gt("年齢", 20) -> 年齢 > 20






    public List<User> userList() {         LambdaQueryWrapper<User> ラッパー = Wrappers.lambdaQuery();         Wrapper.gt(User::getAge, 20);                     this.baseMapper.selectList(wrapper) を返します。     } ge ge("年齢", 20) -> 年齢 >= 20





    public List<User> userList() {         LambdaQueryWrapper<User> ラッパー = Wrappers.lambdaQuery();         Wrapper.ge(User::getAge, 20);                     this.baseMapper.selectList(wrapper) を返します。     } lt lt("年齢", 20) -> 年齢 < 20





    public List<User> userList() {         LambdaQueryWrapper<User> ラッパー = Wrappers.lambdaQuery();         Wrapper.lt(User::getAge, 20);                     this.baseMapper.selectList(wrapper) を返します。     } le le("年齢", 21) -> 年齢 <= 21





    public List<User> userList() {         LambdaQueryWrapper<User> ラッパー = Wrappers.lambdaQuery();         Wrapper.le(User::getAge, 20);                     this.baseMapper.selectList(wrapper) を返します。     between ,notBetween between("age", 18, 25) -> 18 と 25 の間の年齢、年龄在 18 から 25 の間





notBetween は 18 と 25 の間ではないことを意味します

    public List<User> userList() {         LambdaQueryWrapper<User> Wrapper = Wrappers.lambdaQuery();         Wrapper.between(User::getAge, 18,25);                         return this.baseMapper.selectList(wrapper);     } like,notLike like一致する値 -> "%value%" ファジー クエリ





notLike ファジー クエリは「%value%」と一致しません

    public List<User> userList() {         LambdaQueryWrapper<User> ラッパー = Wrappers.lambdaQuery();          Wrapper.like(User::getName, "张");                    this.baseMapper.selectList(wrapper) を返します。     } likeLeft likeLeft 一致值 -> "%值"





    public List<User> userList() {         LambdaQueryWrapper<User> ラッパー = Wrappers.lambdaQuery();          Wrapper.likeLeft(User::getName, "张");                    this.baseMapper.selectList(wrapper) を返します。     } likeRight likeRight 適合值 -> "值%"





    public List<User> userList() {         LambdaQueryWrapper<User> Wrapper = Wrappers.lambdaQuery();         wrapper.likeRight(User::getName, "Zhang");                    return this.baseMapper.selectList(wrapper);     } isNull null 値クエリisNotNull 非 null 値クエリ     public List<User> userList() {         LambdaQueryWrapper<User> Wrapper = Wrappers.lambdaQuery();         Wrapper.isNull(User::getName);         //wrapper.isNotNull(User::getName);                       return this .baseMapper.selectList(wrapper);     } in in("name", "Zhang San", "李思") -> name in ("Zhang San", "李思") Zhang San または Li という名前のユーザーシ













notIn
notIn("name", "张三", "李思") -> name not in ("张三", "李思") 名前が張三でも李思でもないユーザー

    public List<User> userList() {         LambdaQueryWrapper<User> ラッパー = Wrappers.lambdaQuery();         Wrapper.in(User::getName, "张三","李四");         //wrapper.in(User::getName, "张三","李四");                    this.baseMapper.selectList(wrapper) を返します。     } inSql、notInSql public List<ユーザー> userList() {     LambdaQueryWrapper<ユーザー> ラッパー= new LambdaQueryWrapper<>();     // SELECT id,name,email,age FROM user WHERE (age IN (id = 1 のユーザーから年齢を選択))     Wrapper.inSql(User::getAge, "id = 1 のユーザーから年齢を選択");     this.baseMapper.selectList(wrapper) を返します。} groupBy













public List<User> userList() {     LambdaQueryWrapper<User> ラッパー = new LambdaQueryWrapper<>();     [wrapper.groupBy(User::getName)];     this.baseMapper.selectList(wrapper) を返します。orderBy 、orderByAsc、orderByDesc public List<User> userList() {     LambdaQueryWrapper<User> ラッパー = new LambdaQueryWrapper<>();     // ユーザーから ID、名前、電子メール、年齢を選択 ORDER BY 名前 ASC,年齢 DESC     Wrapper.orderBy(true, true, User::getName).orderBy(true, false, User::getAge);     // ユーザーから ID、名前、電子メール、年齢を選択 ORDER BY 名前 ASC,年齢 ASC     Wrapper.orderByAsc(User::getName, User::getAge);     // ユーザーから ID、名前、メールアドレス、年齢を選択 ORDER BY 名前 DESC,年齢 DESC









    


 

    Wrapper.orderByDesc(User::getName, User::getAge);
 
    this.baseMapper.selectList(wrapper) を返します。
}
または、
    public List<User> userList() {         LambdaQueryWrapper<User> ラッパー = Wrappers.lambdaQuery();         // ユーザー WHERE から id、名前、メールアドレス、年齢を選択します (name = ? AND id = ?)         Wrapper.eq(User::getName, "张三").and().eq(User::getId,1) ;         // SELECT id,name,email,age FROM user WHERE (name = ? OR id = ?)                Wrapper.eq(User::getName, "张三").or().eq(User::getId,1) ;              this.baseMapper.selectList(wrapper) を返します。     ここでは次の問題を説明します

 


 




エラーコード

public List<User> userList() {     LambdaQueryWrapper<User> Wrapper = new LambdaQueryWrapper<>();     wrapper.eq(User::getId,1);     wrapper.like(User::getName,"Zhang")            .or( )            .like(User::getEmail,"163")            .or()            .like(User::getAge,1); }上記の書き方で記述したSQL文は以下のようになります。
 








WHERE id = '1' 
    AND name LIKE '%张%'
    OR email LIKE '%163%'
    OR age LIKE '%1%'
これは明らかに間違っています。mysql ステートメントの実行順序に従って、最後に実行されます。これにより、[ name like '%张%'] が発生します。条件が成立した後の or 条件は無効になるため、最初の条件は and の役割を果たしません。

ソリューション
public List<User> userList() {     LambdaQueryWrapper<User> Wrapper = new LambdaQueryWrapper<>();     wrapper.eq(User::getId,1);     wrapper.and(wrapper->wrapper.like(User::getName) ,"Zhang")                                 .or()                                 .like(User::getEmail,"163")                                 .or()                                 .like(User::getAge,1)                ); }こうして得られたSQL文は以下の通り
 









WHERE id = '1' 
    AND (name LIKE '%张%'
    OR email LIKE '%163%'
    OR age LIKE '%1%')
これで問題は解決しました。この問題は、会社の新入社員 (私を含む) については解決されました。 ) ) この問題が発生したようです。ここで説明しましょう

最後
に SQL ステートメントを最後に接続します

注: last() には SQL インジェクションのリスクがあるため、注意して使用してください。

public List<User> userList() {     LambdaQueryWrapper<User> ラッパー = new LambdaQueryWrapper<>();     // SELECT id,name,email,age FROM user WHERE (name = ? OR age = ?) 制限 1     Wrapper.eq(User::getName, "张三").or().eq(User::getAge, 20).last("制限 1");     this.baseMapper.selectList(wrapper) を返します。}存在する、存在しないpublic List<User> userList() {     LambdaQueryWrapper<User> ラッパー = new LambdaQueryWrapper<>();     // SELECT id,name,email,age FROM user WHERE (EXISTS (年齢 > ?) のユーザーから名前を選択)     Wrapper.exists("年齢 > 21 のユーザーから名前を選択");     // ID、名前、メールアドレスを選択します。








 


 

    Wrapper.notExists("年齢が 21 歳以上のユーザーから名前を選択");
 
    this.baseMapper.selectList(wrapper) を返します。
}

おすすめ

転載: blog.csdn.net/MinggeQingchun/article/details/131034200