MyBatis 集成 Spring 框架详解
MyBatis 是一个优秀的持久层框架,它通过简单、灵活的 SQL 语句与 Java 对象进行映射,而 Spring 是 Java 生态系统中最流行的框架之一,广泛用于依赖注入(DI)、面向切面编程(AOP)和事务管理等功能。将 MyBatis 集成到 Spring 框架中,能让开发者充分利用 Spring 的强大功能(如事务管理、IOC 容器等),同时使用 MyBatis 进行高效的数据库操作。
1. 项目依赖配置
在 Spring 项目中集成 MyBatis 通常使用 Spring 提供的 MyBatis Starter。下面以 Spring Boot 为例,演示如何通过 Maven 添加 MyBatis 相关依赖。
1.1 添加 Maven 依赖
在 Spring Boot 项目中集成 MyBatis 需要在 pom.xml
中添加如下依赖:
<dependencies><!-- Spring Boot Starter Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- MyBatis Spring Boot Starter --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.0</version></dependency><!-- MySQL Connector --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><!-- Lombok(可选,简化实体类代码) --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><scope>provided</scope></dependency>
</dependencies>
- spring-boot-starter-web:提供 Spring MVC 功能。
- mybatis-spring-boot-starter:MyBatis 与 Spring Boot 集成的 Starter,自动配置 MyBatis。
- mysql-connector-java:MySQL 数据库驱动。
1.2 配置数据库连接
在 src/main/resources/application.yml
中配置数据库连接信息:
spring:datasource:url: jdbc:mysql://localhost:3306/mydbusername: rootpassword: passworddriver-class-name: com.mysql.cj.jdbc.Drivermybatis:type-aliases-package: com.example.demo.model # 实体类所在包mapper-locations: classpath:mapper/*.xml # Mapper XML 文件位置
datasource.url
:数据库连接 URL。type-aliases-package
:指定实体类所在的包,用于简化 MyBatis 中的类型映射。mapper-locations
:指定 Mapper XML 文件的存放位置。
2. MyBatis 基础配置
在集成 MyBatis 时,通常需要配置实体类、Mapper 接口以及相应的 XML 映射文件。
2.1 创建实体类
假设有一个 User
表,创建对应的实体类 User
:
package com.example.demo.model;import lombok.Data;@Data
public class User {private Integer id;private String username;private String email;
}
2.2 创建 Mapper 接口
在 MyBatis 中,Mapper 接口用于定义与数据库交互的方法。Mapper 接口可以使用注解或者通过 XML 文件进行 SQL 映射。
package com.example.demo.mapper;import com.example.demo.model.User;
import org.apache.ibatis.annotations.*;import java.util.List;@Mapper
public interface UserMapper {@Select("SELECT * FROM user WHERE id = #{id}")User getUserById(int id);@Select("SELECT * FROM user")List<User> getAllUsers();@Insert("INSERT INTO user (username, email) VALUES (#{username}, #{email})")@Options(useGeneratedKeys = true, keyProperty = "id")void insertUser(User user);@Update("UPDATE user SET username = #{username}, email = #{email} WHERE id = #{id}")void updateUser(User user);@Delete("DELETE FROM user WHERE id = #{id}")void deleteUser(int id);
}
- @Mapper:标注这是一个 MyBatis Mapper 接口,Spring Boot 会自动扫描并注入这些接口。
- @Select、@Insert、@Update、@Delete:用于执行相应的 SQL 操作。
2.3 使用 XML 配置 Mapper(可选)
除了使用注解,还可以通过 XML 配置 Mapper SQL 语句。在 src/main/resources/mapper/
目录下创建 UserMapper.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.example.demo.mapper.UserMapper"><select id="getUserById" resultType="com.example.demo.model.User">SELECT * FROM user WHERE id = #{id}</select><select id="getAllUsers" resultType="com.example.demo.model.User">SELECT * FROM user</select><insert id="insertUser" useGeneratedKeys="true" keyProperty="id">INSERT INTO user (username, email) VALUES (#{username}, #{email})</insert><update id="updateUser">UPDATE user SET username = #{username}, email = #{email} WHERE id = #{id}</update><delete id="deleteUser">DELETE FROM user WHERE id = #{id}</delete></mapper>
在 UserMapper.java
中,不需要再使用 SQL 注解,而是通过 XML 文件进行 SQL 映射。
3. 使用 MyBatis 与 Spring 进行数据库操作
MyBatis 与 Spring 集成后,Spring 可以自动管理 Mapper 的实例,可以通过依赖注入来调用数据库操作方法。
3.1 创建服务类
服务类中调用 UserMapper
接口来执行数据库操作。
package com.example.demo.service;import com.example.demo.mapper.UserMapper;
import com.example.demo.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class UserService {@Autowiredprivate UserMapper userMapper;public User getUserById(int id) {return userMapper.getUserById(id);}public List<User> getAllUsers() {return userMapper.getAllUsers();}public void createUser(User user) {userMapper.insertUser(user);}public void updateUser(User user) {userMapper.updateUser(user);}public void deleteUser(int id) {userMapper.deleteUser(id);}
}
3.2 创建控制器
为了通过 REST API 调用数据库操作,创建一个简单的控制器:
package com.example.demo.controller;import com.example.demo.model.User;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.List;@RestController
@RequestMapping("/users")
public class UserController {@Autowiredprivate UserService userService;@GetMapping("/{id}")public User getUserById(@PathVariable int id) {return userService.getUserById(id);}@GetMappingpublic List<User> getAllUsers() {return userService.getAllUsers();}@PostMappingpublic void createUser(@RequestBody User user) {userService.createUser(user);}@PutMapping("/{id}")public void updateUser(@PathVariable int id, @RequestBody User user) {user.setId(id);userService.updateUser(user);}@DeleteMapping("/{id}")public void deleteUser(@PathVariable int id) {userService.deleteUser(id);}
}
@RestController
:标注这是一个 REST 控制器。@RequestMapping
:定义基础 URL 路径。@GetMapping
、@PostMapping
等注解用于处理 HTTP 请求。
4. 事务管理
Spring 提供了强大的事务管理功能,结合 MyBatis 可以轻松管理数据库事务。通常,我们可以通过 @Transactional
注解来声明事务。
4.1 在服务类中声明事务
在需要事务管理的方法或类上添加 @Transactional
注解,Spring 会自动管理事务的提交和回滚。
import org.springframework.transaction.annotation.Transactional;@Service
public class UserService {@Autowiredprivate UserMapper userMapper;@Transactionalpublic void createUserAndLog(User user) {userMapper.insertUser(user);// 如果某个操作发生异常,整个事务将回滚// 例如日志写入失败,user 数据库插入也会回滚logMapper.insertLog(user.getId(), "User created");}
}
- 事务回滚:当发生异常时,事务会自动回滚,确保数据库的一致性。
5. MyBatis 缓存与日志
5.1 MyBatis 一级缓存与二级缓存
- 一级缓存:MyBatis 的默认缓存机制,作用范围是
SqlSession
,同一个SqlSession
内的查询会被缓存。 - 二级缓存:可选的全局缓存,需要在 Mapper 中显式开启,通过
@CacheNamespace
或<cache>
配置启用。
5.2 日志配置
可以通过配置日志框架(如 SLF4J 和 Logback)来记录 MyBatis 的 SQL 执行情况。将日志级别设置为 DEBUG
,可以查看每条 SQL 的执行详情。
logging:level:org.apache.ibatis: DEBUG
在 logback.xml
中配置 MyBatis 日志:
<logger name="org.apache.ibatis" level="DEBUG" additivity="false"><appender-ref ref="STDOUT"/>
</logger>
6. 总结
MyBatis 与 Spring 的集成为开发者提供了强大的数据持久化解决方案。通过 MyBatis,开发者可以灵活地编写 SQL 并进行高效的数据库交互,而 Spring 的事务管理、依赖注入、AOP 等功能则增强了持久层的管理能力。在实际项目中,可以根据业务需求选择注解或 XML 方式进行 SQL 映射,并利用 Spring 的强大功能实现数据操作的稳定性和可维护性。
集成 Spring 与 MyBatis 的关键步骤包括:
- 配置数据库连接和 MyBatis 相关依赖。
- 使用注解或 XML 定义 Mapper 接口和 SQL 语句。
- 在服务层使用
@Transactional
进行事务管理,保证数据一致性。