質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

MyBatis

MyBatisはJavaや.NET Frameworkでなどで使用できる、SQL文や、ストアドプロシージャをオブジェクトと紐付けるO/Rマッピングフレームワークです。

Q&A

解決済

2回答

2559閲覧

SpringBoot(Spring解体新書) 8章 Mybatisでのデータベース操作ができない

takaroid

総合スコア5

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

MyBatis

MyBatisはJavaや.NET Frameworkでなどで使用できる、SQL文や、ストアドプロシージャをオブジェクトと紐付けるO/Rマッピングフレームワークです。

1グッド

0クリップ

投稿2023/07/22 03:14

実現したいこと

SpringBootを自学している初心者です。
「Spring解体新書第2版」を用いて、Spring Bootの学習をしています。

7章までは問題なく進めました。
8章の、MayBatisを使用してデータベースを操作する部分でつまづいております。

どうすれば、エラーを回避できるのか具体的な方法をご教授いただけますと幸いです。よろしくお願いいたします。

発生している問題・エラーメッセージ

以下、コンソールより Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled. 2023-07-22T11:46:13.909+09:00 ERROR 15724 --- [ restartedMain] o.s.b.d.LoggingFailureAnalysisReporter  : *************************** APPLICATION FAILED TO START *************************** Description: Field mapper in com.example.domain.user.service.impl.UserServiceImpl required a bean of type 'com.example.repository.UserMapper' that could not be found. The injection point has the following annotations: - @org.springframework.beans.factory.annotation.Autowired(required=true) Action: Consider defining a bean of type 'com.example.repository.UserMapper' in your configuration.

該当のソースコード

pom.xml

1(抜粋) 2 <!-- MyBatis --> 3 <dependency> 4 <groupId>org.mybatis.spring.boot</groupId> 5 <artifactId>mybatis-spring-boot-starter</artifactId> 6 <version>2.1.4</version> 7 <!-- <version>3.5.13</version> --> 8 </dependency> 9 10 <!-- Model Mapper --> 11 <dependency> 12 <groupId>org.modelmapper.extensions</groupId> 13 <artifactId>modelmapper-spring</artifactId> 14 <version>2.3.9</version> 15 </dependency>

application.properties

1# データベースの接続設定 2spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE 3spring.datasource.driver-class-name=org.h2.Driver 4spring.datasource.username=sa 5spring.datasource.password= 6spring.datasource.sql-script-encoding=UTF-8 7spring.datasource.Initialize=true 8spring.datasource.schema=classpath:schema.sql 9spring.datasource.data=classpath:data.sql 10 11#H2DB 12spring.h2.console.enabled=true 13 14#message 15spring.messages.basename=i18n/messages,i18n/ValidationMessages 16 17#MyBatis 18mybatis.mapper-locations=classpath*:/mapper/h2/*.xml 19 20#Log Level 21logging.level.com.example=debug 22

schema.sql

1CREATE TABLE IF NOT EXISTS employee( 2 id VARCHAR(50) PRIMARY KEY, 3 name VARCHAR(50), 4 age INT 5 ); 6 7 /* ユーザーマスタ */ 8 CREATE TABLE IF NOT EXISTS m_user( 9 user_id VARCHAR(50) PRIMARY KEY 10 ,password VARCHAR(100) 11 ,user_name VARCHAR(50) 12 ,birthday DATE 13 ,age INT 14 ,gender INT 15 ,department_id INT 16 ,role VARCHAR(50) 17 ); 18 19 20 /* 部署マスタ */ 21 CREATE TABLE IF NOT EXISTS m_department( 22 department_id INT PRIMARY KEY 23 ,department_name VARCHAR(50) 24 ); 25 26 27 /* 給料テーブル */ 28 CREATE TABLE IF NOT EXISTS t_salary( 29 user_id VARCHAR(50) 30 ,year_month VARCHAR(50) 31 ,salary INT 32 ,PRIMARY KEY(user_id,year_month) 33 ); 34

data.sql

