首页 开发教程 SpringBoot + MyBatis 配置详解

SpringBoot + MyBatis 配置详解

开发教程 2025年12月4日
504 浏览

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

检查以下几点:

  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. 使用明确定义映射关系
  3. 检查实体类属性名与数据库字段名是否匹配

9.3 Mapper接口无法注入

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

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

发表评论
暂无评论

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

客服

点击联系客服 点击联系客服

在线时间:09:00-18:00

关注微信公众号

关注微信公众号
客服电话

400-888-8888

客服邮箱 122325244@qq.com

手机

扫描二维码

手机访问本站

扫描二维码
搜索