【Java EE】Mybatis-Plus

1. 开始

先进行和以前一样的项目配置、数据库连接配置,在这些基础上,额外引入 Mybatis-Plus 依赖即可。

复制代码
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
            <version>3.5.11</version>
        </dependency>

编写实体类,一定要按照命名规范,一一对应表的字段。

java 复制代码
@Getter
@Setter
@ToString
public class User {
    private Integer id;
    private String userName;
    private String password;
    private Integer deleteFlag;
    private Date createTime;
    private Date updateTime;
}

做好上面的准备后,就可以使用 Mybatis-Plus 编写 Mapper 层了。

2. 使用 Mybatis-Plus 编写 Mapper 层

现在,如果直接调用 BaseMapper 中的方法会报错,因为数据库中的表名是 user_info,而实体类的名称是 User。因此按照规范命名尤为重要。不过,Mybatis-Plus 也提供了补救方法:在实体类上添加 @TableName("user_info") 注解来手动标识。

类似地,在属性上添加 @TableField() 注解手动标识属性对应的表字段名。

3. 条件构造器

QueryWrapper:用于构造 select 和 delete 语句的 where 条件。

例如:

diff 复制代码
select id, user_name, password from user_info
where id=1 and user_name="%S%"
java 复制代码
        // 构造条件
        QueryWrapper<User> qw = new QueryWrapper<User>()
                .select("id", "user_name", "password") // 填入的均为数据表字段名
                .eq("id", 1)
                .like("user_name", "S");
        // 调用 select 方法
        userMapper.selectList(qw);

lt:less than,小于

le:less than or equal to,小于或等于

gt:greater than,大于

ge:greater than or equal to, 大于或等于

eq:equals,等于

nq:not equals,不等于

注意,构造条件其实就是在拼接 sql,括号内填入的均是数据表字段名。此时 mybatisplus 将查询出来的数据赋值给 java 对象时,TableField 注解将不起作用,因此要求 Java 对象属性名与数据表字段名相同,或满足自动驼峰转换的规范。

UpdateWrapper:用于构造更新语句。

例如:

diff 复制代码
update user_info set delete_flag=0 where id in (1,2) 
java 复制代码
        UpdateWrapper<User> uw = new UpdateWrapper<User>()
                .set("delete_flag", 1)
                .in("id", List.of(1,2));
        userMapper.update(uw);

或:

java 复制代码
        UpdateWrapper<User> uw = new UpdateWrapper<User>()
                .setSql("delete_flag = 1")
                .in("id", List.of(1,2));
        userMapper.update(uw);

LambdaQueryWrapper:使用上面的方法构造条件有两个缺点,第一是没法使用 TableField 注解,第二是所有字段名都是用字符串写死的,后续一旦修改会比较麻烦。为了解决这个问题,Mybatis-Plus 提供了基于 Lambda 的条件构造器,通过 Lambda 表达式来引用实体类的属性,避免硬编码,并能很好利用编译器为我们检查。

java 复制代码
        QueryWrapper<User> qw = new QueryWrapper<>();
        qw.lambda()
                .select(User::getId, User::getUserName, User::getPassword)
                .eq(User::getId, 1);
        List<User> userList = userMapper.selectList(qw);

4. 自定义 SQL

首先,mybatisplus 支持全部 mybatis 自定义 sql 的方式(mybatisplus 只对 mybatis 做升级而不做改动)。在这个基础上,mybatisplus 的 Wrapper 也为自定义 sql 提供了支持。

例 1:

SQL 语句:

diff 复制代码
select id, user_name from user_info where id = 1

Mapper 层:

java 复制代码
@Mapper
public interface UserMapper extends BaseMapper<User> {
    // 上层代码调用该方法时,需传入 Wrapper 实例作为条件构造参数
    List<User> selectByCondition(@Param("ew") Wrapper<User> ew);
}
XML 复制代码
    <select id="selectByCondition" resultType="com.boilermaker.mybatispluslearning.model.User">
        select id, user_name from user_info ${ew.customSqlSegment}
    </select>

测试:

java 复制代码
    @Test
    void selectByCondition() {
        // 构造 Wrapper 对象,作为参数传入 Mapper 层
        QueryWrapper<User> qw = new QueryWrapper<User>()
                .eq("id" ,1);

        // 调用 Mapper 层
        userMapper.selectByCondition(qw).forEach(System.out::println);
    }

例 2:

SQL 语句:

diff 复制代码
update book_info set price = price + 10 where id in (1,2,3)

Mapper 层:

java 复制代码
@Mapper
public interface BookMapper extends BaseMapper<Book> {
    void updateByCondition(@Param("addPrice") int addPrice, @Param("ew") Wrapper<Book> ew);
}
XML 复制代码
    <update id="updateByCondition">
        update book_info
        set price = price + #{addPrice} ${ew.customSqlSegment}
    </update>

测试:

java 复制代码
    @Test
    void updateByCondition() {
        // 构造 Wrapper 实例,作为第二个参数传入
        QueryWrapper<Book> qw = new QueryWrapper<Book>()
                .in("id", List.of(1,2,3));

        // 调用 Mapper 层
        bookMapper.updateByCondition(10, qw);
    }
相关推荐
岁忧9 分钟前
(nice!!!)(LeetCode 每日一题) 2561. 重排水果 (哈希表 + 贪心)
java·c++·算法·leetcode·go·散列表
我要成为c嘎嘎大王19 分钟前
【C++】类和对象(2)
开发语言·c++
阿华的代码王国22 分钟前
【Android】RecyclerView实现新闻列表布局(1)适配器使用相关问题
android·xml·java·前端·后端
码农BookSea26 分钟前
自研 DSL 神器:万字拆解 ANTLR 4 核心原理与高级应用
java·后端
lovebugs29 分钟前
Java并发编程:深入理解volatile与指令重排
java·后端·面试
慕y27434 分钟前
Java学习第九十一部分——OkHttp
java·开发语言·学习
caisexi35 分钟前
Windows批量启动java服务bat脚本
java·windows·python
NullPointerExpection42 分钟前
win10 环境删除文件提示文件被使用无法删除怎么办?
java·ide·windows·win10
Techie峰1 小时前
【Java23种设计模式】:模板方法模式
java·设计模式·模板方法模式
海奥华21 小时前
操作系统到 Go 运行时的内存管理演进与实现
开发语言·后端·golang