1INSERT INTO employee(id,name,age) 2VALUES('1','Tom',30); 3 4 5/* ユーザーマスタ */ 6INSERT INTTO m_user( 7 user_id 8 ,password 9 ,user_name 10 ,birthday 11 ,age 12 ,gender 13 ,department_id 14 ,role 15) VALUES 16('system@co.jp','password','システム管理者','2000-01-01',21,1,1,'ROLE_ADMIN') 17,('user@co.jp','password','ユーザー1','2000-01-01',21,2,2,'ROLE_GENERAL') 18; 19 20 21 22 /* 部署マスタ */ 23INSERT INTTO m_department( 24 department_id 25 ,department_name 26) VALUES 27(1,'システム営業部') 28,(2,'営業部') 29; 30 31 32 /* 給料テーブル */ 33INSERT INTTO t_salary( 34 user_id 35 ,year_month 36 ,salary 37)VALUES 38('user@co.jp','2020/11',280000) 39,('user@co.jp','2020/12',290000) 40,('user@co.jp','2021/01',300000) 41; 42

MUser.java

1package com.example.domain.user.model; 2 3import java.util.Date; 4 5import lombok.Data; 6 7@Data 8public class MUser { 9 private String userId; 10 private String password; 11 private String userName; 12 private Date birthday; 13 private Integer age; 14 private Integer gender; 15 private Integer departmentId; 16 private String role; 17} 18

