ひよっこSEの備忘録

20卒の未経験エンジニアの日々の備忘録です。

コマンドライン引数を使ってデータベースからデータを抽出する

研修の復習です。自分用の備忘録です。

指摘等大歓迎

 

データベースについてはこちら

nekomurasan.hatenablog.com

コマンドライン引数についてはこちら

nekomurasan.hatenablog.com

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()メソッドは割愛