緊急メモ:JAVA-SQL連携のCRUDコードのまとめ(日本語で移してながら復習)
前書き
もともとJAVAのまとめをしていたが、ITスクールで、実際はSQLを利用してDBにCRUD[1]]
をする方法について学んでいた。
それに、JAVAでSQLを使ってDBにCRUDをすることは、JAVAとSQL両方を使うことであった。緊急とも言えるほど重要で、ITスクールでこれを活用した小さいプロジェクトも作っているので、復習を兼ねてめとめておく。
C(CREATE)の例
JAVAでSQLを使ってデータを追加するには大きく分けると4つの過程になる。
- JAVAコードでDBに接続する
- String型でSQL文を作成する
- 2番のSQL文をサーバーに送る/実行する/結果を受けるメソッドを実行する
- 3番を実行した結果を確認する(3番のメソッドが2番のSQL文で作業で影響されたデータの数を戻すので、その数字で確認する。)
JAVAでSQL文を作成するとき、注意することも2つあるので、覚えておこう。
上記した過程と注意事項を考えながら、JAVAでDBにデータを追加するコードを作成してみよう。 例文では表されていない、DBに作っておいた情報を先に書いておく。
- PRODUCT : テーブルの名前(クラスと似ている、決めておいた情報の集合)
- 'VALUES'の括弧のなかに入る情報(左から順番に):項目番号、名前、重さ、値段、マーケット番号
import java.sql.Connection; // JAVAからDBにネットでアクセスするため必要なimport文
import java.sql.DriveraManager; // 上のimportと同じく、DBに接続するimport文
import java.sql.PreparedStatement; // 接続の後、書いたSQL文を伝送/実行/結果を受けるためのimport文
public class InsertMain{
public static void main(String args[]{
//SQL文をJAVAで作って、JAVAで書いたデータをDBに送ってみよう。
// まず、1番ー「JAVAコードでDBに接続する」から。
Connection con = null; //DBに接続するためのインスタンスを生成。
PreaparedStatement pstmt = null;
try{ // CRUD例文では、例外の処理のために、文法的にTry-Catch文を使う。
String address = "jdbc:oracle:thin:@localhost:1521:xe";
//DBサーバーの住所:内容は覚えず、住所が必要であることを覚えておこう。
con = DriverManager.getConnection(address, "ainchel", "1541547");
//DBのサーバーの住所/接続ID/接続PW順番を引数にして、DBに接続
//ここから2番ー「String型でSQL文を作成する」になる。
//SQL文を作成するとき、上記した注意事項を確認!!
String sql = "INSERT INTO PRODUCT "
+"VALUES(PRODUCT_SEQ.NEXTVAL, "
+"'テスト', 3000, 10000, 1)";
//ここから3番ー「2番のSQL文をサーバーに送る/実行する/結果を受けるメソッドを実行する」になる。
pstmt = con.prepareStatement(sql);
//上のpstmtで、conで接続したDBに送るSQL文であるsqlを扱う。
int dataCount = pstmt.executeUpdate();
//上のメソッドがSQL文を伝送/実行/結果を受けることまでして、SQL文で影響をされたデータの数を戻してくれる。
ここから4番ー「3番を実行した結果を確認する」になる。
if(dataCount == 1){ // SQL文の内容が「データを1個追加」であった。
//つまり影響されるデータの数は1になるので、つかりSQL文がうまく作動したならとも言える。」
System.out.println("DBに伝送が成功した!")//出力文で結果を確認する。
}
}//try end
catch{ // conでDBに接続がうまくいけなかったら、例外が発生してここcatch文を実行する。
System.out.println("DBに接続することができませんでした。")
e.printStackTrace();
}
// Connection conと、PreparedStatement pstmtは使い終わると、close()をする。
try{
pstmt.close();
} catch{
e.printStackTrace();
}
try{
con.close();
} catch{
e.printStackTrace();
}
}//main end
}//class end
R(Read)の例文
DBからデータを持ってくることも、大体な過程は同じである。しかし、CRUDの中で、Rは唯一にDB->JAVAにデータをもらい作業なので、受けたデータをJAVAで出力する必要がある。
- DBの住所を通じて、DBに接続する。
- データを読み込むSQL文を作成する。
- SQL文を伝送/実行/結果を受ける。
(ここは違う)4.受けた結果を、JAVAで出力する。
Rで特に変わるコードは別に注釈を付けるので、すぐ例文に入る。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet; //DBから受けた結果を、JAVAで出力するために必要なimport文
public class SelectMain {
public static void main(String[] args) {
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null; //DBからの情報を受けてくれるインスタンス
try {
String address = "jdbc:oracle:thin:@localhost:1521:xe";
con = DriverManager.getConnection(address, "ainchel", "1541547");
//すべての商品の名前を、昇順に整列してうけるSQL文
String sql = "select * from product order by p_name asc";
pstmt = con.prepareStatement(sql);
//C,U,DはSQL文を送るとき「pstmt.executeUpdate()」を使う。実行の結果で、上記した通り影響をされたデータの数を戻す。
//しかし、R(Read)をするときは、「pstmt.executeQuery()」をつかう。
//このメソッドで戻したrs(ResultSet)は、listと似ている形で結果を持っている。
rs = pstmt.executeQuery();
while (rs.next()) {
//SQL文の実行結果を持っているrsは、「next()」を通じて持っているデータを次々と確認する。
//次のデータがあればTRUE、ないとFALSEを戻す。
//while文で条件を確認しているので、次のデータがないまでrs全体を回る。
//回りながら、「rs.getデータ型名(コラム名)」メソッドで、各コラムを読み込む。
System.out.println(rs.getString(2));
System.out.println(rs.getInt("p_weight"));
System.out.println(rs.getInt("p_price"));
System.out.println("------------------------");
}
} catch (Exception e) {
// TODO: handle exception
}
try {
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
try {
pstmt.close();
} catch (Exception e) {
e.printStackTrace();
}
try {
con.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
U(Update)の例文
U(Update)は、すでにDBに入っているデータを修正することである。Cのときと比べると、SQL文だけが違ってほぼ同じである。Rの例文より分かりやすいので、する例文に入る。
例文に入る前に、コードではみえないDBの情報を書いておく。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.util.Scanner; // 変更する内容を入力するためのimport文
public class UpdateMain {
public static void main(String[] args) {
//入力した名前の売り場で売っている、すべての商品の値段を20%下げるコード
Connection con = null;
PreparedStatement pstmt = null;
try {
String address = "jdbc:oracle:thin:@localhost:1521:xe";
con = DriverManager.getConnection(address, "ainchel", "1541547");
Scanner sc = new Scanner(System.in);
System.out.print("売り場の名前を入力 : ");
String name = sc.next();
//入力した売り場の名前をMARKETテーブルのM_NAMEコラムで探す。
//そして、その売り場の番号と同じで番号(P_M_NO)を持つ、PRODUCTのコラムのP_PRICEを全部0.8倍にする。
//SQL文に入っている「?」は、SQL文の中でなく、後で内容を代入するということであう。
String sql = "UPDATE PRODUCT "
+"SET P_PRICE = P_PRICE * 0.8 "
+"WHERE P_M_NO IN(SELECT M_NO FROM MARKET "
+"WHERE M_NAME LIKE '%'||?||'%')";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, name); // ここで、上のSQL文の「?」に入る内容を決める。
// Scannerで入力した売り場の名前が入る。
if(pstmt.executeUpdate() >= 1) { //SQL文の修正がうまくできたなら
System.out.println("修正成功!");
} else {
System.out.println("入力した名前の売り場がDBにありません。");
}
} catch (Exception e) { //
System.out.println("DBに接続できませんでした。");
e.printStackTrace();
}
try {
pstmt.close();
} catch (Exception e) {
e.printStackTrace();
}
try {
con.close();
} catch(Exception e){
e.printStackTrace();
}
}
}
D(Delete)の例文
D(Delete)は、DBに入っているデータを削除することである。これもC(Create)のときとほぼ同じであるので、すぐ例文に入る。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.util.Scanner; // 削除する内容や情報を入力するためのimport文
public class DeleteMain {
public static void main(String[] args) {
Connection con = null;
PreparedStatement pstmt = null;
Scanner sc = new Scanner(System.in);
try {
String address = "jdbc:oracle:thin:@localhost:1521:xe";
con = DriverManager.getConnection(address, "ainchel", "1541547");
System.out.print("상품 명 : ");
String name = sc.next();
String sql = "delete from product where "
+ "where p_name like '%'||?||'%'";
//文字列の中で「%」を使うと、printfのとき使う「%s, %d, %f」などのその「%」に認識する。
//だから、「''」で挟んで文字に認識するようにして、、「||」を使って文字を加える方法を使う。
pstmt = con.prepareStatement(sql);
pstmt.setString(1, name);
if (pstmt.executeUpdate() >= 1 ) {
System.out.println("削除う成功。");
} else {
System.out.println("当たるデータがありません。");
}
} catch (Exception e) {
System.out.println("DBに接続できませんでした。");
e.printStackTrace();
}
try{
pstmt.close();
} catch (Exception e){
e.printStackTrace();
}
try{
con.close();
} catch{
e.printStackTrace();
}
}
}
以上で、JAVAでSQLのCRUDを扱う方法についてまとめてみた。
CRUDの中でもDBの目的(データを入れておいて、多様な条件でデータを読み込む)に1番近いのはやっぱりC(Create)とR(Read)だと言える。今回の例文はSQL文が難しくなくてJAVAのほうだけに気を付けばよかったが、もっと規模の大きいデータを作ったり、もっと複雑な条件でデータを検索するなどの場合になったら、今のまとめが役に立つと思う。
このまとめが記憶にもっと長く残るのを祈りながら、まとめを終える。
-
DBを扱うとき使う、4つの行為を表す。CRUDは各下記のようである。
1.C(Create) : DBにデータを入れることを表す。
2.R(Read) : DBのデータを読み込むことろ表す。
3.U(Update) : DBのデータを修正案することを表す。
4.D(Delete) : DBのデータを削除することを表す。
↩︎
Discussion