# MyBatis-Plus教程 - 2 HelloWorld

MyBatis-Plus 官网推荐在 SpringBoot 中使用的,这里就从 SpringBoot 中集成 MyBatis-Plus 开始。

# 2.1 准备工作

# 1 准备数据库和表数据

# 建库
CREATE DATABASE IF NOT EXISTS foooor_db CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
USE foooor_db;

# 建表
CREATE TABLE `tb_user` (
  `id` BIGINT(20) NOT NULL,
  `username` VARCHAR(32) NULL,
  `password` VARCHAR(32) NULL,
  `email` VARCHAR(64) NULL,
  `age` INT NULL,
  `create_time` DATETIME NULL,
  `update_time` DATETIME NULL,
  PRIMARY KEY (`id`)
) 
ENGINE=InnoDB
DEFAULT CHARSET=utf8mb4;

# 准备数据:
INSERT INTO `tb_user` 
(`id`, `username`, `password`, `email`, `age`, `create_time`, `update_time`)
VALUES 
(1, 'doubi', '123456', 'doubi@foooor.com', 30, NOW(), NOW()),
(2, 'niubi', '1234qwer', 'niubi@foooor.com', 28, NOW(), NOW()),
(3, 'erbi', '88888888', 'erbi@foooor.com', 35, NOW(), NOW());
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

# 2 创建项目

使用 IDEA 的 Spring Initializr 可以快速创建Spring Boot项目。

File --> New --> Project --> 选择Spring Initializr。

然后填写项目信息,然后点击 next


选择项目依赖,勾选如下依赖:

  • Spring Boot DevTools :用于配置热部署,用法见 9 热部署 (opens new window)
  • Lombok :用于生成实体类的 getter 和 setter,用法见 3 Lombok和Hutool (opens new window)
  • Spring Configuration Processor :用于配置文件的提示。
  • Spring Web :因为是 web 项目,所以勾选 Spring Web,会自动导入 SpringMVC 相关的依赖。


创建完成,项目结构如下:

资源目录下的 static 用来放置页面静态资源,templates 用来放置模板引擎的模板页面,因为现在项目开发主要使用前后端分离,前端使用 Vue 开发,所以这两个目录基本不用了,删掉了。

使用 Spring Initializr 创建,会自动创建主启动类。

# 3 pom文件

创建完成,pom.xml 文件如下:

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.3.3</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.foooor</groupId>
    <artifactId>hello-mybatisplus</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>hello-mybatisplus</name>
    <description>hello-mybatisplus</description>

    <properties>
        <java.version>17</java.version>
    </properties>

    <dependencies>
        <!-- Web 依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- devtools依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

        <!-- configuration-processor依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

        <!-- lombok依赖 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <!-- 单元测试依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76

# 4 配置字符编码

防止文件出现乱码,需要设置一下项目文件的字符编码。

# 5 Lombok配置

Lombok 是一个 Java 库,在编译代码的时候,它通过注解自动生成常见的代码结构,如构造器、getter、setter、equals、hashCode、toString 等。

使用方法可以参考 SpringBoot教程 (opens new window) 中的 3 Lombok和Hutool (opens new window)

如果你的 IDEA 版本在2020.3以上,不需要安装Lombok插件。如果IDEA 版本在2020.3以下,需要安装Lombok插件。

点击 Flie --> Setting --> Plugins --> 搜索Lombok --> 安装。

# 2.2 集成MyBatis-Plus

下面开始在 SpringBoot 中集成 MyBatis-Plus。

# 1 添加依赖

在项目的 pom.xml 中添加数据库和 mybatis-plus 的依赖。

<!-- mysql驱动依赖!!! -->
<dependency>
  <groupId>com.mysql</groupId>
  <artifactId>mysql-connector-j</artifactId>
  <version>8.4.0</version>
</dependency>

<!-- mybatis-plus依赖!!! -->
<dependency>
  <groupId>com.baomidou</groupId>
  <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
  <version>3.5.7</version>
</dependency>
1
2
3
4
5
6
7
8
9
10
11
12
13

mybatis-plus 的依赖包含了 mybatis 的依赖。

# 2 编写配置文件

在 application.yaml 中添加数据源配置和mybatis-plus的配置,如下:

# 数据源配置
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/foooor_db?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT
    username: root
    password: 123456
    hikari:
      minimum-idle: 5  # 最小空闲连接数
      maximum-pool-size: 10  # 最大活跃连接数
      idle-timeout: 30000  # 空闲连接生命周期,以毫秒为单位
      pool-name: HikariCP  # 连接池名称,主要用于记录日志和JMX管理,默认为生成的
      max-lifetime: 1800000  # 连接在连接池中允许存在的最长时间,默认为30分钟,以毫秒为单位
      connection-timeout: 30000  # 连接超时时间,以毫秒为单位


