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
方法:
再来测试 insert
方法:
更多内容可参阅 MyBatis 官方资料:MyBatis integration with Spring Boot
少一些功利主义的追求,多一些不为什么的坚持