「オファーが届きました。友達を探して受け取りましょう。私は2022年の春の採用チェックインイベントに参加しています。クリックしてイベントの詳細を表示してください。」
1.ラッパーの紹介
MyBatis Plusは、Wrapperを介してクエリ条件を構築し、条件付き読み取り操作または条件付き書き込み操作を実装します。
Wrapperの抽象サブクラスであるAbstractWrapperには、さまざまな条件付きパラメーターが定義されています。
拼接SQL语句使用的是数据库字段,而不是Java实体类的属性
AbstractWrapperのすべてのクエリ条件の意味は、公式ドキュメントのConditionConstructor
2.条件付きクエリ
準備
挿入メソッドを変更して、t_teslaテーブルにデータを挿入します
@Test
public void insert(){
for (int i = 4; i < 40; i++) {
Tesla tesla = new Tesla();
tesla.setVehicleName("Model " + i);
tesla.setVehicleType("Compact Car");
if (i % 2 == 0) {
tesla.setFactory("Fremont Gigafactory");
} else {
tesla.setFactory("Shanghai Gigafactory");
}
tesla.setVehiclePrice(23000d + i * 10000);
teslaMapper.insert(tesla);
}
}
复制代码
このメソッドを実行して、データベースにデータを挿入します
条件付きクエリを実装する
BaseMapperのselectListメソッドとselectCountメソッド
/**
* 根据 entity 条件,查询全部记录
*
* @param queryWrapper 实体对象封装操作类(可以为 null)
*/
List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
/**
* 根据 Wrapper 条件,查询总记录数
*
* @param queryWrapper 实体对象封装操作类(可以为 null)
*/
Long selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
复制代码
要件:フリーモント工場で製造されたすべてのコンパクトカーモデルについてテスラに問い合わせる
@Test
public void selectListWithWrapper(){
// 构造查询条件
QueryWrapper<Tesla> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("factory", "Fremont Gigafactory")
// 添加or关键字
.or()
.eq("vehicle_type","Compact Car");
List<Tesla> teslaList = teslaMapper.selectList(queryWrapper);
System.out.println("查询到的总数为:" + teslaList.size());
}
复制代码
メソッドを実行する
orメソッドのソースコードを表示する
selectCountテストメソッドを実装する
@Test
public void selectCountWithWrapper(){
// 构造查询条件
QueryWrapper<Tesla> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("factory", "Shanghai Gigafactory")
.eq("vehicle_type","Compact Car");
Long count = teslaMapper.selectCount(queryWrapper);
System.out.println("查询到符合条件的总数为:" + count);
}
复制代码
メソッドを実行する
ページング条件付きクエリを実装する
需要:上海の工場で生産され、価格が230,000〜3,000,000のすべてのテスラを照会するためにPaginate
@Test
public void selectPageWithWrapper(){
// 构造查询条件
QueryWrapper<Tesla> teslaWrapper = new QueryWrapper<>();
teslaWrapper.between("price",230000,3000000)
.eq("factory","Shanghai Gigafactory");
// 构造分页条件
Page<Tesla> teslaPageCondition = new Page<>(2,4);
Page<Tesla> teslaPage = teslaMapper.selectPage(teslaPageCondition, teslaWrapper);
System.out.println("分页条件查询的数据:" + teslaPage.getRecords());
System.out.println("分页条件查询到的记录总数:" + teslaPage.getTotal());
}
复制代码
メソッドを実行する
3.状態の更新
BaseMapperの条件付き更新メソッド
/**
* 根据 whereEntity 条件,更新记录
*
* @param entity 实体对象 (set 条件值,可以为 null)
* @param updateWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)
*/
int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);
复制代码
需要:113000.00を超える価格で、上海工場で製造されたすべてのテスラの価格を113000.00に調整します。
@Test
public void updateWithWrapper(){
// 构造更新条件
UpdateWrapper<Tesla> updateWrapper = new UpdateWrapper<>();
updateWrapper.gt("price",113000.00)
.eq("factory","Shanghai Gigafactory")
.set(true,"price",113000.00);
int updateCount = teslaMapper.update(null, updateWrapper);
System.out.println("更新的行数为:" + updateCount);
}
复制代码
メソッドを実行する
updateメソッドはエンティティクラスを渡します
@Test
public void updateWithWrapper(){
// 构造更新条件
UpdateWrapper<Tesla> updateWrapper = new UpdateWrapper<>();
updateWrapper.gt("price",100000.00)
.eq("factory","Shanghai Gigafactory")
.set(true,"price",100000.00);
Tesla tesla = new Tesla();
tesla.setFactory("Shanghai Gigafactory");
tesla.setVehiclePrice(100000.00);
tesla.setVehicleType("Roadster");
tesla.setVehicleName("Tesla Roadster");
int updateCount = teslaMapper.update(tesla, updateWrapper);
System.out.println("更新的行数为:" + updateCount);
}
复制代码
エンティティクラスの更新パス実行されたSQLステートメントによると、MyBatis Plusは、受信エンティティクラスの属性値を更新されたフィールドの値として使用します。SQLステートメントのsetキーワードの後に2つのprice =?があり、 UpdateWrapper setメソッドによって設定された更新フィールドの値は、エンティティクラスの価格によって上書きされません。
更新するフィールドが少ない場合は、QueryWrapperのsetメソッドを使用して、更新するフィールドの値を設定できます。更新するフィールドが多い場合は、新しいオブジェクトを作成して、フィールドの値を設定することをお勧めします。オブジェクトの対応するプロパティに更新されるようになります。
4.条件付き削除
BaseMapperの条件付き削除メソッド
/**
* 根据 entity 条件,删除记录
*
* @param queryWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)
*/
int delete(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
复制代码
需要:上海工場で生産された価格が90,000を超えるテスラを削除する
@Test
public void deleteWithWrapper(){
QueryWrapper<Tesla> queryWrapper = new QueryWrapper();
queryWrapper.eq("factory", "Shanghai Gigafactory")
.gt("price","90000.00");
int deleteCount = teslaMapper.delete(queryWrapper);
System.out.println("删除的数量为:" + deleteCount);
}
复制代码
メソッドを実行する
5.ラッパーの他の一般的な方法
選別
ソートの条件は、単一の条件またはセットにすることができます
@Test
public void selectPageByWrapperAndSortByPrice(){
// 排序条件的集合
List<String> orderConditionList = new ArrayList<>();
orderConditionList.add("price");
orderConditionList.add("name");
// 对所有弗拉蒙特工厂生产的Tesla按照价格降序排列
QueryWrapper<Tesla> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("factory","Fremont Gigafactory")
.orderByDesc(orderConditionList);
Page<Tesla> teslaPageCondition = new Page<>(2,5);
Page<Tesla> teslaPage = teslaMapper.selectPage(teslaPageCondition, queryWrapper);
System.out.println("分页查询并降序排列的数据:" + teslaPage.getRecords());
}
复制代码
メソッドを実行する
SQLのスプライシング
最後の方法では、SQLの最後にSQLを接続できます
@Test
public void selectListByLastInWrapper(){
QueryWrapper<Tesla> queryWrapper = new QueryWrapper<>();
queryWrapper.last("ORDER BY price");
List<Tesla> teslaList = teslaMapper.selectList(queryWrapper);
System.out.println("last方法拼接SQL查询到的数据:" + teslaList);
}
复制代码
メソッドを実行する
6、ラッパーの概要
条件は、クエリおよび削除操作用にQueryWrapperを使用して構築でき、更新用にUpdateWrapper構築します。
基準クエリは、QBCクエリであるGeneralMapperとMyBatisMBGによって生成されるメソッドに含まれています。クエリ条件は、エンティティクラスXxxExapleを生成することによって構築されます。詳細については、「MyBatis(VIII)-MyBatis Universal Mapper(パートB)」を参照してください。 ofDataAccess 「GenericMapperは複雑なクエリを実装します-ExampleMapper」
2つの違い:
- MBGの条件付きクエリとGeneralMapperの違いは、MBGの条件付きクエリが使用されること
XxxExample中的属性也就是实体类的属性
です。 - MyBatis Plusは、クエリ条件を作成するために使用されます
数据库的字段
。