SpringBoot MyBatis 配置详解
本文将详细介绍SpringBoot整合MyBatis的完整配置过程,包括依赖配置、数据源设置、Mapper接口配置、XML映射文件配置等方面。
一、依赖配置
首先,在SpringBoot项目中需要添加MyBatis相关依赖:
<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配置方式
# 数据库连接信息
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配置方式
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配置
# 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配置
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注解:
package com.example.mapper;
import com.example.entity.User;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface UserMapper {
List findAll();
User findById(Integer id);
int insert(User user);
int update(User user);
int delete(Integer id);
}
4.2 使用@MapperScan注解
在主启动类或配置类上添加@MapperScan注解,指定扫描路径:
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中配置:
mybatis.mapper-locations=classpath:mapper/**/*.xml
5.2 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.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>
六、实体类映射配置
6.1 驼峰命名映射
通过配置map-underscore-to-camel-case=true,可以自动将数据库的下划线命名转换为Java的驼峰命名。
例如:数据库字段user_name会自动映射到Java实体类的userName属性。
6.2 自定义映射关系
在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:
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 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使用标签
@Insert({\"\",
\"INSERT INTO user(user_name, password, email)\",
\"VALUES\",
\"\",
\"(#{user.userName}, #{user.password}, #{user.email})\",
\"\",
\"\"
})
int batchInsert(List list);
}
八、高级配置
8.1 自定义MyBatis配置类
可以通过创建配置类自定义MyBatis的行为:
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注解开启事务管理:
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 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 - 使用
明确定义映射关系 - 检查实体类属性名与数据库字段名是否匹配
9.3 Mapper接口无法注入
- 确保添加了
@Mapper或@MapperScan注解 - 检查Mapper接口包路径是否正确
- 检查Mapper接口的方法名是否与XML中的id一致
通过以上配置,就可以在SpringBoot项目中成功整合并使用MyBatis进行数据库操作。SpringBoot的自动配置机制大大简化了MyBatis的配置过程,使开发者可以更加专注于业务逻辑的实现。



还没有评论呢,快来抢沙发~