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

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

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

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

MyBatis

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

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

1回答

6061閲覧

mybatisで自動生成したSelectができない

moshi

総合スコア90

Java

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

MyBatis

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

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

1クリップ

投稿2019/10/18 05:35

編集2019/10/18 08:31

前提・実現したいこと

mybatisで自動生成したselectByExample()を使用してDBの検索がしたいです。

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

・検索結果がnullであること

メソッド execute() は型 MyBatis3SelectModelAdapter<List<LoginUserInfo>> で使用すべきではありません

・上記のメッセージが出力されていること

該当のソースコード

追記:ソースの情報を追加しました。
※初めてgitを使ったため、不備があれば言ってください
ソース

パッケージ構成は以下になります。
パッケージ構成

TestSpringApplication

java

1package com.example; 2 3import org.springframework.boot.SpringApplication; 4import org.springframework.boot.autoconfigure.SpringBootApplication; 5 6@SpringBootApplication 7public class TestSpringApplication { 8 9 public static void main(String[] args) { 10 SpringApplication.run(TestSpringApplication.class, args); 11 } 12 13} 14

MainController

java

1package com.example.controller; 2 3import org.mybatis.spring.annotation.MapperScan; 4import org.springframework.web.bind.annotation.PathVariable; 5import org.springframework.web.bind.annotation.RequestMapping; 6import org.springframework.web.bind.annotation.ResponseBody; 7import org.springframework.web.bind.annotation.RestController; 8 9import com.example.service.LoginLogic; 10 11 12@ResponseBody 13@RestController 14@MapperScan("com.example.db") 15public class MainController { 16 17 @RequestMapping("/login/{id}/{pw}") 18 public String login(@PathVariable String id, @PathVariable String pw) { 19 20 LoginLogic ll = new LoginLogic(); 21 ll.loginMain(id, pw); 22 23 return pw; 24 } 25 26}

LoginLogic

java

1package com.example.service; 2 3import java.util.List; 4 5import org.springframework.beans.factory.annotation.Autowired; 6import org.springframework.stereotype.Service; 7 8import com.example.db.LoginUserInfo; 9import com.example.db.LoginUserInfoDynamicSqlSupport; 10import com.example.db.LoginUserInfoMapper; 11 12import static org.mybatis.dynamic.sql.SqlBuilder.*; 13 14import lombok.extern.slf4j.Slf4j; 15 16@Slf4j 17@Service 18public class LoginLogic { 19 20 @Autowired 21 private LoginUserInfoMapper login_user_info_mapper; 22 23 public String loginMain(String id, String pw) { 24 25 String ret = ""; 26 27 // 暗号化したpwとidでDB検索 28 try { 29 List<LoginUserInfo> loginUserInfoData = login_user_info_mapper.selectByExample() 30 .where(LoginUserInfoDynamicSqlSupport.userId, isEqualTo(id)).build().execute(); 31 }catch (Exception e) { 32 // TODO: handle exception 33 log.info(e.toString()); 34 } 35 36 37 return ret; 38 } 39 40} 41

試したこと

以下のDBをflywayで作成して、mybatisのジェネレーターでdbフォルダのファイルを生成しました。
V1__CreateUserInfo.sql

sql

1-- Table: public.login_user_info 2 3-- DROP TABLE public.login_user_info; 4 5CREATE TABLE public.login_user_info 6( 7 pw text COLLATE pg_catalog."default", 8 user_id text COLLATE pg_catalog."default" NOT NULL, 9 CONSTRAINT login_user_info_pkey PRIMARY KEY (user_id) 10) 11WITH ( 12 OIDS = FALSE 13) 14TABLESPACE pg_default; 15 16ALTER TABLE public.login_user_info 17 OWNER to postgres; 18

V2__InsertUserInfo.sql

sql

1INSERT INTO public.login_user_info (user_id, pw) 2VALUES ('admin', 'admin'); 3

デバッグで実行をして
http://localhost:8080/login/admin/adminをたたくと
イメージ説明
selectByExample()のところでNullPointerExceptionが発生してしまいます。
自分としては、同じidのものを検索して取得してくれると思ったのですが、何故検索がうまくいかないのでしょうか?

補足情報(FW/ツールのバージョンなど)

Java13

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

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

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

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

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

guest

回答1

0

ベストアンサー

Spring+MyBatisで正しく動作しない実装が残っているようです。

原因として以下があります。

  • Controller で Logic クラスのインスタンスを Spring から取得していないので、Mapperがnullになる

少なくとも、Controllerの実装は、以下のようになるでしょう。

java

1package com.example.controller; 2 3import java.util.List; 4 5import org.springframework.beans.factory.annotation.Autowired; 6import org.springframework.web.bind.annotation.PathVariable; 7import org.springframework.web.bind.annotation.RequestMapping; 8import org.springframework.web.bind.annotation.ResponseBody; 9import org.springframework.web.bind.annotation.RestController; 10 11import com.example.model.LoginUserInfo; 12import com.example.service.LoginLogic; 13 14 15@ResponseBody 16@RestController 17public class MainController { 18 19 @Autowired 20 private LoginLogic ll; 21 22 @RequestMapping("/login/{id}/{pw}") 23 public List<LoginUserInfo> login(@PathVariable String id, @PathVariable String pw) { 24 25 return ll.loginMain(id, pw); 26 } 27 28}

なお、Mybatis-Generatorを使った結果が少し異なるようです。記載していただいた FlywayのMigrate用SQLを実行した結果、それを使ったLogicクラスは

java

1package com.example.service; 2 3import java.util.List; 4 5import org.springframework.beans.factory.annotation.Autowired; 6import org.springframework.stereotype.Service; 7 8import com.example.model.LoginUserInfo; 9import com.example.model.LoginUserInfoExample; 10import com.example.model.LoginUserInfoExample.Criteria; 11import com.example.db.LoginUserInfoMapper; 12 13import lombok.extern.slf4j.Slf4j; 14 15@Slf4j 16@Service 17public class LoginLogic { 18 19 @Autowired 20 private LoginUserInfoMapper login_user_info_mapper; 21 22 public List<LoginUserInfo> loginMain(String id, String pw) { 23 LoginUserInfoExample example = new LoginUserInfoExample(); 24 Criteria criteria = example.createCriteria().andUserIdEqualTo(id).andPwEqualTo(pw); 25 26 List<LoginUserInfo> loginUserInfoData = login_user_info_mapper.selectByExample(example); 27 28 return loginUserInfoData; 29 } 30 31}

などになります。

投稿2019/10/18 10:56

A-pZ

総合スコア12011

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

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

moshi

2019/10/21 01:15

Controllerの実装を上記のように修正したところ値の取得ができました。ありがとうございます! ``` Mybatis-Generatorを使った結果が少し異なるようです。 ``` ということですが、 ``` mvn -Dmybatis.generator.overwrite=true mybatis-generator:generate ``` を実行してもLoginUserInfoExample やCriteriaというクラスは生成されませんでした… 使用したコマンドがA-pZさんとは違うといったことはありますでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問