概述
我正在用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 来执行的