MyBatis Plus of Data Access(2)-ラッパー条件付きコンストラクター

「オファーが届きました。友達を探して受け取りましょう。私は2022年の春の採用チェックインイベントに参加しています。クリックしてイベントの詳細を表示してください。」

1.ラッパーの紹介

MyBatis Plusは、Wrapperを介してクエリ条件を構築し、条件付き読み取り操作または条件付き書き込み操作を実装します。image.png

Wrapperの抽象サブクラスであるAbstractWrapperには、さまざまな条件付きパラメーターが定義されています。image.png

拼接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());

}
复制代码

メソッドを実行する

image.png

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);
}
复制代码

メソッドを実行する

image.png

ページング条件付きクエリを実装する

需要:上海の工場で生産され、価格が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());
}
复制代码

メソッドを実行する

image.png

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);

}
复制代码

メソッドを実行するimage.png

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ステートメントにimage.pngよると、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);
}
复制代码

メソッドを実行するimage.png

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());

}
复制代码

メソッドを実行するimage.png

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);

}
复制代码

メソッドを実行するimage.png

6、ラッパーの概要

条件は、クエリおよび削除操作用にQueryWrapperを使用して構築でき、更新用にUpdateWrapper構築します。

基準クエリは、QBCクエリであるGeneralMapperとMyBatisMBGによって生成されるメソッドに含まれています。クエリ条件は、エンティティクラスXxxExapleを生成することによって構築されます。詳細については、「MyBatis(VIII)-MyBatis Universal Mapper(パートB)」を参照してください。 ofDataAccess 「GenericMapperは複雑なクエリを実装します-ExampleMapper」

2つの違い:

  • MBGの条件付きクエリとGeneralMapperの違いは、MBGの条件付きクエリが使用されることXxxExample中的属性也就是实体类的属性です。
  • MyBatis Plusは、クエリ条件を作成するために使用されます数据库的字段

おすすめ

転載: juejin.im/post/7079263417239863332