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 和业务逻辑,框架自动处理底层连接、事务和映射。

相关推荐
NineData2 小时前
NineData 迁移评估功能正式上线
数据库·dba
NineData7 小时前
数据库迁移总踩坑?用 NineData 迁移评估,提前识别所有兼容性风险
数据库·程序员·云计算
赵渝强老师9 小时前
【赵渝强老师】PostgreSQL中表的碎片
数据库·postgresql
初次攀爬者10 小时前
Kafka 基础介绍
spring boot·kafka·消息队列
用户83071968408210 小时前
spring ai alibaba + nacos +mcp 实现mcp服务负载均衡调用实战
spring boot·spring·mcp
Java水解11 小时前
SpringBoot3全栈开发实战:从入门到精通的完整指南
spring boot·后端
全栈老石13 小时前
拆解低代码引擎核心:元数据驱动的"万能表"架构
数据库·低代码
初次攀爬者1 天前
RocketMQ在Spring Boot上的基础使用
java·spring boot·rocketmq
花花无缺1 天前
搞懂@Autowired 与@Resuorce
java·spring boot·后端
倔强的石头_1 天前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库