springboot mybatis配置(手把手讲解)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

前言

在现代Java后端开发中,Spring Boot与MyBatis的组合因其高效性与灵活性,成为构建企业级应用的热门选择。Spring Boot简化了项目搭建与配置流程,而MyBatis则提供了强大的数据库操作能力。本文将从springboot mybatis配置的核心要点出发,通过分步骤的讲解和代码示例,帮助开发者快速掌握两者的集成方法,并深入理解其工作原理。


环境搭建与核心配置

1. 项目初始化与依赖管理

首先,创建一个Spring Boot项目。通过Maven或Gradle添加以下核心依赖:

<dependencies>
    <!-- Spring Boot Starter Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- MyBatis与Spring Boot集成依赖 -->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>3.0.1</version>
    </dependency>

    <!-- 数据库驱动(以MySQL为例) -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.29</version>
    </dependency>
</dependencies>

关键点解释

  • mybatis-spring-boot-starter 是官方提供的简化配置工具,它会自动扫描src/main/resources目录下的mybatis-config.xml(如果存在)或通过注解方式绑定Mapper接口。
  • 数据库驱动需根据实际使用的数据库类型替换(如PostgreSQL、Oracle等)。

2. 数据库连接配置

application.properties中配置数据源参数:

spring.datasource.url=jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.datasource.hikari.maximum-pool-size=10

参数说明
| 参数 | 作用 |
|------|------|
| spring.datasource.url | 数据库连接地址,包含IP、端口、数据库名及JDBC参数 |
| spring.datasource.username/password | 数据库账号与密码 |
| spring.datasource.driver-class-name | JDBC驱动类名 |
| spring.datasource.hikari.maximum-pool-size | 连接池最大连接数 |


3. MyBatis核心配置

通过application.properties或自定义mybatis-config.xml文件完成MyBatis配置。推荐在Spring Boot中直接通过属性文件配置:

mybatis.type-aliases-package=com.example.entity  # 实体类包路径,避免全限定名
mybatis.mapper-locations=classpath*:mapper/*.xml # XML映射文件路径

注解方式替代XML的场景
若使用注解(如@Select),可省略mapper-locations配置。例如:

@Mapper
public interface UserMapper {
    @Select("SELECT * FROM user WHERE id = #{id}")
    User selectById(Long id);
}

核心组件与工作流程

1. Mapper接口与XML分离设计

MyBatis的核心是通过Mapper接口XML/注解分离SQL逻辑。例如:

// UserMapper.java
public interface UserMapper {
    List<User> selectAll();
    User selectById(Long id);
    int insert(User user);
}

对应的XML文件需与接口同名且路径匹配:

<!-- src/main/resources/mapper/UserMapper.xml -->
<mapper namespace="com.example.mapper.UserMapper">
    <select id="selectAll" resultType="User">
        SELECT * FROM user
    </select>
</mapper>

比喻理解
Mapper接口如同“快递单”,定义了需要执行的操作;XML或注解则是“包裹内容”,具体描述如何完成该操作。Spring Boot会自动将两者绑定,形成完整的数据库操作链路。


2. 事务管理与自动提交控制

Spring Boot默认开启事务管理,可通过@Transactional注解控制:

@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;

    @Transactional
    public void createAndLogUser(User user) {
        userMapper.insert(user);  // 执行插入
        // 其他业务逻辑
    }
}

关键点

  • 事务边界由@Transactional标注的方法或类定义。
  • MyBatis的SqlSession会根据Spring的事务管理自动提交或回滚。

3. 动态SQL与条件查询

在XML中使用MyBatis的动态标签实现复杂查询:

<select id="selectByConditions" resultType="User">
    SELECT * FROM user 
    WHERE 1=1
    <if test="name != null">
        AND name LIKE CONCAT('%', #{name}, '%')
    </if>
    <if test="age != null">
        AND age &gt; #{age}
    </if>
</select>

注解方式
通过@SelectProvider结合工厂类生成动态SQL:

@SelectProvider(type=SqlProvider.class, method="generateSelectByConditions")
List<User> selectByConditions(@Param("name") String name, @Param("age") Integer age);

高级配置与优化

1. 分页查询与性能优化

结合PageHelper插件实现分页:

<!-- pom.xml -->
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>2.0.1</version>
</dependency>

使用示例:

PageHelper.startPage(1, 10);  // 第一页,每页10条
List<User> users = userMapper.selectAll();
PageInfo<User> pageInfo = new PageInfo<>(users);

优势
该插件会在底层动态修改SQL为LIMIT语句,无需手动编写分页逻辑。


2. 多数据源与动态数据源切换

通过AbstractRoutingDataSource实现多数据源:

@Configuration
public class DataSourceConfig {
    @Bean
    @Primary
    public DataSource dataSource(@Qualifier("masterDataSource") DataSource master,
                                @Qualifier("slaveDataSource") DataSource slave) {
        DynamicDataSource dynamicDataSource = new DynamicDataSource();
        dynamicDataSource.setTargetDataSources(Map.of("master", master, "slave", slave));
        dynamicDataSource.setDefaultTargetDataSource(master);
        return dynamicDataSource;
    }
}

动态切换逻辑

public class DynamicDataSourceContextHolder {
    private static final ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<>();

    public static void setDataSource(String dataSource) {
        CONTEXT_HOLDER.set(dataSource);
    }
}

3. 日志与SQL调试

启用MyBatis日志功能,查看执行的SQL语句:

logging.level.root=INFO
logging.level.com.example.mapper=DEBUG

输出示例

DEBUG c.i.j.t.JdbcTransaction - Starting transaction on Connection [HikariProxyConnection@...]
DEBUG f.i.j.JdbcTemplate - Executing prepared SQL query
DEBUG f.i.j.JdbcTemplate - Executing prepared SQL statement [SELECT * FROM user WHERE id = ?]

常见问题与解决方案

1. Mapper接口未被扫描

若遇到No mapper was found错误,需检查:

  • 在Spring Boot启动类或配置类上添加@MapperScan("com.example.mapper")
  • 确保XML文件路径与mapper-locations配置一致

2. SQL注入与参数绑定错误

使用#{}占位符而非${},避免直接拼接SQL:

<!-- 错误示例 -->
WHERE name = '${name}'  # 可能引发SQL注入  

<!-- 正确示例 -->
WHERE name = #{name}    # MyBatis会自动处理参数转义

结论

通过本文的分步讲解,开发者可以掌握从springboot mybatis配置到高级功能实现的完整流程。无论是基础的数据库连接、Mapper设计,还是动态SQL、多数据源等进阶场景,MyBatis与Spring Boot的结合都展现了强大的灵活性与扩展性。建议读者通过实际项目实践,逐步深入理解其底层原理,并根据业务需求优化配置策略。

实践建议

  1. 使用单元测试验证数据库操作的正确性
  2. 结合监控工具(如Prometheus)分析SQL执行性能
  3. 对敏感操作(如删除、更新)添加事务控制与日志记录

掌握这些技能后,开发者将能够更高效地构建健壮、可维护的后端服务。

最新发布