Spring Boot 整合 MyBatis

创建 Spring Boot 项目

利用 IDEA 内置的 Spring Initializr 创建项目,根据需要选择相应的模块,这里已经内置了 MyBatis Framework 选项。

模块选择

当然你也可以选择手动引入:

<!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.4</version>
</dependency>

另外不要忘了引入数据库驱动的依赖。

项目 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>2.3.7.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.yin</groupId>
    <artifactId>boot-07-mybatis</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>boot-07-mybatis</name>
    <description>Spring Boot 整合 MyBatis</description>

    <properties>
        <java.version>11</java.version>
        <mysql.version>8.0.19</mysql.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.4</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <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>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

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

</project>

在 application.yml 中进行相关属性的配置:

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/jdbc_template?serverTimezone=Asia/Shanghai
    username: root
    password: 123456

mybatis:
  configuration:
    # 开启驼峰命名自动映射
    map-underscore-to-camel-case: true
  # mapper 映射文件位置
  mapper-locations: classpath:mapper/*.xml

spring.datasource 配置的是数据库的相关属性。

关于 MyBatis 的设置,这里是在 mybatis.configuration 配置的。当然也可以编写 MyBatis 的 xml 全局配置文件,并用mybatis.config-location 指定其位置,两者二选一。

创建数据库表

CREATE TABLE city
(
  `id`      INT(11) PRIMARY KEY AUTO_INCREMENT,
  `name`    VARCHAR(30),
  `state`   VARCHAR(30),
  `country` VARCHAR(30)
);

对应实体类:

@Data
public class City {
    private Long id;
    private String name;
    private String state;
    private String country;
}

编写 mapper 接口

这里以查询和插入方法为例。在方法上直接标注相应的注解,然后编写 SQL 语句即可,非常简单方便。

不要忘记在类上标注 @Mapper 注解,表明这是一个 mapper 接口。

@Mapper
@Repository
public interface CityMapper {
    /*
      简单的SQL直接注解搞定,复杂的SQL在xml中编写
     */
    /**
     * 根据id查询city
     *
     * @param id id
     * @return 查询到的city
     */
    @Select("select id, name, state, country from city where id=#{id}")
    City getCityById(Long id);

    /**
     * 插入一条city记录
     *
     * @param city 要插入的city
     */
    @Insert("insert into city(name, state, country) values(#{name},#{name},#{name})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    void insert(City city);
}

在方法注解上编写 SQL 语句适合比较简单的情况,如果遇到复杂 SQL,还是在 xml 文件中编写更好。以上面的 insert 方法为例,xml 中是这样的:

<?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="com.yin.mybatis.mapper.CityMapper">
    <!--void insert(City city); xml 配置版-->
    <insert id="insert" useGeneratedKeys="true" keyProperty="id">
        insert into city(name, state, country) values(#{name},#{name},#{name})
    </insert>
</mapper>

更复杂的 SQL 等的编写属于 MyBatis 的内容,不再赘述。

测试

经过上述操作,已经整合完成了,几乎没有编写烦人的 xml 文件。下面就可以对其进行测试了。

首先编写 service:

@Service
public class CityService {
    @Autowired
    CityMapper cityMapper;

    public City getCityById(Long id) {
        return cityMapper.getCityById(id);
    }

    public void insert(City city) {
        cityMapper.insert(city);
    }
}

再编写 controller:

@Controller
public class MybatisController {
    @Autowired
    CityService cityService;

    @ResponseBody
    @GetMapping("/city")
    public City getCityById(@RequestParam("id") Long id) {
        return cityService.getCityById(id);
    }

    @ResponseBody
    @PostMapping("/city")
    public City insertCity(City city) {
        cityService.insert(city);
        return city;
    }
}

测试工具使用 Postman。

测试前先看一下项目结构:

小鸟的图标是 IDE 插件 MyBatisX。

项目结构

首先测试 getCityById 方法:

GET请求

GET响应

再来测试 insert 方法:

POST请求

POST响应

数据库结果


更多内容可参阅 MyBatis 官方资料:MyBatis integration with Spring Boot

本文代码已上传至:https://gitee.com/ME_WE/spring-boot-practice

原文地址:https://www.cnblogs.com/ME-WE/p/14262147.html