# mybaits-plus配置
mybatis-plus:
  # MyBatis Mapper所对应的XML文件位置
  mapper-locations: classpath*:/mapper/*Mapper.xml
  global-config:
    # 关闭MP3.0自带的banner
    banner: false
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  • 在 Spring Boot 中默认的连接池是 HikariCP 连接池,这里进行了连接池的配置。
  • 这里指定了 MyBatis 的 Mapper xml 文件的目录,这里可以放在 src/main/resourcemapper 目录下即可。

下面开始编写pojo、mapper、service、controller。

# 3 编写pojo

编写与数据库映射的实体类。

User.java

package com.foooor.helloplus.pojo;

import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

import java.util.Date;

@Data
@TableName("tb_user")
public class User {
    private Long id;
    private String username;
    private Integer age;
    private Date createTime;
    private Date updateTime;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

因为数据库中的表名和 Java 中的实体类名不对应,所以使用 @TableName 注解指定表名,

@Data 是 lombok 的注解,用于生成 gettersetter

# 4 编写Mapper

编写 Mapper 接口,继承 BaseMapper 接口,并添加 @Mapper 注解。

UserMapper.java:

package com.foooor.helloplus.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.foooor.helloplus.pojo.User;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserMapper extends BaseMapper<User> {

}
1
2
3
4
5
6
7
8
9
10

BaseMapper 接口中提供了很多增删改查的方法,所以不用像 MyBatis 一样添加接口方法,当然后面如果 BaseMapper 中提供的方法不能满足你,那么你也可以在这里自己定义方法,就像 MyBatis 中的一样,没有任何区别。因为这里没有创建接口方法,所以也不需要 XxxMapper.xml 文件。如果后面有需要再创建。

另外如果不想在每个 UserMapper 上添加 @Mapper 注解,可以使用 @MapperScan 注解,可以配置在配置类或主启动类上,用于配置扫描指定包下的 Mapper,但是在使用 @Autowired 注入的时候,IDEA 会飘红报错,但是不影响使用,如果不想飘红报错,可以使用 @Resource 注解注入。

# 5 编写service

编写业务实现类service,和对应的service接口,通过 service 调用 mapper,获取数据。

UserServiceImpl.java,添加@Service注解:

package com.foooor.helloplus.service.impl;

import com.foooor.helloplus.mapper.UserMapper;
import com.foooor.helloplus.pojo.User;
import com.foooor.helloplus.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class UserServiceImpl implements IUserService {

    @Autowired
    private UserMapper userMapper;

    /**
     * 查询所有用户
     */
    public List<User> selectAllUser() {
        List<User> userList = userMapper.selectList(null);
        return userList;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

就提供了一个查询所有用户的方法,selectList 方法是 BaseMapper 提供的,参数是查询条件,这里是查询所有数据,所以条件传空null。

对应的接口,IUserService.java

package com.foooor.helloplus.service;

import com.foooor.helloplus.pojo.User;

import java.util.List;

public interface IUserService {

    /**
     * 获取所有用户信息
     */
    List<User> selectAllUser();

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 6 编写controller

通过接口调用 service,获取数据。

UserController.java

package com.foooor.helloplus.controller;

import com.foooor.helloplus.pojo.User;
import com.foooor.helloplus.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private IUserService userService;

    /**
     * 获取所有用户信息
     */
    @GetMapping("/all")
    public List<User> selectAll() {
        return userService.selectAllUser();
    }

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

# 7 测试

启动 SpringBoot 项目。

请求接口添加数据:http://localhost:8080/user/all


# 8 项目结构

可以看到使用 MyBatis 不用编写接口方法,直接使用 BaseMapper 中提供的方法就可以了,BaseMapper 针对增删改查提供了很多的方法,使用起来很方便,下面会系统的学习一下。

# 2.3 日志配置

为了便于分析执行的 SQL,在项目中添加一下日志配置,这样可以打印执行的 SQL。

因为 Spring Boot 默认使用 SLF4J 作为日志门面,并结合 Logback 作为日志实现。

所以在 resources 目录下创建 logback-spring.xml 配置文件,并编辑内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <!-- 定义一个控制台的日志输出 -->
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>

    <!-- 定义日志文件路径 -->
    <!-- 控制台输出,通常用于开发环境 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 设置根日志记录器,如果没有激活任何特定Profile,则使用默认配置 -->
    <root level="info">
        <appender-ref ref="CONSOLE"/>
    </root>

    <!-- 设置 MyBatis 日志级别为 INFO -->
    <logger name="org.mybatis" level="INFO" additivity="false">
        <appender-ref ref="CONSOLE"/>
    </logger>

    <!-- 设置特定包的日志级别 -->
    <logger name="com.foooor" level="DEBUG" additivity="false">
        <appender-ref ref="CONSOLE" />
    </logger>

</configuration>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

上面只是定义了控制台的输出,SpringBoot 中的日志配置,查看 SpringBoot 教程 (opens new window) 中的 日志配置 (opens new window)

除了上面的配置方式,可以通过如下配置让 MyBatis 打印日志:

在 application.yaml 中配置

# mybaits-plus配置
mybatis-plus:
  mapper-locations: classpath*:/mapper/*Mapper.xml
  global-config:
    banner: false
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl  # 控制台输出日志
1
2
3
4
5
6
7