我在Spring boot中集成mybatis竟然花了不少时间,真没想到。对着官网的文档做,竟然还花了这么多时间。所以我把过程尽可能的详细记录下来,给有需要的朋友。
在spring boot 中使用mybatis。
使用开源组件,最棒的文档就是官方文档了。然而我在看文档时发现了一些小坑,我看文档的顺序如下:
《mybatis》
什么是 MyBatis?
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
https://mybatis.org/mybatis-3/zh/index.html
这个是讲mybatis的通用方法,不是针对spring的。我把这些文档看完,还是没有完美解决 spring boot中完美的集成mybatis。经过摸索才发现mybatis有个子项目《mybatis-spring》。
《mybatis-spring》
什么是 MyBatis-Spring?
MyBatis-Spring 会帮助你将 MyBatis 代码无缝地整合到 Spring 中。它将允许 MyBatis 参与到 Spring 的事务管理之中,创建映射器 mapper 和 SqlSession 并注入到 bean 中,以及将 Mybatis 的异常转换为 Spring 的 DataAccessException。 最终,可以做到应用代码不依赖于 MyBatis,Spring 或 MyBatis-Spring。
https://mybatis.org/mybatis-3/zh/configuration.html
经过摸索和踩坑,我又发现这个项目还有一个子项目《mybatis-spring-boot-autoconfigure》。
事实上对我的需要最有用的就是最后一个文档:
https://mybatis.org/spring/zh/boot.html
看前面两个文档属实让人浪费了不少时间了。
建议大家自行查看官方的文档来练习,如果遇到坑在对照这篇文章看看。
https://mybatis.org/spring/zh/boot.html
以下内容源于官网文档的练习。
我把我测试的代码,打包分享给大家。
https://download.csdn.net/download/lxyoucan/86341756
在这里以mysql为例操作。
-- auto-generated definition
create table CITY
(
city_id bigint auto_increment comment '城市ID'
primary key,
city_name varchar(50) not null comment '城市名称',
state varchar(10) default 'CA' null comment '省'
)
comment '城市';
insert into CITY (city_name, state) values ('北京','beijing');
insert into CITY (city_name, state) values ('南京','jiangsu');
insert into CITY (city_name, state) values ('上海','shanghai');
select * from CITY where state='beijing';
MyBatis-Spring-Boot/pom.xml
<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.0modelVersion>
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.7.2version>
<relativePath/>
parent>
<groupId>cn.ycmitgroupId>
<artifactId>MyBatis-Spring-BootartifactId>
<version>0.0.1-SNAPSHOTversion>
<name>MyBatis-Spring-Bootname>
<description>Demo project for Spring Bootdescription>
<properties>
<java.version>1.8java.version>
properties>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
<dependency>
<groupId>org.mybatis.spring.bootgroupId>
<artifactId>mybatis-spring-boot-starterartifactId>
<version>2.2.2version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
plugins>
build>
project>
MyBatis-Spring-Boot/src/main/java/cn/ycmit/mybatis/domain/City.java
package cn.ycmit.mybatis.domain;
public class City {
private static final long serialVersionUID = 1L;
private Long city_id;
private String city_name;
private String state;
public City() {
}
public Long getCity_id() {
return city_id;
}
public void setCity_id(Long city_id) {
this.city_id = city_id;
}
public String getCity_name() {
return city_name;
}
public void setCity_name(String city_name) {
this.city_name = city_name;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
@Override
public String toString() {
return "City{" +
"city_id=" + city_id +
", city_name='" + city_name + '\'' +
", state='" + state + '\'' +
'}';
}
}
MyBatis-Spring-Boot/src/main/java/cn/ycmit/mybatis/mapper/CityMapper.java
package cn.ycmit.mybatis.mapper;
import cn.ycmit.mybatis.domain.City;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
@Mapper
public interface CityMapper {
@Select("SELECT * FROM CITY WHERE state = #{state}")
City findByState(@Param("state") String state);
}
MyBatis-Spring-Boot/src/main/java/cn/ycmit/mybatis/MyBatisSpringBootApplication.java
主要简化代码,便于理解,实际项目中一般不会这么写。这样写省的写测试类了。
package cn.ycmit.mybatis;
import cn.ycmit.mybatis.mapper.CityMapper;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MyBatisSpringBootApplication implements CommandLineRunner {
private final CityMapper cityMapper;
public MyBatisSpringBootApplication(CityMapper cityMapper) {
this.cityMapper = cityMapper;
}
public static void main(String[] args) {
SpringApplication.run(MyBatisSpringBootApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
System.out.println(this.cityMapper.findByState("beijing"));
}
}
MyBatis-Spring-Boot/src/main/resources/application.yml
主要是数据源相关的配置。
spring:
datasource:
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://128.0.0.1:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&allowMultiQueries=true
username: root
password: itkey123457
MyBatis-Spring-Boot/src/main/java/cn/ycmit/mybatis/controller/SqlApiController.java
package cn.ycmit.mybatis.controller;
import cn.ycmit.mybatis.domain.City;
import cn.ycmit.mybatis.mapper.CityMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class SqlApiController {
@Autowired
CityMapper mapper;
/**
* 查询测试
* @return
*/
@RequestMapping("/city")
public City city()
{
City city =mapper.findByState("beijing");
return city;
}
}
这样访问 http://localhost:8080/city
就会得到如下结果:
{"city_id":1,"city_name":"北京","state":"beijing"}