티스토리 뷰
[JAVA] JDBC 4. JDBCTemplate & select, insert, update, delete 실습
쟌쥰 2020. 1. 3. 01:16JDBCTemplate
이번 시간에는 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) 을 이용한 실습을 진행하도록 하겠습니다.
'JAVA > JAVA Theory' 카테고리의 다른 글
[JAVA] JDBC 번외. Eclipse 에서 Oracle sql 사용하기 (0) | 2020.03.24 |
---|---|
[JAVA] JDBC 5. MVC 패턴을 이용한 실습 (0) | 2020.01.03 |
[JAVA] JDBC 3. Oracle DB Scott/Tiger 계정 EMP 테이블을 이용한 실습 (0) | 2020.01.01 |
[JAVA] JDBC 2. JDBC연결을 위한 JAVA 프로젝트 환경설정 (0) | 2020.01.01 |
[JAVA] JDBC 1. Java Database Connectivity 개념 (0) | 2020.01.01 |
- Total
- Today
- Yesterday
- OOP
- 객체
- JdbcTemplate
- java 환경설정
- 추상화
- jdbc
- 객체지향
- Oracle
- Update
- select
- Delete
- 상속
- INSERT
- JDBC 프로그램 작성단계
- 다형성
- Scott/Tiger
- java
- view
- .
- 캡슐화
- ojdbc6.jar
- controller
- model
- MVC
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |