ㅇㅔ구구 오늘은 살짝 늦잠을 잤다.
CallableStatement
MYSQL에서 만들어둔 프로시저를 호출할수 있는 메서드.
프로시저란?
JAVA에서 MYSQL프로시저 작동시키기
1. MYSQL에서 프로시저를 만든다.
delimiter //
CREATE PROCEDURE retriveCustomerList()
BEGIN
SELECT id, name, age, grade, POINT
FROM customer
ORDER BY id ASC;
END;
//
delimiter ;
2. 자바에서 프로시저 실행문을 작성한다.
package jdbcApp;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
/*
* 프로그램 설명 : retrieveCustomerList 스토어드 프로시저를 호출
*/
public class CallableStatementExam1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//1. Connection 객체 생성
Connection conn = null;
//sql에서 프로시저 호출을 위해 CallableStatement를 사용한다.
CallableStatement cstmt = null; ✨
ResultSet rs = null;
try {
conn = DBConn.getConnection();
//2. CallableStatement 객체 생성
cstmt = conn.prepareCall("call retriveCustomerList()"); ✨✨
rs = cstmt.executeQuery();
while(rs.next()) {
String id = rs.getString(1);
String name = rs.getString(2);
int age = rs.getInt(3);
String grade = rs.getString(4);
int point = rs.getInt(5);
//기본 select값과는 다르게 쿼리를 호출할 필요가 없다. ✨✨✨
System.out.printf("%s, %s, %d, %s, %d%n", id, name, age, grade, point);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
if(cstmt != null) cstmt.close();
if(rs != null) rs.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
}
✨
CallableStatement cstmt = null;
sql에서 프로시저 호출을 위해 CallableStatement를 사용한다.
✨✨
cstmt = conn.prepareCall("call retriveCustomerList()");
CallableStatement 객체를 DB에 연결해서 괄호안에 프로시저 실행문을 준비시킨다.
실행은 다음 라인 executeQuery() 에서 실행한다.
✨✨✨
기본 select값과는 다르게 쿼리 작성해줄 필요가 없다! 프로시저를 "실행" 할꺼니까!
JAVA에서 MYSQL프로시저 작동시키기 (IN/OUT)
D
package jdbcApp;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
/*
* 프로그램 설명 : retrieveCustomerList 스토어드 프로시저를 호출
*/
public class CallableStatementExam2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
// 1. Connection 객체 생성
Connection conn = null;
// sql에서 프로시저 호출을 위해 CallableStatement를 사용한다.
CallableStatement cstmt = null;
ResultSet rs = null;
try {
conn = DBConn.getConnection();
// 2. CallableStatement 객체 생성
cstmt = conn.prepareCall("call retriveCustomerById(?, ? ,?)"); ✨
// 3. IN Parameter 설정 (ID를 적으면)
cstmt.setString(1, "java2"); ✨✨
// 4. OUT Parameter 설정 (이름이랑 나이가 출력된다.)
cstmt.registerOutParameter(2, java.sql.Types.VARCHAR); ✨✨✨
cstmt.registerOutParameter(3, java.sql.Types.INTEGER);
// 5. 실제로 프로시저를 호출하는 뷰뷴
cstmt.execute(); ✨✨✨✨
String name = cstmt.getString(2); ✨✨✨✨✨
int age = cstmt.getInt(3);
System.out.printf("%s, %d%n", name, age);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (cstmt != null)
cstmt.close();
if (rs != null)
rs.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
}
✨
cstmt = conn.prepareCall("call retriveCustomerById(?, ? ,?)");
prepareCall("call 프로시져명(매개변수 갯수만큼 ?, )")
✨✨
cstmt.setString(1, "java2");
프로시저에 IN으로 넣을 매개변수를 설정한다.
setString(몇번쨰 ?에 값을 넣을지 인덱스번호, 넣을 데이터)
✨✨✨
cstmt.registerOutParameter(2, java.sql.Types.VARCHAR);
프로시저에서 받아올 OUT이 어떠한 데이터 타입인지 설정한다.
✨✨✨✨cstmt.execute();
✨✨✨✨✨ String name = cstmt.getString(2);
try ~ catch ~ finally
try{
//에러가 발생할 수 있는 코드
throw new Exception(); //강제 에러 출력
}catch (Exception e){
//에러시 수행
e.printStackTrace(); //오류 출력(방법은 여러가지)
throw e; //최상위 클래스가 아니라면 무조건 던져주자
}finally{
//무조건 수행
}
JAVA에서 MYSQL 트렌젝션 제어하기
특정 작업을 성공했을때는 데이터베이스에 적용하고 싶고, 실패했을때는 데이터베이스에 적용하지 않고 싶을때는 롤백/커밋을 사용한다.
package jdbcApp;
import java.sql.Connection;
import java.sql.PreparedStatement;
public class TransactionExam1 {
/*
* 프로그램 설명 : 트렌젝션 처리에 대한 예쩨
*/
public static void main(String[] args) {
Connection conn = null;
PreparedStatement pstmt = null;
boolean isSuccess = false;
try {
// 1. connection 객체 생성
conn = DBConn.getConnection();
// tx.begin (트렌젝션 실행)
conn.setAutoCommit(false);
// 2. preparedStatemnt 객체 생성
StringBuffer sql = new StringBuffer();
sql.append("DELETE FROM customer ");
sql.append("WHERE id = ? ");
pstmt = conn.prepareStatement(sql.toString());
pstmt.setString(1, "java4");
pstmt.executeUpdate();
// pstmt재사용을 위해서 아래와 같은 코드를 사용함
pstmt.close();
// sql 재사용을 위해서 아래와 같은 코드를 사용함
sql.delete(0, sql.length());
// 고객정보 등록
sql.append("INSERT INTO customer ( id, name, age, grade, point ) ");
sql.append("VALUES ( ?, ?, ?, ?, ? ) ");
// ?를 변경해야하는 경우에는 prepareStatement 를 사용하고 쿼리를 수정할 필요없이
// 작동시킬 것이라면 createStatement로 sql전송객체를 만들면 된다.
pstmt = conn.prepareStatement(sql.toString());
pstmt.setString(1, "mysql");
pstmt.setString(2, "사길동");
pstmt.setInt(3, 40);
pstmt.setString(4, "vip");
pstmt.setInt(5, 10);
//여기까지는 정상적으로 실행된 것임
pstmt.executeUpdate(); //-> 중복 pk로 오류발생해서 catch로 나감
isSuccess = true;
conn.commit(); //커밋
} catch (Exception e) {
e.printStackTrace();
try {
if(!isSuccess) {
System.out.println("고객정보 등록실패!");
conn.rollback(); //롤백
}
} catch (Exception e2) {
e2.printStackTrace();
}
} finally {
try {
if (pstmt != null)
pstmt.close();
if (conn != null)
conn.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
}
JAVA에서 MYSQL 데이터 일괄처리하기
// 전체 고객 목록을 조회한다.
public ArrayList<CustomerVO> selectCustomerList() throws Exception {
ArrayList<CustomerVO> customers = new ArrayList<CustomerVO>();
// 2. Connection 객체 생성
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
// 3. Connection 객체 생성 - 모듈화로 아래와 같이 변경
conn = DBConn.getConnection();
stmt = conn.createStatement();
// 4. SQL문을 전송객체 생성
StringBuffer sql = new StringBuffer();
sql.append("SELECT id, name, age, grade, point ");
sql.append("FROM customer ");
sql.append("ORDER BY id ASC ");
rs = stmt.executeQuery(sql.toString());
while (rs.next()) {
String id = rs.getString(1);
String name = rs.getString(2);
int age = rs.getInt(3);
String grade = rs.getString(4);
int point = rs.getInt(5);
CustomerVO customer = new CustomerVO(id, name, age, grade, point);
customers.add(customer);
}
} catch (Exception e) {
throw e;
} finally {
// resource release
if (rs != null)
rs.close();
if (conn != null)
conn.close();
if (stmt != null)
stmt.close();
}
return null;
}