JAVA/JAVA개발자 양성과정

[JAVA] 자바 개발자 양성과정 17일차 - JAVA에서 MYSQL제어하기

728x90
반응형

ㅇㅔ구구 오늘은 살짝 늦잠을 잤다.


CallableStatement

MYSQL에서 만들어둔 프로시저를 호출할수 있는 메서드.

 

프로시저란?

 

[MYSQL] 자바 개발자 양성과정 15일차 - UNSIGNED, DECIMAL, 저장 프로시저, 프로시저로 데이터 (IN, OUT, INO

이번주도 화이팅!! 🎈✨✨ 테이블 명은 가급적이면 대소문자를 구분해서 쓰자! SQL에서는 구분하지 않지만, 나중에 리눅스에서 돌릴 것도 생각한다면 가급적 대소문자를 구분하는 것이 좋음 UNSI

hoyashu.tistory.com

 

 

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;

}

 

728x90
반응형