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的使用非常灵活,可以单独使用,也可以组合使用。

QueryWrapper

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

UpdateWrapper

    @Test
    void updateWrapperTest1(){
        User user = new User();
        user.setEmail("456");
        UpdateWrapper<User> wrapper = new UpdateWrapper<User>().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数据库中表内容如下:

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<User> {
    // 使用 QueryWrapper 自定义update
    void updateEmailByAges(@Param(Constants.WRAPPER) QueryWrapper<User> wrapper, @Param("email") String email);

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

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

UserMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.fulian.mybatispluslearning.mapper.UserMapper">

    <resultMap id="BaseResultMap" type="com.fulian.mybatispluslearning.domain.User">
            <id property="id" column="id" jdbcType="BIGINT"/>
            <result property="name" column="name" jdbcType="VARCHAR"/>
            <result property="age" column="age" jdbcType="INTEGER"/>
            <result property="email" column="email" jdbcType="VARCHAR"/>
    </resultMap>

    <sql id="Base_Column_List">
        id,name,age,
        email
    </sql>

    <update id="updateEmailByAges">
        update user
        set email = #{email}
        ${ew.customSqlSegment}
    </update>
    <update id="updateEmailByAges2">
        update user
        set email = concat(email , #{email})
        ${ew.customSqlSegment}
    </update>
    <select id="findUserInAges" resultType="com.fulian.mybatispluslearning.domain.User">
        select * from user ${ew.customSqlSegment}
    </select>
</mapper>

测试类

@SpringBootTest
class UserServiceTest {
    @Resource
    private UserService userService;

    @Resource
    private UserMapper userMapper;


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

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

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

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

    }

}

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

  • 16
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

仙草不加料

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值