부스트 코스 웹 백엔드
JDBC
Java Database Connectivity
자바를 이용해서 데이터베이스에 접속하고 SQL문을 실행할수 있도록 하는 것
Java는 표준 인터페이스인 JDBC API를 제공한다.
데이터베이스 벤더는 JDBC인터페이스를 구현한 driver를 제공한다.
JDBC 환경 설정
Maven의 pom파일이나 build.gradle에 DBMS의 JDBC driver 의존성 구문을 추가한다.
JDBC 클래스의 생성관계
JDBC를 이용한 프로그래밍 절차
import java.sql.*;
드라이버를 로드한다.
Connection 객체를 생성한다. -DB에 접속하는 기능
Statement 객체를 생성하고 쿼리문 수행
SQL문에 결과물이 있다면 ResultSet 객체를 생성한다. - ResultSet으로 결과 받기
ResultSet rs = stmt.executeQuery("select no from user");
while ( rs.next() ) {
System.out.println(rs.getInt("no"));
}
모든 객체를 닫는다.
위의 학습자료를 바탕으로 실습한 내용
pom파일이나 MySQL 테이블 생성 등의 과정은 생략
public class Role {
private Integer roleId;
private String description;
public Role() {}
public Role(Integer roleId, String description) {
this.roleId = roleId;
this.description = description;
}
public Integer getRoleId() {
return roleId;
}
public void setRoleId(Integer roleId) {
this.roleId = roleId;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
@Override
public String toString() {
return "Role{" +
"roleId=" + roleId +
", description='" + description + '\'' +
'}';
}
}
JDBC 프로그래밍을 할때 드라이버를 로딩하고, 커넥션을 맺고, sql문을 실행할수 있는 statement객체를 만들고, 결과값을 얻어내는 ResultSet 객체가 필요하다.
SELECT문 수행하는 메소드 만들기 - roleId에 해당하는 Role객체를 반환하기
public class RoleDao {
// DB에 접속할때 사용할 정보들은 계속 사용될 것이므로 static 변수로 선언한다.
private static String dbUrl = "jdbc:mysql://localhost:3306/bootcourse_exam?serverTimezone=UTC";
private static String dbUser = "root";
private static String dbPassword = "1234";
public Role getRole(Integer roleId) {
Role role = null;
try {
// 드라이버 로딩
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
String sql = "SELECT role_id, description FROM role WHERE role_id = ?";
// 자원들을 매번 close해주는게 복잡하므로 try-with-resources 구문을 사용한다.
try (Connection connection = DriverManager.getConnection(dbUrl, dbUser, dbPassword);
PreparedStatement preparedStatement = connection.prepareStatement(sql)
) {
// 실행할 sql문의 몇번째 물음표인지가 setInt의 첫번재 파라미터(1부터 시작)
preparedStatement.setInt(1, roleId);
try (ResultSet resultSet = preparedStatement.executeQuery()) {
if(resultSet.next()) {
int id = resultSet.getInt("role_id");
String description = resultSet.getString(2);
role = new Role(id, description);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return role;
}
}
드라이버 로딩
Class.forName("com.mysql.cj.jdbc.Driver");
커넥션 맺기
Connection connection = DriverManager.getConnection(dbUrl, dbUser, dbPassword);
sql문을 실행할 수 있는 statement 객체 만들기
PreparedStatement preparedStatement = connection.prepareStatement(sql)
preparedStatement.setInt(1, roleId); → sql문의 첫번째 물음표에는 roleId가 들어갈거라는 뜻, 실행할 sql문의 몇번째 물음표인지가 setInt()의 첫번재 파라미터(1부터 시작)
ResultSet으로 쿼리문 실행한 결과 받기
ResultSet resultSet = preparedStatement.executeQuery()
resultSet.getInt("role_id"); → role_id라는 컬럼에 해당하는 값을 리턴한다.
resultSet.getString(2); → sql문에서 두번째로 적어준 컬럼의 값을 리턴한다.
INSERT문 수행하는 메소드 만들기
UPDATE와 DELETE도 이와 유사하다.
// RoleDao class
public int addRole(Role role) {
int insertCount = 0;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
String sql = "INSERT INTO role (role_id, description) VALUES (?, ?)";
try (Connection connection = DriverManager.getConnection(dbUrl, dbUser, dbPassword);
PreparedStatement preparedStatement = connection.prepareStatement(sql)){
preparedStatement.setInt(1, role.getRoleId());
preparedStatement.setString(2, role.getDescription());
insertCount = preparedStatement.executeUpdate();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return insertCount;
}
insertCount = preparedStatement.executeUpdate();
INSERT, UPDATE, DELETE는 executeUpdate 메소드를 사용한다.
INSERT, UPDATE, DELETE에 영향을 받은 row의 수가 반환된다.