Spring Boot 中集成 MyBatis:优雅操作数据库的实战指南

一、前言

在现代 Java 后端开发中,数据库操作是不可或缺的一环。虽然 JPA 和 Spring Data JPA 提供了高度抽象的 ORM 方式,但很多场景下,我们仍需要更灵活、更贴近 SQL 的控制能力。这时,MyBatis 就成为了一个极具吸引力的选择。

MyBatis 是一个优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射,与 Spring Boot 结合后,能够实现“零配置”快速集成,极大提升开发效率。

本文将带你从零开始,在 Spring Boot 项目中集成 MyBatis,完成数据库的增删改查操作,并分享实用技巧与最佳实践。


二、MyBatis 是什么?

MyBatis 是一个支持普通 SQL 查询、存储过程和高级映射的持久层框架。它消除了几乎所有的 JDBC 代码、参数手动设置和结果集封装,通过简单的 XML 或注解即可将接口方法映射到 SQL 语句。

MyBatis 的核心特点:

● 

SQL 与代码分离:SQL 写在 XML 文件或注解中,便于维护。

● 

灵活控制 SQL:适合复杂查询、多表关联、动态 SQL。

● 

轻量级 & 高性能:相比 Hibernate 更轻,适合对 SQL 有高控制需求的项目。

● 

与 Spring Boot 天然兼容:通过 mybatis-spring-boot-starter 快速集成。


三、Spring Boot 集成 MyBatis 步骤

1. 环境准备

● 

JDK 8+

● 

Maven / Gradle

● 

IDE(IntelliJ IDEA 或 STS)

● 

数据库(以 MySQL 为例)

2. 创建 Spring Boot 项目

访问 https://start.spring.io,选择以下依赖:

● 

Spring Web

● 

MyBatis Framework

● 

MySQL Driver

● 

Lombok(可选,简化实体类)

下载并导入 IDE。

3. 添加依赖(Maven)
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>3.0.3</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>
4. 配置数据库连接

application.yml 中配置数据源:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/testdb?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
    username: root
    password: yourpassword
    driver-class-name: com.mysql.cj.jdbc.Driver

mybatis:
  type-aliases-package: com.example.demo.entity
  mapper-locations: classpath:mapper/*.xml
  configuration:
    map-underscore-to-camel-case: true  # 开启驼峰命名自动映射

说明:

● 

type-aliases-package:实体类包路径,避免在 XML 中写全类名。

● 

mapper-locations:XML 映射文件位置。

● 

map-underscore-to-camel-case:数据库下划线字段自动映射到 Java 驼峰属性。


四、实战:实现用户管理功能

1. 创建数据库表
CREATE DATABASE testdb;
USE testdb;

CREATE TABLE user (
  id BIGINT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(50) NOT NULL,
  email VARCHAR(100) UNIQUE NOT NULL,
  created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
2. 创建实体类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private Long id;
    private String name;
    private String email;
    private LocalDateTime createdAt;
}
3. 创建 Mapper 接口
@Mapper
public interface UserMapper {

    @Select("SELECT * FROM user WHERE id = #{id}")
    User findById(Long id);

    @Select("SELECT * FROM user")
    List<User> findAll();

    @Insert("INSERT INTO user(name, email, created_at) VALUES(#{name}, #{email}, #{createdAt})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    int insert(User user);

    @Update("UPDATE user SET name = #{name}, email = #{email} WHERE id = #{id}")
    int update(User user);

    @Delete("DELETE FROM user WHERE id = #{id}")
    int deleteById(Long id);
}

说明:

● 

@Mapper:标记为 MyBatis Mapper 接口。

● 

@Options(useGeneratedKeys = true):启用主键回写。

● 

也可使用 XML 方式编写 SQL,适合复杂动态 SQL。

4. 使用 XML 配置(可选)

创建 src/main/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.demo.mapper.UserMapper">

    <select id="findById" resultType="User">
        SELECT * FROM user WHERE id = #{id}
    </select>

    <insert id="insert" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO user(name, email, created_at) VALUES(#{name}, #{email}, #{createdAt})
    </insert>

</mapper>

当使用 XML 时,接口中无需写 @Select 等注解,MyBatis 会自动绑定。

5. 创建 Service 层
@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

    public User getUserById(Long id) {
        return userMapper.findById(id);
    }

    public List<User> getAllUsers() {
        return userMapper.findAll();
    }

    public void addUser(User user) {
        user.setCreatedAt(LocalDateTime.now());
        userMapper.insert(user);
    }

    public void updateUser(User user) {
        userMapper.update(user);
    }

    public void deleteUser(Long id) {
        userMapper.deleteById(id);
    }
}
6. 创建 Controller
@RestController
@RequestMapping("/users")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping
    public List<User> getAll() {
        return userService.getAllUsers();
    }

    @GetMapping("/{id}")
    public User getById(@PathVariable Long id) {
        return userService.getUserById(id);
    }

    @PostMapping
    public String add(@RequestBody User user) {
        userService.addUser(user);
        return "用户添加成功,ID: " + user.getId();
    }

    @PutMapping
    public String update(@RequestBody User user) {
        userService.updateUser(user);
        return "用户更新成功";
    }

    @DeleteMapping("/{id}")
    public String delete(@PathVariable Long id) {
        userService.deleteUser(id);
        return "用户删除成功";
    }
}

五、高级特性与技巧

1. 动态 SQL(使用 XML)
<select id="findUsers" resultType="User">
    SELECT * FROM user
    <where>
        <if test="name != null">
            AND name LIKE CONCAT('%', #{name}, '%')
        </if>
        <if test="email != null">
            AND email = #{email}
        </if>
    </where>
</select>
2. 分页查询(集成 PageHelper)

添加依赖:

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.4.6</version>
</dependency>

使用:

PageHelper.startPage(1, 10);
List<User> users = userMapper.findAll();
PageInfo<User> pageInfo = new PageInfo<>(users);
3. 事务管理

在 Service 方法上添加 @Transactional 注解:

@Transactional
public void addUserWithTx(User user) {
    userMapper.insert(user);
    // 可能的其他操作,失败则回滚
}

六、MyBatis vs JPA:如何选择?

对比项

MyBatis

JPA

SQL 控制

完全可控,适合复杂 SQL

抽象程度高,适合简单 CRUD

学习成本

较低,SQL 基础即可

需理解 JPA 规范、HQL

性能

更高(可优化 SQL)

一般

开发效率

中等

高(自动生成 SQL)

适用场景

复杂查询、报表、遗留系统集成

快速开发、标准 CRUD 应用

建议:新项目可优先考虑 JPA,但对 SQL 有强控制需求时,MyBatis 是更优选择。


七、最佳实践建议

1. 

优先使用注解简化简单 SQL,复杂 SQL 使用 XML

2. 

合理使用 @Mapper@MapperScan 扫描接口

3. 

开启驼峰映射,避免字段映射错误

4. 

使用 Lombok 减少样板代码

5. 

结合 PageHelper 实现分页

6. 

SQL 语句避免拼接,防止 SQL 注入

7. 

使用连接池(如 HikariCP)提升性能


八、结语

Spring Boot 与 MyBatis 的结合,既保留了 Spring Boot 的快速开发优势,又赋予了开发者对 SQL 的完全控制能力。无论是中小型项目还是复杂业务系统,这套组合都能提供稳定、高效的数据访问支持。

掌握 MyBatis,意味着你不仅能“写代码”,还能“写好 SQL”,真正理解数据层的运作机制。

动手实践是掌握 MyBatis 的最好方式。不妨现在就创建一个项目,尝试连接你的数据库吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值