티스토리 뷰

JDBCTemplate

이번 시간에는 JAVA 와 Oracle DB 연결중 코드를 반복 기입하는 번거로움을 줄이기 위해 필수적으로 입력되어야 하는 코드를 따로 묶어 Template 코드를 만들어보도록 하겠습니다.

 

이후 진행할 DB 연결과 관련된 모든 실습에는 이 JDBCTemplate를 사용하도록 하겠습니다.

 

먼저 코드를 살펴보겠습니다.

 

package common;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

// driver 연결
// 계정 연결

// db 종료
// commit / rollback

// Singleton 패턴 && static 으로 메모리 낭비 방지!!
public class JDBCTemplate {

	// 1. driver 연결
	// 2. 계정 연결
	public static Connection getConnection() {
		// 1.
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
		} catch (ClassNotFoundException e) {
			System.out.println("[Error] : JDBCTemplate.Driver");
			e.printStackTrace();
		}

		// 2.
		String url = "jdbc:oracle:thin:@localhost:1521:xe";
		String user = "kh";
		String password = "kh";

		Connection con = null;
		try {

			con = DriverManager.getConnection(url, user, password);
			con.setAutoCommit(false);

		} catch (SQLException e) {
			System.out.println("[Error] : JDBCTemplate.getConnection");
			e.printStackTrace();
		}

		return con;
	}
	
	// 5. DB 종료
	public static void close(ResultSet rs) {
		try {
			rs.close();
		} catch (SQLException e) {
			System.out.println("[Error] : JDBCTemplate.close(rs)");
			e.printStackTrace();
		}
	}

	// 5. DB 종료
	public static void close(Statement stmt) {
		try {
			stmt.close();
		} catch (SQLException e) {
			System.out.println("[Error] : JDBCTemplate.close(stmt)");
			e.printStackTrace();
		}
	}

	// 5. DB 종료
	public static void close(Connection con) {
		try {
			con.close();
		} catch (SQLException e) {
			System.out.println("[Error] : JDBCTemplate.close(con)");
			e.printStackTrace();
		}
	}

	public static void commit(Connection con) {
		try {
			con.commit();
		} catch (SQLException e) {
			System.out.println("[Error] : JDBCTemplate.commit(con)");
			e.printStackTrace();
		}
	}

	public static void rollback(Connection con) {
		try {
			con.rollback();
		} catch (SQLException e) {
			System.out.println("[Error] : JDBCTemplate.rollback(con)");
			e.printStackTrace();
		}
	}
}

 

위 코드는 기본적으로 JDBC 프로그램의 작성 단계 중

 

1. Driver 연결

2. 계정 연결

5. DB 종료

와 관련된 코드를 미리 작성해 놓은 것입니다.

 

이 외에도 insert, update, delete 등의 트랜잭션과 관련된 쿼리를 자동 commit 하지 않기 위해 

 

getConnection() 메서드에서 con.setAutoCommit(false) 로 설정 해 놓고

 

commit(con) / rollback(con) 메서드를 통해 수동 comitt 할 수 있도록 하였습니다.

 

이제 이 JDBCTemplate을 이용한 SIUD (select / insert / update / delete) 실습을 해 보도록 하겠습니다.

 

 


Select Insert Update Delete TEST

실습에 사용될 table은 다음과 같습니다.

DROP TABLE JDBCTEST;
CREATE TABLE JDBCTEST(
	NO NUMBER,
	NAME VARCHAR2(100),
	NICKNAME VARCHAR2(200)
);
SELECT * FROM JDBCTEST;

INSERT INTO JDBCTEST VALUES(1, '홍길동','길동');
INSERT INTO JDBCTEST VALUES(2, '조현준','쟌쥰');
INSERT INTO JDBCTEST VALUES(3, '이순신','장군');
INSERT INTO JDBCTEST VALUES(4, '구마적','마적');
INSERT INTO JDBCTEST VALUES(5, '세종대왕','임금');
INSERT INTO JDBCTEST VALUES(6, '왕건','고려');

 

Select_List

package com.test_jdbctest;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import common.JDBCTemplate;

public class JDBCTEST_SelectList extends JDBCTemplate {

	public static void main(String[] args) throws ClassNotFoundException, SQLException {

		// 1. driver 연결
		// 2. 계정 연결
		Connection con = getConnection();
		Statement stmt = null;
		ResultSet rs = null;

		// 3. Query 준비
		String sql = " SELECT * FROM JDBCTEST "; // 복잡한 쿼리를 위해 앞 뒤를 띄어주자~!
		stmt = con.createStatement();
		
		// 4. 실행 및 리턴
		rs = stmt.executeQuery(sql);
		
		// 리턴받은 결겨괎을 console에 출력!
		while (rs.next()) {
			System.out.println(rs.getInt(1) + " " + rs.getString(2) + " " + rs.getString(3));
		}

		// 5. DB 종료
		close(rs);
		close(stmt);
		close(con);
	}
}

