我在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》。
- 《mybatis-spring-boot-autoconfigure》
MyBatis-Spring-Boot-Starter 帮助您在Spring Boot之上快速构建 MyBatis 应用程序。
https://mybatis.org/spring/zh/boot.html
事实上对我的需要最有用的就是最后一个文档:
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';pom.xml
MyBatis-Spring-Boot/pom.xml
实体类4.0.0 org.springframework.boot spring-boot-starter-parent 2.7.2 cn.ycmit MyBatis-Spring-Boot 0.0.1-SNAPSHOT MyBatis-Spring-Boot Demo project for Spring Boot 1.8 org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-test test org.mybatis.spring.boot mybatis-spring-boot-starter 2.2.2 mysql mysql-connector-java org.springframework.boot spring-boot-maven-plugin
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 + ''' + '}'; } }mapper
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")); } }application.yml
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: itkey123457controller注入演示
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; @RequestMapping("/city") public City city() { City city =mapper.findByState("beijing"); return city; } }
这样访问 http://localhost:8080/city
就会得到如下结果:
{"city_id":1,"city_name":"北京","state":"beijing"}