🗂

緊急メモ:JAVA-SQL連携のCRUDコードのまとめ(日本語で移してながら復習)

2023/08/28に公開

前書き

もともとJAVAのまとめをしていたが、ITスクールで、実際はSQLを利用してDBにCRUD[1]]
をする方法について学んでいた。

それに、JAVAでSQLを使ってDBにCRUDをすることは、JAVAとSQL両方を使うことであった。緊急とも言えるほど重要で、ITスクールでこれを活用した小さいプロジェクトも作っているので、復習を兼ねてめとめておく。

C(CREATE)の例

JAVAでSQLを使ってデータを追加するには大きく分けると4つの過程になる。

  1. JAVAコードでDBに接続する
  2. String型でSQL文を作成する
  3. 2番のSQL文をサーバーに送る/実行する/結果を受けるメソッドを実行する
  4. 3番を実行した結果を確認する(3番のメソッドが2番のSQL文で作業で影響されたデータの数を戻すので、その数字で確認する。)

JAVAでSQL文を作成するとき、注意することも2つあるので、覚えておこう。

上記した過程と注意事項を考えながら、JAVAでDBにデータを追加するコードを作成してみよう。 例文では表されていない、DBに作っておいた情報を先に書いておく。

  1. PRODUCT : テーブルの名前(クラスと似ている、決めておいた情報の集合)
  2. 'VALUES'の括弧のなかに入る情報(左から順番に):項目番号、名前、重さ、値段、マーケット番号
InsertMain1

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で出力する必要がある。

  1. DBの住所を通じて、DBに接続する。
  2. データを読み込むSQL文を作成する。
  3. 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のほうだけに気を付けばよかったが、もっと規模の大きいデータを作ったり、もっと複雑な条件でデータを検索するなどの場合になったら、今のまとめが役に立つと思う。

このまとめが記憶にもっと長く残るのを祈りながら、まとめを終える。

脚注
  1. DBを扱うとき使う、4つの行為を表す。CRUDは各下記のようである。
    1.C(Create) : DBにデータを入れることを表す。
    2.R(Read) : DBのデータを読み込むことろ表す。
    3.U(Update) : DBのデータを修正案することを表す。
    4.D(Delete) : DBのデータを削除することを表す。
    ↩︎

Discussion