[DB] JDBC, Java DataBase Connectivity
JDBC
- Java DataBase Connectivity
- 자바가 데이터베이스에 접속해서 SQL을 실행할 수 있도록 하는 표준이다.
- java.sql 패키지와 javax.sql 패키지에 관련 인터페이스와 클래스가 존재한다.
주요 API
- Connection 인터페이스
- 자바프로그램과 데이터베이스간의 연결을 담당하는 객체다.
- Statement createStatement()
- SQL전송을 담당하는 Statement객체를 반환한다.
- PreparedStatement prepareStatement(String sql)
- SQL전송을 담당하는 Statement객체를 반환한다.
- void commit()
- SQL실행결과를 DB에 반영시킨다.
- void rollback()
- SQL실행결과의 DB 반영을 취소시킨다.
- void close()
- DB와의 접속을 해제한다.
- PreparedStatement 인터페이스
- SQL의 전송을 담당하는 객체다.
- int executeUpdate()
- INSERT, UPDATE, DELETE 쿼리를 DB로 전송하고, 실행결과를 반환한다.
- ResultSet executeQuery()
- SELECT 쿼리를 DB로 전송하고, 조회결과를 반환한다.
- void setXXX(int index, XXX value)
- ?위치에 실제값(파라미터값)을 설정한다.
- void setString(int index, String value)
- void setInt(int index, int value)
- void setLong(int index, long value)
- void setDouble(int index, double value)
- void setDate(int index, Date value)
- void close()
- DB 연결 자원을 해제한다.
- ResultSet 인터페이스
- SELECT 쿼리문의 조회결과를 담당하는 객체다.
- boolean next()
- 커서를 다음행으로 이동시킨다. 데이터행이 존재하면 true를 반환한다.
- XXX getXXX(String columnName)
- 컬럼명에 해당하는 값을 반환한다.
- String getString(String columnName);
- int getInt(String columnName);
- long getLong(String columnName);
- double getDouble(String columnName);
- Date getDate(String columnName);
- void close()
- DB 연결 자원을 해제한다.
- DriverManager 클래스
- JDCB 표준을 구현한 JDBC드라이버를 관리하는 클래스다.
- JDBC드라이버는 각 DBMS제작사가 자사의 DBMS에 엑세스할 수 있도록 위에 언급한 인터페이스를 구현한 클래스들의 모음이다.
- Connection getConnection(String url, String username, String password)
- url이 가르키는 데이터베이스에 지정된 계정정보로 연결을 시도한 후 연결을 담당하는 Connection객체를 반환한다.
## JDBC API를 사용해서 자바와 데이터베이스 연동하기
- 자바와 데이터베이스 연동 절차
- JDBC 드라이브 JVM 메모리에 로딩하기
Class.forName("oracle.jdbc.OracleDriver");
- DBMS와 연결을 담당하는 Connection객체 획득하기
String url = "jdbc:oracle:thin:@localhost:1521:xe"; String username = "hta"; String password = "zxcv1234"; Connection connection = DriverManager.getConnection(url, username, password);
- DDBMS에 SQL 전송과 실행을 담당하는 PreparedStatement객체 획득하기
String sql = "insert into department(deptno, dname, part, build) values (?, ?, ?, ?)"; PreparedStatement pstmt = connection.prepareStatement(slq);
- SQL의 ?에 값을 대응시키기
pstmt.setInt(1, 204); pstmt.setString(2, '정밀기계공학과'); pstmt.setInt(3, 200); pstmt.setString(4, '정밀기계실험관');
- SQL을 DBMS에 보내서 실행시키기
pstmt.executeUpdate();
- DBMS와 연결된 모든 자원을 해제하기
pstmt.close(); connection.close();
데이터 조회하기
- JDBC 드라이브 JVM 메모리에 로딩하기
- 레코드 한 개 조회하기
public Department getDepartmentByNo(int deptNo) throws SQLException { Department department = null; String sql = "String * from department where deptno = ?"; String driverClassName = "oracle.jdbc.OracleDriver"; String url = "jdbc:oracle:thin:@localhost:1521:xe"; String username = "hta"; String password = "zxcv1234"; Class.forName(driverClassName); Connection connection = DriverManager.getConnection(url, username, password); PreparedStatement pstmt = connection.prepareStatement(sql); pstmt.setInt(1, deptNo); ResultSet rs = pstmt.executeQuery(); if (rs.next()) { department = new Department(); department.setNo(rs.getInt("deptno")); department.setName(rs.getString("dname")); department.setPart(rs.getInt("part")); department.setBuild(rs.getString("build")); } rs.close(); pstmt.close(); connection.close(); return department; }
- 레코드 여러 개 조회하기
public List<Department> getAllDepartments(int deptNo) throws SQLException { List<Department> departmentList = new ArrayList<>(); String sql = "String * from department"; String driverClassName = "oracle.jdbc.OracleDriver"; String url = "jdbc:oracle:thin:@localhost:1521:xe"; String username = "hta"; String password = "zxcv1234"; Class.forName(driverClassName); Connection connection = DriverManager.getConnection(url, username, password); PreparedStatement pstmt = connection.prepareStatement(sql); ResultSet rs = pstmt.executeQuery(); while (rs.next()) { Department department = new Department(); department.setNo(rs.getInt("deptno")); department.setName(rs.getString("dname")); department.setPart(rs.getInt("part")); department.setBuild(rs.getString("build")); departmentList.add(department); } rs.close(); pstmt.close(); connection.close(); return departmentList; }
- 레코드를 추가하기
public void insertDepartment(Department department) throws SQLException { String sql = "insert into department(deptno, dname, part, build) values (?,?,?,?)"; String driverClassName = "oracle.jdbc.OracleDriver"; String url = "jdbc:oracle:thin:@localhost:1521:xe"; String username = "hta"; String password = "zxcv1234"; Class.forName(driverClassName); Connection connection = DriverManager.getConnection(url, username, password); PreparedStatement pstmt = connection.prepareStatement(sql); pstmt.setInt(1, department.getNo()); pstmt.setString(2, department.getName()); pstmt.setInt(3, department.getPart()); pstmt.setString(4, department.getBuild()); pstmt.executeUpdate(); pstmt.close(); connection.close(); }
- 레코드 삭제하기
public void deleteDepartmentByNo(int deptNo) throws SQLException { String sql = "delete from department where deptno = ?"; String driverClassName = "oracle.jdbc.OracleDriver"; String url = "jdbc:oracle:thin:@localhost:1521:xe"; String username = "hta"; String password = "zxcv1234"; Class.forName(driverClassName); Connection connection = DriverManager.getConnection(url, username, password); PreparedStatement pstmt = connection.prepareStatement(sql); pstmt.setInt(1, deptNo); pstmt.executeUpdate(); pstmt.close(); connection.close(); }
- 레코드 변경하기
public void updateDepartment(Department department) throws SQLException { String sql = "update department "; sql += " set "; sql += " dname = ?, "; sql += " part = ?, "; sql += " build = ? "; sql += " where deptno = ? " String driverClassName = "oracle.jdbc.OracleDriver"; String url = "jdbc:oracle:thin:@localhost:1521:xe"; String username = ""; String password = ""; Class.forName(driverClassName); Connection connection = DriverManager.getConnection(url, username, password); PreparedStatement pstmt = connection.prepareStatement(sql); pstmt.setString(1, department.getName()); pstmt.setInt(2, department.getPart()); pstmt.setString(3, department.getBuild()); pstmt.setInt(4, department.getNo()); pstmt.executeUpdate(); pstmt.close(); connection.close(); }