springboot整合mybatis(长文讲解)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

在现代 Java 后端开发领域,Spring Boot 和 MyBatis 是两个不可或缺的工具。Spring Boot 以其开箱即用、快速构建应用的能力著称,而 MyBatis 则凭借灵活的 SQL 映射和简洁的 ORM 特性受到开发者青睐。将两者整合,既能享受 Spring Boot 的高效开发体验,又能发挥 MyBatis 在数据库操作上的优势,是构建企业级应用的黄金组合。本文将从环境搭建到实战案例,逐步讲解如何实现这一整合,并通过生动的比喻和代码示例,帮助读者轻松掌握这一技能。


环境搭建:构建整合的基础

Maven 依赖配置

整合的第一步是准备项目依赖。在 Spring Boot 中,只需在 pom.xml 文件中添加 MyBatis 和数据库驱动的依赖,就像为工具箱安装必要的工具一样。

<!-- Spring Boot 核心依赖 -->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.1.5</version>
</parent>

<!-- 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>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.33</version>
</dependency>

项目结构规划

一个典型的整合项目结构如下:

src  
├── main  
│   ├── java  
│   │   └── com.example.demo  
│   │       ├── config          # 配置类存放目录  
│   │       ├── controller      # 控制层  
│   │       ├── service         # 业务逻辑层  
│   │       ├── mapper          # MyBatis 映射文件目录  
│   │       └── entity          # 实体类目录  
│   └── resources  
│       ├── application.yml     # 配置文件  
│       └── mapper              # XML 映射文件存放目录  
└── test  
    └── ...  

提示mapper 目录需要与 XML 文件的包路径一致,否则 MyBatis 无法加载映射文件。

数据库准备

假设我们要管理一个“用户信息”表,创建表的 SQL 如下:

CREATE TABLE user (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    email VARCHAR(100) UNIQUE,
    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

核心配置:让 Spring Boot 与 MyBatis “对话”

数据源与 MyBatis 配置

application.yml 中配置数据库连接和 MyBatis 参数:

spring:  
  datasource:  
    url: jdbc:mysql://localhost:3306/demo_db?useSSL=false&serverTimezone=Asia/Shanghai  
    username: root  
    password: root  
    driver-class-name: com.mysql.cj.jdbc.Driver  

mybatis:  
  mapper-locations: classpath:mapper/*.xml  # 指定 XML 映射文件路径  
  type-aliases-package: com.example.demo.entity  # 实体类包路径  

MyBatis 配置类(可选)

对于复杂场景,可以通过 Java 配置类增强 MyBatis 功能。例如:

@Configuration
@MapperScan("com.example.demo.mapper")  // 扫描 Mapper 接口包
public class MyBatisConfig {

    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();  // 集成分页插件
    }
}

比喻:这个配置类就像一个“交通指挥官”,负责协调 MyBatis 的各个组件,确保 SQL 执行、分页等逻辑正确运行。


实战:CRUD 操作详解

实体类(Entity)

实体类对应数据库表的结构:

@Data  // Lombok 注解,自动生成 getter/setter  
public class User {  
    private Long id;  
    private String name;  
    private String email;  
    private LocalDateTime createTime;  
}  

Mapper 接口与 XML 映射

1. 定义 Mapper 接口

public interface UserMapper {  
    User selectById(Long id);  
    List<User> selectAll();  
    int insert(User user);  
    int update(User user);  
    int deleteById(Long id);  
}  

2. 编写 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="selectById" resultType="User">  
        SELECT * FROM user WHERE id = #{id}  
    </select>  

    <!-- 查询所有记录 -->  
    <select id="selectAll" resultType="User">  
        SELECT * FROM user  
    </select>  

    <!-- 新增记录 -->  
    <insert id="insert" useGeneratedKeys="true" keyProperty="id">  
        INSERT INTO user(name, email)  
        VALUES(#{name}, #{email})  
    </insert>  
</mapper>  

3. 业务层与控制层调用

在 Service 层注入 Mapper:

@Service  
public class UserService {  
    @Autowired  
    private UserMapper userMapper;  

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

在 Controller 层暴露 REST API:

@RestController  
@RequestMapping("/users")  
public class UserController {  
    @Autowired  
    private UserService userService;  

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

高级功能:提升整合的灵活性

动态 SQL 与条件查询

在 XML 中使用 MyBatis 的动态标签(如 <if><choose>)实现条件查询:

<select id="selectByCondition" resultType="User">  
    SELECT * FROM user  
    WHERE 1=1  
    <if test="name != null">  
        AND name LIKE CONCAT('%', #{name}, '%')  
    </if>  
    <if test="email != null">  
        AND email = #{email}  
    </if>  
</select>  

分页插件(以 PageHelper 为例)

通过在配置类中引入分页插件,简化分页逻辑:

@Configuration  
public class MyBatisConfig {  
    @Bean  
    public PageInterceptor pageInterceptor() {  
        return new PageInterceptor();  
    }  
}  

使用时只需添加分页参数:

PageHelper.startPage(1, 10);  // 第一页,每页10条  
PageInfo<User> pageInfo = new PageInfo<>(userMapper.selectAll());  

事务管理

Spring Boot 默认对 @Service 注解的类开启事务。通过 @Transactional 可以细化事务控制:

@Service  
public class UserService {  
    @Transactional(rollbackFor = Exception.class)  
    public void addUserAndLog(User user) {  
        userMapper.insert(user);  
        // 其他操作,若失败则回滚  
    }  
}  

常见问题与解决方案

1. Mapper 接口无法注入

原因:未在配置类中使用 @MapperScan 或未在接口上添加 @Mapper 注解。
解决

@Configuration  
@MapperScan("com.example.demo.mapper")  // 指定 Mapper 包路径  
public class MyBatisConfig { ... }  

2. SQL 语句执行报错

常见场景:字段名与数据库列名不一致。
解决

  • 在实体类中使用 @Column 注解指定列名:
    @Data  
    public class User {  
        @Column("user_name")  
        private String name;  
    }  
    
  • 或在 XML 中显式指定列名:
    <result column="user_name" property="name"/>  
    

3. 性能优化与 SQL 注入

  • SQL 注入防御:始终使用 #{参数} 而非 ${参数},避免直接拼接 SQL。
  • 查询优化:使用 MyBatis 的二级缓存或 Redis 缓存高频查询结果。

结论

通过本文的讲解,读者应已掌握 Spring Boot 与 MyBatis 的整合方法,并能独立实现基础的 CRUD 操作与高级功能。这一整合不仅简化了数据库操作,还通过 Spring Boot 的自动配置特性降低了学习成本。对于开发者而言,掌握这一技术栈不仅能提升开发效率,还能为构建复杂企业级应用打下坚实基础。

下一步行动:建议读者动手创建一个完整项目,尝试实现用户管理系统的增删改查功能,并通过 Postman 测试接口。实践是检验知识的最佳方式,也欢迎在评论区分享你的学习心得!

最新发布