spring boot 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 BootMyBatis 是两个不可或缺的工具。Spring Boot 以其快速启动、自动配置和开箱即用的特性,极大简化了项目搭建过程;而 MyBatis 则以灵活的 SQL 映射和与数据库的高效交互能力,成为持久层开发的首选框架。两者的结合,如同“装修好的房子”与“定制化家具”的搭配——前者提供稳定的基础框架,后者赋予开发者对数据操作的精细控制。本文将从零开始,逐步讲解如何利用 Spring Boot MyBatis 构建一个完整的 Web 应用,并通过实际案例帮助读者掌握核心知识点。


环境搭建:快速启动的基石

依赖配置与项目初始化

使用 Spring Boot MyBatis 的第一步是搭建开发环境。通过 Maven 或 Gradle 管理依赖是最常见的做法。以下是一个典型的 Maven 依赖配置示例:

<dependencies>
    <!-- Spring Boot Web 启动器 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- MyBatis Spring Boot 整合依赖 -->
    <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.26</version>
    </dependency>

    <!-- 测试依赖(可选) -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

数据库与配置文件

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

spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_demo?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456

mybatis.mapper-locations=classpath:mapper/*.xml

核心概念解析:理解框架的底层逻辑

Spring Boot 的自动配置机制

Spring Boot 的核心优势之一是 自动配置。当引入 mybatis-spring-boot-starter 依赖后,框架会自动扫描并初始化以下组件:

  1. 数据源(DataSource):根据 application.properties 配置自动创建数据库连接池。
  2. SqlSessionFactory:基于数据源生成 SQL 会话工厂。
  3. MyBatis 接口扫描:通过 @MapperScan 注解或组件扫描自动注册 Mapper 接口。

比喻:这就像“乐高积木的自动拼装”,开发者只需提供基础模块(如数据库配置),框架会自动组合成完整的系统。

MyBatis 的 SQL 映射原理

MyBatis 通过 XML 或注解将 SQL 语句与 Java 方法绑定,实现“面向接口的编程”。例如,以下代码展示了用户查询的映射关系:

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

对应的 XML 文件(user-mapper.xml):

<select id="selectById" resultType="com.example.User">
    SELECT * FROM user WHERE id = #{id}
</select>

核心思想:SQL 语句与 Java 方法分离,避免硬编码,同时保持 SQL 的灵活性。


实战案例:用户管理系统的实现

实体类设计

定义 User 实体类,与数据库表 user 对应:

public class User {
    private Long id;
    private String username;
    private String email;
    // 省略 getter/setter 方法
}

Mapper 接口与 SQL 实现

创建 UserMapper 接口并编写查询方法:

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

在 XML 文件中实现 SQL 语句:

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

<!-- 新增用户 -->
<insert id="insert">
    INSERT INTO user (username, email) VALUES (#{username}, #{email})
</insert>

Service 层与 Controller 层

通过 Service 层封装业务逻辑,Controller 层提供 REST API:

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

    public List<User> getAllUsers() {
        return userMapper.selectAll();
    }
}

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

    @GetMapping
    public ResponseEntity<List<User>> getUsers() {
        return ResponseEntity.ok(userService.getAllUsers());
    }
}

高级功能:提升开发效率的技巧

分页与动态 SQL

通过 MyBatis 的 <if><choose> 等标签实现动态 SQL,结合分页插件(如 PageHelper)简化分页逻辑:

<!-- 带条件的查询 -->
<select id="selectByCondition" resultType="User">
    SELECT * FROM user 
    WHERE 1=1
    <if test="username != null">
        AND username LIKE CONCAT('%', #{username}, '%')
    </if>
</select>

二级缓存与性能优化

启用 MyBatis 的二级缓存可减少数据库查询次数:

mybatis.configuration.cache-enabled=true

在 Mapper 接口中添加 @CacheNamespace 注解:

@CacheNamespace
public interface UserMapper {
    // 方法定义
}

常见问题与解决方案

1. SQL 语句未被识别

原因:Mapper 接口未被 Spring Boot 扫描到。
解决:在启动类或配置类上添加 @MapperScan("com.example.mapper") 注解。

2. 数据库连接失败

原因:数据库 URL、用户名或密码配置错误。
解决:检查 application.properties 中的数据库配置,并确认数据库服务已启动。

3. MyBatis 与 JPA 共存冲突

原因:Spring Boot 默认会自动配置 JPA,导致 MyBatis 配置被覆盖。
解决:在启动类中排除 JPA 自动配置:

@SpringBootApplication(exclude = {HibernateJpaAutoConfiguration.class})
public class Application {
    // 主方法
}

结论

通过本文的讲解,读者应已掌握 Spring Boot MyBatis 的核心概念、开发流程和常见技巧。这一组合不仅降低了开发门槛,还提供了灵活的数据操作能力。对于初学者,建议从简单 CRUD 功能入手,逐步探索分页、缓存等高级特性;中级开发者则可以结合实际需求,深入研究 MyBatis 的插件机制或与 Spring Data JPA 的对比。未来,随着微服务架构的普及,掌握 Spring Boot MyBatis 将成为构建高可用、高性能系统的重要基石。

最后提醒:实践是掌握技术的关键!读者可通过搭建一个完整的用户管理系统,或尝试将现有项目迁移到 Spring Boot MyBatis 架构,进一步巩固所学知识。

最新发布