MybatisPlus中的使用Wrapper自定义SQL

一、条件构造器

        条件构造器提供了一种更加简洁和直观的方式来构建复杂的查询条件。它提供了一组静态方法,用于构建各种类型的查询条件,包括等于、不等于、大于、小于、包含等。使用条件构造器可以避免手动拼接SQL语句的麻烦,提高代码的可读性和可维护性。

以下是官方文档提供的常用的条件构造器实例:

        每种方法都重载了第一个参数为boolean类型的参数,表示该条件是否加入最后生成的sql中,默认为true。

alleq():全部eq

allEq({id:1,name:"老王",age:null})--->id = 1 and name = '老王' and age is null

eq():等于 =

eq("name", "老王")--->name = '老王'

ne():不等于 <>

ne("name", "老王")--->name <> '老王'

gt():大于 >

gt("age", 18)--->age > 18

ge():大于等于 >=

ge("age", 18)--->age >= 18

lt():小于 <

lt("age", 18)--->age < 18

le():小于等于 <=

le("age", 18)--->age <= 18

or():拼接OR

eq("id",1).or().eq("name","老王")--->id = 1 or name = '老王'

add():拼接AND

and(i -> i.eq("name", "李白").ne("status", "活着"))--->and (name = '李白' and status <> '活着')

between():BETWEEN 值1 AND 值2

between("age", 18, 30)--->age between 18 and 30

notBetween():NOT BETWEEN 值1 AND 值2

notBetween("age", 18, 30)--->age not between 18 and 30

like():LIKE '%值%

like("name", "王")--->name like '%王%'

notLike():NOT LIKE '%值%'

notLike("name", "王")--->name not like '%王%'

likeLeft():LIKE '%值'

likeLeft("name", "王")--->name like '%王'

likeRight():LIKE '值%'

likeRight("name", "王")--->name like '王%'

isNull():字段 IS NULL

isNull("name")--->name is null

isNotNull():字段 IS NOT NULL

isNotNull("name")--->name is not null

in():字段 IN (v0, v1, ...)

in("age", 1, 2, 3)--->age in (1,2,3)

notIn():字段NOT IN  (v0, v1, ...)

notIn("age", 1, 2, 3)--->age not in (1,2,3)

groupBy():分组:GROUP BY 字段

groupBy("id", "name")--->group by id,name

orderByAsc():排序:ORDER BY 字段, ... ASC

orderByAsc("id", "name")--->order by id ASC,name ASC

orderByDesc():排序:ORDER BY 字段, ... DESC

orderByDesc("id", "name")--->order by id DESC,name DESC

having():HAVING ( sql语句 

having("sum(age) > 10")--->having sum(age) > 10

二、Wrapper

        Wrapper在MyBatis-Plus中是用于构建动态SQL语句的重要工具之一。主要的子类有UpdateWrapper(实现更新操作)、QueryWrapper(实现查询操作)以及可以进行链式编程的AbstractLambdaWrapper,Wrapper的使用非常灵活,可以单独使用,也可以组合使用。

MybatisPlus中的使用Wrapper自定义SQL_第1张图片

QueryWrapper

    @Test
    void queryWrapperTest(){
        QueryWrapper wrapper = new QueryWrapper().in("age",5);
        long count = userService.count(wrapper);
        System.out.println(count);
    }

UpdateWrapper

    @Test
    void updateWrapperTest1(){
        User user = new User();
        user.setEmail("456");
        UpdateWrapper wrapper = new UpdateWrapper().eq("name","fulian");
        boolean update = userService.update(user, wrapper);
        System.out.println(update);
    }

三、使用Wrapper实现自定义SQL

        需要注意的是:需要mybatis-plus版本 >= 3.0.7 param 参数名要么叫ew,要么加上注解@Param(Constants.WRAPPER) 使用${ew.customSqlSegment} 不支持 Wrapper 内的entity生成where语句。

实例

MySQL数据库中表内容如下:

MybatisPlus中的使用Wrapper自定义SQL_第2张图片

User实体类

@TableName(value ="user")
@AllArgsConstructor
@NoArgsConstructor
@Data
public class User implements Serializable {
    private Long id;

    private String name;

    private Integer age;

    private String email;

    private static final long serialVersionUID = 1L;
}

UserMapper接口

public interface UserMapper extends BaseMapper {
    // 使用 QueryWrapper 自定义update
    void updateEmailByAges(@Param(Constants.WRAPPER) QueryWrapper wrapper, @Param("email") String email);

    // 使用 LambdaQueryWrapper 自定义update
    void updateEmailByAges2(@Param(Constants.WRAPPER) LambdaQueryWrapper wrapper, @Param("email")String email);

    // 使用 LambdaQueryWrapper 自定义select
    List findUserInAges(@Param(Constants.WRAPPER)LambdaQueryWrapper wrapper);
}

UserMapper.xml





    
            
            
            
            
    

    
        id,name,age,
        email
    

    
        update user
        set email = #{email}
        ${ew.customSqlSegment}
    
    
        update user
        set email = concat(email , #{email})
        ${ew.customSqlSegment}
    
    

测试类

@SpringBootTest
class UserServiceTest {
    @Resource
    private UserService userService;

    @Resource
    private UserMapper userMapper;


    @Test
    void customSqlUpdateTest(){
        List ages = Arrays.asList(10,55);
        String email = "789";

        // 使用 LambdaQueryWrapper 自定义select
        LambdaQueryWrapper in = new LambdaQueryWrapper().in(User::getAge, ages);
        List userInAges = userMapper.findUserInAges(in);

        // 使用 QueryWrapper 自定义update
        QueryWrapper wrapper = new QueryWrapper().in("age",ages);
        userMapper.updateEmailByAges1(wrapper,email);

        // 使用 LambdaQueryWrapper 自定义update
        LambdaQueryWrapper wrapper = new LambdaQueryWrapper().in(User::getAge,ages);
        userMapper.updateEmailByAges2(wrapper,email);

    }

}

        总之,Wrapper是MyBatis-Plus中非常强大和灵活的工具之一,它提供了一种链式调用的方式,可以方便地构建复杂的查询条件和动态SQL语句。通过使用Wrapper,我们可以提高代码的可读性和可维护性,并且使我们的应用程序更加高效和灵活。

你可能感兴趣的:(sql,java,数据库,mybatis)