本文将系统性地讲解如何在SpringBoot项目中整合MyBatis,涵盖从依赖引入、数据源配置到Mapper编写、事务管理的全过程,帮助您快速搭建高效的数据访问层。
核心依赖配置
在SpringBoot项目的pom.xml文件中,需要添加以下核心依赖以支持MyBatis和数据库连接:
<!-- MyBatis 整合 SpringBoot 的 Starter 依赖 -->
<!-- 自动配置 MyBatis 核心组件,简化整合流程 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<!-- MySQL 数据库驱动 -->
<!-- 运行时生效,用于建立与 MySQL 数据库的连接 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- Druid 连接池 Starter -->
<!-- 提供高性能数据源管理,包含连接池监控等功能 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.8</version>
</dependency>
数据源配置
properties 格式配置
# 数据库连接核心参数
spring.datasource.url=jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# Druid 连接池配置(可选)
spring.datasource.druid.initial-size=5
spring.datasource.druid.min-idle=5
spring.datasource.druid.max-active=20
spring.datasource.druid.max-wait=60000
spring.datasource.druid.time-between-eviction-runs-millis=60000
spring.datasource.druid.min-evictable-idle-time-millis=300000
spring.datasource.druid.validation-query=SELECT 1
yaml 格式配置
spring:
datasource:
url: jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC&characterEncoding=UTF-8
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
druid:
initial-size: 5 # 初始化连接数
min-idle: 5 # 最小空闲连接数
max-active: 20 # 最大活跃连接数
max-wait: 60000 # 最大等待时间(毫秒)
MyBatis 核心配置
properties 格式配置
# MyBatis 基础配置
mybatis.type-aliases-package=com.example.entity
mybatis.mapper-locations=classpath:mapper/**/*.xml
mybatis.configuration.map-underscore-to-camel-case=true
logging.level.com.example.mapper=debug
yaml 格式配置
mybatis:
type-aliases-package: com.example.entity # 实体类别名扫描包
mapper-locations: classpath:mapper/**/*.xml # XML 映射文件路径
configuration:
map-underscore-to-camel-case: true # 开启下划线转驼峰映射
logging:
level:
com.example.mapper: debug # 开启 Mapper 日志打印
Mapper 接口配置
MyBatis 提供两种方式注册 Mapper 接口,任选其一即可。
方式一:@Mapper 注解
在每个 Mapper 接口上添加@Mapper注解,声明为 MyBatis 映射接口:
package com.example.mapper;
import com.example.entity.User;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface UserMapper {
List<User> findAll();
User findById(Integer id);
int insert(User user);
int update(User user);
int delete(Integer id);
}
方式二:@MapperScan 注解
在启动类或配置类上添加@MapperScan注解,批量扫描 Mapper 接口。这是SpringBoot项目中常用的方式,能简化配置。
package com.example;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@MapperScan("com.example.mapper")
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
XML 映射文件配置
基础 XML 示例
XML映射文件通常存放在resources/mapper/目录下,并通过配置项mybatis.mapper-locations指定扫描路径。
<mapper namespace="com.example.mapper.UserMapper">
<resultMap id="UserResultMap" type="User">
<id column="id" property="id"/>
<result column="user_name" property="userName"/>
<result column="password" property="password"/>
<result column="email" property="email"/>
</resultMap>
<select id="findAll" resultType="User">
SELECT * FROM user
</select>
<select id="findById" parameterType="int" resultType="User">
SELECT * FROM user WHERE id = #{id}
</select>
<insert id="insert" parameterType="User">
INSERT INTO user(user_name, password, email)
VALUES(#{userName}, #{password}, #{email})
</insert>
<update id="update" parameterType="User">
UPDATE user
SET user_name = #{userName}, password = #{password}, email = #{email}
WHERE id = #{id}
</update>
<delete id="delete" parameterType="int">
DELETE FROM user WHERE id = #{id}
</delete>
</mapper>
自定义映射关系
当数据库字段名与实体类属性名不一致时,可以通过resultMap手动配置映射关系,这是处理复杂映射的常用技巧。
<resultMap id="UserResultMap" type="User">
<id column="id" property="id"/>
<result column="user_name" property="userName"/>
<result column="pwd" property="password"/>
</resultMap>
<select id="findById" parameterType="int" resultMap="UserResultMap">
SELECT * FROM user WHERE id = #{id}
</select>
注解式 SQL 编写
除 XML 外,也可直接在 Mapper 接口中使用注解编写 SQL 语句,这种方式适合简单的SQL操作。
@Mapper
public interface UserMapper {
@Select("SELECT * FROM user")
List<User> findAll();
@Select("SELECT * FROM user WHERE id = #{id}")
User findById(Integer id);
@Insert("INSERT INTO user(user_name, password, email) VALUES(#{userName}, #{password}, #{email})")
int insert(User user);
@Update("UPDATE user SET user_name = #{userName}, password = #{password}, email = #{email} WHERE id = #{id}")
int update(User user);
@Delete("DELETE FROM user WHERE id = #{id}")
int delete(Integer id);
}
自定义 MyBatis 配置类
对于更复杂的定制需求,可以通过创建配置类来灵活定义 MyBatis 的行为,例如自定义插件或类型处理器。
@Configuration
@MapperScan("com.example.mapper")
public class MyBatisConfig {
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource);
factoryBean.setMapperLocations(
new PathMatchingResourcePatternResolver()
.getResources("classpath:mapper/**/*.xml")
);
factoryBean.setTypeAliasesPackage("com.example.entity");
org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
configuration.setMapUnderscoreToCamelCase(true);
factoryBean.setConfiguration(configuration);
return factoryBean.getObject();
}
}
事务管理配置
在 Service 层通过@Transactional注解即可便捷地开启声明式事务管理,这是保证数据一致性的关键。
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
@Transactional
public int insert(User user) {
return userMapper.insert(user);
}
@Override
@Transactional
public int update(User user) {
return userMapper.update(user);
}
}
配置检查清单
整合完成后,建议进行以下检查以确保一切就绪:
- 依赖兼容性:确认 MyBatis Starter 与 SpringBoot 版本匹配。
- 数据库连接:核对
application.properties/yaml中的数据库地址、用户名和密码。
- 映射一致性:检查 Mapper 接口的
namespace与对应XML文件中的声明是否一致。
- SQL准确性:确保SQL语句中的字段名、表名与数据库中的实际结构相符。
通过遵循上述步骤,您可以在SpringBoot项目中快速、稳健地完成MyBatis的整合,构建出清晰高效的数据持久层。