본문 바로가기

국비과정/JAVA

20230623 _[16일차]_02. db연결 및 데이터불러오기

 * 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