ALLYES
[2022년 청년친화형 기업 ESG지원 사업 - 17] 본문
일시 : 2022.09.27
시간 : 9:00 ~ 18:00
오전/오후 : Java
- JDBC(Java DataBase Connectivity)
- 개념
- 자바 DB간 연결해주는 API
- 실행 단계
- JDBC Driver 동적 로딩
- 데이터베이스 연결
- SQL(Query)문 전송
- 연결종료
- 개념
- DriverManager 클래스
- JDBC 드라이버를 통해서 Connection 만드는 역할
- Class.forName 메소드를 통해서 생성
- Class.forName : 드라이버를 구현하는 작업
- ClassNotFoundException 예외
- 위 에러가 발생한 이유 : 프로젝트에 ojdbc6.jar 추가 x
- 추가하는 방법 : 프로젝트 우클릭 - Build path - Configure build path - Libraries
- DriverManager 클래스의 모든 메소드는 static 영역에 저장됨
- 이로 인해 반드시 객체를 생성할 필요가 없음
- Connection 인터페이스 객체 생성
- getConnection() 메소드
- JDBC 드라이버를 통해서 Connection 만드는 역할
- Connection 인터페이스
- SQL문장을 정의하고 실행 시킬 수 있는 Statement 객체를 생성하기 위해서 Connection 객체 사용
- Statement 인터페이스
- Connection 객체를 통해 구현되는 메소드 집합 정의
- Statement 객체 생성 후 SQL 질의문을 실행 할 경우 executeQuery() 메소드 호출
- 단순 질의문을 사용할 경우에 유용함
- PrepareStatement 인터페이스
- 개념
- 실행시간 동안에 인수 값을 위한 공간을 미리 확보 가능
- SQL문장이 미리 컴파일
- 실행 요건
- 1. 동일한 질의문을 반복적으로 수행, 값만 바꾸어서 여러번 실행 할 경우
- 2. 데이터들이 많아서 질의문을 정리할 필요가 있을 경우
- 3. 인수들이 많을 때
- Statement vs PrepareStatement
- Statement 인터페이스 : 실행될 때 마다 매번 서버에서 분석 => 실행 속도 느림
- PrepareStatement 인터페이스 : 한번 분석되면 재사용이 용이 => 실행 속도 빠름
- 위치 홀더
- " ? " 인자로 사용
- 일종의 토큰
- SQL 문장이 실행되기 이전에 실제 값으로 대체
- 개념
- ResultSet 인터페이스
- 개념
- SQL문(Select문) 사용 성공 : ResultSet 반환(리턴)
- 형태
- 테이블 형태
- 행과 열 존재
- Cursor(커서)
- 초기의 첫번 째 행 바로 앞을 가리키고 있음
- ResultSet 객체의 메소드에 따라서 커서가 다음 위치로 이동
- 개념
>> 키보드로 입력받아 출력하는 insert문
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
public class Ex01_insert {
public static void main(String[] args) {
// 키보드로부터 id/pw/name/age 등을 입력을 받고
// JDBC Insert문 구현
Connection conn = null;
PreparedStatement psmt = null;
ResultSet rs = null; // 쿼리의 결과를 담은 객체
try { // try-catch : 예외 처리를 하기 위한 문법
Class.forName("oracle.jdbc.driver.OracleDriver");
// 2. DB연결
String url = "jdbc:oracle:thin:@127.0.0.1:1521:xe";
String db_id = "hr"; // DB 연결 아이디
String db_pw = "hr"; // DB 연결 비밀번호
conn = DriverManager.getConnection(url, db_id, db_pw);
if (conn != null) {
System.out.println("연결 성공");
} else {
System.out.println("연결 실패");
}
// 키보드에 입력받기
Scanner sc = new Scanner(System.in);
System.out.print("ID : ");
String id = sc.next();
System.out.print("PW : ");
String pw = sc.next();
System.out.print("Name : ");
String name = sc.next();
System.out.print("Age : ");
int age = sc.nextInt();
String sql = "insert into mem(id,pw,name,age) values(?,?,?,?)";
psmt = conn.prepareStatement(sql);
psmt.setString(1, id);
psmt.setString(2, pw);
psmt.setString(3, name);
psmt.setInt(4, age);
int cnt = psmt.executeUpdate();
if (cnt > 0) {
System.out.println("insert 성공");
} else {
System.out.println("insert 실패");
}
// 4. 종료
// 종료 순서 : 가장 마지막에 열어주었던 객체부터 역순부터 닫아줌
} catch (SQLException e) { // DB정보 확인
System.out.println("sql 오류");
e.printStackTrace();
} catch (ClassNotFoundException e1) {
System.out.println("동적 오류 발생");
e1.printStackTrace();
} finally {
if (psmt != null) {
try {
psmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
>> 키보드로 입력받아 출력하는 update문
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
public class Ex02_update {
public static void main(String[] args) {
// ID가 Mars인 사람을 비밀번호 1025로 바꿔서 SQL문을 전송 JDBC 구현
Connection conn = null;
PreparedStatement psmt = null;
ResultSet rs = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
String url = "jdbc:oracle:thin:@127.0.0.1:1521:xe";
String db_id = "hr";
String db_pw = "hr";
conn = DriverManager.getConnection(url, db_id, db_pw);
if (conn != null) {
System.out.println("연결 성공");
} else {
System.out.println("연결 실패");
}
Scanner sc = new Scanner(System.in);
System.out.println("===회원 정보 수정 ===");
System.out.print("ID 입력 : ");
String id = sc.next();
System.out.print("PW 변경 : ");
String pw = sc.next();
String sql = "UPDATE MEM SET pw = ? WHERE id = ?";
psmt = conn.prepareStatement(sql);
psmt.setString(1, id);
psmt.setString(2, pw);
int cnt = psmt.executeUpdate();
if (cnt > 0) {
System.out.println("update 성공");
} else {
System.out.println("update 실패");
}
} catch (SQLException e) { // DB정보 확인
System.out.println("sql 오류");
e.printStackTrace();
} catch (ClassNotFoundException e1) {
System.out.println("동적 오류 발생");
e1.printStackTrace();
} finally {
if (psmt != null) {
try {
psmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
>> MVC 형태
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
public class DAO {
// Controller 단계
// DAO : Data Access Object
// 정의 : DB에 있는 data들에게 접근하기 위한 객체
// 사용 이유 : DB접근을 하기 위하 로직, 비지니스 로직을 분리하기 위해서
private PreparedStatement psmt;
private Connection conn;
private ResultSet rs;
private void getConnection() {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
String db_url = "jdbc:oracle:thin:@127.0.0.1:1521:xe";
String db_id = "hr";
String db_pw = "hr";
conn = DriverManager.getConnection(db_url, db_id, db_pw);
if (conn != null) {
System.out.println("DB연결 성공");
} else {
System.out.println("DB연결 실패");
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void close() {
try {
if (rs != null) {
rs.close();
}
if (psmt != null) {
psmt.close();
}
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public int insert(String id, String pw, String name, int age) {
int cnt = 0; // 리턴 받기 위한 변수
try {
getConnection();
String sql = "INSERT INTO MEM VALUES(?,?,?,?)";
psmt = conn.prepareStatement(sql);
psmt.setString(1, id);
psmt.setString(2, pw);
psmt.setString(3, name);
psmt.setInt(4, age);
cnt = psmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
close();
}
return cnt;
}
public int update(String id, int age) {
int cnt = 0;
try {
getConnection();
String sql = "update mem set age = ? where id = ?";
psmt = conn.prepareStatement(sql);
psmt.setInt(1, age);
psmt.setString(2, id);
cnt = psmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
close();
}
return cnt;
}
public int delete(String id) {
int cnt = 0;
try {
getConnection();
String sql = "delete from mem where id = ?";
psmt = conn.prepareStatement(sql);
psmt.setString(1, id);
cnt = psmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
close();
}
return cnt;
}
public ArrayList<MemberVO> select() {
ArrayList<MemberVO> list = new ArrayList<MemberVO>();
try {
getConnection();
String sql = "select * from mem";
psmt = conn.prepareStatement(sql);
rs = psmt.executeQuery();
while (rs.next()) {
String id = rs.getString(1);
String pw = rs.getString(2);
String name = rs.getString(3);
int age = rs.getInt(4);
MemberVO vo = new MemberVO(id, pw, name, age);
list.add(vo);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
close();
}
return list;
}
}
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 1.등록 2.조회 3.수정 4.삭제 5.종료
// DB 관련 작업 수행 객체 DAO
DAO dao = new DAO();
while (true) {
System.out.print("1.등록 2.조회 3.수정 4.삭제 5.종료 >> ");
int choice = sc.nextInt();
if (choice == 1) {
// 등록 기능
System.out.println("===등록 단계===");
System.out.print("PW : ");
String pw = sc.next();
System.out.print("ID : ");
String id = sc.next();
System.out.print("NAME : ");
String name = sc.next();
System.out.print("AGE : ");
int age = sc.nextInt();
int cnt = dao.insert(pw, id, name, age);
if (cnt > 0) {
System.out.println("등록 성공");
} else {
System.out.println("등록실패");
}
}else if(choice ==2) {
// 조회 기능
System.out.println("===조회 단계===");
ArrayList<MemberVO> list = dao.select()
;
for(int i =0; i<list.size(); i++) {
System.out.println(list.get(i).getId() +"\t"+ list.get(i).getPw()+"\t"+ list.get(i).getName() +"\t"+ list.get(i).getAge());
}
}
else if (choice == 3) {
// 수정 기능
// ID : 0909
System.out.println("===수정 단계===");
System.out.print("ID : ");
String id = sc.next();
System.out.print("AGE : ");
int age = sc.nextInt();
int cnt = dao.update(id, age);
if (cnt > 0) {
System.out.println("수정 성공");
} else {
System.out.println("수정 실패");
}
} else if (choice == 4) {
//삭제 기능
System.out.println("===삭제 단계===");
System.out.print("ID : ");
String id = sc.next();
int cnt = dao.delete(id);
if (cnt > 0) {
System.out.println("삭제 성공");
} else {
System.out.println("삭제 실패");
}
}
else if (choice == 5) {
System.out.println("종료");
}
}
}
}
public class MemberVO {
// 필드 구성
// 필드 = DB 컬럼값
private String id;
private String pw;
private String name;
private int age;
// 생성자
public MemberVO(String id, String pw, String name, int age) {
this.id = id;
this.pw = pw;
this.name = name;
this.age = age;
}
// Getter & Setter
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPw() {
return pw;
}
public void setPw(String pw) {
this.pw = pw;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}


복습 코드
package 오후;
public class MemberVO {
private String id;
private String pw;
private String name;
private int age;
public MemberVO(String id, String pw, String name, int age) {
this.id = id;
this.pw = pw;
this.name = name;
this.age = age;
}
// 오버로딩
public MemberVO(String id, String pw) {
this.id = id;
this.pw = pw;
}
public MemberVO(String name) {
this.name = name;
}
public String getId() {
return id;
}
public String getPw() {
return pw;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
package 오후;
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
MemberDAO dao = new MemberDAO();
while (true) {
System.out.print("[1]회원가입 [2]로그인 [3]조회 [4] 종료 >> ");
int choice = sc.nextInt();
if (choice == 4) {
System.out.println("종료");
break;
} else if (choice == 1) {
System.out.println("회원가입을 진행합니다.");
System.out.print("ID : ");
String id = sc.next();
System.out.print("PW : ");
String pw = sc.next();
System.out.print("NAME : ");
String name = sc.next();
System.out.print("AGE : ");
int age = sc.nextInt();
MemberVO vo = new MemberVO(id, pw, name, age);
int result = dao.joinInsert(vo);
if (result == 0) {
System.out.println("회원가입 실패!");
} else {
System.out.println("회원가입 성공!");
}
} else if (choice == 2) {
System.out.println("로그인을 시작합니다.");
System.out.print("ID : ");
String id = sc.next();
System.out.print("PW : ");
String pw = sc.next();
MemberVO vo = new MemberVO(id, pw);
String name = dao.loginSelect(vo);
if (name == null) {
System.out.println("로그인 실패");
} else {
System.out.println(name + "님 환영!!");
}
} else if (choice == 3) {
System.out.print("[1]전체조회 [2]선택조회 >> ");
int searchChoice = sc.nextInt();
if (searchChoice == 1) {
// 전체조회 기능
System.out.println("===전체조회===");
System.out.println("ID\tPW\tNAME\tAGE");
ArrayList<MemberVO> li = dao.searchAllSelect();
if (li.size() > 0) {
for (int i = 0; i < li.size(); i++) {
String id = li.get(i).getId();
String pw = li.get(i).getPw();
String name = li.get(i).getName();
int age = li.get(i).getAge();
System.out.println(id + "\t" + pw + "\t" + name + "\t" + age);
}
} else {
System.out.println("조회 실패");
}
} else if (searchChoice == 2) {
// 선택조회 기능
System.out.println("===선택조회===");
System.out.print("검색 NAME : ");
String insertname = sc.next();
MemberVO vo = new MemberVO(insertname);
ArrayList<MemberVO> list = dao.searchSelect(vo);
if (list.size() == 0) {
System.out.println("조회 실패");
} else {
System.out.println("ID\tPW\tNAME\tAGE");
for (int i = 0; i < list.size(); i++) {
String id = list.get(i).getId();
String pw = list.get(i).getPw();
String name = list.get(i).getName();
int age = list.get(i).getAge();
System.out.println(id + "\t" + pw + "\t" + name + "\t" + age);
}
}
}
}
}
}
}
package 오후;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
public class MemberDAO {
Connection conn = null; // 실제 DB 연결 해주는 객체
PreparedStatement psmt = null; // SQL 구문을 실행해주는 역할
ResultSet rs = null; // DB에서 검색해온 값을 저장
// DB 연결
private void getConnection() {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
String db_url = "jdbc:oracle:thin:@127.0.0.1:1521:xe";
String db_id = "hr";
String db_pw = "hr";
conn = DriverManager.getConnection(db_url, db_id, db_pw);
} catch (ClassNotFoundException e) { // 클래스를 찾을 수 없다면 에러 문구 출력
e.printStackTrace();
} catch (SQLException e) { // SQL문 에러가 발생하면 에러문구 출력
e.printStackTrace(); // 발생하는 모든 에러를 대비하는 문구 : Exception
}
}
// 연결 닫기
private void close() {
try {
if (conn != null) {
conn.close();
}
if (psmt != null) {
psmt.close();
}
if (rs != null) {
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public int joinInsert(MemberVO vo) {
int cnt = 0;
// DB연결
getConnection();
// Query 준비
String sql = "INSERT into MEM values(?,?,?,?)";
try {
psmt = conn.prepareStatement(sql);
psmt.setString(1, vo.getId());
psmt.setString(2, vo.getPw());
psmt.setString(3, vo.getName());
psmt.setInt(4, vo.getAge());
cnt = psmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
close();
}
return cnt;
}
public String loginSelect(MemberVO vo) {
String name = null;
getConnection();
String sql = "select name from mem where id=? and pw =?";
try {
psmt = conn.prepareStatement(sql);
psmt.setString(1, vo.getId());
psmt.setString(2, vo.getPw());
rs = psmt.executeQuery();
while (rs.next()) {
name = rs.getString(1);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
close();
}
return name;
}
public ArrayList<MemberVO> searchAllSelect() {
ArrayList<MemberVO> list = new ArrayList<MemberVO>();
getConnection();
String sql = "select * from mem";
try {
psmt = conn.prepareStatement(sql);
rs = psmt.executeQuery();
while (rs.next()) {
String id = rs.getString(1);
String pw = rs.getString(2);
String name = rs.getString(3);
int age = rs.getInt(4);
list.add(new MemberVO(id, pw, name, age));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
close();
}
return list;
}
public ArrayList<MemberVO> searchSelect(MemberVO vo) {
ArrayList<MemberVO> list = new ArrayList<MemberVO>();
getConnection();
String sql = "select * from mem where name =?";
try {
psmt = conn.prepareStatement(sql);
psmt.setString(1, vo.getName());
rs = psmt.executeQuery();
while(rs.next()) {
String id = rs.getString(1);
String pw = rs.getString(2);
String name = rs.getString(3);
int age = rs.getInt(4);
list.add(new MemberVO(id, pw, name, age));
}
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
}
- 1. DB 연결
- getConnection() 호출
- 2. SQL Query 준비
- String sql = " ? " ;
- psmt 객체 생성
- psmt = conn.prepareStatement(sql);
- ? 채워주기
- psmt.setString(순서, 데이터)
- psmt.setInt(순서, 데이터)
- 3. Query 전송
- insert, update, delete : 테이블 정보 변경 O
- int cnt = psmt.executeUpdate()
- return값은 정수 타입으로 반환 : sql문 실행에 영향을 받는 행 수 반환
- select : 테이블 정보 변경 X
- rs = psmt.executeQuery()
- return 값은 ResultSet 객체로 반환
- insert, update, delete : 테이블 정보 변경 O
- 4. Query 결과값 활용
- insert, update, delete : 테이블 정보 변경 O
- int cnt를 리턴
- select : 테이블 정보 변경 X
- while(rs.next()){}
- { } : String name = rs.getString(컬럼 순서), int age = rs.getInt(컬럼순서)
- rs.next()는 다음행이 없을 때 false를 반환함, 즉 더이상 가져올 행이 없을 때까지 while문 반복
- ResultSet 객체에는 select한 정보가 들어있다. 안에 들어가있는 데이터를 가져올 때는 rs.getString(), getInt()를 호출
- while(rs.next()){}
- insert, update, delete : 테이블 정보 변경 O
- 5. 객체 닫아주기
- close() 호출
'ESG' 카테고리의 다른 글
| [2022년 청년친화형 기업 ESG지원 사업 - 19] (1) | 2022.09.29 |
|---|---|
| [2022년 청년친화형 기업 ESG지원 사업 - 18] (1) | 2022.09.28 |
| [2022년 청년친화형 기업 ESG지원 사업 - 16] (0) | 2022.09.26 |
| [2022년 청년친화형 기업 ESG지원 사업 - 15] (0) | 2022.09.24 |
| [2022년 청년친화형 기업 ESG지원 사업 - 14] (0) | 2022.09.23 |