SpringBoot MyBatis 配置详解
本文将详细介绍SpringBoot整合MyBatis的完整配置过程,包括依赖配置、数据源设置、Mapper接口配置、XML映射文件配置等方面。
一、依赖配置
首先,在SpringBoot项目中需要添加MyBatis相关依赖:
xml
<!-- MyBatis Spring Boot Starter -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version> <!-- 可根据实际需求选择版本 -->
</dependency>
<!-- 数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- 可选:连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.8</version>
</dependency>
二、数据源配置
在application.properties
或application.yml
中配置数据库连接信息:
2.1 application.properties配置方式
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
# 连接池配置(可选)
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
2.2 application.yml配置方式
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核心配置
在application.properties
或application.yml
中配置MyBatis相关属性:
3.1 application.properties配置
properties
# MyBatis配置
# 实体类别名扫描包,简化XML中的类名引用
mybatis.type-aliases-package=com.example.entity
# 指定MyBatis的Mapper XML文件位置
mybatis.mapper-locations=classpath:mapper/**/*.xml
# 开启驼峰命名转换(如:user_name -> userName)
mybatis.configuration.map-underscore-to-camel-case=true
# 打印SQL语句日志
logging.level.com.example.mapper=debug
3.2 application.yml配置
yaml
mybatis:
type-aliases-package: com.example.entity
mapper-locations: classpath:mapper/**/*.xml
configuration:
map-underscore-to-camel-case: true
logging:
level:
com.example.mapper: debug
四、Mapper接口配置
SpringBoot整合MyBatis有两种方式配置Mapper接口:
4.1 使用@Mapper注解
在每个Mapper接口上添加@Mapper
注解:
java
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);
}
4.2 使用@MapperScan注解
在主启动类或配置类上添加@MapperScan
注解,指定扫描路径:
java
package com.example;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.example.mapper") // 扫描Mapper接口所在包
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
五、XML映射文件配置
5.1 XML映射文件位置
XML映射文件通常有两种放置方式:
5.1.1 方式一:与Mapper接口同包同目录
在src/main/resources
下创建与Mapper接口相同的包结构:
- Mapper接口路径:
src/main/java/com/example/mapper/UserMapper.java
- XML映射文件路径:
src/main/resources/com/example/mapper/UserMapper.xml
5.1.2 方式二:放在resources/mapper目录下
在application.properties
或application.yml
中配置:
properties
mybatis.mapper-locations=classpath:mapper/**/*.xml
5.2 XML映射文件基本结构
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">
<!-- namespace必须与对应的Mapper接口全限定名一致 -->
<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>
<!-- 根据ID查询用户 -->
<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>
六、实体类映射配置
6.1 驼峰命名映射
通过配置map-underscore-to-camel-case=true
,可以自动将数据库的下划线命名转换为Java的驼峰命名。
例如:数据库字段user_name
会自动映射到Java实体类的userName
属性。
6.2 自定义映射关系
在XML文件中使用<resultMap>
定义实体类与数据库表的映射关系:
xml
<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文件)
除了使用XML配置SQL外,也可以直接在Mapper接口中使用注解编写SQL:
java
package com.example.mapper;
import com.example.entity.User;
import org.apache.ibatis.annotations.*;
import java.util.List;
@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})")
@Options(useGeneratedKeys = true, keyProperty = "id") // 获取自动生成的主键
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);
// 使用@Results定义映射关系
@Select("SELECT * FROM user WHERE id = #{id}")
@Results({
@Result(property = "id", column = "id", id = true),
@Result(property = "userName", column = "user_name"),
@Result(property = "password", column = "pwd")
})
User findByIdWithMapping(Integer id);
// 复杂SQL使用<script>标签
@Insert({"<script>",
"INSERT INTO user(user_name, password, email)",
"VALUES",
"<foreach collection='list' item='user' separator=','>",
"(#{user.userName}, #{user.password}, #{user.email})",
"</foreach>",
"</script>"
})
int batchInsert(List<User> list);
}
八、高级配置
8.1 自定义MyBatis配置类
可以通过创建配置类自定义MyBatis的行为:
java
package com.example.config;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import javax.sql.DataSource;
@Configuration
@MapperScan("com.example.mapper")
public class MyBatisConfig {
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource);
// 设置Mapper XML文件位置
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();
}
}
8.2 事务管理配置
在Service层使用@Transactional
注解开启事务管理:
java
package com.example.service.impl;
import com.example.entity.User;
import com.example.mapper.UserMapper;
import com.example.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public List<User> findAll() {
return userMapper.findAll();
}
@Override
@Transactional
public int insert(User user) {
return userMapper.insert(user);
}
@Override
@Transactional
public int update(User user) {
return userMapper.update(user);
}
@Override
@Transactional
public int delete(Integer id) {
return userMapper.delete(id);
}
}
九、常见问题解决
9.1 XML映射文件无法被加载
检查以下几点:
- XML文件路径是否正确
mybatis.mapper-locations
配置是否正确- XML文件的
namespace
是否与Mapper接口全限定名一致 - 检查编译后的target目录中是否包含XML文件
9.2 实体类与数据库表字段映射问题
- 确保开启了驼峰命名转换:
mybatis.configuration.map-underscore-to-camel-case=true
- 使用
<resultMap>
明确定义映射关系 - 检查实体类属性名与数据库字段名是否匹配
9.3 Mapper接口无法注入
- 确保添加了
@Mapper
或@MapperScan
注解 - 检查Mapper接口包路径是否正确
- 检查Mapper接口的方法名是否与XML中的id一致
通过以上配置,就可以在SpringBoot项目中成功整合并使用MyBatis进行数据库操作。SpringBoot的自动配置机制大大简化了MyBatis的配置过程,使开发者可以更加专注于业务逻辑的实现。