コマンドライン引数を使ってデータベースからデータを抽出する
研修の復習です。自分用の備忘録です。
指摘等大歓迎
データベースについてはこちら
コマンドライン引数についてはこちら
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()メソッドは割愛