You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpringBoot整合MyBatis无法调用XML中SQL语句求助

SpringBoot+MyBatis XML映射文件无法执行问题排查

问题背景

我正在开发基于SpringBoot的Web应用,使用MyBatis作为ORM框架。在XML文件中编写了SQL语句,但无法正常调用执行,推测是XML文件调用环节出现问题,但未能解决。

预期目标

成功执行XML文件中编写的SQL语句。

项目目录结构

src/main
├── java
│   └── com
│       └── example
│           └── userapi
│               ├── UserApiApplication.java
│               ├── batch
│               │   ├── CsvImportJobInvoker.java
│               │   └── CsvImporter.java
│               ├── config
│               │   ├── MyBatisConfig.java
│               │   └── MyBatisMapperScannerConfig.java
│               ├── constants
│               │   └── ErrorCode.java
│               ├── controller
│               │   ├── BatchController.java
│               │   └── UserController.java
│               ├── entity
│               │   ├── PurchasingInformation.java
│               │   └── User.java
│               ├── mapper
│               ├── repository
│               │   ├── PurchasingInformationMapper.java
│               │   └── UserMapper.java
│               ├── service
│               │   ├── PurchasingInformationService.java
│               │   └── UserService.java
│               └── utility
│                   └── Logger.java
└── resources
    ├── application.properties
    ├── com.example.userapi.repository
    │   └── PurchasingInformationMapper.xml
    ├── static
    └── templates

相关代码片段

1. MyBatis XML映射文件(resources/com.example.userapi.repository/PurchasingInformationMapper.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.userapi.repository.PurchasingInformationMapper">
    <insert id="bulkInsert" parameterType="java.util.List">
        INSERT INTO purchasing_information
        (
            sales_date,
            buyer_id,
            product_name,
            comment
        )
        VALUES
        <foreach collection="entities" item="entity" separator=",">
        (
            #{entity.sales_date},
            #{entity.buyer_id},
            #{entity.product_name},
            #{entity.comment}
        )
        </foreach>
    </insert>
</mapper>

2. Mapper接口(java/com/example/userapi/repository/PurchasingInformationMapper.java)

package com.example.userapi.repository;

import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Component;

import com.example.userapi.entity.PurchasingInformation;

@Mapper
@Component
public interface PurchasingInformationMapper {
    int bulkInsert(@Param("entities")List<PurchasingInformation> entities);
}

3. 服务层代码(java/com/example/userapi/service/PurchasingInformationService.java)

package com.example.userapi.service;

import java.util.ArrayList;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.example.userapi.entity.PurchasingInformation;
import com.example.userapi.repository.PurchasingInformationMapper;

@Service
public class PurchasingInformationService {
    private final PurchasingInformationMapper dao;

    @Autowired
    public PurchasingInformationService(PurchasingInformationMapper dao) {
        this.dao = dao;
    }

    public int bulkInsert(ArrayList<PurchasingInformation> entities) {
        return dao.bulkInsert(entities);
    }
}

4. build.gradle配置

plugins {
    id 'java'
    id 'org.springframework.boot' version '2.7.5'
    id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    implementation 'org.xerial:sqlite-jdbc:3.30.1'
    implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.2'
    implementation 'org.xerial:sqlite-jdbc:3.39.3.0'
    implementation 'io.reactivex.rxjava3:rxjava:3.1.5'
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
}

tasks.named('test') {
    useJUnitPlatform()
}

5. MyBatis扫描配置(java/com/example/userapi/config/MyBatisMapperScannerConfig.java)

package com.example.userapi.config;

import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyBatisMapperScannerConfig {
    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer() {
        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
        mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory");

        mapperScannerConfigurer.setBasePackage("com.example.userapi.repository");

        return mapperScannerConfigurer;
    }
}

6. application.properties配置

server.error.include-stacktrace=never
logging.file.name=logs/application.log
logging.level.org.springframework.web=INFO

spring.datasource.url=jdbc:sqlite:db/database.sqlite3
spring.datasource.driver-class-name=org.sqlite.JDBC
mybatis.configuration.map-underscore-to-camel-case=true
mybatis.mapper-locations=classpath:/com/example/userapi/repository/*.xml

已尝试的操作

  • 不使用XML,直接在Mapper接口中通过@Insert注解编写SQL时,语句可正常执行并写入数据库。

额外信息

  • 使用SpringBoot 2.7.5版本

内容的提问来源于stack exchange,提问作者katahik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 04:35:26