UserMapper.xml

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 5<!-- Mappingとxmlのマッピング --> 6<mapper namespace="com.example.repository.UserMapper"> 7 8<!-- ユーザー1件登録 --> 9<insert id="insertOne"> 10 insert into m_user( 11 user_id 12 ,password 13 ,user_name 14 ,birthday 15 ,age 16 ,gender 17 ,department_id 18 ,role 19 ) 20 values( 21 #{userId} 22 ,#{password} 23 ,#{userName} 24 ,#{birthday} 25 ,#{age} 26 ,#{gender} 27 ,#{departmentId} 28 ,#{role} 29 ) 30</insert> 31</mapper>

UserServiceImpl.java

1package com.example.domain.user.service.impl; 2 3import org.springframework.beans.factory.annotation.Autowired; 4import org.springframework.stereotype.Service; 5 6import com.example.domain.user.model.MUser; 7import com.example.domain.user.service.UserService; 8import com.example.repository.UserMapper; 9 10 11@Service 12public class UserServiceImpl implements UserService { 13 14 @Autowired 15 private UserMapper mapper; 16 17 /** ユーザ登録 */ 18 @Override 19 public void signup(MUser user) { 20 user.setDepartmentId(1); //部署 21 user.setRole("ROLE_GENERAL"); //ロール 22 mapper.insertOne(user); 23 } 24 25 26} 27

JavaConfig.java

1package com.example.config; 2 3import org.modelmapper.ModelMapper; 4import org.springframework.context.annotation.Bean; 5import org.springframework.context.annotation.Configuration; 6 7@Configuration 8public class JavaConfig { 9 10 @Bean 11 public ModelMapper modelMapper() { 12 return new ModelMapper(); 13 } 14 15} 16

SignupController.java

1package com.example.controller; 2 3import java.util.Locale; 4import java.util.Map; 5 6import org.modelmapper.ModelMapper; 7import org.springframework.beans.factory.annotation.Autowired; 8import org.springframework.stereotype.Controller; 9import org.springframework.ui.Model; 10import org.springframework.validation.BindingResult; 11import org.springframework.validation.annotation.Validated; 12import org.springframework.web.bind.annotation.GetMapping; 13import org.springframework.web.bind.annotation.ModelAttribute; 14import org.springframework.web.bind.annotation.PostMapping; 15import org.springframework.web.bind.annotation.RequestMapping; 16 17import com.example.application.service.UserApplicationService; 18import com.example.domain.user.model.MUser; 19import com.example.domain.user.service.UserService; 20import com.example.form.GroupOrder; 21import com.example.form.SignupForm; 22 23import lombok.extern.slf4j.Slf4j; 24 25@Controller 26@RequestMapping("/user") 27@Slf4j 28public class SignupController { 29 30 @Autowired 31 private UserApplicationService userApplicationService; 32 33 @Autowired 34 private UserService userService; 35 36 @Autowired 37 private ModelMapper modelMapper; 38 39 /** ユーザー登録画面を表示 */ 40 @GetMapping("/signup") 41 public String getSignup(Model model,Locale locale, 42 @ModelAttribute SignupForm form) { 43 44 //System.out.println("1"); 45 46 //性別を取得 47 Map<String,Integer> genderMap = userApplicationService.getGenderMap(); 48 model.addAttribute("genderMap",genderMap); 49 50 //ユーザー登録画面に遷移 51 System.out.println("--1--"); 52 return "user/signup"; 53 } 54 55 56 /** ユーザー登録処理 */ 57 @PostMapping("/signup") 58 public String postSignup(Model model,Locale locale, 59 @ModelAttribute @Validated(GroupOrder.class) SignupForm form, 60 BindingResult bindingResult) { 61 62 //入力チェック結果 63 if(bindingResult.hasErrors()) { 64 //NG:ユーザ登録画面に戻ります 65 return getSignup(model,locale,form); 66 } 67 68 log.info(form.toString()); 69 70 71 // formをMUesrクラスに変換 72 MUser user = modelMapper.map(form,MUser.class); 73 74 //ユーザー登録 75 userService.signup(user); 76 77 //ログイン画面にリダイレクト 78 return "redirect:/login"; 79 } 80} 81

試したこと

1.書籍内容の見直し
何度もやっていますが間違いを見つけることができません

2.別環境(Eclipse2022)や、別のPCでの動作確認
同じ現象になります。

3.net情報の検索とさらなる?問題
MyBatisのバージョンの問題について言及されているサイトを見つけ、EclipseのマーケットプレイスからMyBatis Generator 1.4.2をインストールしようとしていますが、

https://mybatis.jfrog.io/artifactory/generator-eclipse-release/ のリポジトリーを読み取ることができません。
https://mybatis.jfrog.io/artifactory/generator-eclipse-release/ は有効なリポジトリー・ロケーションではありません。

と表示されインストールができません。
(別PCでも同様でした)

繰り返しとなりますが、どうぞご教授お願いいたします。

kashi1130👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

neko_the_shadow

2023/07/22 03:36

com.example.repository.UserMapperクラスの内容を追記できますか?
takaroid

2023/07/22 03:58

>neko_the_shadow 様 ありがとうございます!このようになっております。<(_ _)> package com.example.repository; import org.apache.ibatis.annotations.Mapper; import com.example.domain.user.model.MUser; @Mapper public interface UserMapper { /** ユーザー登録 */ public int insertOne(MUser user); }
neko_the_shadow

2023/07/22 06:13

ありがとうございます。UserMapper.javaは問題なさそうですね。ちなみにUserMapper.xmlは正しい位置に設置できていますか? > mybatis.mapper-locations=classpath*:/mapper/h2/*.xml
takaroid

2023/07/22 07:46

>neko_the_shadow 様 ありがとうございます。 UserMapper.xml の設置場所は、 src/main/resources/mapper/h2/UserMapper.xml となっております。<(_ _)>
takaroid

2023/07/23 01:21

>neko_the_shadow 様 ありがとうございました。 解決することができました。 また何かの際にはよろしくお願いいたします。
guest

回答2

0

自己解決

他の方の解決例により解決することができました!
結論としては、

pom.xmlの修正
→ mybatisのバージョンを3.0.0にする
参考)https://teratail.com/questions/25irm51j04bbwr
です。

皆様、ありがとうございました!

投稿2023/07/23 01:08

takaroid

総合スコア5

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KT001

2023/07/23 01:44

リンク先にコメントした者ですが、現在のSpring Boot (3.0.9また3.1.2) をお使いであれば、MyBatisは3.0.2になりますので、併せてお試しください。
takaroid

2023/07/23 01:58

>KT001 様 貴重な情報ありがとうございました! また、今後お世話になる機会があるかもしれません。 合わせてよろしくお願いいたします。<(_ _)>
guest

0

同書でやってみた方が途中々々のコード等も公開されているようです。

Spring解体新書第二版ハンズオンメモ

比較してみては如何でしょうか。

投稿2023/07/22 06:54

jimbe

総合スコア13318

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takaroid

2023/07/22 07:48

>jimbe 様 ありがとうございます。 一度比較したのですが再度確認してみます。
jimbe

2023/07/22 09:18

既にチェックされていましたか、失礼。 あとは・・・各種バージョンが同じかどうか、でしょうか。結構バージョンによって異なっているそうですので。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問