1.JDBC?
:JDBC(Java Database Connectivity)는 웹 어플리케이션과 데이터베이스를 연결하는 자바 API이다. JDBC는 인터페이스를 제공하여 서로 다른 DBMS를 공통의 코드로 사용할 수 있게한다.
2.JDBC 프로그래밍 흐름
2.1 전체흐름
1) 드라이버에 로드하기
2) 연결 생성하기
3) 문장 실행하기
4) 결과집합 사용하기
(1) Class.forName("oracle.jdbc.driver.OracleDriver) - 드라이버 로드하기
(2) Connection con = DriverManager.getConnection(...) - 연결 생성하기
(3) Statement st = con.createStatement() - 문장 실행하기
(4) ResultSet rs = st.executeQuery(sql) - 해당 쿼리문이 들어가는 결과집합 사용하기, 깡통(rs)이 생긴다.
(5)rs.next() - 다음 Row값을 읽어 깡통(rs)에 넣는다
(6) String title = rs.getString("title") - 깡통에서 title에 해당하는 데이터를 가져온다.
3.JDBC 접속과 CRUD
3.1.JDBC 접속
*dburl은 DBMS마다 다르다. 해당 DBMS 회사 사이트에서 사용법을 보고 사용해야한다.
3.2 CRUD
①SQL문을 작성한다
②'?'를 제외한 SQL(Prepared statement)문을 준비한다.
③'?'를 채워 SQL문을 완성한다.
④완성된 SQL문을 실행한다.
①SQL문을 작성한다
②'?'를 제외한 SQL(Prepared statement)문을 준비한다.
③첫 번째 물음표에 10.5를 채운다.
④완성된 SQL문을 DBMS안에서 실행한다. 실핸된 결과를 rs(Result set)이 가리킨다.
⑤데이터를 가져와(rs.next()) 가져온 데이터를 EmpDto에 담는다.
4. 예시
RoleDao.java
package kr.or.connect.jdbcexam.dao;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.sql.Connection;
import java.sql.PreparedStatement;
import kr.or.connect.jdbcexam.dto.Role;
public class RoleDao {
private static String dburl = "jdbc:mysql://localhost:3306/cutePin?serverTimezone=Asia/Seoul&useSSL=false";
private static String dbUser = "callie";
private static String dbpasswd = "connect123!@#";
public Role getRole(Integer roleId) {
Role role = null;
Connection conn =null;
PreparedStatement ps =null;
ResultSet rs = null;
try {
//load the driver to memory?
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(dburl,dbUser,dbpasswd);
//? 에 다른게 들어갈 수 있다. set 으로 설정할 수 있음
String sql = "SELECT role_id,description FROM role WHERE role_id =?";
//
ps=conn.prepareStatement(sql);
ps.setInt(1, roleId);
rs = ps.executeQuery();
// 있으면, 객체 리턴. 없으면 false리턴
if(rs.next()) {
int id= rs.getInt(1);//rs.getInt("role_id"); 이렇게 해도 된다.
String description = rs.getString(2);
role = new Role(id,description);
}
}catch(Exception e){
e.printStackTrace();
}finally{
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(ps!=null) {
try {
ps.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(rs!=null) {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
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 catch문 신기
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<>();
//driver 다운로드
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";
//위에서 받은 driver manager에서 Connection 객체를 받고, Connection 객체에서 preparedStatement 객체를 받는다.
try(Connection conn = DriverManager.getConnection(dburl,dbUser,dbpasswd);
PreparedStatement ps = conn.prepareStatement(sql)){
//try문 안에 또 try문이 있다.
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);
}
}catch(Exception e){
e.printStackTrace();
}
}catch(Exception ex) {
ex.printStackTrace();
}
return list;
}
public int deleteRole(int 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) {
}
}
}
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(conn!=null) {
try {
conn.close();
}catch(Exception ex) {}
}
}
return updateCount;
}
}
참조
-https://yejip.com/web/2021-06-16-JDBC2/
-https://velog.io/@dyunge_100/DB-JDBC%EC%97%90-%EB%8C%80%ED%95%9C-%EC%A0%95%EB%A6%AC
SQL부터 Spring Data JPA까지 (https://www.youtube.com/watch?v=Kdt4TpP4nm8&list=PLHpaQi-LiUCxVX_GuPu42vdAbcBz8Bvdc&index=24&ab_channel=%EB%B6%80%EB%B6%80%EA%B0%9C%EB%B0%9C%EB%8B%A8-%EC%A6%90%EA%B2%81%EA%B2%8C%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EB%B0%B0%EC%9A%B0%EA%B8%B0)