前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >芋道 Spring Boot MyBatis 入门(三)之 MyBatis-Plus

芋道 Spring Boot MyBatis 入门(三)之 MyBatis-Plus

作者头像
芋道源码
发布2019-11-13 19:43:43
1.1K0
发布2019-11-13 19:43:43
举报
文章被收录于专栏:芋道源码1024芋道源码1024

点击上方“芋道源码”,选择“设为星标”

做积极的人,而不是积极废人!

源码精品专栏

  • 原创 | Java 2019 超神之路,很肝~
  • 中文详细注释的开源项目
  • RPC 框架 Dubbo 源码解析
  • 网络应用框架 Netty 源码解析
  • 消息中间件 RocketMQ 源码解析
  • 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析
  • 作业调度中间件 Elastic-Job 源码解析
  • 分布式事务中间件 TCC-Transaction 源码解析
  • Eureka 和 Hystrix 源码解析
  • Java 并发源码

摘要: 原创出处 http://www.iocoder.cn/Spring-Boot/MyBatis/ 「芋道源码」欢迎转载,保留摘要,谢谢!

  • 1. 概述
  • 2. MyBatis + XML
    • 2.1 引入依赖
    • 2.2 Application
    • 2.3 应用配置文件
    • 2.4 MyBatis 配置文件
    • 2.5 UserDO
    • 2.6 UserMapper
    • 2.7 简单测试
  • 3. MyBatis + 注解
    • 3.1 差异部分
    • 3.2 UserMapper
    • 3.3 简单测试
  • 4. MyBatis-Plus
    • 4.1 引入依赖
    • 4.2 Application
    • 4.3 应用配置文件
    • 4.4 UserDO
    • 4.5 UserMapper
    • 4.6 简单测试
  • 5. tkmybatis
    • 5.1 引入依赖
    • 5.2 Application
    • 5.3 应用配置文件
    • 5.4 MyBatis 配置文件
    • 5.5 UserDO
    • 5.6 UserMapper
    • 5.7 简单测试
  • 666. 彩蛋

4. MyBatis-Plus

关于 MyBatis-Plus 的介绍,直接到 https://mybatis.plus/ 官网,艿艿就不多哔哔,嘿嘿。

示例代码对应仓库:mybatis-plus 。

本小节,我们会使用 mybatis-plus-boot-starter 自动化配置 MyBatis-Plus 的配置。同时,演示如何使用 MyBatis-Plus 实现我们在 「2. MyBatis + XML」 演示的各种 CRUD 的操作。

4.1 引入依赖

pom.xml 文件中,引入相关依赖。

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>lab-12-mybatis-plus</artifactId>

    <dependencies>
        <!-- 实现对数据库连接池的自动化配置 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency> <!-- 本示例,我们使用 MySQL -->
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.48</version>
        </dependency>

        <!-- 实现对 MyBatis Plus 的自动化配置 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.2.0</version>
        </dependency>

        <!-- 方便等会写单元测试 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

    </dependencies>

</project>
  • 相比来说,将 mybatis-spring-boot-starter 替换成 mybatis-plus-boot-starter

4.2 Application

创建 Application.java 类,配置 @MapperScan 注解,扫描对应 Mapper 接口所在的包路径。代码如下:

代码语言:javascript
复制
// Application.java

@SpringBootApplication
@MapperScan(basePackages = "cn.iocoder.springboot.lab12.mybatis.mapper")
public class Application {
}
  • 和 「2.2 Application」 一致。

4.3 应用配置文件

resources 目录下,创建 application.yaml 配置文件。配置如下:

代码语言:javascript
复制
spring:
  # datasource 数据源配置内容
  datasource:
    url: jdbc:mysql://47.112.193.81:3306/testb5f4?useSSL=false&useUnicode=true&characterEncoding=UTF-8
    driver-class-name: com.mysql.jdbc.Driver
    username: testb5f4
    password: F4df4db0ed86@11

