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

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

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

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

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Java

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

受付中

PreparedStatement の使い方

削除済ユーザー
削除済ユーザー

総合スコア0

JDBC

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

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Java

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

0回答

0評価

0クリップ

24閲覧

投稿2020/06/03 08:33

編集2022/01/12 10:55

入力した文字をエスケープさせ、検索でただの文字列として使用できるようにし,
また、Keyword もエスケープさせてただの文字列として検索できるようにしたいです。
AND
PreparedStatement を使用すればエスケープ処理を自動でしてくれるみたいなのですが、私がかいたコードでも問題ないかどうかどうか、また他の書き方がれば、javadocの記述のうえ
ご教示頂いただければ幸いです、

<前提>
1:コンソールから入力した条件で検索を行い、結果をコンソールに一覧表示
2:入力した文字をエスケープさせて検索で文字列として使用
2-1:入力したKeyword もエスケープさせて文字列として検索すること
3:共通処理があれば任意のメソッドを作成して処理をすること。
<実現>
PreparedStatement を使用して、入力した文字を自動エスケープさせ,て検索で文字列として使用できるようにしたい。
また、Keyword もエスケープさせて文字列として検索できるようにしたい。

該当のソースコード

Java

package db; import java.io.BufferedReader; import java.io.InputStreamReader; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; public class PreparedStmtOraTest { static BufferedReader _br = new BufferedReader(new InputStreamReader(System.in)); public static void main(String[] args) { try { new PreparedStmtOraTest().execute(); }catch(Exception e) { e.printStackTrace(); } } public void execute() throws Exception { Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; String hostname = "****"; String username = "****"; String pw = "****"; String sid = "XE"; String url = "jdbc:oracle:thin:@"; //(ドライバのロード) Class.forName("oracle.jdbc.driver.OracleDriver"); //DBに接続(URL,USER_ID,PASSWORD) conn = DriverManager.getConnection(url + hostname + ":1521:" + sid, username, pw); //input System.out.println("Please input SQL command "); String inp; while ((inp = _br.readLine()) != null) { if (!(inp.isEmpty()))break;{ } } //SQLを発行 pstmt = conn.prepareStatement("Select EMPID, ENAME, JOB from EMPLOYEES where job  = ? " ); pstmt.setString(1, inp); rs = pstmt.executeQuery(); //結果を取得 while(rs.next()) { System.out.println("EMPID "+rs.getInt("EMPID")+" ENAME "+rs.getString("ENAME")+" JOB "+rs.getString("JOB")); } //後始末 rs.close(); pstmt.close(); conn.close(); } }

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

Oracle_version_18.3
Java_version_1.8
Eclipse_version_4.14.0

期待結果:

1:以下の文字をコンソールで入力
WHERE job LIKE '%事務_チームB%' ESCAPE ''

エスケープ処理

2:条件検索
where句のみ

###追記
以下のコードに修正して、しっかりとエスケープ処理をして文字列として扱えるか検証してみましたが上手く行きません。
何故かわからないです。ご教示頂ければ幸いです。

java

static BufferedReader _br = new BufferedReader(new InputStreamReader(System.in)); // final String SQL = "Select EMPID, ENAME, JOB from EMPLOYEES "; public static void main(String[] args) { System.out.println("検索したい文字をを入力して下さい。"); System.out.println("入力する内容は正しいSQL文、かつ、選択したテーブルに則した内容でなければならない。"); System.out.println("Select EMPID, ENAME, JOB from EMPLOYEES where  JOB like"); System.out.println(""); DDD d = new DDD(); boolean flg = true; String word = null; while (flg) { try { // input where clause word = _br.readLine(); d.getName(word); flg = false; } catch (IOException e) { System.out.println("入力された値は不正です。"); continue; } } } private void getName(String word){ Connection con = null; String sql = null; PreparedStatement ps = null; ResultSet rs = null; String hostname = "*****"; String username = "****"; String pw = "******"; String sid = "XE"; String url = "jdbc:oracle:thin:@"; try{ Class.forName("oracle.jdbc.driver.OracleDriver"); con = DriverManager.getConnection(url + hostname + ":1521:" + sid, username, pw); sql = "Select EMPID, ENAME, JOB from EMPLOYEES where JOB like?"; ps = con.prepareStatement(sql); ps.setString(1, "%" +this.escape(word) + "%"); rs = ps.executeQuery(); while (rs.next()) { // System.out.println(rs.getInt("EMPID")+rs.getString("ENAME")+rs.getString("JOB")); System.out.println("EMPID " + rs.getInt("EMPID") + " ENAME " + rs.getString("ENAME") + " JOB " + rs.getString("JOB")); } rs.close(); ps.close(); } catch (ClassNotFoundException e) { System.out.println("There is no JDBC driver"); } catch (SQLException e) { e.printStackTrace(); }finally{ if(con != null){ try { con.close(); } catch (SQLException e) { System.out.println( e.getErrorCode() ); } } } } public String escape(String before){ StringBuilder after = new StringBuilder(); String esSymbol = "\\"; char es1 = '_'; char es2 = '%'; for (int i = 0; i < before.length(); i++) { if (before.charAt(i) == es1 || before.charAt(i) == es2) { after.append(esSymbol); after.append(String.valueOf(before.charAt(i))); continue; } after.append(String.valueOf(before.charAt(i))); } return after.toString(); } }

###期待結果:
入力した値が正しいかわからないのですが、
以下の値を入力して検索をかけて
%事務_チームA%
エスケープ処理

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

JDBC

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

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Java

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