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) を返します。
}