【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);
    }
相关推荐
你好~每一天1 分钟前
2025年B端产品经理进阶指南:掌握这些计算机专业技能,决胜职场!
java·人工智能·经验分享·学习·产品经理·大学生
程序喵大人33 分钟前
写C++十年,我现在怎么设计类和模块?(附真实项目结构)
开发语言·c++·类和模板
黄焖鸡能干四碗1 小时前
信息系统安全保护措施文件方案
大数据·开发语言·人工智能·web安全·制造
一只韩非子1 小时前
Spring AI Alibaba 快速上手教程:10 分钟接入大模型
java·后端·ai编程
叫我阿柒啊1 小时前
从Java全栈到云原生:一场技术深度对话
java·spring boot·docker·微服务·typescript·消息队列·vue3
ONLYOFFICE1 小时前
【技术教程】如何将文档编辑器集成至基于Java的Web应用程序
java·编辑器·onlyoffice
lbwxxc1 小时前
手写 Tomcat
java·tomcat
liulilittle1 小时前
Unix/Linux 平台通过 IP 地址获取接口名的 C++ 实现
linux·开发语言·c++·tcp/ip·unix·编程语言
CHEN5_021 小时前
【CouponHub项目开发】使用RocketMQ5.x实现延时修改优惠券状态,并通过使用模板方法模式重构消息队列发送功能
java·重构·模板方法模式·项目
杨杨杨大侠1 小时前
实战案例:商品详情页数据聚合服务的技术实现
java·spring·github