Spring Boot 与 MyBatis 数据库操作

一、核心原理

  1. Spring Boot 的自动配置

    • 通过 mybatis-spring-boot-starter 自动配置 DataSource(连接池)、SqlSessionFactorySqlSessionTemplate

    • 扫描 @Mapper 接口或指定包路径,生成动态代理实现类。

  2. MyBatis 的核心组件

    • SqlSessionFactory :生产 SqlSession 的工厂,负责加载 MyBatis 配置和映射文件。

    • SqlSession :封装了 JDBC 操作,通过 Executor 执行 SQL。

    • Mapper 接口:通过动态代理将 Java 方法调用绑定到 XML 或注解中的 SQL。

二、Java 示例

1. 项目依赖 (pom.xml)

<dependencies>

<!-- Spring Boot Starter -->

<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.3</version>

</dependency>

<!-- MySQL 驱动 -->

<dependency>

<groupId>com.mysql</groupId>

<artifactId>mysql-connector-j</artifactId>

<version>8.0.33</version>

</dependency>

</dependencies>

2. 数据源配置 (application.properties)

# 数据源配置
spring.datasource.url=jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# MyBatis 配置
mybatis.mapper-locations=classpath:mapper/*.xml # XML 映射文件路径
mybatis.type-aliases-package=com.example.entity # 实体类包别名

3. 实体类 (User.java)
复制代码
package com.example.entity;

public class User {
    private Integer id;
    private String name;
    private String email;

    // Getters and Setters
}
4. Mapper 接口 (UserMapper.java)
复制代码
package com.example.mapper;

import com.example.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

@Mapper  // 标记为 MyBatis Mapper 接口
public interface UserMapper {
    // 注解方式定义 SQL
    @Select("SELECT * FROM user WHERE id = #{id}")
    User getUserById(int id);

    // XML 方式定义 SQL(见下方 UserMapper.xml)
    User getUserByName(String name);
}
5. XML 映射文件 (resources/mapper/UserMapper.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">
    <select id="getUserByName" resultType="User">
        SELECT * FROM user WHERE name = #{name}
    </select>
</mapper>

运行 HTML

6. Service 层 (UserService.java)
复制代码
package com.example.service;

import com.example.entity.User;
import com.example.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;  // 注入动态代理对象

    // 通过注解 SQL 查询
    public User getUserById(int id) {
        return userMapper.getUserById(id);
    }

    // 通过 XML SQL 查询
    public User getUserByName(String name) {
        return userMapper.getUserByName(name);
    }

    // 事务管理示例
    @Transactional
    public void updateUser(User user) {
        // 更新操作(需在 Mapper 中定义 SQL)
    }
}
7. 启动类 (Application.java)
复制代码
package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@SpringBootApplication
@EnableTransactionManagement  // 启用事务管理
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

三、执行流程

  1. 启动应用

    • Spring Boot 自动配置 DataSourceSqlSessionFactory

    • 扫描 @Mapper 接口,生成动态代理对象。

  2. 方法调用

    • 调用 userMapper.getUserById(1) 时,动态代理对象通过 SqlSession 执行注解中的 SQL。

    • 调用 userMapper.getUserByName("Alice") 时,查找 UserMapper.xml 中对应的 SQL。

  3. 事务管理

    • 使用 @Transactional 注解的方法由 Spring AOP 代理管理事务。

四、关键机制

  1. 动态代理

    MyBatis 通过 MapperProxy 为接口生成代理对象,将方法调用映射到 SQL 执行。

  2. SQL 解析

    • #{} 使用预编译(防止 SQL 注入),${} 直接拼接 SQL(需谨慎使用)。
  3. 事务整合

    Spring 的 DataSourceTransactionManager 管理 MyBatis 的数据库操作,确保事务一致性。


五、常见问题

  1. Mapper 接口未找到

    • 确保使用 @Mapper@MapperScan("com.example.mapper") 扫描接口。
  2. XML 文件未加载

    • 检查 mybatis.mapper-locations 配置路径是否匹配。
  3. 事务不生效

    • 确保启动类添加 @EnableTransactionManagement,并在方法上使用 @Transactional

通过上述示例和原理,Spring Boot 与 MyBatis 实现了简洁高效的数据库操作,开发者只需关注 SQL 和业务逻辑,框架自动处理底层连接、事务和映射。

相关推荐
千维百策66619 分钟前
如何管理错误预算:提升服务可靠性与 SLO 达成率的实践经验
服务器·网络·数据库
音符犹如代码1 小时前
Arthas Profiler 火焰图实战:CPU 热点在哪一目了然
java·jvm·spring boot
阿里云云原生1 小时前
AI Agent 上线容易稳定难?阿里云 AgentLoop 推出“经验自进化”闭环治理方案
人工智能·阿里云·mybatis·agentscope
Y3815326621 小时前
2026 年 7 月,SERP API 调用的稳定性实战:超时、重试、降级
开发语言·数据库·人工智能·php
sugar__salt1 小时前
向量数据库从零到实战:用 Milvus + Zilliz 构建 AI 日记语义检索系统
数据库·人工智能·embedding·milvus·rag·zilliz
Gauss松鼠会2 小时前
Prometheus 实现 openGauss 的指标监控(二)Prometheus 中添加 openGauss指标
网络·数据库·oracle·prometheus·opengauss·经验总结
Cloud云卷云舒2 小时前
PolarDB(阿里云)VS HaishanDB(海山数据库,移动云)的AI能力全面对比
数据库·阿里云·ai-native·polardb·haishandb
大模型丫丫2 小时前
Spring Boot 入门指南:从零开始构建微服务
spring boot·微服务·firefox
我是人✓2 小时前
SQL主键与外键
java·数据库
飞翔的馒2 小时前
浏览器缓存之【结构化数据库与缓存】: IndexedDB、Cache storage 和 Storage buckets
数据库·缓存