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

相关推荐
计算机毕设孵化场2 小时前
计算机毕设-基于springboot的人工智能领域复合型人才校企协同培养管理系统的设计与实现(附源码+lw+ppt+开题报告)
java·spring boot·课程设计·计算机毕设论文·计算机毕业设计如何选题·计算机毕业设计选题推荐
小句3 小时前
Redis 基本数据类型及其适用场景与案例
redis·spring·mybatis
drebander3 小时前
Spring 中 @Transactional 注解的用法
数据库·spring
励碼3 小时前
BUG: 解决新版本SpringBoot3.4.3在创建项目时勾选lombok但无法使用的问题
java·spring boot·bug·lombok
morris1314 小时前
【redis】数据类型之hyperloglog
数据库·redis·缓存·hyperloglog·hll
一切顺势而行4 小时前
Redis 面试题
数据库·redis·缓存
石兴稳4 小时前
SSD 固态硬盘存储密度的分区
开发语言·javascript·数据库
sg_knight4 小时前
从 Spring Boot 2 升级到 Spring Boot 3 的终极指南
java·spring boot·后端·springcloud
茂桑5 小时前
Mybatis的一级、二级缓存
java·spring·mybatis