【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);
    }
相关推荐
老郑聊AI业财智造9 分钟前
Spring AI 技术架构与源码分析
java·人工智能·后端·spring·架构·软件工程
程序员与背包客_CoderZ11 分钟前
高性能分布式KV存储引擎RocksDB入门与C/C++编码实战
c语言·开发语言·数据库·c++·分布式·分布式数据库·rocksdb
省长15 分钟前
别人绕过我的网关直接调用资源服务怎么办?使用 Sa-Token 解决:网关转发鉴权、RPC调用鉴权
java·后端·开源
MetaLite17 分钟前
SpringBoot异常处理-到底该转换还是继续抛-入口层与调用层不能一刀切
java·spring boot·后端
钱栈up20 分钟前
Mac 开发机一键发版不用切环境:我这样改造了团队的后端部署脚本Maven编译卡住20分钟?我靠两步定位到2处隐蔽编译错误
开发语言·python·macos
william_yangshun25 分钟前
【大模型部署实战】kimi-k3-in-c 中文版:用 176KB 纯 C99 引擎在 CPU 上跑 Kimi K3 上手指南
c语言·开发语言
Sagittarius_A*33 分钟前
Burst Lab | PHP 审计 14|反序列化(四):字符串逃逸与绕过技巧
开发语言·安全·php·web·反序列化
名字还没想好☜44 分钟前
Go 用 slices/maps 标准库泛型函数:告别手写 Contains、Sort、去重(Go 1.21)
开发语言·后端·算法·golang·go
淼澄研学1 小时前
Python实战:基于LangChain与Chroma构建企业级RAG知识库问答系统
开发语言·python·langchain
赵广陆1 小时前
Spring AI的聊天模型
java·人工智能·spring