# mybatis-plus 配置内容
mybatis-plus:
  configuration:
    map-underscore-to-camel-case: true # 虽然默认为 true ,但是还是显示去指定下。
  global-config:
    db-config:
      id-type: auto # ID 主键自增
      logic-delete-value: 1 # 逻辑已删除值(默认为 1)
      logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
  mapper-locations: classpath*:mapper/*.xml
  type-aliases-package: cn.iocoder.springboot.lab12.mybatis.dataobject

# logging
logging:
  level:
    # dao 开启 debug 模式 mybatis 输入 sql
    cn:
      iocoder:
        springboot:
          lab12:
            mybatis:
              mapper: debug
  • mybatis 替换成 mybatis-plus 配置项目。实际上,如果老项目在用 mybatis-spring-boot-starter 的话,直接将 mybatis 修改成 mybatis-plus 即可。
  • 相比 mybatis 配置项来说,mybatis-plus 增加了更多配置项,也因此我们无需在配置 `mybatis-config.xml` 配置文件。
  • 更多的 MyBatis-Plus 配置项,可以看看 MyBatis-Plus 使用配置 。
  • 配置 logging 的原因是,方便我们看到 MyBatis-Plus 自动生成的 SQL 。生产环境下,记得关闭噢。

4.4 UserDO

cn.iocoder.springboot.lab12.mybatis.dataobject 包路径下,创建 UserDO.java 类,用户 DO 。代码如下:

代码语言:javascript
复制
// UserDO.java
@TableName(value = "users")
public class UserDO {

    /**
     * 用户编号
     */
    private Integer id;
    /**
     * 账号
     */
    private String username;
    /**
     * 密码(明文)
     *
     * ps:生产环境下,千万不要明文噢
     */
    private String password;
    /**
     * 创建时间
     */
    private Date createTime;
    /**
     * 是否删除
     */
    @TableLogic
    private Integer deleted;

    // ... 省略 setting/getting 方法

}
  • 相比 「2.5 UserDO」 来说,主要有两点差别。
  • 增加了 `@TableName` 注解,设置了 UserDO 对应的表名是 users 。毕竟,我们要使用 MyBatis-Plus 给咱自动生成 CRUD 操作。
  • 增加了 deleted 字段,并添加了 `@TableLogic` 注解,设置该字段为逻辑删除的标记。
    • 在 `application.yaml` 配置文件中,我们配置了删除(`logic-delete-value = 1`)和未删除(`logic-not-delete-value = 0`)。当然,也可以通过注解的 `value` 和 `delval` 来定义未删除和删除。
    • 具体关于 MyBatis-Plus 的逻辑删除功能,看下 逻辑删除 部分的文档。

对应的创建表的 SQL 如下:

代码语言:javascript
复制
CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户编号',
  `username` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '账号',
  `password` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '密码',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `deleted` bit(1) DEFAULT NULL COMMENT '是否删除。0-未删除;1-删除',
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_username` (`username`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

4.5 UserMapper

cn.iocoder.springboot.lab12.mybatis.mapper 包路径下,创建 UserMapper 接口。代码如下:

代码语言:javascript
复制
// UserMapper.java

@Repository
public interface UserMapper extends BaseMapper<UserDO> {

    default UserDO selectByUsername(@Param("username") String username) {
        return selectOne(new QueryWrapper<UserDO>().eq("username", username));
    }

    List<UserDO> selectByIds(@Param("ids") Collection<Integer> ids);

    default IPage<UserDO> selectPageByCreateTime(IPage<UserDO> page, @Param("createTime") Date createTime) {
        return selectPage(page,
                new QueryWrapper<UserDO>().gt("create_time", createTime));
    }

}
  • 还是老样子,我们来比较下 「2.6 UserMapper」 接口。
  • 继承了 com.baomidou.mybatisplus.core.mapper.BaseMapper 接口,这样常规的 CRUD 操作,MyBatis-Plus 就可以替我们自动生成。一般来说,开发 CRUD 业务的时候,最枯燥的就是要写 CRUD 的常用 SQL ,完全跟不上艿艿的思绪哈。
    • 因为继承了 BaseMapper 接口,所以我们删除了 `#insert(UserDO user)`、`#updateById(UserDO user)`、`#deleteById(@Param("id") Integer id)`、`#selectById(@Param("id") Integer id)` 四个 CRUD 方法。
    • 更多 BaseMapper 已经提供好的接口方法,可以看看 《MyBatis-Plus 文档 —— CRUD 接口》 。
  • 对于 #selectByUsername(@Param("username") String username) 方法,我们使用了 com.baomidou.mybatisplus.core.conditions.query.QueryWrapper 构造相对灵活的条件,这样一些动态 SQL 我们就无需在 XML 中编写。
    • 更多 QueryWrapper 已经提供好的拼接方法,可以看看 《MyBatis-Plus 文档 —— 条件构造器》 。
    • 建议 1 :不要在 Service 中,使用 QueryWrapper 拼接动态条件。因为 BaseMapper 提供了 `#selectList(Wrapper queryWrapper)` 等方法,促使我们能够在 Service 层的逻辑中,使用 QueryWrapper 拼接动态条件,这样会导致逻辑里遍布了各种查询,使我们无法对实际有哪些查询条件做统一的管理。碰到这种情况,建议封装到对应的 Mapper 中,这样会更加简洁干净可管理。
    • 建议 2 :因为 QueryWrapper 暂时不支持一些类似 ` ` 等 MyBatis 的 OGNL 表达式,所以艿艿在 onemall 中,通过继承 QueryWrapper 类,封装了 QueryWrapperX 类。
  • 对于 #selectByIds(@Param("ids") 方法,实际也可以使用 MyBatis-Plus 的 QueryWrapper 很方便的实现,这里仅仅是为了演示在 MyBatis-Plus 混合使用 XML 。
  • 对于 #selectPageByCreateTime(IPage page, @Param("createTime") Date createTime) 方法,是我们额外添加的,用于演示 MyBatis-Plus 提供的分页插件。
    • 更多 IPage 的内容,可以看看 《MyBatis-Plus 文档 —— 分页插件》 。

