인터페이스 선언(JDBC API : java.sql.package)
private Connection conn;
private Statement stmt;
private PreparedStatement pstmt;
private ResultSet rs;
Driver(interface)
- 모든 드라이버가 반드시 구현해야 하는 인터페이스
- 드라이버의 버전이나 연결에 대한 정보를 알아볼수 있는 메소드
Connection(interface)
- 데이터베이스에 대한 하나의 세션(하나의 클라이언트가 서버 요청을 하기 위해 연결을 맺은 상태) 표현
- DriverManager 클래스의 getConnection() 메소드를 이용하여 얻어올 수 있음
- 디폴트로 setAutoCommit(true) 설정
- 개발자가 원하는 경우에 commit을 해주고 싶거나 트랜잭션이 아주 중요한 부분에 있어서 RollBack 처리를 하고자 할 때에는 setAutoCommit(false) 설정 그러나 이 경우에는 SQL문을 수행 할 때 마다 명시적으로 commit() 호출
Statement(interface)
- SQL문장 실행하고 결과 값을 가져오기 위해서 사용
- SQL문, DML, query,DDL 등 수행
- 결과가 ResultSet 이면 true
//selct 처리할때 사용
public ResultSet executeQuery(String sql) throws SQLException
- 결과가 DML이거나 특별한 결과 가없으면 false 리턴
//주로 DML(delect,update, insert)등의 SQL수행할 때 사용
public int executeUpdate(String sql) throws SQLException
PreparedStatement (interface)
- 동일한 SQL문장이 여러번 반복적으로 수행될 때 사용하는 객체
ResultSet (interface)
- 쿼리에 대한 결과값 처리
// ResultSet 객체의 커서 이동
next()
// 메소드를 이용하여 데이터를 얻을수 있음
get~~~(index or name);
JDBCUtil
static {
try {
//옵션(드라이버 빌드패스 설정여부 확인용)
Class.forName("oracle.jdbc.driver.OracleDriver");
//한번만 호출하면되서 static 블록에서 넣어줌 매번 넣을 필요없음
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Class.forName("경로");
- 드라이버 빌드 패스 설정이 잘되었는지 확인용
- Class.forName("경로") 사용해서 Driver Class를 로딩하여 객체 생성
-생성된 객체는 DriverManager 등록
public static Connection getConnection() {
try {
return DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:xe",
"pc15",
"java");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
DriverManger
- 로드된 JDBC 드라이버를 통해서 Connection 활성화 해주는 객체
- DriverManager.getConnection(url,id,pw);
public static void close(Connection conn,
PreparedStatement pstmt,
Statement stmt,
ResultSet rs) {
//자원반납
if(rs != null) try {rs.close();} catch(SQLException ex) {}
if(pstmt != null) try {pstmt.close();} catch(SQLException ex) {}
if(stmt != null) try {stmt.close();} catch(SQLException ex) {}
if(conn != null) try {conn.close();} catch(SQLException ex) {}
}
close()
- 열었던 순서 역순 닫아 줘야함
- 닫아야 할 자원의 값이 null이라면 Error 발생하기 때문에 if문 함
displayMember()
try {
//conn 먼저 해야 createStatement() 만들수 있음
conn = JDBCUtil2.getConnection();
String sql = "select * from mymember";
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
while (rs.next()) {
String memId = rs.getNString("mem_Id");
String memName = rs.getNString("mem_name");
String memTel = rs.getNString("mem_tel");
String memAddr = rs.getNString("mem_addr");
//LocalDateTim
LocalDate regDt = rs.getTimestamp("reg_dt")
.toLocalDateTime().toLocalDate();
System.out.println(" "+memId+"\t"+regDt+"\t"+memName+
"\t"+memTel+" \t"+memAddr);
}
}catch (SQLException e) {
e.printStackTrace();
}
순서
Connection conn → Statement stmt → ResultSet rs 순서대로 써야함
conn로 DB 연결
createStatement()
- DB로 SQL문들을 보내기 위해서 Statement 객체 한개 생성
- 만약. 똑같은 SQL문을 여러번 실행되도록 하고자 하면, PreparedStatement객체 사용하는게 효율적
execute실행문
메소드명(매개변수) | 리턴타입 | 기능 |
execute() | boolean | sql문 실행 성공하면 false 리턴 모든 구문 수행가능 |
executeQuery() | ResultSet | select 구문실행 ResultSet객체의 값 리턴 |
executeUpdate() | int | insert,update,delect문 실행하고 영향을 받은 행의 개수 반환 create,drop관련 구문에서 -1 반환 |
executeQuery() 실행 시켰다면 ResultSet 객체로 값을 리턴 받은 후 next() ,getInt(),getString() 메소드 통해 값 가져올 수 있다
- next() : 다음행 가리켜줌
- 다음 행 있으면 true 없으면 false - get() : 매개변수로 쓰인 문자(숫자)의 위치에 있는 값을 가져옴
checkMember(String memId)
//중복 체크
boolean isExist = false;
try {
conn = JDBCUtil2.getConnection();
//mem_id가 있으면 count: 1 나옴
String sql = "select count(*) cnt \r\n" +
" from mymember\r\n" +
" where\r\n" +
" mem_id = ?";
pstmt = conn.prepareStatement(sql);
//첫번째 ?에 매개변수:memId 들어감
pstmt.setString(1, memId);
rs = pstmt.executeQuery();
while(rs.next()) {
//"cnt" count(*) 별칭
//count(*) 숫자이므로 getInt 사용함
//count(*) 결과값이 rs.getInt("cnt") 대입
int cnt = rs.getInt("cnt");
if(cnt > 0) {
isExist = true; // 이미존재함
}
}
}catch(SQLException ex) {
ex.printStackTrace();
}finally {
JDBCUtil2.close(conn, pstmt, pstmt, rs);
}
return isExist;
}
PrepareStatement() : SQL문장 실행, 결과 반환
- setString(?의 위치, 넣어줄값)
메소드명(매개변수) | 리턴타입 | 기능 |
execute() | boolean | sql문 실행 성공하면 false 리턴 모든 구문 수행가능 |
executeQuery() | ResultSet | select 구문실행 ResultSet객체의 값 리턴 |
executeUpdate() | int | insert,update,delect문 실행하고 영향을 받은 행의 개수 반환 create,drop관련 구문에서 -1 반환 |
executeQuery() 실행 시켰다면 ResultSet 객체로 값을 리턴 받은 후 next() ,getInt(),getString() 메소드 통해 값 가져올 수 있다
- next() : 다음행 가리켜줌
- 다음 행 있으면 true 없으면 false - get() : 매개변수로 쓰인 문자(숫자)의 위치에 있는 값을 가져옴
close() : DB 연결 해제
insertMember()
//중복 체크
boolean isExist = false;
isExist = checkMember(memId);
if(isExist) { //true
System.out.println(memId + "인 회원이 이미 존재합니다..");
System.out.println("다시 입력해 주세요.");
return;
}
try {
//오라클 접속
conn = JDBCUtil2.getConnection();
String sql = "insert into mymember"
+ " (MEM_ID,MEM_NAME,MEM_TEL,MEM_ADDR)\r\n" +
" values (?,?,?,?)";
pstmt = conn.prepareStatement(sql);
// pstmt.setNString(?위치 번호, 값);
pstmt.setNString(1, memId);
pstmt.setNString(2, memName);
pstmt.setNString(3, memTel);
pstmt.setNString(4, memAddr);
//executeQuery() : select (조회)
//executeUpdate() : 리턴타입 : int 0이면 executeUpdate 안되있고 0 보다 크면 executeUpdate 됨
int cnt = pstmt.executeUpdate();
if(cnt >0 ) { //
System.out.println(memId + "회원 정보 등록 작업 성공!");
}else { // cnt <0
System.out.println(memId + "회원 정보 등록 작업 실패!");
}
} catch (SQLException ex) {
ex.printStackTrace();
} finally {
//자원반납
JDBCUtil2.close(conn, pstmt, pstmt, rs);
}
PrepareStatement() : SQL문장 실행, 결과 반환
- setString(?의 위치, 넣어줄값)
execute() 실행메소드
메소드명(매개변수) | 리턴타입 | 기능 |
execute() | boolean | sql문 실행 성공하면 false 리턴 모든 구문 수행가능 |
executeQuery() | ResultSet | select 구문실행 ResultSet객체의 값 리턴 |
executeUpdate() | int | insert,update,delect문 실행하고 영향을 받은 행의 개수 반환 create,drop관련 구문에서 -1 반환 |
원본
회원정보를 관리하는 프로그램을 작성하는데
아래의 메뉴를 모두 구현하시오. (CRUD기능 구현하기)
(DB의 MYMEMBER테이블을 이용하여 작업한다.)
* 자료 삭제는 회원ID를 입력 받아서 삭제한다.
예시메뉴)
----------------------
== 작업 선택 ==
1. 자료 입력 ---> insert
2. 자료 삭제 ---> delete
3. 자료 수정 ---> update
4. 전체 자료 출력 ---> select
5. 작업 끝.
----------------------
// 회원관리 프로그램 테이블 생성 스크립트
create table mymember(
mem_id varchar2(8) not null, -- 회원ID
mem_name varchar2(100) not null, -- 이름
mem_tel varchar2(50) not null, -- 전화번호
mem_addr varchar2(128), -- 주소
reg_dt DATE DEFAULT sysdate, -- 등록일
CONSTRAINT MYMEMBER_PK PRIMARY KEY (mem_id)
);
Main
public class T01MemberInfoTest {
//인터페이스 선언
private Connection conn;
private Statement stmt;
private PreparedStatement pstmt;
private ResultSet rs;
private Scanner scan = new Scanner(System.in);
/**
* 메뉴를 출력하는 메서드
*/
public void displayMenu(){
System.out.println();
System.out.println("----------------------");
System.out.println(" === 작 업 선 택 ===");
System.out.println(" 1. 자료 입력");
System.out.println(" 2. 자료 삭제");
System.out.println(" 3. 자료 수정");
System.out.println(" 4. 전체 자료 출력");
System.out.println(" 5. 작업 끝.");
System.out.println("----------------------");
System.out.print("원하는 작업 선택 >> ");
}
/**
* 프로그램 시작메서드
*/
public void start(){
int choice;
do{
displayMenu(); //메뉴 출력
choice = scan.nextInt(); // 메뉴번호 입력받기
switch(choice){
case 1 : // 자료 입력
insertMember();
break;
case 2 : // 자료 삭제
delectMember();
break;
case 3 : // 자료 수정
updateMember();
break;
case 4 : // 전체 자료 출력
displayMember();
break;
case 5 : // 작업 끝
System.out.println("작업을 마칩니다.");
break;
default :
System.out.println("번호를 잘못 입력했습니다. 다시입력하세요");
}
}while(choice!=5); //5 반복종료
}
/**
* 회원정보를 모두 출력하기 위한 메서드
*/
private void displayMember() {
System.out.println();
System.out.println("--------------------------");
System.out.println("ID\t생성일\t이 름\t전화번호 \t\t 주 소");
System.out.println("--------------------------");
try {
//conn 먼저 해야 createStatement() 만들수 있음
conn = JDBCUtil2.getConnection();
String sql = "select * from mymember";
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
while (rs.next()) {
String memId = rs.getNString("mem_Id");
String memName = rs.getNString("mem_name");
String memTel = rs.getNString("mem_tel");
String memAddr = rs.getNString("mem_addr");
//LocalDateTim
LocalDate regDt = rs.getTimestamp("reg_dt")
.toLocalDateTime().toLocalDate();
System.out.println(" "+memId+"\t"+regDt+"\t"+memName+
"\t"+memTel+" \t"+memAddr);
}
}catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 회원정보를 삭제하기 위한 메서드
*/
private void delectMember() {
boolean isExist = false;
System.out.println();
System.out.println("삭제할 회원정보를 입력하세요.");
System.out.println("회원 ID>>");
String memId = scan.next();
try {
conn = JDBCUtil2.getConnection();
String sql = "delete from mymember where mem_id = ?";
pstmt = conn.prepareStatement(sql);
pstmt.setNString(1, memId);
int cnt = pstmt.executeUpdate();
if(cnt > 0 ) {
System.out.println(memId + "인 회원정보 삭제 성공");
}else {
System.out.println(memId + "인 회원정보 삭제 실패");
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCUtil2.close(conn, pstmt, pstmt, rs);
}
}
/**
* 회원정보를 수정하기 위한 메서드
*/
private void updateMember() {
//중복체크
boolean isExist = false;
System.out.println();
System.out.println("수정할 회원정보를 입력하세요.");
System.out.println("회원 ID>>");
String memId = scan.next();
//
isExist = checkMember(memId);
if(!isExist) { //false
System.out.println(memId + "인 회원이 존재하지 않습니다.");
System.out.println("다시 입력해 주세요.");
return;
}
System.out.println("회원 이름>>");
String memName = scan.next();
System.out.println("회원 전화번호>>");
String memTel = scan.next();
scan.nextLine(); // 버퍼에 남아있을 언터키 제거용
System.out.println("회원 주소>>");
String memAddr = scan.nextLine();
//JDBC 코딩
try {
//오라클 접속
conn = JDBCUtil2.getConnection();
String sql = "update mymember\r\n" +
" set\r\n" +
" mem_name = ?\r\n" +
" , mem_tel = ?\r\n" +
" , mem_addr = ?\r\n" +
" where\r\n" +
" mem_id = ?";
pstmt = conn.prepareStatement(sql);
// pstmt.setNString(?위치 번호, 값);
pstmt.setNString(1, memName);
pstmt.setNString(2, memTel);
pstmt.setNString(3, memAddr);
pstmt.setNString(4, memId);
//executeQuery() : select (조회)
//executeUpdate() : 리턴타입 : int 0이면 executeUpdate 안되있고 0 보다 크면 executeUpdate 됨
int cnt = pstmt.executeUpdate();
if(cnt >0 ) { //
System.out.println(memId + "회원 정보 수정 작업 성공!");
}else { // cnt <0
System.out.println(memId + "회원 정보 수정 작업 실패!");
}
} catch (SQLException ex) {
ex.printStackTrace();
} finally {
//자원반납
JDBCUtil2.close(conn, pstmt, pstmt, rs);
}
}
/*
* 회원정보를 등록하기 위한 메서드
*/
private void insertMember() {
//중복체크
boolean isExist = false;
System.out.println();
System.out.println("추가할 회원정보를 입력하세요.");
System.out.println("회원 ID>>");
String memId = scan.next();
//
isExist = checkMember(memId);
if(isExist) { //true
System.out.println(memId + "인 회원이 이미 존재합니다..");
System.out.println("다시 입력해 주세요.");
return;
}
System.out.println("회원 이름>>");
String memName = scan.next();
System.out.println("회원 전화번호>>");
String memTel = scan.next();
scan.nextLine(); // 버퍼에 남아있을 언터키 제거용
System.out.println("회원 주소>>");
String memAddr = scan.nextLine();
//JDBC 코딩
try {
//오라클 접속
conn = JDBCUtil2.getConnection();
String sql = "insert into mymember"
+ " (MEM_ID,MEM_NAME,MEM_TEL,MEM_ADDR)\r\n" +
" values (?,?,?,?)";
pstmt = conn.prepareStatement(sql);
// pstmt.setNString(?위치 번호, 값);
pstmt.setNString(1, memId);
pstmt.setNString(2, memName);
JDBCUtil
package kr.or.ddit.utill;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCUtil {
static {
try {
//옵션(드라이버 빌드패스 설정여부 확인용)
Class.forName("oracle.jdbc.driver.OracleDriver");
//한번만 호출하면되서 static 블록에서 넣어줌 매번 넣을 필요없음
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static Connection getConnection() {
try {
return DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:xe",
"pc15",
"java");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
public static void close(Connection conn,
PreparedStatement pstmt,
Statement stmt,
ResultSet rs) {
//자원반납
if(rs != null) try {rs.close();} catch(SQLException ex) {}
if(pstmt != null) try {pstmt.close();} catch(SQLException ex) {}
if(stmt != null) try {stmt.close();} catch(SQLException ex) {}
if(conn != null) try {conn.close();} catch(SQLException ex) {}
}
}
'JAVA > 수업' 카테고리의 다른 글
2024-03-25 (0) | 2024.03.25 |
---|---|
MVCTest 원본 (0) | 2024.02.07 |
T07FileWriterTest (InputStreamReader) (1) | 2024.02.03 |
T06FileStreamTest 파일저장용 스트림 (0) | 2024.02.03 |
T05FileStreamTest (0) | 2024.02.03 |