Mybatis - Springboot程序里 (情景分析),怎么注入Mybatis的 XML映射文件

1. 添加依赖

确保 pom.xml 或 build.gradle 中包含 MyBatis 的 Spring Boot 集成依赖:
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>3.0.3</version>
</dependency>

2. 配置 XML 映射文件路径

在 application.yml 或 application.properties 中指定 XML 文件的位置:
mybatis:
  mapper-locations: classpath:mapper/**/*.xml  # 关键配置
  configuration:
    map-underscore-to-camel-case: true        # 可选:自动驼峰命名
  • 路径说明
    • classpath:mapper/**/*.xml:表示从 resources/mapper 目录及其子目录加载所有 XML 文件。
    • 如果 XML 文件直接放在 resources/mapper 目录下,可简写为 classpath:mapper/*.xml

 

3. 创建 XML 映射文件

在 src/main/resources/mapper 目录下创建 XML 文件(例如 UserMapper.xml),并配置命名空间指向对应的 Mapper 接口:
<?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.dao.UserDao"> <!-- 必须与 Mapper 接口全限定名一致 -->
    <select id="findById" resultType="com.example.model.User">
        SELECT * FROM user WHERE id = #{id}
    </select>
</mapper>

 

4. 定义 Mapper 接口

创建对应的 Java 接口(无需注解,但需与 XML 的 namespace 一致):
public interface UserDao {  // 无需 @Mapper 注解(通过 @MapperScan 扫描)
    User findById(Long id); // 方法名需与 XML 中的 id 一致
}

 

5. 启用 Mapper 扫描

在启动类上添加 @MapperScan,指定 Mapper 接口所在的包:
@SpringBootApplication
@MapperScan("com.example.dao")  // 扫描包下的所有 Mapper 接口
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

 

6. 注入并使用 Mapper

在 Service 或 Controller 中直接注入 Mapper 接口:

@Service
public class UserService {
    @Autowired
    private UserDao userDao;  // 自动注入

    public User getUser(Long id) {
        return userDao.findById(id);
    }
}

常见问题排查

问题 1:XML 文件未加载

  • 表现:调用方法时报错 Invalid bound statement (not found)
  • 解决
    1. 检查 mybatis.mapper-locations 路径是否与 XML 文件的实际位置匹配。
    2. 确保 XML 文件在 resources 目录下且被正确打包到 JAR 中(解压 JAR 后查看路径)。

问题 2:命名空间或方法名不匹配

  • 表现:报错 BindingException: Mapper method not found
  • 解决
    1. 检查 XML 中的 namespace 是否与 Mapper 接口的全限定名一致。
    2. 确认 XML 中的 SQL 语句 id 与方法名一致。

问题 3:XML 语法错误

  • 表现:启动时报 XML parse error
  • 解决
    1. 检查 XML 文件的 DTD 声明和标签闭合。
    2. 使用 IDE 的 XML 校验工具(如 IntelliJ 的自动提示)。

完整示例目录结构

src/main/java/
└─ com/example/
   ├─ dao/
   │  └─ UserDao.java       # Mapper 接口
   ├─ model/
   │  └─ User.java          # 实体类
   └─ Application.java      # 启动类

src/main/resources/
├─ mapper/
│  └─ UserMapper.xml        # XML 映射文件
└─ application.yml

总结

  • 核心配置mybatis.mapper-locations + @MapperScan
  • 关键规则
    • XML 的 namespace 必须对应 Mapper 接口的全限定名。
    • XML 的 SQL id 必须与接口方法名一致。
  • 推荐实践:将 XML 和 Mapper 接口放在同名包下(如 resources/mapper/com/example/dao 对应 java/com/example/dao),但需调整 mapper-locations 路径。
 

 

posted on 2025-03-31 15:54  frank_cui  阅读(65)  评论(0)    收藏  举报

导航

levels of contents