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,我们可以提高代码的可读性和可维护性,并且使我们的应用程序更加高效和灵活。

相关推荐

  1. SQL Server定制视野:实现数据库定义视图

    2023-12-06 16:12:02       24 阅读
  2. Mybatis-pluswrapper区别

    2023-12-06 16:12:02       59 阅读
  3. vue定义指令使用方法

    2023-12-06 16:12:02       38 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-06 16:12:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-06 16:12:02       106 阅读
  3. 在Django里面运行非项目文件

    2023-12-06 16:12:02       87 阅读
  4. Python语言-面向对象

    2023-12-06 16:12:02       96 阅读

热门阅读

  1. 【华为交换】交换机MSTP+VRRP配置

    2023-12-06 16:12:02       65 阅读
  2. jvm 调优参数

    2023-12-06 16:12:02       46 阅读
  3. ElasticSearch之Search settings

    2023-12-06 16:12:02       63 阅读
  4. C++字符去除空格反转顺序输出

    2023-12-06 16:12:02       54 阅读
  5. 数据结构-堆

    2023-12-06 16:12:02       59 阅读
  6. 基数排序简单了解

    2023-12-06 16:12:02       59 阅读
  7. 基于Hadoop的异构网络协同过滤推荐算法设计

    2023-12-06 16:12:02       49 阅读
  8. 可以使用京东商品详情 API 获取哪些商品信息?

    2023-12-06 16:12:02       61 阅读
  9. Gson与FastJson详解

    2023-12-06 16:12:02       48 阅读