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

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

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

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

Java

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

SQL

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

Q&A

解決済

3回答

4466閲覧

カラム名を プレースホルダにしたい

nyoi

総合スコア14

JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

Java

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

SQL

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

0グッド

0クリップ

投稿2019/05/28 14:58

編集2019/05/28 14:59

JDBCで条件検索をより深く設定したいのですが
どうしても結果が出ません・・・
最終的には条件を絞ったテーブル一覧を出したいだけです。

SQL文でDBを確認するとテーブルが見れるのですが
Javaにいれたら全く見えましぇん

・カラム名をプレースホルダに入れたい
・昇順降順の指示をプレースホルダに入れたい

java

1 2 public static List<P> list(String a, String n, String c) { 3 Connection connection = null; 4 PreparedStatement preparedStatement = null; 5 List<P> p = new ArrayList<P>(); 6 7 try { 8 9 connection = getConnection(); 10 preparedStatement = connection.prepareStatement( 11 "SELECT * FROM P_TABLE WHERE A_NAME LIKE ? ORDER BY ? ?"); 12 preparedStatement.setString(1, a + "%"); 13 preparedStatement.setString(2,b); 14 preparedStatement.setString(3,c); 15 16 ResultSet resultSet = preparedStatement.executeQuery(); 17 18 while (resultSet.next()) {

1.preparedStatement.setString(2,b);
カラム名を引数としてもってきたい

2.preparedStatement.setString(3,c);
変数に"desc"または"asc"を持たせて変数を入れたい

どうぞよろしくお願いいたします

HRU

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

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

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

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

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

guest

回答3

0

自己解決

gentaroさんのコメント「変数にしたいなら変数にすれば良い」から
変数にしてみたら、自分の欲しい情報が取得できてソートできました。

根本的なルールを学ぶことは大切だと感じました。
このような質問にお付き合いいただきありがとうございました。

Java

1public static List<P> list(String a, String n, String c) { 2 Connection connection = null; 3 PreparedStatement preparedStatement = null; 4 List<P> p = new ArrayList<P>(); 5 6 try { 7 8 connection = getConnection(); 9 preparedStatement = connection.prepareStatement( 10 "SELECT * FROM P_TABLE WHERE A_NAME LIKE ? ORDER BY " + n + " " + c); 11 preparedStatement.setString(1, a + "%"); 12 //preparedStatement.setString(2,b); 13 //preparedStatement.setString(3,c); 14 15 ResultSet resultSet = preparedStatement.executeQuery(); 16

投稿2019/05/29 04:36

編集2019/06/03 01:55
nyoi

総合スコア14

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

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

0

そもそもDB名、テーブル名、カラム名はプレースホルダーのロジックにそぐわないので無理です

もしやるならこんな手順でしょうか

  • 受け取ったものをそのまま埋め込むのはNGなので対比表をつくる
  • 対比表に合致しない値が来た場合SQL自体を発行しない
  • SQL文の生成はprintf的な埋め込みをする

投稿2019/05/29 01:16

yambejp

総合スコア114839

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

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

nyoi

2019/05/29 04:39

コメントありがとうございます! そもそもプレースホルダにこだわったところに敗因があったのかと思いました。 具体的な指標をいただきありがとうございました。 SQLを発行しないというのも大切なのですね・・・ 精進いたします。
yambejp

2019/05/29 04:49

プレースホルダーの基本はユーザーから受け取ったデータを リスクなく利用することです。 仮にカラム名をユーザーから受け取るような仕組みだと ユーザーにより任意のカラムを指定されてしまう危険があり サービス側が許可したカラム以外は指定できないようにしないと いけません。
guest

0

prepareStatementメソッドに渡している文字列のうち、カラム名の部分をあらかじめ置換すれば良いと思いますが…。

投稿2019/05/28 15:02

gentaro

総合スコア8949

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

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

nyoi

2019/05/28 15:10 編集

1.preparedStatement.setString(2,b); このbの部分を文字列に ということでしょうか カラム名も条件によって変えたくて 変数を入れたいと思っていたんですけども どのように置換すればよいですか? String b = null; if( ){ b = "A_NAME"; }else{ b= "A_AGE" }
gentaro

2019/05/28 15:23

いや、 > prepareStatementメソッドに渡している文字列 なので preparedStatement = connection.prepareStatement( "SELECT * FROM P_TABLE WHERE A_NAME LIKE ? ORDER BY ? ?"); の部分の話です。 "SELECT * FROM P_TABLE WHERE A_NAME LIKE ? ORDER BY ? ?" を "SELECT * FROM P_TABLE WHERE A_NAME LIKE ? ORDER BY [COL1] ?" とか、カラム名の部分を何か適当な文字にしておいて、文字列置換すればいいだけじゃないかなと。 例えば String s = "SELECT * FROM P_TABLE WHERE A_NAME LIKE ? ORDER BY [COL1] ?"; s.replace("[COL1]", "Column1"); みたいな。
gentaro

2019/05/28 15:29

あ、そもそもカラム名の部分がどうやって渡されるかわかんないから、この方法だと下手するとSQLインジェクションの可能性ありますね。 ただ、JDBCも確かそうだったと思いますが、カラム名ってプレースホルダ使えないと思いますけど…。
nyoi

2019/05/28 15:31 編集

ありがとうございます!! わーいと飛びついたのですが・・・ 例えば String s = "SELECT * FROM P_TABLE WHERE A_NAME LIKE ? ORDER BY [COL1] ?"; s.replace("[COL1]", "Column1");            ↑ ここがStringで一意に指定ではなくて 変数にしたいのです・・・
nyoi

2019/05/28 15:32

そうなんです カラム名はプレースホルダに使えないって 書いてあるところがほとんどだったんですけど 偉い人が裏技をご存じないかとわらをもすがる感じでした。
gentaro

2019/05/28 15:34

変数にしたいなら変数にすれば良いと思いますのでちょっと問題が何なのかよくわかりませんが、文字列加工で動的にSQL文を生成したい場合は、SQL インジェクション対策は考えてくださいね。
gentaro

2019/05/28 15:50 編集

補足すると、通常の業務プログラミング等であれば、文字列加工してSQL文を組み立てるようなことは一般的にあり得ないというか、見づらいしメンテナンス性は悪いしSQLインジェクションを気にしなきゃいけないので、やらないケースがほとんどだと思います。 じゃあどうやるのかというと、とりあえずざっくりデータをプログラム側で受け取ってフィルタしたり並べ替えたりするか、ストアドプロシージャ等のDB側のプログラミングで対処するのが普通じゃないかと。 学習用のちょっとしたプログラミングなら文字列加工でも問題ないかな、と思って回答していましたが、ちょっと無責任でしたね。すみません。
nyoi

2019/05/29 04:42

コメントありがとうございます! レスが追いついていかず申し訳ありませんでした。 普通のやり方を教わることができて助かりました。 ありがとうございました。 受け取った側でソートしようとしたのですが 一意のものはできたのですが、マルチなソートができず・・・ SQL文を作り上げることに専念したらできました! 今できることで編集することも大切ですが そもそも論の大切さを学びました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問