Spring Boot中MyBatis的定义与使用

MyBatis 是一款优秀的持久层框架(ORM 框架),它支持自定义 SQL、存储过程以及高级映射。 在 Spring Boot 项目中,它的主要作用是简化数据库操作,充当应用程序和数据库之间的桥梁,让你能够以更面向对象的方式与数据库交互,而无需处理繁琐的 JDBC 代码。


核心功能与特点(它做了什么?)

  1. 解耦 SQL 与代码

    • 传统的 JDBC 需要将 SQL 语句硬编码在 Java 代码中,难以维护。

    • MyBatis 将 SQL 语句剥离出来,集中配置在 XML 文件或使用注解写在 Mapper 接口上,实现了数据操作逻辑与业务逻辑的分离。

  2. ORM(对象关系映射)

    • 自动将数据库表中的记录映射成 Java 对象(POJO),以及将 Java 对象的变化持久化到数据库表中。

    • 你操作的是 User 这样的对象,而 MyBatis 在背后帮你生成 INSERT INTO user ... 这样的 SQL 并执行。

  3. 动态 SQL

    • 提供了强大的动态 SQL 功能,可以根据不同的条件智能地拼接 SQL 语句,避免编写大量重复和复杂的条件判断代码。例如 <if>, <choose>, <foreach> 等标签。
  4. 简化开发

    • 通过与 Spring Boot 集成,大部分配置都可以自动完成。你只需要定义好数据模型(Entity)、Mapper 接口和 SQL 映射,就可以直接注入 Mapper 接口使用,极大地提高了开发效率。

在 Spring Boot 中的工作流程

  1. 定义数据实体(Entity):一个普通的 Java 类,其属性对应数据库表中的字段。

    java

    复制代码
    // User.java
    @Data // Lombok 注解,自动生成getter/setter等方法
    public class User {
        private Long id;
        private String name;
        private String email;
    }
  2. 创建 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);
    }
  3. 提供 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);
      }
  4. 在 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 项目中集成

非常简单,通常只需两步:

  1. 添加依赖 :在 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>
  2. 配置数据源 :在 application.propertiesapplication.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 优化的项目的首选。

相关推荐
贫民窟的勇敢爷们18 小时前
SpringBoot整合AOP切面编程实战,实现日志统一记录+接口权限校验
java·spring boot·spring
步菲18 小时前
【Java泛型擦除】一次 MyBatis 返回值不一致引发的线上故障复盘
mybatis
吾疾唯君医21 小时前
Java SpringBoot集成积木报表实操记录
java·spring boot·spring·导出excel·积木报表·数据文件下载
正儿八经的少年1 天前
Spring Boot 两种激活配置方式的作用与区别
java·spring boot·后端
疯狂成瘾者1 天前
Spring Boot 项目中的 SMTP 邮件验证码服务技术解析
java·spring boot·后端
啃臭1 天前
AOP和反射
java·spring boot
河阿里1 天前
SpringBoot:Spring Task定时任务完整使用教学
java·spring boot·spring
五阿哥永琪1 天前
从0开始做一个导出功能,完整流程
spring boot
java1234_小锋1 天前
SpringBoot可以同时处理多少请求?
java·spring boot·后端
海棠Flower未眠1 天前
Spring Boot 3 + JPA多模块系统对MySQL和DORIS进行多数据源集成实战(荣耀典藏版)
spring boot·后端·mysql