* DTO -> EmployeeDTO (데이터 전송 객체)
* VO(Value Object) -> 값 객체
* DAO(Data Access Object) -> SQL
* Connection-> DB접속 정보 -> 싱글턴 패턴
[ dbConn ]
package jun23;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
// 자바와 데이터베이스를 연결하겠습니다.
// 2023-06-23 웹 서버프로그램 구현
// 주소URL, ID, PW
public class dbConn {
public static void main(String[] args) {
// String url = "jdbc:데이터베이스://아이피:포트/디비명";
// String url = "jdbc:mariadb://127.0.0.1:3306/employees";
String url = "jdbc:mariadb://localhost:3306/employees";
String id = "root";
String pw = "0228";
Connection conn = null;
try { // 예외 처리
Class.forName("org.mariadb.jdbc.Driver");
conn = DriverManager.getConnection(url, id, pw); // 위에서 만든 conn에다가 url, id, pw 넣어줌
Statement stmt = conn.createStatement(); // 얘한테 명령내려
System.out.println("접속 성공");
ResultSet rs = stmt.executeQuery("SELECT * FROM employees LIMIT 10"); // 괄호안 쿼리문 실행했을때의 결과값을 가져와 rs에 담기
while(rs.next()) {
System.out.print(rs.getInt("emp_no")); // **
System.out.print(rs.getString("birth_date"));
System.out.print(rs.getString("first_name"));
System.out.print(rs.getString("last_name"));
System.out.print(rs.getString("gender"));
System.out.println(rs.getString("hire_date"));
}
} catch (ClassNotFoundException e) {
System.out.println("접속 객체가 없습니다."); // 예외1
e.printStackTrace();
} catch (SQLException e) {
System.out.println("접속 정보가 잘못되었습니다."); // 예외2
e.printStackTrace();
} finally {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
( try / catch ) _ 자바 안팎으로 왔다갔다 하는 파일들을 처리
자바 밖의 자료파일들을 가져올 때 사용.
자바 내에서는 문제없는데, 자바 시스템 영역 밖에 있는(내 컴퓨터에는 있지만) 외부 파일 가져오면 문제가 발생할 수 있음 => 예외처리
* 예외1. db와의 연결에서 문제가 발생했을 때 작동.
* 예외2. "접속성공" (출력) 이후 쿼리문 실행에서(rs) 문제가 발생했을 때 작동.
** System.out.println(rs.getString(1)) // System.out.println(rs.getInt(1));
=> db는 (열)1부터 셈, 1열 가져오겠다는 의미! (데이터 타입(String/Int) 맞춰주기)
접속 성공 // db정보 가져오기 성공
100011953-09-02GeorgiFacelloM1986-06-26
100021964-06-02BezalelSimmelF1985-11-21
100031959-12-03PartoBamfordM1986-08-28
100041954-05-01ChirstianKoblickM1986-12-01
100051955-01-21KyoichiMaliniakM1989-09-12
100061953-04-20AnnekePreusigF1989-06-02
100071957-05-23TzvetanZielinskiF1989-02-10
100081958-02-19SaniyaKalloufiM1994-09-15
100091952-04-19SumantPeacF1985-02-18
100101963-06-01DuangkaewPiveteauF1989-08-24
[DB02]
package jun23;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
public class DB02 {
public static void main(String[] args) {
final String URL = "jdbc:mariadb://localhost:3306/employees";
final String ID = "root";
final String PW = "비밀번호";
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
List<Employee> member = new ArrayList<Employee>();
}
}
수정불가 상수 객체 URL, ID, PW 생성
Connection, Statement, ResultSet 생성 및 임포트
db에서 가져온 정보들을 담을 list ( member )생성
Employee 클래스 만들쟈~
[Employee]
package jun23;
// 결과 한줄을 저장할 class
public class Employee {
private int emp_no;
private String birth_date, first_name, last_name, hire_date;
private char gender;
// 이제 위 필드를 외부에서 보지 못하게 잠가두겠습니다.
// 메소드를 만들어서 접근하게 하겠습니다. getter setter
public int getEmp_no() {
return emp_no;
}
public void setEmp_no(int emp_no) {
this.emp_no = emp_no;
}
public String getBirth_date() {
return birth_date;
}
public void setBirth_date(String birth_date) {
this.birth_date = birth_date;
}
public String getFirst_name() {
return first_name;
}
public void setFirst_name(String first_name) {
this.first_name = first_name;
}
public String getLast_name() {
return last_name;
}
public void setLast_name(String last_name) {
this.last_name = last_name;
}
public String getHire_date() {
return hire_date;
}
public void setHire_date(String hire_date) {
this.hire_date = hire_date;
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
}
ex) 게시판에서 (no, 글제목, 글쓴이...등등) 한줄이 하나의dto
package jun23;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
public class DB02 {
public static void main(String[] args) {
final String URL = "jdbc:mariadb://localhost:3306/employees";
final String ID = "root";
final String PW = "비밀번호";
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
List<Employee> member = new ArrayList<Employee>();
try {
Class.forName("org.mariadb.jdbc.Driver"); // 자바밖(외부)에 있는 영역으로 나감
conn = DriverManager.getConnection(URL, ID, PW);
stmt = conn.createStatement(); // 배달부
String sql = "SELECT * FROM employees LIMIT 10";
rs = stmt.executeQuery(sql); // 배달부가 가져온 결과값
while(rs.next()) { // 다음 행이 존재하는 동안에만 반복
Employee e = new Employee();
e.setEmp_no(rs.getInt("emp_no"));
e.setBirth_date(rs.getString("birth_date"));
e.setFirst_name(rs.getString("first_name"));
e.setLast_name(rs.getString("last_name"));
e.setGender(rs.getString("gender").charAt(0));
e.setHire_date(rs.getString("hire_date"));
member.add(e);
}
} catch (ClassNotFoundException e) {
e.printStackTrace(); // 오류알려주는거
} catch (SQLException e) {
e.printStackTrace();
} finally { // 마지막에 연 것 부터 닫습니다. re -> stmt -> conn
try {
rs.close();
stmt.close();
conn.close(); // 자동으로 닫아주지만 오류가 났을때 지맘대로 종료할수도 있어서
} catch (SQLException e) {
e.printStackTrace();
}
}
System.out.println(" 번호\t생년월일\t 이름\t\t 성\t 성별\t입사일");
System.out.println("------------------------------------------------------------------");
for (Employee employee : member) {
System.out.printf("%3d ", employee.getEmp_no());
System.out.printf("%10s ", employee.getBirth_date());
System.out.printf("%-15s ", employee.getFirst_name());
System.out.printf("%-15s ", employee.getLast_name());
System.out.printf("%2c ", employee.getGender());
System.out.printf("%10s\n ", employee.getHire_date());
}
System.out.println("------------------------------------------------------------------");
}
}
번호 생년월일 이름 성 성별 입사일
------------------------------------------------------------------
10001 1953-09-02 Georgi Facello M 1986-06-26
10002 1964-06-02 Bezalel Simmel F 1985-11-21
10003 1959-12-03 Parto Bamford M 1986-08-28
10004 1954-05-01 Chirstian Koblick M 1986-12-01
10005 1955-01-21 Kyoichi Maliniak M 1989-09-12
10006 1953-04-20 Anneke Preusig F 1989-06-02
10007 1957-05-23 Tzvetan Zielinski F 1989-02-10
10008 1958-02-19 Saniya Kalloufi M 1994-09-15
10009 1952-04-19 Sumant Peac F 1985-02-18
10010 1963-06-01 Duangkaew Piveteau F 1989-08-24
------------------------------------------------------------------
만약 while문 밖에서 객체를 생성하면 하나의 객체만 생성.
하나의 객체에 계속해서 필드값이 들어가고 최종적으로는 마지막 필드값만 들어있게됨.
(필드값들이 들어갔던 메모리주소가 모두 같은거 콘솔창에서 확인가능)
while문 안에서 객체생성 해줘야 각 개별 필드값에 해당하는 객체가 여러개 생성됨.
while문으로 하나씩 생성-사용-저장의 반복
package com.database
[ DBConnection.java ]
package com.database;
import java.sql.Connection;
import java.sql.DriverManager;
public class DBConnection {
//데이터베이스 접속 정보를 저장합니다.
public Connection getConn() {
Connection conn = null;
try {
Class.forName("org.mariadb.jdbc.Driver");
String url = "jdbc:mariadb://localhost:3306/employees";
conn = DriverManager.getConnection(url, "root", "0228");
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
}
package com.database.dto;
[ EmployeeDTO.java ]
package com.database.dto;
//데이터 전송객체 : 데이터베이스에서 온 값을 담을 그릇
public class EmployeeDTO {
// 각 값을 담을 필드를 만들겠습니다.
// 각 필드는 수정불가 = 외부에서 보지 못하게 해주세요 = get/set
// 사원번호 emp_no
// 생년월일
// 이름
// 성
// 성별
// 입사일
private int emp_no;
private String birth_date, last_name, first_name, gender, hire_date;
public int getEmp_no() {
return emp_no;
}
public void setEmp_no(int emp_no) {
this.emp_no = emp_no;
}
public String getBirth_date() {
return birth_date;
}
public void setBirth_date(String birth_date) {
this.birth_date = birth_date;
}
public String getLast_name() {
return last_name;
}
public void setLast_name(String last_name) {
this.last_name = last_name;
}
public String getFirst_name() {
return first_name;
}
public void setFirst_name(String first_name) {
this.first_name = first_name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getHire_date() {
return hire_date;
}
public void setHire(String hire_date) {
this.hire_date = hire_date;
}
}
package com.database.DAO;
[EmployeesDAO.java]
package com.database.DAO;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import com.database.DBConnection;
import com.database.dto.EmployeeDTO;
// 데이터베이스에 접속해서 일을 하는 DAO
public class EmployeesDAO {
// 10명 뽑기
public List<EmployeeDTO> selectList() {
List<EmployeeDTO> list = new ArrayList<EmployeeDTO>();
// DB접속 정보 가져오기
DBConnection db = new DBConnection();
Connection conn = db.getConn();
// SQL문 만들기
String sql = "SELECT * FROM employees LIMIT 10";
Statement stmt = null;
ResultSet rs = null;
try {
stmt = conn.createStatement();
// 실행하기
rs = stmt.executeQuery(sql);
// while로 뽑기
while(rs.next()) {
// 저장하기
EmployeeDTO dto = new EmployeeDTO();
dto.setEmp_no(rs.getInt(1));
dto.setBirth_date(rs.getString(2));
dto.setFirst_name(rs.getString(3));
dto.setLast_name(rs.getString(4));
dto.setGender(rs.getString(5));
dto.setHire(rs.getString(6));
list.add(dto);
}
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
}
package com.database;
[Employees.java] _ 최종출력
package com.database;
import java.util.List;
import com.database.DAO.EmployeesDAO;
import com.database.dto.EmployeeDTO;
public class Employees {
public static void main(String[] args) {
EmployeesDAO dao = new EmployeesDAO();
List<EmployeeDTO> list = dao.selectList();
System.out.println("번호\t생년월일\t 이름\t\t 성\t 성별\t 입사일");
System.out.println("===============================================================");
for (EmployeeDTO employee : list) {
System.out.printf("%3d ", employee.getEmp_no());
System.out.printf("%10s ", employee.getBirth_date());
System.out.printf("%-15s ", employee.getFirst_name());
System.out.printf("%-15s ", employee.getLast_name());
System.out.printf("%2s ", employee.getGender());
System.out.printf("%10s\n ", employee.getHire_date());
}
}
}
번호 생년월일 이름 성 성별 입사일
===============================================================
10001 1953-09-02 Georgi Facello M 1986-06-26
10002 1964-06-02 Bezalel Simmel F 1985-11-21
10003 1959-12-03 Parto Bamford M 1986-08-28
10004 1954-05-01 Chirstian Koblick M 1986-12-01
10005 1955-01-21 Kyoichi Maliniak M 1989-09-12
10006 1953-04-20 Anneke Preusig F 1989-06-02
10007 1957-05-23 Tzvetan Zielinski F 1989-02-10
10008 1958-02-19 Saniya Kalloufi M 1994-09-15
10009 1952-04-19 Sumant Peac F 1985-02-18
10010 1963-06-01 Duangkaew Piveteau F 1989-08-24
'국비과정 > JAVA' 카테고리의 다른 글
20230628 _[19일차]_01. 보조스트림 (0) | 2023.06.28 |
---|---|
20230626 _[17일차]_02. HTML_게시판 만들기 (0) | 2023.06.26 |
20230621 _[14일차]_02. 정처기 문제연습 (0) | 2023.06.25 |
20230621 _[14일차]_01. 인터페이스 (0) | 2023.06.22 |
20230620 _[13일차]_02. 접근제어자_ 상속 * (0) | 2023.06.22 |