resources/mapper 路径下,创建 UserMapper.xml 配置文件。代码如下:

代码语言:javascript
复制
<?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="cn.iocoder.springboot.lab12.mybatis.mapper.UserMapper">

    <sql id="FIELDS">
        id, username, password, create_time
    </sql>

    <select id="selectByIds" resultType="UserDO">
        SELECT
            <include refid="FIELDS" />
        FROM users
        WHERE id IN
            <foreach item="id" collection="ids" separator="," open="(" close=")" index="">
                #{id}
            </foreach>
    </select>

</mapper>
  • 是不是一下子,瘦了!

4.6 简单测试

创建 UserMapperTest 测试类,我们来测试一下简单的 UserMapper 的每个操作。代码如下:

代码语言:javascript
复制
// UserMapperTest.java

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class UserMapperTest {

    @Autowired
    private UserMapper userMapper;

    @Test
    public void testInsert() {
        UserDO user = new UserDO().setUsername(UUID.randomUUID().toString())
                .setPassword("nicai").setCreateTime(new Date())
                .setDeleted(0); // 一般情况下,是否删除,可以全局枚举下。
        userMapper.insert(user);
    }

    @Test
    public void testUpdateById() {
        UserDO updateUser = new UserDO().setId(1)
                .setPassword("wobucai");
        userMapper.updateById(updateUser);
    }

    @Test
    public void testDeleteById() {
        userMapper.deleteById(2);
    }

    @Test
    public void testSelectById() {
        userMapper.selectById(1);
    }

    @Test
    public void testSelectByUsername() {
        userMapper.selectByUsername("yunai");
    }

    @Test
    public void testSelectByIds() {
        List<UserDO> users = userMapper.selectByIds(Arrays.asList(1, 3));
        System.out.println("users:" + users.size());
    }

    @Test
    public void testSelectPageByCreateTime() {
        IPage<UserDO> page = new Page<>(1, 10);
        Date createTime = new Date(2018 - 1990, Calendar.FEBRUARY, 24); // 临时 Demo ,实际不建议这么写
        page = userMapper.selectPageByCreateTime(page, createTime);
        System.out.println("users:" + page.getRecords().size());
    }

}:
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-11-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 芋道源码 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 4. MyBatis-Plus
    • 4.1 引入依赖
      • 4.2 Application
        • 4.3 应用配置文件
          • 4.4 UserDO
            • 4.5 UserMapper
              • 4.6 简单测试
              相关产品与服务
              消息队列 TDMQ
              消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档