如何让Spring Boot扫描到依赖Jar包中的MyBatis Bean

介绍

在开发中,我们经常会使用到Spring Boot和MyBatis框架,而有时我们可能遇到的问题是在依赖的Jar包中添加了MyBatis的Mapper接口和对应的实现类,但是Spring Boot应用程序无法扫描到这些Bean,导致无法正常使用。本文将介绍如何解决这个问题,并提供详细的步骤和代码示例。

整体流程

下面是解决该问题的整体流程的步骤概述:

gantt
    title Spring Boot扫描不到依赖Jar包中MyBatis Bean的解决流程

    section 了解问题
    定义问题  :done, 2022-01-01, 1d
    理解问题  :done, 2022-01-02, 1d

    section 解决方案
    添加依赖  :done, 2022-01-03, 1d
    配置扫描  :done, 2022-01-04, 1d
    测试运行  :done, 2022-01-05, 1d

    section 完成
    文章撰写  :done, 2022-01-06, 1d
    文章校对  :done, 2022-01-07, 1d

了解问题

在开始解决问题之前,我们需要先了解问题的背景和原因。当我们将MyBatis Mapper接口和对应的实现类打包成Jar包,并将其作为依赖引入到Spring Boot应用中时,Spring Boot默认是不会自动扫描到这些Bean的。因此,我们需要手动配置Spring Boot来扫描这些Bean。

解决方案

添加依赖

首先,我们需要在Spring Boot应用的pom.xml文件中添加MyBatis和MyBatis-Spring的依赖。这些依赖将提供MyBatis的核心功能和与Spring的集成支持。

<dependencies>
    <!-- MyBatis -->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.2.0</version>
    </dependency>
    <!-- MyBatis-Spring -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.6</version>
    </dependency>
</dependencies>

配置扫描

接下来,我们需要配置Spring Boot来扫描并加载Jar包中的MyBatis Bean。我们可以在application.propertiesapplication.yml文件中添加以下配置:

mybatis.mapper-locations=classpath*:com/example/mappers/**/*.xml

这个配置告诉Spring Boot去扫描具有指定包路径的Mapper XML文件,并将其加载为MyBatis的Mapper Bean。

测试运行

现在,我们已经完成了配置,可以通过以下步骤来测试运行我们的应用程序:

  1. 创建一个MyBatis的Mapper接口和对应的实现类,例如:

    package com.example.mappers;
    
    import com.example.models.User;
    
    public interface UserMapper {
        User getUserById(int id);
    }
    
  2. 创建相应的Mapper XML文件,例如:

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "
    <mapper namespace="com.example.mappers.UserMapper">
        <select id="getUserById" resultType="com.example.models.User">
            SELECT * FROM user WHERE id = #{id}
        </select>
    </mapper>
    
  3. 在控制器或服务中注入并使用Mapper接口,例如:

    package com.example.controllers;
    
    import com.example.mappers.UserMapper;
    import com.example.models.User;
    
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class UserController {
        private final UserMapper userMapper;
    
        public UserController(UserMapper userMapper) {
            this.userMapper = userMapper