概要
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
Java
1<?xml version="1.0" encoding="UTF-8" ?> 2<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 3 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 4<mapper namespace="com.example.userapi.repository.PurchasingInformationMapper"> 5 <insert id="bulkInsert" parameterType="java.util.List"> 6 INSERT INTO purchasing_information 7 ( 8 sales_date, 9 buyer_id, 10 product_name, 11 comment 12 ) 13 VALUES 14 <foreach collection="entities" item="entity" separator=","> 15 ( 16 #{entity.sales_date}, 17 #{entity.buyer_id}, 18 #{entity.product_name}, 19 #{entity.comment} 20 ) 21 </foreach> 22 </insert> 23</mapper>
xmlファイルの呼び出し元
java/com/example/userapi/repository/PurchasingInformationMapper.java
Java
1package com.example.userapi.repository; 2 3import java.util.List; 4import org.apache.ibatis.annotations.Insert; 5import org.apache.ibatis.annotations.Mapper; 6import org.apache.ibatis.annotations.Param; 7import org.springframework.stereotype.Component; 8 9import com.example.userapi.entity.PurchasingInformation; 10 11@Mapper 12@Component 13public interface PurchasingInformationMapper { 14 int bulkInsert(@Param("entities")List<PurchasingInformation> entities); 15}
参考
java/com/example/userapi/service/PurchasingInformationService.java
Java
1package com.example.userapi.service; 2 3import java.util.ArrayList; 4 5import org.springframework.beans.factory.annotation.Autowired; 6import org.springframework.stereotype.Service; 7 8import com.example.userapi.entity.PurchasingInformation; 9import com.example.userapi.repository.PurchasingInformationMapper; 10 11@Service 12public class PurchasingInformationService { 13 private final PurchasingInformationMapper dao; 14 15 @Autowired 16 public PurchasingInformationService(PurchasingInformationMapper dao) { 17 this.dao = dao; 18 } 19 20 public int bulkInsert(ArrayList<PurchasingInformation> entities) { 21 return dao.bulkInsert(entities); 22 } 23} 24
参考
build.gradle
Java
1plugins { 2 id 'java' 3 id 'org.springframework.boot' version '2.7.5' 4 id 'io.spring.dependency-management' version '1.0.15.RELEASE' 5} 6 7group = 'com.example' 8version = '0.0.1-SNAPSHOT' 9sourceCompatibility = '17' 10 11repositories { 12 mavenCentral() 13} 14 15dependencies { 16 implementation 'org.springframework.boot:spring-boot-starter-web' 17 developmentOnly 'org.springframework.boot:spring-boot-devtools' 18 testImplementation 'org.springframework.boot:spring-boot-starter-test' 19 implementation 'org.xerial:sqlite-jdbc:3.30.1' 20 implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.2' 21 implementation 'org.xerial:sqlite-jdbc:3.39.3.0' 22 implementation 'io.reactivex.rxjava3:rxjava:3.1.5' 23 compileOnly 'org.projectlombok:lombok' 24 annotationProcessor 'org.projectlombok:lombok' 25} 26 27tasks.named('test') { 28 useJUnitPlatform() 29}
参考
java/com/example/userapi/config/MyBatisMapperScannerConfig.java
Java
1package com.example.userapi.config; 2 3import org.mybatis.spring.mapper.MapperScannerConfigurer; 4import org.springframework.context.annotation.Bean; 5import org.springframework.context.annotation.Configuration; 6 7@Configuration 8public class MyBatisMapperScannerConfig { 9 @Bean 10 public MapperScannerConfigurer mapperScannerConfigurer() { 11 MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer(); 12 mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory"); 13 14 mapperScannerConfigurer.setBasePackage("com.example.userapi.repository"); 15 16 return mapperScannerConfigurer; 17 } 18}
参考
resources/application.properties
Java
1server.error.include-stacktrace=never 2logging.file.name=logs/application.log 3logging.level.org.springframework.web=INFO 4 5spring.datasource.url=jdbc:sqlite:db/database.sqlite3 6spring.datasource.driver-class-name=org.sqlite.JDBC 7mybatis.configuration.map-underscore-to-camel-case=true 8mybatis.mapper-locations=classpath:/com/example/userapi/repository/*.xml
試したこと
xmlを使わない場合(MapperファイルにSQLを書いた場合)はSQLが実行されるのか→実行される
一旦以下2つのファイルを下記のように変更し、insert文を実行したら、正しくDBに保存された。
java/com/example/userapi/service/PurchasingInformationService.java
Java
1.... 2 public int bulkInsert(ArrayList<PurchasingInformation> entities) { 3 dao.insertUser("11111111"); 4 return 1; 5 } 6...
java/com/example/userapi/repository/PurchasingInformationMapper.java
Java
1... 2public interface PurchasingInformationMapper { 3 @Insert("INSERT INTO purchasing_information(sales_date) values(#{sales_date})") 4 void insertUser(@Param("sales_date") String sales_date); 5... 6}
補足情報(FW/ツールのバージョンなど)
Springframework.boot 2.7.5
あなたの回答
tips
プレビュー