[멀캠|Java] 21일차 수업
KB IT’s Your Life 4기 - Java JDBC 21일차
JDBC
JDBC란?
자바는 DB와 연결해서 데이터 입출력 작업을 할 수 있도록 JDBC라이브러리(java.sql 패키지)를 제공한다.
- JDBC는 데이터베이스관리시스템의 종류와 상관없이 동일하게 사용할 수 있는 클래스와 인터페이스로 구성된다.
- DBMS 종류: 오라클, MySQL, MariaDB, SQLServer
JDBC Driver란?
JDBC인터페이스를 구현한 것으로 DBMS마다 별도로 다운로드 받아 사용한다.
- DriverManager 클래스: JDBC Driver를 관리하며 DB와 연결해서 Connection 구현 객체 생성.
- Connection 클래스 : 연결만하는 역할
- Statement 인터페이스 : 텍스트 형태로. SQL의 DDL,DML문 실행시 사용
- PreparedStatement : 바이너리 형태로 대부분 Statement말고 이걸 사용. SQL의 DDL,DML문 실행시 사용
- CallableStatement: DB에 저장된 프로시저와 함수 호출
- ResultSet: DB에서 가져온 데이터 읽음
JDBC 코딩 순서
- 사용하려는 DBMS의 jdbc 드라이버 파일을 classpath에 등록
- import java.sql.*
- 드라이버로딩 : Class.forName(“드라이버 클래스 전체 이름”)
- DBMS 연결 : DriverManager.getConnection(“jdbc프로토콜”, “ID”, “비번”)
- Statement 생성 : SQL 전송 및 결과 수신 -> statement(해킹 가능성 존재, 성능상 좀 떨어짐, 잘 안씀) / preparedStatement(많이 씀) / callableStatement 3가지 방식이 있음
-
SQL 전송, 결과 수신 : DML전송하면 적용된 행의 개수가 반환 -> insert, update, delete select 전송하면 ResultSet 반환. -> 결과없음, 값1, 1개열, 1개행, 여러행 여러열 - 결과처리 : 값 추출
- 자원닫기 : 사용의 역순 -> ResultSet.close(), Statement.close(), Connection.close()
JDBC 구현
package day_0801;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class JDBCInsertExam {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 1. Jdbc Driver 로딩
Class.forName("oracle.jdbc.driver.OracleDriver"); // oracle.jdbc.driver 패키지명 OracleDriver 클래스명 -> 동적로딩
System.out.println("Jdbc Driver 로딩 성공");
String url = "jdbc:oracle:thin:@127.0.0.1:1521/XE";
String user = "hr";
String password = "HR";
// 2. DBMS 연결
Connection con = DriverManager.getConnection(url, user, password);
System.out.println("DBMS 로그인 성공");
// 3. SQL 작성
String sql = "INSERT INTO MEMBERS(id, name, password, status)";
sql += "VALUES('user03','유저3','333','N')";
// 4. Statement 생성
PreparedStatement pstmt = con.prepareStatement(sql);
// 5. 데이터 설정
// 6. sql 전송 및 결과 수신
// DML 전송 : executeUpdate() : int
// SELECT 전송 : executeQuery() : ResultSet
int count = pstmt.executeUpdate();
System.out.println(count + "행 입력완료");
// 7. 자원 반환
pstmt.close();
con.close();
}
}
동적 value 넣기
package day_0801;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class JDBCInsertExam2 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 1. Jdbc Driver 로딩
Class.forName("oracle.jdbc.driver.OracleDriver"); // oracle.jdbc.driver 패키지명 OracleDriver 클래스명 -> 동적로딩
System.out.println("Jdbc Driver 로딩 성공");
String url = "jdbc:oracle:thin:@127.0.0.1:1521/XE";
String user = "hr";
String password = "HR";
// 2. DBMS 연결
Connection con = DriverManager.getConnection(url, user, password);
System.out.println("DBMS 로그인 성공");
// 3. SQL 작성
String sql = "INSERT INTO MEMBERS(id, name, password, status)";
sql += "VALUES(?,?,?,?)";
// 4. Statement 생성
PreparedStatement pstmt = con.prepareStatement(sql);
// 5. 데이터 설정
pstmt.setString(1, "user05");
pstmt.setString(2, "유저5");
pstmt.setString(3, "555");
pstmt.setString(4, "N");
// 6. sql 전송 및 결과 수신
// DML 전송 : executeUpdate() : int
// SELECT 전송 : executeQuery() : ResultSet
int count = pstmt.executeUpdate();
System.out.println(count + "행 입력완료");
// 7. 자원 반환
pstmt.close();
con.close();
}
}
data 수정 UPDATE
package day_0801;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class JDBCUpdateExam {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 1. Jdbc Driver 로딩
Class.forName("oracle.jdbc.driver.OracleDriver"); // oracle.jdbc.driver 패키지명 OracleDriver 클래스명 -> 동적로딩
System.out.println("Jdbc Driver 로딩 성공");
String url = "jdbc:oracle:thin:@127.0.0.1:1521/XE";
String user = "hr";
String password = "HR";
// 2. DBMS 연결
Connection con = DriverManager.getConnection(url, user, password);
System.out.println("DBMS 로그인 성공");
// 3. SQL 작성
String sql = "UPDATE MEMBERS set status = ?";
sql += "WHERE id = ?";
// 4. Statement 생성
PreparedStatement pstmt = con.prepareStatement(sql);
// 5. 데이터 설정
pstmt.setString(1, "Y");
pstmt.setString(2, "user05");
// 6. sql 전송 및 결과 수신
// DML 전송 : executeUpdate() : int
// SELECT 전송 : executeQuery() : ResultSet
int count = pstmt.executeUpdate();
System.out.println(count + "행 수정완료");
// 7. 자원 반환
pstmt.close();
con.close();
}
}
데이터 삭제 delete
package day_0801;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class JDBCDeleteExam {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 1. Jdbc Driver 로딩
Class.forName("oracle.jdbc.driver.OracleDriver"); // oracle.jdbc.driver 패키지명 OracleDriver 클래스명 -> 동적로딩
System.out.println("Jdbc Driver 로딩 성공");
String url = "jdbc:oracle:thin:@127.0.0.1:1521/XE";
String user = "hr";
String password = "HR";
// 2. DBMS 연결
Connection con = DriverManager.getConnection(url, user, password);
System.out.println("DBMS 로그인 성공");
// 3. SQL 작성
String sql = "DELETE MEMBERS ";
sql += "WHERE id = ?";
// 4. Statement 생성
PreparedStatement pstmt = con.prepareStatement(sql);
// 5. 데이터 설정
pstmt.setString(1, "user05");
// 6. sql 전송 및 결과 수신
// DML 전송 : executeUpdate() : int
// SELECT 전송 : executeQuery() : ResultSet
int count = pstmt.executeUpdate();
System.out.println(count + "행 삭제완료");
// 7. 자원 반환
pstmt.close();
con.close();
}
}
ResultSet
String sql = "select count(*) from members"; -> 무조건 숫자 1개가 반환
String sql = "select count(*) from members where id=?"; -> id가 PK이면 0개 또는 1개 행 반환
String sql = "select id from members"; => 1개 열이 반환. 행 개수는 0~N개
String sql = "select * from members"; => N개 열, N개 행이 반환.
package day_0801;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class JDBCSelectExam {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 1. Jdbc Driver 로딩
Class.forName("oracle.jdbc.driver.OracleDriver"); // oracle.jdbc.driver 패키지명 OracleDriver 클래스명 -> 동적로딩
System.out.println("Jdbc Driver 로딩 성공");
String url = "jdbc:oracle:thin:@127.0.0.1:1521/XE";
String user = "hr";
String password = "HR";
// 2. DBMS 연결
Connection con = DriverManager.getConnection(url, user, password);
System.out.println("DBMS 로그인 성공");
// 3. SQL 작성
String sql = "SELECT count(*) FROM MEMBERS ORDER BY id ";
// 4. Statement 생성
PreparedStatement pstmt = con.prepareStatement(sql);
// 5. 데이터 설정
// 6. sql 전송 및 결과 수신
// DML 전송 : executeUpdate() : int
// SELECT 전송 : executeQuery() : ResultSet
ResultSet rs = pstmt.executeQuery();
rs.next();
int count = rs.getInt(1); //1대신, "count(*)"써도 됨.
// 7. 자원 반환
pstmt.close();
con.close();
System.out.println("count = " + count );
}
}
모든 데이터 가져오기
package day_0801;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class JDBCSelectExam3 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 1. Jdbc Driver 로딩
Class.forName("oracle.jdbc.driver.OracleDriver"); // oracle.jdbc.driver 패키지명 OracleDriver 클래스명 -> 동적로딩
System.out.println("Jdbc Driver 로딩 성공");
String url = "jdbc:oracle:thin:@127.0.0.1:1521/XE";
String user = "hr";
String passwd = "HR";
// 2. DBMS 연결
Connection con = DriverManager.getConnection(url, user, passwd);
System.out.println("DBMS 로그인 성공");
// 3. SQL 작성
String sql = "SELECT * FROM MEMBERS ORDER BY id ";
// 4. Statement 생성
PreparedStatement pstmt = con.prepareStatement(sql);
// 5. 데이터 설정
// 6. sql 전송 및 결과 수신
// DML 전송 : executeUpdate() : int
// SELECT 전송 : executeQuery() : ResultSet
ResultSet rs = pstmt.executeQuery();
while(rs.next()) {
String id = rs.getString("id");
String name = rs.getString("name");
String password = rs.getString("password");
String status = rs.getString("status");
System.out.println(id + ", " + name +", "+ password + "," +status);
};
int count = rs.getInt(1);
// 7. 자원 반환
pstmt.close();
con.close();
System.out.println("count = " + count );
}
}
package day_0801;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class JDBCSelectExam3 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 1. Jdbc Driver 로딩
Class.forName("oracle.jdbc.driver.OracleDriver"); // oracle.jdbc.driver 패키지명 OracleDriver 클래스명 -> 동적로딩
System.out.println("Jdbc Driver 로딩 성공");
String url = "jdbc:oracle:thin:@127.0.0.1:1521/XE";
String user = "hr";
String passwd = "HR";
// 2. DBMS 연결
Connection con = DriverManager.getConnection(url, user, passwd);
System.out.println("DBMS 로그인 성공");
// 3. SQL 작성
String sql = "SELECT * FROM MEMBERS ORDER BY id ";
// 4. Statement 생성
PreparedStatement pstmt = con.prepareStatement(sql);
// 5. 데이터 설정
// 6. sql 전송 및 결과 수신
// DML 전송 : executeUpdate() : int
// SELECT 전송 : executeQuery() : ResultSet
ResultSet rs = pstmt.executeQuery();
while(rs.next()) {
String id = rs.getString("id");
String name = rs.getString("name");
String password = rs.getString("password");
String status = rs.getString("status");
System.out.println(id + ", " + name +", "+ password + "," +status);
};
int count = rs.getInt(1);
// 7. 자원 반환
pstmt.close();
con.close();
System.out.println("count = " + count );
}
}
DTO에 저장해서 이력을 모두 출력
package day_0801;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import day_0801.dto.LoginDto;
public class test5 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1. Jdbc Driver 로딩
Class.forName("oracle.jdbc.driver.OracleDriver");
System.out.println("Jdbc Driver 로딩 성공");
String url="jdbc:oracle:thin:@127.0.0.1:1521/XE";
String user="hr";
String password="HR";
//2. DBMS 연결
Connection con = DriverManager.getConnection(url, user, password);
System.out.println("DBMS 로그인 성공");
//3. SQL 작성
String sql = "SELECT * FROM LOGIN, members "; //빈칸필수
sql += "where login.member_id = members.id";
//4. Statement 생성
PreparedStatement pstmt = con.prepareStatement(sql);
//5. 데이터 설정
//6. SQL 전송, 결과수신
// DML 전송: executeUpdate() : int
// SELECT전송: excuteQuery() : ResultSet
ArrayList<LoginDto> loginList = new ArrayList<LoginDto>();
ResultSet rs = pstmt.executeQuery();
while(rs.next()) {//조회결과가 있다
String member_id = rs.getString("member_id");
String login_date = rs.getString("login_date");
String login_time = rs.getString("login_time");
String logout_date = rs.getString("logout_date");
String logout_time = rs.getString("logout_time");
String name = rs.getString("name");
LoginDto dto = new LoginDto(member_id, login_date, login_time, logout_date, logout_time, name); //
loginList.add(dto);
};
//7. 자원반환
pstmt.close();
con.close();
System.out.println(loginList);
}
}
public class LoginDto {
private String member_id, login_date, login_time, logout_date, logout_time, name;
public LoginDto() {
}
public LoginDto(String member_id, String login_date, String login_time, String logout_date, String logout_time, String name) {
super();
this.member_id = member_id;
this.login_date = login_date;
this.login_time = login_time;
this.logout_date = logout_date;
this.logout_time = logout_time;
this.name = name;
}
public String getMember_id() {
return member_id;
}
public void setMember_id(String member_id) {
this.member_id = member_id;
}
public String getLogin_date() {
return login_date;
}
public void setLogin_date(String login_date) {
this.login_date = login_date;
}
public String getLogin_time() {
return login_time;
}
public void setLogin_time(String login_time) {
this.login_time = login_time;
}
public String getLogout_date() {
return logout_date;
}
public void setLogout_date(String logout_date) {
this.logout_date = logout_date;
}
public String getLogout_time() {
return logout_time;
}
public void setLogout_time(String logout_time) {
this.logout_time = logout_time;
}
public String getname() {
return name;
}
public void setname(String name) {
this.name = name;
}
@Override
public String toString() {
return "member_id=" + member_id + ", login_date=" + login_date + ", login_time=" + login_time
+ ", logout_date=" + logout_date + ", logout_time=" + logout_time +", name="+name;
}
}