JDBC 연결
- java.sql.DriverManager
- java.sql.Connection ( Java 인터페이스 )
DriverManager.getConnection( 데이터베이스 링크, 데이터베이스 사용자 아이디 , 데이터베이스 사용자 비밀번호 )
/*
Connection connection = DriverManager.getConnection(ConnectionConst.URL, ConnectionConst.USERNAME, ConnectionConst.PASSWORD);
*/
@Slf4j
public class DBConnectionUtil {
public static Connection getConnection(){
try{
Connection connection = DriverManager.getConnection(ConnectionConst.URL, ConnectionConst.USERNAME, ConnectionConst.PASSWORD);
return connection;
}catch (SQLException e){
throw new IllegalStateException(e);
}
}
}
JDBC 기본 구조
- Connection : DB연결을 위한 자바 인터페이스
- PreparedStatement : sql 구문 정의
- ResultSet : DB 결과 응답 값 저장
Connection con = null; // DB 연결
PreparedStatement pstmt = null; // SQL 구문
ResultSet rs = null; // 결과값
try{
con = DriverManger.getConnection(URL, USERNAME, PASSWORD);
pstmt = con.prepareStatement("sql구문");
pstmt.setString() // pstmt.setInd ...
pstmt.executeUpdate() // pstmt.executeQuery()
}
catch ( SQLException e ){
// ...
}
finally{
rs.close(); // null이 아니면
pstmt.close(); // null이 아니면
con.close(); // null이 아니면
}
- close()를 줘야지 connection이 해제됨
- close()순서도 중요, ( ResultSet -> PreparedStatement -> Connection )
JDBC Create/Read/Update/Delete
- pstmt
- pstmt.setXXX (순서, 값)
- 순서 : sql구문 중 "?"(물음표) 위치
- 값 : 해당 부분에 넣을 값
- pstmt.executeUpdate()
- 결과값없이, 해당 sql 구문 적용
- 반환값은 sql구문이 영향을 끼친 행(row)개수를 반환 ( int executeUpdate() throws SQLException; )
- pstmt.executeQuery()
- sql 구문의 결과값이 존재
- 반환값은 sql 구문의 결과값 (ResultSet executeQuery() throws SQLException; )
- ResultSet
- 해당 결과값의 경우 객체형태로 오지않으므로, 해당하는 객체에 직접 넣어줘야함
- ResultSet의 커서의 경우, 맨 처음은 열(column) 이름을 가리킴 (그 다음부터 행(row)을 가리킨다)
- rs.next()를 한번 해줘야 진정한 행(row)값을 얻을 수 있음
//Create
public Member save(Member member) throws SQLException {
String sql = "insert into member(member_id, money) values(?,?)";
Connection con = null;
PreparedStatement pstmt = null;
try{
con = DBConnectionUtil.getConnection();
pstmt = con.prepareStatement(sql);
pstmt.setString(1, member.getMemberId());
pstmt.setInt(2, member.getMoney());
pstmt.executeUpdate();
return member;
}catch (SQLException e){
throw e;
}finally{
close(con,pstmt, null);
}
}
//Read
public Member findById(String memberId) throws SQLException{
String sql = "select * from member where member_id=?";
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
con = DBConnectionUtil.getConnection();
pstmt = con.prepareStatement(sql);
pstmt.setString(1, memberId);
rs = pstmt.executeQuery();
if (rs.next()) {
Member member = new Member();
member.setMemberId(rs.getString("member_id"));
member.setMoney(rs.getInt("money"));
return member;
} else {
throw new NoSuchElementException("member not found memberId=" + memberId);
}
}catch (SQLException e){
log.error("db error", e);
throw e;
}finally{
close(con, pstmt, rs);
}
}
//Update
public void update(String memberId, int money) throws SQLException{
String sql = "update member set money=? where member_id=?";
Connection con = null;
PreparedStatement pstmt = null;
try{
con = DBConnectionUtil.getConnection();
pstmt = con.prepareStatement(sql);
pstmt.setInt(1,money);
pstmt.setString(2, memberId);
int resultSize = pstmt.executeUpdate();
log.info("업데이트 행 개수 = {}", resultSize);
}catch(SQLException e){
log.error("db error", e);
throw e;
}finally{
close(con,pstmt,null);
}
}
//Delete
public void delete(String memberId) throws SQLException{
String sql = "delete from member where member_id=?";
Connection con = null;
PreparedStatement pstmt = null;
try{
con = DBConnectionUtil.getConnection();
pstmt = con.prepareStatement(sql);
pstmt.setString(1,memberId);
pstmt.executeUpdate();
}catch (SQLException e){
log.error("db error", e);
throw e;
}finally{
close(con,pstmt,null);
}
}
private void close(Connection con, PreparedStatement stmt, ResultSet rs){
if(rs!=null){
try{
rs.close();
}catch(SQLException e){
log.info("error", e);
}
}
if(stmt != null){
try{
stmt.close();
}catch (SQLException e){
log.info("error", e);
}
}
if (con != null){
try{
con.close();
}catch(SQLException e){
log.info("error", e);
}
}
}