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
相关产品推荐
相关产品推荐

