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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java

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

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Spring

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

MyBatis

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

Q&A

解決済

2回答

12322閲覧

Select文を実行したときに値が取れてきていない

nagomi72

総合スコア51

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java

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

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Spring

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

MyBatis

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

0グッド

0クリップ

投稿2019/08/16 04:33

編集2019/08/16 07:54

t_userというテーブルがあり、このテーブルは以下の4つのカラムを持っています
user_id,user_name,user_password,user_email

また、10件のデータがあります。

このテーブルからuser_id,user_nameを取り出そうとしているのですが
Select文を実行後、結果を代入したListの中身を確認すると
10個nullが入っており、値が取れていない状況です。
※実行したsqlは後述

xmlに記載しているselect文をローカルのmysql環境で実行した場合、
結果が取れることは確認したため、sqlの構文に誤りはないと考えています。

また、結果を代入したListにnullがテーブルに存在するデータ文(10個)入っているため、
SQL自体は実行されていると考えています。

原因をご教授いただければ幸いです。

いかにソースを記載します。

メインクラス

package spring.test; import java.io.IOException; import java.nio.file.AccessDeniedException; import java.nio.file.FileAlreadyExistsException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import org.springframework.context.ApplicationContext; import org.springframework.context.support.FileSystemXmlApplicationContext; public class HelloWorldTest { public static void main(String[] args) { ApplicationContext context = new FileSystemXmlApplicationContext( "file:/Users/nagami/Documents/workspace-sts-ver2/MyBatis/WebContent/WEB-INF/SpringTest.xml"); SpringBean bean = (SpringBean) context.getBean("helloWorld"); bean.show(); } }

メインクラスで読み込んでいるxml

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd"> <bean id="helloWorld" class="spring.test.SpringBean"> </bean> <context:component-scan base-package="spring.test" /> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/test_app" /> <property name="username" value="root" /> <property name="password" value="hogehoge" /> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="mapperLocations" value="classpath:/spring/test/sql.xml" /> </bean> <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg index="0" ref="sqlSessionFactory" /> </bean> <bean class="spring.test.UserDaoImpl"> <property name="session" ref="sqlSession" /> </bean> </beans>

ビーンクラス

package spring.test; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; public class SpringBean { @Autowired private UserDao dao; public void show() {      // listにnullが10個入ってきている。3行下でぬるぽで落ちる List<User> list = dao.getUserList(); for (User user : list) { System.out.println(user.getUserId() + "-" + user.getUserName()); } } }

モデルクラス

package spring.test; public class User { String userId; String userName; public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } }

インターフェース

package spring.test; import java.util.List; public interface UserDao { public List<User> getUserList(); }

sql実行クラス

package spring.test; import java.util.List; import org.apache.ibatis.session.SqlSession; public class UserDaoImpl implements UserDao { private SqlSession session; public void setSession(SqlSession ss) { this.session = ss; } public List<User> getUserList() { return session.selectList("test.sql.selectUser"); } }

sqlを記載した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="test.sql"> <select id="selectUser" resultType="spring.test.User"> select user_id,user_name from t_user </select> </mapper>

ローカルで同様のselect文実行時のEVD

イメージ説明

追記

package spring.test; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.ibatis.session.SqlSession; public class UserDaoImpl implements UserDao { private SqlSession session; public void setSession(SqlSession ss) { this.session = ss; } public List<User> getUserList() { // 結果取得 List<Map<String, Object>> result = session.selectList("test.sql.selectUser"); System.out.println("件数:" + result.size()); result.forEach(row -> { row.forEach((columnName, value) -> { System.out.printf("columnName=%s, value=%s%n", columnName, value); }); }); return session.selectList("test.sql.selectUser"); } }

コンソール出力内容

イメージ説明

追記.2

イメージ説明

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

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

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

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

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

guest

回答2

0

自己解決

原因はモデルクラスにありました。
モデルクラスの変数名を取得対象のカラム名と一致させる必要がありました。

投稿2019/08/17 06:39

nagomi72

総合スコア51

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

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

0

MyBatisを利用したことがあるわけではないですが、nullとなる理由はハッキリしてそうです。

ドキュメントによると

SqlSession.selectList (String statement)

Returns
List of mapped object

なので、Listが返ってきているのは分かります。
ただ、返ってきたList内容を確認してみるとおそらく分かりますが、
user_id,user_nameという名前で返ってきているだけでUserモデルの各変数と紐づけができているわけではないように思います。
一度List<Map<String, Object>>とかで受け取りループしてそれぞれにsetしてあげる必要があるのでは?

参考:MyBatis 使い方メモ#実装

10件のnull=レコードは取れているが取得したデータとの紐づけができていない
ということになりますね。
単にnewしただけのmodelって中のプロパティは初期値入れてない限りnullですので。

投稿2019/08/16 04:41

編集2019/08/16 04:49
m.ts10806

総合スコア80850

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

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

nagomi72

2019/08/16 06:17

List<Map<String, Object>> result = session.selectList("test.sql.selectUser"); として返り値を受けたとき、resultの中身はサイズは10で値は全てnullでした。 ループしてそれぞれにsetしてあげる必要があるとご提案頂きましたが、 ここがあまり理解できておりません。 セットする値は何になるのでしょうか。 またセットするというのは、setUserId,setUserNameを用いるという認識で合っておりますでしょうか。 ループ回数はselectListで取得したListの長さ分として、 データベースから取れてきた値をsetUserId,setUserNameでセットするという 認識なのですが、そもそもデータベースから取ってきた値であるresultがnullのため セットできないのでは…という状況です。 認識の齟齬等あると存じますので、恐れ入りますがご指摘ご助言の程よろしくお願いいたします。
m.ts10806

2019/08/16 06:23

> として返り値を受けたとき、resultの中身はサイズは10で値は全てnullでした。 その内容が分かる情報を質問に追記していただいても良いですか? サイズは10=10件のデータ と私は理解しています。 念のため提示したサイトのサンプルコードのようにループしてcolumnNameとvalueをコンソール出力してみてください。 > セットする値は何になるのでしょうか。 「select user_id,user_name from t_user」というSQLで取得しているので そのカラム名を指定したそれぞれの値です。 > またセットするというのは、setUserId,setUserNameを用いるという認識で合っておりますでしょうか。 はい。合っています。
nagomi72

2019/08/16 06:37

追記いたしました。 不足点あればご指摘ください。
m.ts10806

2019/08/16 06:41

えーと 私が提示した記事ではforEachを使っていたかと思うのですが、なぜ、forなのでしょうか。。 それにresult.get(i)が返す値は文字列ではない( Mapの中の<String, Object> )ですよ。 forEachにして確認してもらいたいのと、念のためデータを1件削除して「9件」となるかどうか確認してみてください。 レコード件数が出ているのであればあとは取り出し方だけです。
nagomi72

2019/08/16 07:20

動作的には違いがないと考えました。 失礼しました。 ソースをforEachに変更しました。 また、レコードを1件削除したところ、resultのサイズは9になりました
m.ts10806

2019/08/16 07:34

データが取得できてそうなのは間違いなさそうですね。 ちなみにNullPointerExceptionが起きているという25行目はどこですか?
nagomi72

2019/08/16 07:40

row.forEach((columnName, value) -> {の部分になります。 rowがnullの状況です。
m.ts10806

2019/08/16 07:41

なるほど。 ちなみにデバッグ実行でブレークポイントを仕掛けて、resultの内容は確認できますか?
nagomi72

2019/08/16 07:55

画像を追加いたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問