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

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

新規登録して質問してみよう
ただいま回答率
85.48%
DAO(Data Access Object)

DAO(Data Access Object)とは、データベースなどに保存するための操作を実装したオブジェクトのことです。データの永続化機構に抽象化されたインタフェースを提供し、データベースの詳細を隠蔽。ビジネスロジックとデータ操作も分離できます。

Java

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Spring

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

バインド

バインドは、一定の方法で複数の事柄が関連付けられている状態を呼びます。また、そのような関連付けを実行する機能自体を指す事もあります。

Q&A

解決済

3回答

1409閲覧

Daoでバインドが出来ません

sukesukesuke

総合スコア73

DAO(Data Access Object)

DAO(Data Access Object)とは、データベースなどに保存するための操作を実装したオブジェクトのことです。データの永続化機構に抽象化されたインタフェースを提供し、データベースの詳細を隠蔽。ビジネスロジックとデータ操作も分離できます。

Java

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Spring

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

バインド

バインドは、一定の方法で複数の事柄が関連付けられている状態を呼びます。また、そのような関連付けを実行する機能自体を指す事もあります。

0グッド

0クリップ

投稿2022/01/27 13:39

編集2022/01/28 04:42

バインドが出来ないです。
NamedParameterJdbcTemplateの使い方が間違っていますでしょうか?

バインドさせずに直接パラメータを記述すると、期待した結果が得られています。

java

