SpringBoot + MyBatis 配置详解

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.propertiesapplication.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.propertiesapplication.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.propertiesapplication.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映射文件无法被加载

检查以下几点:

  1. XML文件路径是否正确
  2. mybatis.mapper-locations配置是否正确
  3. XML文件的namespace是否与Mapper接口全限定名一致
  4. 检查编译后的target目录中是否包含XML文件

9.2 实体类与数据库表字段映射问题

  1. 确保开启了驼峰命名转换:mybatis.configuration.map-underscore-to-camel-case=true
  2. 使用<resultMap>明确定义映射关系
  3. 检查实体类属性名与数据库字段名是否匹配

9.3 Mapper接口无法注入

  1. 确保添加了@Mapper@MapperScan注解
  2. 检查Mapper接口包路径是否正确
  3. 检查Mapper接口的方法名是否与XML中的id一致

通过以上配置,就可以在SpringBoot项目中成功整合并使用MyBatis进行数据库操作。SpringBoot的自动配置机制大大简化了MyBatis的配置过程,使开发者可以更加专注于业务逻辑的实现。

相关推荐
爱分享的鱼鱼3 小时前
技术方案文档案例——电商直播平台
后端
oak隔壁找我3 小时前
SpringBoot + Redis 配置详解
java·数据库·后端
学习OK呀3 小时前
java 有了Spring AI的扶持下
后端
躺平的赶海人3 小时前
C# Dictionary 线程安全指南:多线程下操作 Dictionary<string, DateTime> 的加锁策略
java·安全·c#
帧栈3 小时前
开发避坑指南(64):修复IllegalArgumentException:参数值类型与期望类型不匹配
java·数据库
canonical_entropy3 小时前
最小变更成本 vs 最小信息表达:第一性原理的比较
后端
渣哥3 小时前
代理选错,性能和功能全翻车!Spring AOP 的默认技术别再搞混
javascript·后端·面试
坐不住的爱码3 小时前
ArrayList和LinkedList的区别
java
java1234_小锋3 小时前
什么是Java三高架构?
java·开发语言·架构