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 BootMyBatis的组合堪称“黄金搭档”。前者通过约定优于配置的理念简化了项目搭建,后者则以灵活的SQL映射能力解决了ORM框架的灵活性问题。本文将从零开始,系统讲解两者的整合思路,通过循序渐进的案例,帮助开发者掌握这一技术栈的核心要点。

一、环境搭建与基础配置

1.1 项目初始化

使用Spring Initializr快速创建项目时,需添加以下依赖:

<dependencies>  
    <dependency>  
        <groupId>org.springframework.boot</groupId>  
        <artifactId>spring-boot-starter-web</artifactId>  
    </dependency>  
    <dependency>  
        <groupId>org.mybatis.spring.boot</groupId>  
        <artifactId>mybatis-spring-boot-starter</artifactId>  
        <version>2.2.0</version>  
    </dependency>  
    <!-- 数据库驱动,此处以MySQL为例 -->  
    <dependency>  
        <groupId>mysql</groupId>  
        <artifactId>mysql-connector-java</artifactId>  
        <version>8.0.23</version>  
    </dependency>  
</dependencies>  

小贴士:通过<artifactId>mybatis-spring-boot-starter</artifactId>,Spring Boot会自动扫描src/main/resources目录下的application.properties文件。

1.2 数据库连接配置

application.properties中添加数据库参数:

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

此时,Spring Boot会自动创建DataSource并初始化MyBatis环境。

二、核心概念解析

2.1 Spring Boot的“约定优于配置”哲学

Spring Boot通过一系列starter依赖和默认配置,大幅降低了开发者的重复劳动。例如:

  • 自动配置:无需手动配置Tomcat、数据源等基础组件
  • 端点监控:内置Actuator模块提供健康检查、指标统计等功能
  • 日志聚合:统一使用SLF4J实现日志输出

比喻:就像搭建乐高积木,Spring Boot提供了标准化的“积木块”,开发者只需按需组合,即可快速构建复杂系统。

2.2 MyBatis的“SQL映射”机制

MyBatis通过XML或注解将Java方法与SQL语句进行绑定,其核心优势在于:

  • 灵活性:直接编写原生SQL,避免ORM框架的性能损耗
  • 可维护性:通过Mapper接口与XML分离,实现代码解耦
  • 扩展性:支持动态SQL、分页插件等高级功能

比喻:MyBatis就像一位“SQL翻译官”,将Java的面向对象思维转化为数据库能理解的SQL语言。

三、整合实战:从配置到运行

3.1 定义实体类与Mapper接口

// User.java  
@Data  
public class User {  
    private Long id;  
    private String username;  
    private String email;  
}  

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

    @Insert("INSERT INTO user(username, email) VALUES(#{username}, #{email})")  
    void insert(User user);  
}  

3.2 配置MyBatis扫描路径

在Spring Boot主类或配置类中添加:

@Configuration  
@MapperScan("com.example.mapper")  
public class MyBatisConfig {  
    // 可在此扩展配置,如分页插件等  
}  

3.3 控制器层实现

@RestController  
public class UserController {  
    @Autowired  
    private UserMapper userMapper;  

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

此时启动项目,访问/user/1即可通过MyBatis查询数据库。

四、高级用法与优化技巧

4.1 动态SQL与条件查询

通过<if>标签实现复杂查询:

<!-- UserMapper.xml -->  
<select id="selectByCondition" resultType="User">  
    SELECT * FROM user  
    <where>  
        <if test="username != null">  
            AND username LIKE CONCAT('%', #{username}, '%')  
        </if>  
        <if test="email != null">  
            AND email = #{email}  
        </if>  
    </where>  
</select>  

4.2 分页插件集成

通过PageHelper实现分页:

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

使用方式:

PageHelper.startPage(1, 10);  
List<User> users = userMapper.selectAll();  
PageInfo<User> pageInfo = new PageInfo<>(users);  

4.3 二级缓存优化

application.properties中启用二级缓存:

mybatis.configuration.cache-enabled=true  

并在Mapper接口添加注解:

@CacheNamespace(implementation = EhcacheCache.class)  
public interface UserMapper {  
    // 方法定义  
}  

五、案例分析:用户管理功能实现

5.1 需求场景

实现一个包含增删改查的用户管理模块,要求:

  • 支持按用户名模糊查询
  • 支持分页显示用户列表
  • 提供数据校验功能

5.2 完整代码示例

5.2.1 数据库表结构

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

5.2.2 Mapper XML配置

<mapper namespace="com.example.mapper.UserMapper">  
    <select id="selectPage" resultType="User">  
        SELECT * FROM user  
        WHERE username LIKE CONCAT('%', #{username}, '%')  
        LIMIT #{offset}, #{pageSize}  
    </select>  

    <insert id="insertUser">  
        INSERT INTO user(username, email)  
        VALUES(#{user.username}, #{user.email})  
    </insert>  
</mapper>  

5.2.3 服务层校验

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

    public void addUser(User user) {  
        // 校验邮箱格式  
        if (!user.getEmail().matches("\\w+@\\w+\\.\\w+")) {  
            throw new IllegalArgumentException("邮箱格式错误");  
        }  
        userMapper.insertUser(user);  
    }  
}  

六、常见问题与解决方案

6.1 Mapper接口无法注入

原因:未正确配置@MapperScan或包路径错误
解决

@Configuration  
@MapperScan("com.example.mapper") // 确保与包路径一致  
public class MyBatisConfig {}  

6.2 SQL执行超时

原因:未配置数据库连接池参数
解决

spring.datasource.hikari.connection-timeout=30000  
spring.datasource.hikari.maximum-pool-size=20  

6.3 动态SQL条件失效

原因:对象属性未正确传递
解决

// 正确写法  
Map<String, Object> params = new HashMap<>();  
params.put("username", "test");  
userMapper.selectByCondition(params);  

// XML中使用  
<if test="username != null">  
    AND username = #{username}  
</if>  

结论

通过本文的讲解,开发者可以掌握Spring Boot与MyBatis从基础整合到高级应用的全流程。这种技术组合既继承了Spring Boot的快速开发优势,又保留了MyBatis的SQL灵活性,特别适合需要兼顾开发效率与数据库控制力的场景。

建议读者在实践过程中,重点关注以下几点:

  1. 配置规范性:严格按照Spring Boot的约定管理依赖和配置
  2. 分层设计:保持Controller-Service-DAO的清晰职责边界
  3. 性能优化:善用MyBatis的缓存机制和分页插件

随着项目复杂度的提升,可进一步探索MyBatis的插件扩展、Spring Boot的Actuator监控等功能,逐步构建健壮的企业级应用。

最新发布