MyBatis 与 Spring 整合实战
约 1031 字大约 3 分钟
作者寄语:
MyBatis 是一款优秀的持久层框架,它通过 XML 或注解的方式将 Java 对象与 SQL 语句进行映射,避免了传统 JDBC 的繁琐操作。与全自动 ORM 框架(如 Hibernate)不同,MyBatis 强调 SQL 的灵活控制,特别适合需要复杂 SQL 优化的场景。
MyBatis环境搭建
创建Maven项目
demo项目的JDK版本是17,这里提一下JDK版本的原因是建议不要使用特别新的JDK版本,因为最新的版本可能会出现不稳定或者功能不兼容的情况。

创建之后项目结构大概就是这样,MyBatisDemo中的src文件是不会写任何业务代码的,可以选择删除

连接数据库
创建MySQL数据库连接,我这里使用的本地虚拟机中的MySQL,如果使用的是本地的数据库Host需要修改为本地的地址localhost
或127.0.0.1

连接成功数据库之后就可以编写业务代码,我会使用多模块编写业务代码。
创建多模块
创建一个子模块mybatis
,整体的项目结构如下。

导入相关依赖
父模块依赖
<?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 http://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.0.0</version>
</parent>
<packaging>pom</packaging>
<groupId>com.leemuzi</groupId>
<artifactId>MyBatisDemo</artifactId>
<version>1.0-SNAPSHOT</version>
<name>train</name>
<description>train</description>
<modules>
<module>mybatis</module>
</modules>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<spring-cloud.version>2022.0.0</spring-cloud.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<lombok.version>1.18.30</lombok.version>
<mybatis.version>3.0.0</mybatis.version>
<mysql.version>8.0.22</mysql.version>
</properties>
<dependencyManagement>
<dependencies>
<!--lombok依赖-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
<!--MySQL依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!--mybatis依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
子模块依赖
<?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>com.leemuzi</groupId>
<artifactId>MyBatisDemo</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<packaging>jar</packaging>
<artifactId>mybatis</artifactId>
<name>mybatis</name>
<description>mybatis</description>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
</dependencies>
</project>
关于MyBatis的依赖需要进行解释一下
<!-- 这个依赖是官方文档中提供的 配置相对比较复杂-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>x.x.x</version>
</dependency>
<!-- MyBatis 官方为 Spring Boot 提供的集成依赖 可以简化配置 项目中也是使用的这个依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
配置application.properties
# 配置服务器端口,端口这里可能会出现的问题是端口被占用,可以选择换一个端口。
server.port=8081
# 数据库的一些必要配置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://192.168.0.198:3306/mybatis_demo?characterEncoding=UTF8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root
# 这里的配置十分重要,这就是mybatis依赖提供的遍历,路径是mapper文件内的所有xml文件
mybatis.mapper-locations=classpath:/mapper/**/*.xml
业务代码
控制层
@RestController
public class MybatisController {
@Autowired
private MybatisService mybatisService;
@GetMapping("/count")
public int count() {
return mybatisService.count();
}
}
服务层
public interface MybatisService {
int count();
}
public class MybatisServiceImpl implements MybatisService {
@Autowired
private MybatisMapper mapper;
@Override
public int count() {
return mapper.count();
}
}
持久层
@Mapper
public interface MybatisMapper {
int count();
}
创建映射文件
映射文件在该项目中存储位置是src/main/resources/mapper/MybatisMapper.xml
,application.properties
要确保路径是正确的
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace 是MybatisMapper的位置-->
<mapper namespace="com.leemuzi.mybatis.mapper.MybatisMapper">
<!--id是方法的名字-->
<select id="count" resultType="int">
select count(1) from mybatis_user
</select>
</mapper>
测试结果
结果查询到我的数据库中只有一条数据,测试成功。

犯点错误
(1)mybatis.mapper-locations
配置错误或没配置

(2)动态SQL中的id或返回类型不匹配


(3)但是使用包装类型是不会出现错误的
