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

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

新規登録して質問してみよう
ただいま回答率
85.38%
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

解決済

1回答

496閲覧

queryForMap(query,id)について疑問がある

ikigamikita

総合スコア20

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クリップ

投稿2024/05/03 08:11

実現したいこと

JdbcTemplateのqueryForMap()メソッドについて疑問があります。queryForMap(query,id)についてですが、検索したいレコードのidさえわかればデータベースから検索できるのになぜqueryという引数が必要なのでしょうか?
また、queryが分かればidの引数など不要に思います。なぜ二つの引数があるのか調べたところ、idにはバインド変数が入るとありましたが、下記のコードの場合、findByIdという関数の引数のidが代入されているので、queryにselect文は要るのでしょうか?select文が必要だとしてもなぜidが必要なのでしょうか?
初心者故稚拙な質問だと思いますがどなたかご教示ください。

参考サイト:https://keishiprogramming.hatenablog.com/entry/2021/10/04/091120

該当のソースコード

package com.example.hello; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Repository; @Repository public class HelloRepository { @Autowired private JdbcTemplate jdcbTemplate; public Map<String,Object> findById(String id){ // select文 String query="select" +"from employee" +"where id=?"; // 検索実行 // queryForMap()メソッドそのものは、Spring FrameworkのJdbcTemplateクラスに固有のものです。 // そのため、Spring FrameworkやSpring Bootの一部で提供される機能です。 // 他のフレームワークやライブラリでは、直接このメソッドを使用することはできません。 Map<String, Object> employee=jdcbTemplate.queryForMap(query,id); return employee; } }

試したこと

chatGPTに聞いたら、queryは不要という回答でしたが、納得できていません。

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

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

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

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

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

guest

回答1

0

ベストアンサー

検索したいレコードのidさえわかればデータベースから検索できるのになぜqueryという引数が必要なのでしょうか?

あらゆるデータベースに「id」という名前で主キーが存在するわけではないからです。
そのコードサンプルの前提としているサンプルデータベースの抽出条件とするカラムがたまたま「id」という名前だから「id」という名前でコード上、アクセスしているだけで、データベースによっては別名の場合もあるでしょう。
また抽出したいレコードについて、すべてのカラムではなく必要なカラムだけ限定して抽出したい場合もあるでしょう。

だからこそ、query と言う引数で、対象となるデータベース及び目的とするデータに応じた SQL 文を指定できるようにしているわけです。

queryが分かればidの引数など不要に思います。

これについて「id引数は不要だ。id を変数化して使用したいなら query として直接組み立てる下記のようなコードでいいじゃないか?」と考えていらっしゃるのかもしれません。

String query="select" +"from employee" +"where id=" +id; Map<String, Object> employee=jdcbTemplate.queryForMap(query);

でもこれは、SQLインジェクションを引き起こすおそれのある典型的なダメコードです。

このようなことをさせないために、queryForMap(String sql, @Nullable Object... args)メソッドは、バインド変数を使えるようにしてるんです。(参考:データベースのバインド変数のメリットを語る(②メリット:SQLインジェクションの防止)

投稿2024/05/03 08:32

編集2024/05/03 08:39
patapi

総合スコア808

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

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

ikigamikita

2024/05/06 00:31

回答ありがとうございます。 全て理解しきれませんでしたが、おおよそ理解できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.38%

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

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

質問する

関連した質問