コマンドライン引数を使ってデータベースからデータを抽出する
研修の復習です。自分用の備忘録です。
指摘等大歓迎
データベースについてはこちら
コマンドライン引数についてはこちら
Javaをデータベースに接続する基本的事項はこちら
nekomurasan.hatenablog.com
***
今回の演習問題は下記のようなものです。(数値等改変済)
コマンドラインから社員番号を入力し、testrecordテーブルからデータを抽出して表示する。
・表示はOneEmpクラスのtoString()メソッドを使う
引数の確認
以前記述しているので簡易的に書きます。
社員番号を1つ入れたときのみ作動するプログラムが課題なので、コマンドライン引数が1つのみということを判断するメソッドを作ります。
//引数の確認 if(args.length != 1){ System.out.println("引数に学籍番号を入力してください"); return; }
プレースホルダの実現
JDBCでは、PreparedStatementオブジェクトを使ってプレースホルダの実現が可能です。
プレースホルダとは
SQL文中の変動する箇所に使われます。
操作画面に自由入力するものがある場合に仮で入れておく数値で、その後変更が可能です。
文字列連結よりSQLインジェクション(開発者の意図しない入力で新しい命令文等を送信されてしまう)を受けることがなく、脆弱性が生じにくい
プレースホルダを用いた変数sqlを作成し、DBにアクセスする際にPreparedStatementとともに使います。
//プレースホルダの記述 String sql = "select * from testrecord where empNo" = ?; //SQL文実行のための準備 PreparedStatement pstmt = con.prepareStatement(sql);){ //プレースホルダに値をセットする pstmt.setString(1, args[0]);
プレースホルダに値を設定する際には、setXXX(index,value)を使います。
indexには?の位置を入れます。コード中に1つしかない場合は1です。
同じ位置のものに複数回値を入れ更新することも可能です。
XXXにはデータの型、valueには値を入れます。
今回、社員番号はA01で文字列型だったので、args[0]の型としてStringを使っています。
インスタンス化
OneEmpクラス(フィールド宣言、アクセサ、toString()メソッドがあります。コードは割愛します)をインスタンス化します。
出力する際にはデータベースから値を取り込む必要があります。
OneEmp emp1 = new OneEmp(res.getString("empNo"),res.getString("empName"),res.getInt("empale"));
インスタンスの際に実行したSQLのデータが格納されているresから値を.getXXX("フィールド名")で順番に受け取っていきます。
全コード記述
public class Sample1{ public static void main(String[] args){ //引数の確認 if(args.length != 1){ System.out.println("引数に学籍番号を入力してください"); return; } //フィールド宣言 String url = "任意のurl名"; String user = "任意のユーザ名"; String password = "任意のパスワード"; String sql = "select * from testrecord where empNo" = ?; //データベースへ接続 try(Connection con = DriverManager.getConnection(url, user,password); PreparedStatement pstmt = con.prepareStatement(sql);){ //プレースホルダへ値をセットする pstmt.setString(1, args[0]); //SQLステートメントの実行 ResultSet res = pstmt.execteQuery(); //結果の取得 while(res.next()){ //インスタンス化 OneEmp emp1 = new OneEmp(res.getString("empNo"),res.getString("empName"),res.getInt("empale")); System.out.println(emp1); return; } System.out.println("社員番号" + args[0] + "のレコードを抽出できませんでした"); } catch (SQLException e) { System.out.println("異常が発生しました"); } } }
toString()メソッドは割愛