MyBatisPlusのDQLプログラミング制御
1. 条件付きクエリ方式
- MyBatisPlus は、複雑な SQL クエリ条件をカプセル化し、プログラミングを使用してクエリ条件の組み合わせを完成させます。
1.1 条件付きクエリ
1.1.1 方法 1: 条件によるクエリ
QueryWrapper<User> qw=new QueryWrapper<>();
qw.lt("age", 18);
List<User> userList = userDao.selectList(qw);
System.out.println(userList);
1.1.2 方法 2: ラムダ形式の条件によるクエリ
QueryWrapper<User> qw = new QueryWrapper<User>();
qw.lambda().lt(User::getAge, 10);
List<User> userList = userDao.selectList(qw);
System.out.println(userList);
1.1.3 方法 3: ラムダ形式で条件によるクエリ (推奨)
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
lqw.lt(User::getAge, 10);
List<User> userList = userDao.selectList(lqw);
System.out.println(userList);
1.2 組み合わせ条件
1.2.1 との関係 (と)
//并且关系
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
//并且关系:10到30岁之间
lqw.lt(User::getAge, 30).gt(User::getAge, 10);
List<User> userList = userDao.selectList(lqw);
System.out.println(userList);
1.2.2 OR 関係 (または)
//或者关系
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
//或者关系:小于10岁或者大于30岁
lqw.lt(User::getAge, 10).or().gt(User::getAge, 30);
List<User> userList = userDao.selectList(lqw);
System.out.println(userList);
1.3 NULL値の処理
検索シナリオや複数条件クエリで、条件値が空の場合、問題をどのように解決すればよいでしょうか?
1.3.1 If文制御条件の追加
Integer minAge=10; //将来有用户传递进来,此处简化成直接定义变量了
Integer maxAge=null; //将来有用户传递进来,此处简化成直接定义变量了
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
if(minAge!=null){
lqw.gt(User::getAge, minAge);
}
if(maxAge!=null){
lqw.lt(User::getAge, maxAge);
}
List<User> userList = userDao.selectList(lqw);
userList.forEach(System.out::println);
1.3.2 条件付きパラメータ制御
Integer minAge=10; //将来有用户传递进来,此处简化成直接定义变量了
Integer maxAge=null; //将来有用户传递进来,此处简化成直接定义变量了
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
//参数1:如果表达式为true,那么查询才使用该条件
lqw.gt(minAge!=null,User::getAge, minAge);
lqw.lt(maxAge!=null,User::getAge, maxAge);
List<User> userList = userDao.selectList(lqw);
userList.forEach(System.out::println);
1.3.3 条件付きパラメータ制御(チェーンプログラミング)
Integer minAge=10; //将来有用户传递进来,此处简化成直接定义变量了
Integer maxAge=null; //将来有用户传递进来,此处简化成直接定义变量了
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
//参数1:如果表达式为true,那么查询才使用该条件
lqw.gt(minAge!=null,User::getAge, minAge)
.lt(maxAge!=null,User::getAge, maxAge);
List<User> userList = userDao.selectList(lqw);
userList.forEach(System.out::println);
2. クエリ プロジェクション (クエリ フィールド、グループ化、ページング)
2.1 クエリ結果にはモデル クラスのいくつかの属性が含まれています
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
lqw.select(User::getId, User::getName, User::getAge);
//或者
QueryWrapper<User> lqw = new QueryWrapper<User>();
lqw.select("id", "name", "age", "tel");
List<User> userList = userDao.selectList(lqw);
System.out.println(userList);
2.2 クエリ結果にモデル クラスに未定義の属性が含まれている
QueryWrapper<User> lqw = new QueryWrapper<User>();
lqw.select("count(*) as count, tel");
lqw.groupBy("tel");
List<Map<String, Object>> userList = userDao.selectMaps(lqw);
System.out.println(userList);
3. クエリ条件の設定
複数の条件クエリの組み合わせ
- 範囲一致 (>、=、間)
- ファジーマッチング(いいね)
- 無効判定(無効)
- 包含一致 (in)
- グループ
- 注文
- ……
3.1 クエリ条件
- ユーザーログイン(eqマッチ)
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
//等同于=
lqw.eq(User::getName, "Jumper").eq(User::getPassword, "jumper");
User loginUser = userDao.selectOne(lqw);
System.out.println(loginUser);
- ショッピングの価格帯の設定と戸籍登録の年齢帯の設定(年齢照合または間照合)
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
//范围查询 lt le gt ge eq between
lqw.between(User::getAge, 10, 30);
List<User> userList = userDao.selectList(lqw);
System.out.println(userList);
- 情報の確認とニュースの検索(非全文検索版:マッチングなど)
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
//模糊匹配 like
lqw.likeLeft(User::getName, "J"); // "J%"
List<User> userList = userDao.selectList(lqw);
System.out.println(userList);
- 統計レポート(グループ化クエリ集計機能)
QueryWrapper<User> qw = new QueryWrapper<User>();
qw.select("gender","count(*) as nums");
qw.groupBy("gender");
List<Map<String, Object>> maps = userDao.selectMaps(qw);
System.out.println(maps);
3.2 クエリAPI
- クエリ条件設定のリファレンスの詳細については、https://mybatis.plus/guide/wrapper.html#abstractwrapperを参照してください。
4. フィールドマッピングとテーブル名のマッピング
テーブルのフィールドがエンティティ クラスの属性に対応しない場合、クエリはどうなりますか?
4.1 問題 1: テーブルフィールドの設計とコーディング属性が同期していない
- モデル クラス属性の上で、**@TableField** 属性注釈を使用して、 == value == 属性を通じて現在の属性に対応するデータベース テーブル内のフィールド関係を設定します。
4.2 問題 2: コーディング中にデータベース内の未定義の属性が追加される
- モデル クラス属性の上で、**@TableFieldアノテーションを使用して渡します。存在する**属性。データベース テーブル フィールドに属性が存在するかどうかを設定します。デフォルトは true です。この属性を値と組み合わせることはできません。
4.3 質問 3: デフォルトのクエリを使用すると、より多くのフィールド表示権限が得られます
- モデル クラス属性の上で、**@TableFieldアノテーションを使用して渡します。選択する**属性: この属性がクエリに参加するかどうかを設定します。このプロパティは、select() マッピング構成と競合しません。
4.4 問題 4: テーブル名とコーディングの開発と設計が同期していない
- モデル クラスの上で、 **@TableNameアノテーションを使用して渡します。価値**属性、現在のクラスに対応するデータベーステーブルの名前を設定します。
@Data
@TableName("tbl_user")
public class User {
/*
id为Long类型,因为数据库中id为bigint类型,
并且mybatis有自己的一套id生成方案,生成出来的id必须是Long类型
*/
private Long id;
private String name;
@TableField(value = "pwd",select = false) //表示pwd字段不参与查询
private String password;
private Integer age;
private String tel;
@TableField(exist = false) //表示online字段不参与CRUD操作,该字段不在数据库
private Boolean online;
}