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 Web 开发中,Spring Boot 和 MyBatis 是两个被广泛采用的技术栈。Spring Boot 提供了快速构建应用的开箱即用能力,而 MyBatis 则以灵活的 SQL 映射机制著称。本文将通过循序渐进的方式,讲解如何将这两个技术整合到一个项目中。无论是刚刚接触框架的新手,还是希望提升工程实践的中级开发者,都能通过本文掌握 Spring Boot 集成 MyBatis 的核心要点。


一、环境准备与项目搭建

1.1 项目初始化

使用 Spring Initializr(https://start.spring.io)创建新项目。选择以下配置:

  • Project:Maven Project
  • Language:Java
  • Spring Boot Version:推荐最新稳定版(如 3.2.x)
  • Dependencies:添加 Spring WebSpring Data JPA(可选,用于对比)、MySQL Driver

1.2 关键依赖引入

pom.xml 中添加 MyBatis 和数据库驱动依赖:

<dependencies>  
    <!-- MyBatis Spring Boot Starter -->  
    <dependency>  
        <groupId>org.mybatis.spring.boot</groupId>  
        <artifactId>mybatis-spring-boot-starter</artifactId>  
        <version>3.0.1</version>  
    </dependency>  
    <!-- MySQL Connector -->  
    <dependency>  
        <groupId>mysql</groupId>  
        <artifactId>mysql-connector-java</artifactId>  
        <version>8.0.33</version>  
    </dependency>  
</dependencies>  

1.3 数据库配置

application.properties 中配置数据库连接信息:

spring.datasource.url=jdbc:mysql://localhost:3306/mydb?useSSL=false  
spring.datasource.username=root  
spring.datasource.password=your_password  
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver  

二、核心配置与核心概念

2.1 MyBatis 配置文件

src/main/resources 目录下创建 mybatis-config.xml,用于定义全局配置:

<?xml version="1.0" encoding="UTF-8" ?>  
<!DOCTYPE configuration  
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  
  "http://mybatis.org/dtd/mybatis-3-config.dtd">  
<configuration>  
    <settings>  
        <setting name="mapUnderscoreToCamelCase" value="true"/>  
    </settings>  
</configuration>  

知识点mapUnderscoreToCamelCase 可将数据库字段名(如 user_name)自动映射为实体类的驼峰命名属性(userName)。

2.2 Mapper 接口与 XML 文件

2.2.1 定义 Mapper 接口

创建一个接口,例如 UserMapper.java

public interface UserMapper {  
    @Select("SELECT * FROM user WHERE id = #{id}")  
    User selectById(Long id);  
}  

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

2.3 自动扫描配置

在 Spring Boot 启动类上添加 @MapperScan 注解,指定 Mapper 接口的包路径:

@SpringBootApplication  
@MapperScan("com.example.mapper")  
public class Application {  
    public static void main(String[] args) {  
        SpringApplication.run(Application.class, args);  
    }  
}  

三、核心流程与原理剖析

3.1 从接口到 SQL 的映射机制

当调用 UserMapper.selectById(1L) 时,MyBatis 的核心流程如下:

  1. 接口解析:通过反射获取接口的方法名、参数类型和注解信息。
  2. SQL 解析:从 XML 或注解中读取对应的 SQL 语句。
  3. 参数绑定:将方法参数 #{id} 替换为数据库查询参数。
  4. 结果映射:将数据库返回的 ResultSet 转换为 Java 对象。

3.2 动态 SQL 与条件语句

通过 <if> 标签实现动态 SQL:

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

比喻:这就像一个智能快递分拣系统,根据包裹标签上的条件动态决定投递路径。


四、高级特性与最佳实践

4.1 二级缓存机制

通过配置 MyBatis 的二级缓存提升查询性能:

<mapper namespace="com.example.mapper.UserMapper">  
    <cache/>  
    <select .../>  
</mapper>  

注意:需确保实体类实现 Serializable 接口。

4.2 通用 Mapper 的使用

引入 mybatis-generator 生成基础 Mapper:

<dependency>  
    <groupId>org.mybatis.generator</groupId>  
    <artifactId>mybatis-generator-core</artifactId>  
    <version>1.4.2</version>  
</dependency>  

通过配置文件自动生成 CRUD 方法,减少重复代码。

4.3 事务管理

在 Service 层使用 @Transactional 注解管理事务:

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

    @Transactional  
    public void addUser(User user) {  
        userMapper.insert(user);  
        // 其他业务逻辑  
    }  
}  

五、常见问题与解决方案

5.1 SQL 注入风险

问题:直接拼接 SQL 语句可能导致注入漏洞。
解决方案:使用 #{} 占位符替代 $ 符号,例如:

<update id="updateUser">  
    UPDATE user SET name = #{name} WHERE id = #{id}  
</update>  

5.2 表名与实体类不匹配

问题:数据库表名和实体类属性名不一致时,查询结果为空。
解决方案:使用 @Results 注解或 XML 的 <result> 标签映射字段:

@Select("SELECT * FROM user WHERE id = #{id}")  
@Results({  
    @Result(property = "userName", column = "user_name")  
})  
User selectById(Long id);  

5.3 性能优化建议

  • 分页查询:使用 RowBounds 或自定义分页插件。
  • 延迟加载:通过 lazyLoadAllEnabled 配置减少 N+1 查询问题。
  • 索引优化:对高频查询字段建立数据库索引。

六、完整案例演示

6.1 实体类设计

@Data  
public class User {  
    private Long id;  
    private String name;  
    private Integer age;  
}  

6.2 Controller 层代码

@RestController  
@RequestMapping("/users")  
public class UserController {  
    @Autowired  
    private UserMapper userMapper;  

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

6.3 启动项目并测试

运行 Application 类,访问 http://localhost:8080/users/1,即可查看查询结果。


结论

通过本文的讲解,读者应能掌握 Spring Boot 集成 MyBatis 的完整流程,包括依赖配置、核心概念、高级特性和问题排查。无论是搭建简单的 CRUD 系统,还是构建复杂的企业级应用,MyBatis 的灵活性与 Spring Boot 的便捷性结合,都能显著提升开发效率。建议读者通过实际项目不断实践,并结合官方文档深入理解底层原理,逐步成长为全栈开发工程师。

关键词布局:springboot集成mybatis、MyBatis 配置、SQL 注入、二级缓存、动态 SQL、Mapper 接口、事务管理、实体类映射、分页查询、性能优化。

最新发布