JDBC(Java Database Connectivity) 프로그래밍
자바 프로그래밍과 DBMS를 연동하는 작업으로, DB에 직접 접근하는 것이 아니라 DBMS(MySQL)와 네트워크로 연결해 데이터 처리를 요청하고 결과를 응답받는 구조이다.
이 과정을 진행하려면 드라이버(jar) 파일을 프로젝트에 포함시켜야 한다.
File > Project Structure... 실행 -> Libraries 선택 -> '+' 버튼 클릭 > 'Java' 선택 -> 외부 jar 파일의 위치를 찾아 포함
처리 단계)
- DBMS용 드라이버 로드
- 드라이버를 통한 DBMS 접속(IP, 계정, 비밀번호)
- 요청 및 응답 처리
- 접속 해제
예제) 흐름 파악하기
package dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DataDao {
public static void main(String[] args) {
Connection conn = null;
try {
// 1. 드라이버 로드
Class.forName("com.mysql.cj.jdbc.Driver");
// 드라이버 매니저 : 외부 프로그램과 네트워크로 접속할 때
// 접속용 드라이버 라이브러리를 관리하는 객체
System.out.println("드라이버 로드 성공");
// 2. DB에 접속 : 접속 관리 객체 Connection
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/devdb",
"dev01", "12341234"
);
System.out.println("접속 성공");
} catch (ClassNotFoundException e) {
e.printStackTrace();
System.out.println("드라이버 로드 실패");
} catch (SQLException se) {
se.printStackTrace();
System.out.println("접속 실패");
} finally {
// 통로를 해제하는 작업
try {
System.out.println("접속 해제 성공");
conn.close();
} catch (SQLException e) {
// 여기에는 아무것도 작성하지 않음
}
}
}
}
예제) 회원가입/로그인
- DataDto(주고 받을 데이터 변수를 담음)
package dto;
import lombok.Data;
public class MemberDto {
private String m_id;
private String m_pwd;
private String m_name;
private int m_age;
private String m_job;
public String getM_id() { return m_id; }
public void setM_id(String m_id) { this.m_id = m_id; }
public String getM_pwd() { return m_pwd; }
public void setM_pwd(String m_pwd) { this.m_pwd = m_pwd; }
public String getM_name() { return m_name; }
public void setM_name(String m_name) {this.m_name = m_name; }
public int getM_age() { return m_age; }
public void setM_age(int m_age) { this.m_age = m_age; }
public String getM_job() { return m_job; }
public void setM_job(String m_job) { this.m_job = m_job; }
// 사용 안 함
public String getM_grade() { return m_grade; }
public void setM_grade(String m_grade) { this.m_grade = m_grade; }
public int getM_point() { return m_point; }
public void setM_point(int m_point) { this.m_point = m_point; }
private String m_grade;
private int m_point;
} // DB 테이블의 컬럼명과 동일하게 변수명을 설정
- DataDao(DB 접속)
package dao;
import dto.MemberDto;
import java.sql.*;
public class DataDao2 {
private String drv = "com.mysql,cj.jdbc.Driver";
private String url = "jdbc:mysql://127.0.0.1:3306/devdb";
private String user = "dev01";
private String pwd = "12341234";
Connection conn; // 접속 관리 객체 선언
// SQL 실행 객체
Statement stmt;
PreparedStatement pstmt; // upgrade ver
ResultSet rs; // 결과 집합 저장 객체
// 드라이버 로드의 경우 최초 1번만 실행하면 됨 (생성자에서 처리)
public DataDao2() {
try {
Class.forName(drv);
} catch (ClassNotFoundException e) {
System.out.println("드라이버 로드 실패");
}
} // 생성자 end
// 해제 전문 메소드 close(통로를 유지하려면 메모리가 소모된다)
private void close() {
try {
if (rs != null) rs.close();
if (stmt != null) stmt.close();
// 접속 관리 객체가 null이 아닌 경우에만 해제
if(conn != null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
} // close end
// 접속 테스트 메소드
public void connectionTest() {
try {
conn = DriverManager.getConnection(url, user, pwd);
System.out.println("접속 성공");
} catch (SQLException e) {
e.printStackTrace();
System.out.println("접속 실패");
} finally {
close(); // 해제 메소드 사용
}
}
// 로그인 => 비밀번호를 검색해 오는 메소드
public String selectPwd(String m_id) {
String dbpwd = null;
try {
// DB 접속
conn = DriverManager.getConnection(url, user, pwd);
// SQL 실행 객체 생성
stmt = conn.createStatement();
// SQL 쿼리문장을 작성
String query = "SELECT m_pwd FROM member WHERE m_id = '" + m_id + "'" ;
// SELECT m_pwd FROM member WHERE m_id = '입력값'
String query2 = "SELECT m_pwd FROM member " + "WHERE m_id = ?";
// 사용자의 입력값이 위치하는 곳에 '?'로 작성
// ? 위치에 문자열일 경우 자동으로 ''를 붙여줌
// 숫자값일 경우 '' 없이 추가됨
pstmt = conn.prepareStatement(query2);
pstmt.setString(1, m_id);
// rs = stmt.executeQuery(query); // 쿼리문을 실행하는 메소드
rs = pstmt.executeQuery(); // 미리 쿼리문을 준비해 미완성된 부분을 채워넣어 실행하는 메소드
// SELECT 쿼리문을 이용하는 변수
if (rs.next()) { // rs.next() : select 결과가 있을 경우 true, 없을 경우 false
dbpwd = rs.getString("m_pwd");
// getString(컬럼의 위치(순번) 또는 컬럼명)
}
} catch (SQLException e) {
e.printStackTrace();
System.out.println("DB 처리 실패");
}
return dbpwd;
}
// 회원가입
public void insetMember(MemberDto md) {
try {
conn = DriverManager.getConnection(url, user, pwd);
// 미완성 쿼리문 작성
String query = "INSERT INTO member " +
"VALUES (?,?,?,?,?,default,default)";
// 실행 객체 생성
pstmt = conn.prepareStatement(query);
// 미완성 부분 채워넣기
pstmt.setString(1, md.getM_id());
pstmt.setString(2, md.getM_pwd());
pstmt.setString(3, md.getM_name());
pstmt.setInt(4, md.getM_age());
pstmt.setString(5, md.getM_job());
int r = pstmt.executeUpdate();
// insert, update, delete 작업은 모두 executeUpdate()로 실행
// 작업 실패 시 0을 반환
if (r != 0) {
System.out.println("입력 성공");
} else {
System.out.println("입력 실패");
}
} catch (SQLException e) {
System.out.println("DB 처리 실패");
}
}
} // class end
- JoinClass(회원가입 run)
import dao.DataDao2;
import dto.MemberDto;
import java.util.Scanner;
public class MainClass2 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
DataDao2 dao = new DataDao2();
MemberDto md = new MemberDto();
System.out.println("회원가입");
System.out.println("-------");
System.out.print("ID : ");
md.setM_id(scan.nextLine());
System.out.print("PWD : ");
md.setM_pwd(scan.nextLine());
System.out.print("NAME : ");
md.setM_name(scan.nextLine());
System.out.print("AGE : ");
md.setM_age(scan.nextInt());
System.out.print("JOB : ");
md.setM_job(scan.nextLine());
dao.insetMember(md);
}
}
- LoginClass(로그인 run)
import dao.DataDao2;
import java.util.Scanner;
public class MainClass {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
DataDao2 dao = new DataDao2();
dao.connectionTest();
System.out.println("로그인 처리");
System.out.print("아이디 : ");
String m_id = scan.nextLine();
System.out.print("비밀번호 : ");
String m_pwd = scan.nextLine();
String dbpwd = dao.selectPwd(m_id);
if (m_pwd.equals(dbpwd)) {
System.out.println("로그인 성공");
} else {
System.out.println("비밀번호 오류");
}
}
}
'JDBC' 카테고리의 다른 글
JDBC_3강(spr) (0) | 2022.11.01 |
---|---|
JDBC_2강 (0) | 2022.10.09 |