JDBCTemplate 을 상속받아 구현한 SelectList 기능입니다. 

 

코드가 꽤나 간소화 된 모습을 볼 수 있는데요,

 

1. driver 연결

2. 계정 연결

과 괕련된 코드를 JDBCTemplate에 미리 작성해 놓았기 때문에 이러한 작업이 완료된 Connection 객체를 받아오기만 하면 됩니다.

 

Connection con = getConnection();

 

5. DB 종료

또한 파라미터의 종류에 따라 오버로딩된 close() 메서드를 통해 종료해 주면 됩니다. 

 

이 외에

3. query 준비

4. 실행 및 리턴

와 관련된 코드는 실행하고자 하는 작업에 따라 유동적이기 때문에 상황에 맞게 코딩해 주시면 됩니다.

 

Insert

package com.test_jdbctest;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;

import common.JDBCTemplate;

public class JDBCTEST_Insert extends JDBCTemplate {

	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		Scanner sc = new Scanner(System.in);

		System.out.println("번호 입력 : ");
		int no = sc.nextInt();

		System.out.println("이름 입력 : ");
		String name = sc.next();

		System.out.println("별명 입력 : ");
		String nickname = sc.next();
		///////////////////////////////////////////////////////

		// 1. driver 연결
		// 2. 계정 연결
		Connection con = getConnection();
		Statement stmt = null;
		int res = 0;

		// 3. 쿼리 준비
		String sql = " INSERT INTO JDBCTEST " + " VALUES(" + no + ",'" + name + "','" + nickname + "') ";
		stmt = con.createStatement();

		// 4. 실행 및 리턴
		res = stmt.executeUpdate(sql);
		if (res > 0) {
			System.out.println("insert 성공!!");
			commit(con);
		} else {
			System.out.println("insert 실패!!");
		}

		// 5. db 종료
		close(stmt);
		close(con);

		sc.close();
	}
}

 

 

JDBCTemplate 을 이용한 Insert 기능 구현입니다.

 

주의깊게 살펴보실 부분은 쿼리 실행을 통해 받은 결과값이 int 타입의 변수에 담긴다는 점 입니다.

 

DataBase 는 Insert, Update, Delete 쿼리에 대한 결과값으로 적용된 row의 갯수를 반환합니다.

 

만약 적용된 row 의 갯수가 0 보다 크다면 성공적으로 작업이 완료된 것으로 간주하고

 

commit 작업을 진행해 줍니다.

 

Update

package com.test_jdbctest;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;

import common.JDBCTemplate;

public class JDBCTEST_Update extends JDBCTemplate {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		System.out.println("수정할 번호 : ");
		int no = sc.nextInt();

		System.out.println("수정할 이름 : ");
		String name = sc.next();

		System.out.println("수정할 별명 : ");
		String nickName = sc.next();
		///////////////////////////////////////////////////////

		Connection con = getConnection();
		PreparedStatement pstmt = null;
		int res = 0;
		String sql = " UPDATE JDBCTEST SET NAME = ?, NICKNAME = ? " + " WHERE NO = ? ";

		try {
			// sql 을 미리 가지고 있는다!! -> free complied
			pstmt = con.prepareStatement(sql);

			pstmt.setString(1, name);
			pstmt.setString(2, nickName);
			pstmt.setInt(3, no);

			res = pstmt.executeUpdate();

			if (res > 0) {
				System.out.println("Update 성공!!");
				commit(con);
			} else {
				System.out.println("0 rows updated;;;");
			}

		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close(pstmt);
			close(con);
		}

	}
}

Update (수정) 실습 입니다. 

 

PreparedStatement 객체를 사용해 query를 실행했다는 점 말고는 특별히 달라진 부분은 없습니다!!

 

Delete

package com.test_jdbctest;

import static common.JDBCTemplate.close;
import static common.JDBCTemplate.commit;
import static common.JDBCTemplate.getConnection;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;

public class JDBCTEST_Delete {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("삭제할 번호 : ");
		int no = sc.nextInt();

		Connection con = getConnection();
		Statement stmt = null;
		int res = 0;
		String sql = " DELETE FROM JDBCTEST WHERE NO = " + no;

		try {
			stmt = con.createStatement();
			res = stmt.executeUpdate(sql);

			if (res > 0) {
				System.out.println("삭제 성공!!");
				commit(con);
			} else {
				System.out.println("0개의 row가 삭제됨;;");
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close(stmt);
			close(con);
			sc.close();
		}

	}
}

Delete (삭제) 실습입니다. 

 


JAVA 와 Oracle DB 연결 코드를 간소화 하기 위한 JDBCTemplate 을 만들고

 

이를 이용해 Select, Insert, Update, Delete 실습을 진행 해 보았습니다.

 

다음 시간에는 MVC 패턴 (Model, View, Controller) 을 이용한 실습을 진행하도록 하겠습니다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함