JDBC (Java Database Connectivity)
- 자바를 이용한 데이터베이스 접속과 SQL 문장의 실행, 그리고 실행 결과로 얻어진 데이터의 핸들링을 제공하는 방법과 절차에 관한 규약이다.
- 자바 애플리케이션에서 DBMS를 연동하기 위해 JDBC API를 제공하고 있다.
- 애플리케이션은 JDBC API를 이용함으로써 DBMS의 종류에 상관없이 동일한 방법으로 데이터베이스를 이용할 수 있다.
- DBMS 접속 및 이용을 위한 인터페이스와 클래스들(인터페이스를 구현한 클래스)을 포함한다.
- DBMS vendor에서 제공하는 JDBC Driver를 통해 구현된다.
JDBC API
다음과 같은 두 개의 package로 구성된다.
1. java.sql
https://docs.oracle.com/javase/8/docs/api/
: Data source(일반적으로 관계형 DB)에 저장된 데이터를 접근하고 처리하기 위한 API를 제공
- Class : DariverManager
- Interface : Connection, Statement, PreparedStatement, CallableStatement, ResultSet, DatabaseMetaData, ResultSetMetaData 등
2. javax.sql
https://docs.oracle.com/javase/8/docs/api/
: 서버에 존재하는 data source를 접근하고 이용하기 위한 API를 제공
- interface : DataSource, XADaraSource
JDBC 환경 구성
-JDK 설치
-JDBC 드라이버 설치
-Maven에 다음과 같은 의존성 추가
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.45</version>
</dependency>
JDBC API 사용 프로그래밍 방법
1. JDBC 관련 Package import
import java.sql.*;
2. JDBC Driver를 로딩 및 등록
Class.forName( "com.mysql.jdbc.Driver" );
3. DBMS와의 Connection 객체를 생성한다.
String dburl = "jdbc:mysql://localhost/dbName";
Connection con = DriverManager.getConnection ( dburl, ID, PWD );
4. Statement 객체를 생성 및 질의 수행
Statement stmt = con.createStatement();
5. SQL문에 결과물이 있다면 ResultSet 객체를 생성한다.
ResultSet rs = stmt.executeQuery("select no from user" );
// ResultSet을 통해 접근
while ( rs.next() )
System.out.println( rs.getInt( "no") );
// 참고
stmt.execute(“query”); //any SQL
stmt.executeQuery(“query”); //SELECT
stmt.executeUpdate(“query”); //INSERT, UPDATE, DELETE
6. 모든 객체를 닫는다 = 자원 반납(ResultSet, Statement, Connection)
rs.close();
stmt.close();
con.close();
소스코드 (SELECT)
package kr.or.connect.jdbcexam.dao;
import kr.or.connect.jdbcexam.dto.*;
import java.sql.*;
public class RoleDao {
private static String dburl = "jdbc:mysql://localhost:3306/dbname";
private static String dbUser = "userId";
private static String dbpasswd = "userPwd";
public Role getRole(Integer roleId) {
Role role = null;
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(dburl, dbUser, dbpasswd);
String sql = "SELECT description, role_id "
+ "FROM ROLE "
+ "WHERE role_id = ?";
ps = conn.prepareStatement(sql);
ps.setInt(1, roleId);
rs = ps.executeQuery();
if (rs.next()) {
String description = rs.getString(1);
int id = rs.getInt("role_id");
role = new Role(id, description);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if(rs != null) {
try {
rs.close();
} catch(SQLException e) {
e.printStackTrace();
}
}
if(ps != null) {
try {
ps.close();
} catch(SQLException e) {
e.printStackTrace();
}
}
if(conn != null) {
try {
conn.close();
} catch(SQLException e) {
e.printStackTrace();
}
}
}
return role;
}
public int addRole(Role role) {
int insertCount = 0;
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
String sql = "INSERT INTO role (role_id, description) VALUES ( ?, ? )";
try (Connection conn = DriverManager.getConnection(dburl, dbUser, dbpasswd);
PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setInt(1, role.getRoleId());
ps.setString(2, role.getDescription());
insertCount = ps.executeUpdate();
} catch (Exception ex) {
ex.printStackTrace();
}
return insertCount;
}
public List<Role> getRoles() {
List<Role> list = new ArrayList<>();
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
String sql = "SELECT description, role_id FROM role order by role_id desc";
try (Connection conn = DriverManager.getConnection(dburl, dbUser, dbpasswd);
PreparedStatement ps = conn.prepareStatement(sql)) {
try (ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
String description = rs.getString(1);
int id = rs.getInt("role_id");
Role role = new Role(id, description);
list.add(role); // list에 반복할때마다 Role인스턴스를 생성하여 list에 추가한다.
}
} catch (Exception e) {
e.printStackTrace();
}
} catch (Exception ex) {
ex.printStackTrace();
}
return list;
}
public int deleteRole(Integer roleId) {
int deleteCount = 0;
Connection conn = null;
PreparedStatement ps = null;
try {
Class.forName( "com.mysql.jdbc.Driver" );
conn = DriverManager.getConnection ( dburl, dbUser, dbpasswd );
String sql = "DELETE FROM role WHERE role_id = ?";
ps = conn.prepareStatement(sql);
ps.setInt(1, roleId);
deleteCount = ps.executeUpdate();
}catch(Exception ex) {
ex.printStackTrace();
}finally {
if(ps != null) {
try {
ps.close();
}catch(Exception ex) {}
} // if
if(conn != null) {
try {
conn.close();
}catch(Exception ex) {}
} // if
} // finally
return deleteCount;
}
public int updateRole(Role role) {
int updateCount = 0;
Connection conn = null;
PreparedStatement ps = null;
try {
Class.forName( "com.mysql.jdbc.Driver" );
conn = DriverManager.getConnection ( dburl, dbUser, dbpasswd );
String sql = "update role set description = ? where role_id = ?";
ps = conn.prepareStatement(sql);
ps.setString(1, role.getDescription());
ps.setInt(2, role.getRoleId());
updateCount = ps.executeUpdate();
}catch(Exception ex) {
ex.printStackTrace();
}finally {
if(ps != null) {
try {
ps.close();
}catch(Exception ex) {}
} // if
if(conn != null) {
try {
conn.close();
}catch(Exception ex) {}
} // if
} // finally
return updateCount;
}
}
참고
웹 백엔드
부스트코스 무료 강의
www.boostcourse.org
'Dev > Spring' 카테고리의 다른 글
[Spring Boot] Heroku 서버 배포하기 (0) | 2022.05.18 |
---|---|
[Spring Boot] CORS 설정 시 addCorsMappings 에러 해결 (0) | 2022.05.03 |
[Spring boot] JPA 카멜 표기법으로 이름 설정하기 (0) | 2022.04.08 |
[Spring boot] 404 Not Found 에러 해결 - 경로 (0) | 2022.04.08 |
[Spring] Maven이란? (0) | 2022.02.08 |