无法在MyBatis中调用xml



概述

我正在用SpringBoot创建一个web应用程序
我正在为ORMapper使用mybatis
我在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

相关源代码

我想调用这个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>

xml文件的调用方
java.com/example/userapi/repository/PurchasingInformationMapper.java

package com.example.userapi.repository;
import java.util.List;
import org.apache.ibatis.annotations.Insert;
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);
}

参考
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);
}
}

参考
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()
}

参考
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;
}
}

参考
resources/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文件中编写SQL),SQL会被执行吗->是的

一旦我按照如下方式更改了以下两个文件并执行了insert语句,它就被正确地保存到了DB中
java.com/example/userapi/service/PurchasingInformationService.java

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

java.com/example/userapi/repository/PurchasingInformationMapper.java

...
public interface PurchasingInformationMapper {
@Insert("INSERT INTO purchasing_information(sales_date) values(#{sales_date})")
void insertUser(@Param("sales_date") String sales_date);
...
}

附加信息(固件/工具版本等)

Springframework.boot 2.7.5

SQL是通过将目录更改为src/main/resources/com/example/userapi/repository 来执行的