MyBatis 是一款优秀的持久层框架(ORM 框架),它支持自定义 SQL、存储过程以及高级映射。 在 Spring Boot 项目中,它的主要作用是简化数据库操作,充当应用程序和数据库之间的桥梁,让你能够以更面向对象的方式与数据库交互,而无需处理繁琐的 JDBC 代码。
核心功能与特点(它做了什么?)
解耦 SQL 与代码:
传统的 JDBC 需要将 SQL 语句硬编码在 Java 代码中,难以维护。
MyBatis 将 SQL 语句剥离出来,集中配置在 XML 文件或使用注解写在 Mapper 接口上,实现了数据操作逻辑与业务逻辑的分离。
ORM(对象关系映射):
自动将数据库表中的记录映射成 Java 对象(POJO),以及将 Java 对象的变化持久化到数据库表中。
你操作的是
User
这样的对象,而 MyBatis 在背后帮你生成INSERT INTO user ...
这样的 SQL 并执行。
动态 SQL:
提供了强大的动态 SQL 功能,可以根据不同的条件智能地拼接 SQL 语句,避免编写大量重复和复杂的条件判断代码。例如
<if>
,<choose>
,<foreach>
等标签。
简化开发:
通过与 Spring Boot 集成,大部分配置都可以自动完成。你只需要定义好数据模型(Entity)、Mapper 接口和 SQL 映射,就可以直接注入 Mapper 接口使用,极大地提高了开发效率。
在 Spring Boot 中的工作流程
定义数据实体(Entity):一个普通的 Java 类,其属性对应数据库表中的字段。
java
// User.java @Data // Lombok 注解,自动生成getter/setter等方法 public class User { private Long id; private String name; private String email; }
创建 Mapper 接口:定义一个 Java 接口,里面声明需要对数据库进行的操作方法。
java
// UserMapper.java @Mapper // 关键注解:Spring Boot 会为此接口自动生成实现类 public interface UserMapper { User findById(Long id); void insert(User user); void update(User user); void deleteById(Long id); }
提供 SQL 映射:告诉 MyBatis 接口中的方法具体要执行什么 SQL。有两种主要方式:
XML 方式(推荐用于复杂 SQL):在
resources/
目录下创建对应的 XML 文件(如UserMapper.xml
)。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="com.example.demo.entity.User"> SELECT * FROM user WHERE id = #{id} </select> <insert id="insert" parameterType="com.example.demo.entity.User" useGeneratedKeys="true" keyProperty="id"> INSERT INTO user (name, email) VALUES (#{name}, #{email}) </insert> </mapper>
注解方式(简单 SQL):直接在接口方法上使用
@Select
,@Insert
,@Update
,@Delete
等注解。java
@Mapper public interface UserMapper { @Select("SELECT * FROM user WHERE id = #{id}") User findById(Long id); @Insert("INSERT INTO user(name, email) VALUES(#{name}, #{email})") void insert(User user); }
在 Service 中注入并使用:由于 MyBatis-Spring-Boot-Starter 的自动配置,Spring 会自动为
@Mapper
标记的接口生成代理实现类。你可以直接通过@Autowired
注入它并使用。java
@Service public class UserService { @Autowired private UserMapper userMapper; // 直接注入接口,无需自己实现 public User getUserById(Long id) { return userMapper.findById(id); } public void createUser(User user) { userMapper.insert(user); } }
如何在 Spring Boot 项目中集成
非常简单,通常只需两步:
添加依赖:在
pom.xml
中加入 MyBatis 的 Spring Boot Starter 依赖。xml
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>3.0.3</version> <!-- 请使用最新版本 --> </dependency>
同时还需要加入数据库驱动依赖,例如 MySQL:
xml
<dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <scope>runtime</scope> </dependency>
配置数据源:在
application.properties
或application.yml
中配置数据库连接信息。properties
# application.properties spring.datasource.url=jdbc:mysql://localhost:3306/your_database spring.datasource.username=your_username spring.datasource.password=your_password spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # 可选:指定 MyBatis Mapper XML 文件的位置 mybatis.mapper-locations=classpath:mapper/*.xml # 可选:配置实体类的包别名 mybatis.type-aliases-package=com.example.demo.entity
与 JPA(如 Hibernate)的对比
特性 | MyBatis | JPA (Hibernate) |
---|---|---|
控制力 | 高。开发者需要编写和优化所有 SQL,对 SQL 有完全的控制权。 | 低。框架自动生成 SQL,开发者控制力较弱,有时生成的 SQL 不够优化。 |
开发效率 | 对于简单 CRUD 较慢,对于复杂查询和定制化操作更快。 | 高。简单的 CRUD 操作非常快,无需写 SQL。 |
学习曲线 | 简单,主要需要学习 SQL 和 MyBatis 的标签。 | 较陡峭,需要学习 JPQL 和框架的复杂概念(如缓存、延迟加载)。 |
适用场景 | 需要高度优化 SQL、处理复杂查询、使用存储过程或与现有复杂数据库 schema 打交道的项目。 | 适合模型驱动开发、快速原型构建、数据库 schema 由应用控制的项目。 |
总结
在 Spring Boot 中,MyBatis 是一个通过少量配置就能集成的高效、灵活、SQL-centric 的持久层框架。它完美地结合了 Spring Boot 的自动配置优势和开发者对 SQL 的完全控制能力,是许多需要精细操作数据库和进行 SQL 优化的项目的首选。