1 2 public List<WebboardDto> selectBySearch(String id, String name, String editName, String message) { 3 4 var sb = new StringBuilder(); 5 sb.append("SELECT "); 6 sb.append(" * "); 7 sb.append("FROM "); 8 sb.append(" MESSAGE_BOARD "); 9 sb.append("WHERE "); 10 sb.append(" ID = :id "); 11 sb.append(" AND CREATED_ID = :name "); 12 sb.append(" AND NAME = :editName "); 13 sb.append(" AND MESSAGE LIKE :message "); 14 sb.append(" AND DELETE_FLAG = 0 "); 15 sb.append("ORDER BY "); 16 sb.append(" ID DESC "); 17 18 // バインド用のインスタンスを生成します 19 var ps = new MapSqlParameterSource(); 20 ps.addValue("id", StringUtils.isNotBlank(id) ? id : "ID"); 21 ps.addValue("name", StringUtils.isNotBlank(name) ? name : "CREATED_ID"); 22 ps.addValue("editName", StringUtils.isNotBlank(editName) ? editName : "NAME"); 23 ps.addValue("message", StringUtils.isNotBlank(message) ? "%" + message + "%" : "MESSAGE"); 24 25 BeanPropertyRowMapper<WebboardDto> rm = BeanPropertyRowMapper.newInstance(WebboardDto.class); 26 27 return namedParameterJdbcTemplate.query(sb.toString(), ps, rm); 28

ソースはこちら

java

1 2package jp.co.sandbox.dao; 3 4import java.util.List; 5import org.apache.commons.lang3.StringUtils; 6import org.springframework.beans.factory.annotation.Autowired; 7import org.springframework.jdbc.core.BeanPropertyRowMapper; 8import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; 9import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; 10import org.springframework.stereotype.Repository; 11import jp.co.careritz.sandbox.dto.WebboardDto; 12 13/** 14 * 掲示板DAO. 15 * 16 * @author ryosuke.tahara 17 */ 18 19@Repository 20public class WebboardDao { 21 22 /** 23 * NamedParameterJdbcTemplateクラスのインスタンスを宣言 24 */ 25 26 private NamedParameterJdbcTemplate np; 27 28 /** 29 * コンストラクタ 30 * 31 * @param np NamedParameterJdbcTemplate 32 */ 33 34 @Autowired 35 public WebboardDao(NamedParameterJdbcTemplate np) { 36 this.np = np; 37 } 38 39 /** 40 * 全投稿取得 41 * 42 * @return 全投稿 43 */ 44 45 public List<WebboardDto> select() { 46 47 var sb = new StringBuilder(); 48 49 sb.append("SELECT "); 50 sb.append(" ID "); 51 sb.append(" , NAME "); 52 sb.append(" , MESSAGE "); 53 sb.append(" , CREATED_ID "); 54 sb.append(" , CREATED_AT "); 55 sb.append(" , UPDATED_ID "); 56 sb.append(" , UPDATED_AT "); 57 sb.append("FROM "); 58 sb.append(" MESSAGE_BOARD "); 59 sb.append("WHERE "); 60 sb.append(" DELETE_FLAG = 0 "); 61 sb.append("ORDER BY "); 62 sb.append(" ID DESC "); 63 BeanPropertyRowMapper<WebboardDto> rm = BeanPropertyRowMapper.newInstance(WebboardDto.class); 64 65 return np.query(sb.toString(), rm); 66 } 67 68 /** 69 * 投稿取得(id指定) 70 * 71 * @param id 取得対象のidをServiceクラスから受け取っています 72 * @return 取得対象の投稿 73 */ 74 75 public WebboardDto selectById(int id) { 76 77 var sb = new StringBuilder(); 78 79 sb.append("SELECT "); 80 sb.append(" ID "); 81 sb.append(" , NAME "); 82 sb.append(" , MESSAGE "); 83 sb.append(" , CREATED_ID "); 84 sb.append(" , CREATED_AT "); 85 sb.append(" , UPDATED_ID "); 86 sb.append(" , UPDATED_AT "); 87 sb.append("FROM "); 88 sb.append(" MESSAGE_BOARD "); 89 sb.append("WHERE "); 90 sb.append(" ID = :id "); 91 92 // バインド用のインスタンスを生成します 93 var ps = new MapSqlParameterSource(); 94 ps.addValue("id", id); 95 96 BeanPropertyRowMapper<WebboardDto> rm = BeanPropertyRowMapper.newInstance(WebboardDto.class); 97 98 return np.queryForObject(sb.toString(), ps, rm); 99 100 } 101 102 /** 103 * 投稿取得(id, name, editName, message指定) 104 * 105 * @param id 取得したい投稿のid情報をServiceクラスから受け取っています 106 * @param name 取得したい投稿のname情報をServiceクラスから受け取っています 107 * @param editName 取得したい投稿のeditName情報をServiceクラスから受け取っています 108 * @param message 取得したい投稿のmessage情報をServiceクラスから受け取っています 109 * @return 取得対象の投稿 110 */ 111 112 public List<WebboardDto> selectBySearch(String id, String name, String editName, String message) { 113 114 var sb = new StringBuilder(); 115 sb.append("SELECT "); 116 sb.append(" * "); 117 sb.append("FROM "); 118 sb.append(" MESSAGE_BOARD "); 119 sb.append("WHERE "); 120 sb.append(" ID = :id "); 121 sb.append(" AND CREATED_ID = :name "); 122 sb.append(" AND NAME = :editName "); 123 sb.append(" AND MESSAGE LIKE :message "); 124 sb.append(" AND DELETE_FLAG = 0 "); 125 sb.append("ORDER BY "); 126 sb.append(" ID DESC "); 127 128 // バインド用のインスタンスを生成します 129 var ps = new MapSqlParameterSource(); 130 ps.addValue("id", StringUtils.isNotBlank(id) ? id : "ID"); 131 ps.addValue("name", StringUtils.isNotBlank(name) ? name : "CREATED_ID"); 132 ps.addValue("editName", StringUtils.isNotBlank(editName) ? editName : "NAME"); 133 ps.addValue("message", StringUtils.isNotBlank(message) ? "%" + message + "%" : "MESSAGE"); 134 135 BeanPropertyRowMapper<WebboardDto> rm = BeanPropertyRowMapper.newInstance(WebboardDto.class); 136 137 return np.query(sb.toString(), ps, rm); 138 139 } 140 141 /** 142 * 新規投稿処理 143 * 144 * @param name 入力されたnameをServiceクラスから受け取っています 145 * @param message 入力されたmessageをServiceクラスから受け取っています 146 */ 147 148 public void post(String name, String message) { 149 150 var sb = new StringBuilder(); 151 sb.append("INSERT "); 152 sb.append("INTO MESSAGE_BOARD( "); 153 sb.append(" NAME "); 154 sb.append(" , MESSAGE "); 155 sb.append(" , DELETE_FLAG "); 156 sb.append(" , CREATED_ID "); 157 sb.append(" , CREATED_AT "); 158 sb.append(" , UPDATED_ID "); 159 sb.append(" , UPDATED_AT "); 160 sb.append(") "); 161 sb.append("VALUES (:name, :message, 0, :name, NOW(), :name, NOW()) "); 162 163 // バインド用のインスタンスを生成します 164 var ps = new MapSqlParameterSource(); 165 ps.addValue("name", name); 166 ps.addValue("message", message); 167 168 // バインド後、SQLを実行します 169 np.update(sb.toString(), ps); 170 } 171 172 /** 173 * 削除処理 174 * 175 * @param id 削除対象のidをServiceクラスから受け取っています 176 */ 177 178 public void delete(int id) { 179 180 var sb = new StringBuilder(); 181 sb.append("UPDATE MESSAGE_BOARD "); 182 sb.append("SET "); 183 sb.append(" DELETE_FLAG = 1 "); 184 sb.append("WHERE "); 185 sb.append(" ID = :id "); 186 187 var ps = new MapSqlParameterSource(); 188 ps.addValue("id", id); 189 190 np.update(sb.toString(), ps); 191 } 192 193 /** 194 * 編集処理 195 * 196 * @param id 編集対象のidをServiceクラスから受け取っています 197 * @param name 編集後のnameをServiceクラスから受け取っています 198 * @param message 編集後のmessagをServiceクラスから受け取っています 199 */ 200 201 public void edit(int id, String name, String message) { 202 var sb = new StringBuilder(); 203 sb.append("UPDATE MESSAGE_BOARD "); 204 sb.append("SET "); 205 sb.append(" NAME = :name "); 206 sb.append(" , UPDATED_ID = :name "); 207 sb.append(" , MESSAGE = :message "); 208 sb.append(" , UPDATED_AT = NOW() "); 209 sb.append("WHERE "); 210 sb.append(" ID = :id "); 211 212 var ps = new MapSqlParameterSource(); 213 ps.addValue("id", id); 214 ps.addValue("name", name); 215 ps.addValue("message", message); 216 217 np.update(sb.toString(), ps); 218 } 219} 220

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

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

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

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

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

guest

回答3

0

自己解決

java

1//StringbuilderよりSQL文を抜粋 2sb.append(" ID = :id "); 3 4//ParamSourceよりidバインド個所を抜粋 5ps.addValue("id", StringUtils.isNotBlank(id) ? id : "ID");

上記のような記載だとSQL文が

sql

1WHERE ID = 'ID'

のようになってしまう為、検索結果が正しく得られていなかった。

java

1//StringbuilderよりSQL文を抜粋 2sb.append(" (ID = :id OR :id IS NULL) "); 3 4//ParamSourceよりidバインド個所を抜粋 5 ps.addValue("id", StringUtils.isNotBlank(id) ? id : null);

のようにして解決

投稿2022/01/28 02:40

sukesukesuke

総合スコア73

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

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

0

SQLもパラメータの設定も問題ないように、見えますね。ちなみに、変数名は namedParameterJdbcTemplate ですが、実体はほんとうに NamedParameterJdbcTemplate なのでしょうか。提示されたソースだけではわかりませんので。

投稿2022/01/27 23:40

shiketa

総合スコア3971

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

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

sukesukesuke

2022/01/28 00:55

回答ありがとうございます。 ソース追加しました。 NamedParameterJdbcTemplateであってるはずです、、
guest

0

検索するとこんな記事がありました。古めですが如何でしょうか。

NamedParameterJdbcTemplateでSQLのプレースホルダに名前を使う

投稿2022/01/27 15:25

jimbe

総合スコア12648

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

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

sukesukesuke

2022/01/28 01:07

回答ありがとうございます。 参照してみます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問