MyBatisPlusのラッパー使用例

1. ワッパーの紹介

ソースコード: https://gitee.com/charlinchenlin/store-pos

1、Wrapper家族

MP では、汎用 Mapper (BaseMapper) を使用して基本的なクエリを実装したり、カスタム Mapper (カスタム XML) を使用してより高度なクエリを実装したりできます。もちろん、条件コンストラクターを組み合わせて、より高度なクエリを便利に実装することもできます。
ここに画像の説明を挿入

Wrapper : 条件构造抽象类,最顶端父类  
    AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件
        QueryWrapper : 查询条件封装
        UpdateWrapper : Update 条件封装
    AbstractLambdaWrapper : 使用Lambda 语法
        LambdaQueryWrapper :用于Lambda语法使用的查询Wrapper
        LambdaUpdateWrapper : Lambda 更新封装Wrapper

2. テスト ユーザー テーブルとエンティティ クラスを作成する

CREATE TABLE `user`  (
  `id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户名',
  `password` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '密码',
  `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '地址',
  `email` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '电子邮件',
  `age` int(3) NULL DEFAULT NULL COMMENT '年龄',
  `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
  `modify_time` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
@Data
public class User {
    
    
    
    private String id;
    
    private String username;
    
    private String password;
    
    private String address;
    
    private Integer age;
    
    private Date craeteTime;
    
    private Date modifyTime;
}

3. テスト クラスを作成する

@SpringBootTest
public class WrapperTests {
    
    
    
    @Resource
    private UserMapper userMapper;
}

4. QueryWrapper テスト例

1. アセンブリ クエリ条件

名前に n が含まれ、年齢が 10 以上 20 以下で、電子メール アドレスが空でないユーザーをクエリします。

@Test
public void test1() {
    
    

    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper
        .like("name","n")
        .between("age", 10, 20)
        .isNotNull("email");
    List<User> users = userMapper.selectList(queryWrapper);
    users.forEach(System.out::println);
}

2. 組立品の選別条件

年齢の降順でユーザーをクエリし、同じ年齢の場合はIDの昇順で並べ替えます

@Test
public void test2() {
    
    

    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper
        .orderByDesc("age")
        .orderByAsc("id");

    List<User> users = userMapper.selectList(queryWrapper);
    users.forEach(System.out::println);
}

3. 組み立てと削除の条件

メールが空のユーザーを削除する

@Test
public void test3() {
    
    

    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.isNull("email");
    int result = userMapper.delete(queryWrapper); //条件构造器也可以构建删除语句的条件
    System.out.println("delete return count = " + result);
}

4. 条件の優先度

n を含む名前と (年齢が 18 歳未満または電子メール アドレスが空のユーザー) をクエリし、これらのユーザーの年齢を 18 に設定し、電子メール アドレスを [email protected] に設定します。

@Test
public void test4() {
    
    

    //修改条件
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper
        .like("name", "n")
        .and(i -> i.lt("age", 18).or().isNull("email")); //lambda表达式内的逻辑优先运算

    User user = new User();
    user.setAge(18);
    user.setEmail("[email protected]");
    int result = userMapper.update(user, queryWrapper);
    System.out.println(result);
}

5. サブクエリを実装する

ID が 3 以下のすべてのユーザーの ID リストを照会します

@Test
public void test6() {
    
    

    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.inSql("id", "select id from user where id <= 3");

    //selectObjs的使用场景:只返回一列
    List<Object> objects = userMapper.selectObjs(queryWrapper);//返回值是Object列表
    objects.forEach(System.out::println);
}

注:しかし、上記の方法はSQLインジェクションを引き起こしやすいです

queryWrapper.inSql("id", "select id from user where id <= 3 or true"); // 或插叙出所有用户id

ただし、次のクエリを使用して置き換えます

queryWrapper.in("id", 1, 2, 3 );
// 或
queryWrapper.le("id", 3 );

五、UpdateWrapperのテスト例

n を含む名前と (年齢が 18 歳未満または電子メール アドレスが空のユーザー) をクエリし、これらのユーザーの年齢を 18 に設定し、電子メール アドレスを [email protected] に設定します。

@Test
public void test7() {
    
    
    
    //组装set子句
    UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
    updateWrapper
        .set("age", 18)
        .set("email", "[email protected]")
        .like("name", "n")
        .and(i -> i.lt("age", 18).or().isNull("email")); //lambda表达式内的逻辑优先运算

    //这里必须要创建User对象,否则无法应用自动填充。如果没有自动填充,可以设置为null
    User user = new User();
    int result = userMapper.update(user, updateWrapper);
    System.out.println(result);
}

6. 条件を使用してクエリ条件を動的に組み立てる

名前に n が含まれ、年齢が 10 歳以上 20 歳未満のユーザーをクエリします。クエリ条件はユーザー入力から取得され、オプションです。

@Test
public void test8() {
    
    
    
    //定义查询条件,有可能为null(用户未输入)
    String name = null;
    Integer ageBegin = 10;
    Integer ageEnd = 20;

    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    if(StringUtils.isNotBlank(name)){
    
    
        queryWrapper.like("name","n");
    }
    if(ageBegin != null){
    
    
        queryWrapper.ge("age", ageBegin);
    }
    if(ageEnd != null){
    
    
        queryWrapper.le("age", ageEnd);
    }

    List<User> users = userMapper.selectList(queryWrapper);
    users.forEach(System.out::println);
}

上記の実装スキームで問題はありませんが、コードはより複雑になります. オーバーロードされたメソッドと condition パラメータを使用して、クエリ条件を構築し、コード記述を簡素化できます

@Test
public void test8Condition() {
    
    

    //定义查询条件,有可能为null(用户未输入)
    String name = null;
    Integer ageBegin = 10;
    Integer ageEnd = 20;

    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper
        .like(StringUtils.isNotBlank(name), "name", "n")
        .ge(ageBegin != null, "age", ageBegin)
        .le(ageEnd != null, "age", ageEnd);

    List<User> users = userMapper.selectList(queryWrapper);
    users.forEach(System.out::println);
}

セブン、LambdaXxxWrapper テスト例

1. 年齢が 10 歳から 20 歳のユーザーをクエリする

@Test
public void test9() {
    
    

    //定义查询条件,有可能为null(用户未输入)
    String name = null;
    Integer ageBegin = 10;
    Integer ageEnd = 20;

    LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
    queryWrapper
        //避免使用字符串表示字段,防止运行时错误
        .like(StringUtils.isNotBlank(name), User::getName, "n")
        .ge(ageBegin != null, User::getAge, ageBegin)
        .le(ageEnd != null, User::getAge, ageEnd);

    List<User> users = userMapper.selectList(queryWrapper);
    users.forEach(System.out::println);
}

2. 電子メールが空のユーザーの電子メールを更新します

@Test
public void test10() {
    
    

    //组装set子句
    LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>();
    updateWrapper
        .set(User::getAge, 18)
        .set(User::getEmail, "[email protected]")
        .like(User::getName, "n")
        .and(i -> i.lt(User::getAge, 18).or().isNull(User::getEmail)); //lambda表达式内的逻辑优先运算
    
 	User user = new User();
    int result = userMapper.update(user, updateWrapper);
    System.out.println(result);
}

おすすめ

転載: blog.csdn.net/lovoo/article/details/129740271