학원에서 자바와 mysql을 맛보기(?) 식으로 공부를 어느정도 진행되고 오늘 JDBC를 이용해 성적프로그램을
간단하게 만들어 보았고 혼자 실습(?)하는 느낌으로 사원정보 프로그램을 만들어보려고 한다.
보다가 주옥같은 부분이 있다면 말해주길.. 못알아들을수도 있는건 함정
JDBC ( java database connectivity ) :
자바를 통해 다양하고 관계형 데이터베이스에 접속하고
SQL문을 실행해서 관리하고자 할때
사용하는 표준 SQL인터페이스
이것을 통해 데이터베이스 코드를 한번만 작성해두면
어떤 DBMS라도 코드 변경 없이 동일하게 작동시킬 수 있음
JDK에 포함된 JDBC 인터페이스는 java.sql 패키지 아래에 있음
하지만, 이것만으로는 작동하지 않고
JDBC 인터페이스에 맞게 각 데이터베이스 제조사가
구현한 JDBC 클래스들이 필요한데,
이것을 JDBC 드라이버라고 함.
JDBC드라이버들은 제조사 홈페이지에서 내려받을수 있음.
mariadb.org
1. DB 테이블 생성
mariaDB 전용 스크래치 파일을 만들어 간단한 테이블 생성 코드를 작성
create table EmployeeManage (
empno int auto_increment, -- 사원번호는 자동증가하게 설정
fname varchar(255), -- 미국식 이름으로 설정 ㅋ ㅈㅅ
lname varchar(255),
email varchar(255),
phone varchar(255),
hdate varchar(255), -- 입사일
jobid varchar(255), -- 직책번호
sal int, -- 연봉
comm decimal(5,2), -- 수당
mgrid int, -- 사수 사원번호
deptid int, -- 부서번호
date timestamp default current_timestamp(), -- 데이터 기록날짜/시간
primary key (empno) -- 사원번호를 기본키로 설정
);
2. EmployeeUtil 클래스 만들기
DB를 접속하여 리소스(테이블)에 접근하고 작업이 끝나면 접속해제(?)하는 메서드를 구현 하기 위한 클래스
접속하기 위해서는 각각 맞는 드라이버 파일을 자바폴더에 설치해서 IDE에서 라이브러리 추가해주어야함
package semiproject12_16;
import javax.xml.transform.Result;
import java.sql.*;
public class EmployeeUtil {
// DB접속 하기
public static Connection makeConn(){
String DRV = "org.mariadb.jdbc.Driver"; //드라이버 내용고정이라서 외워주면 좋음?
String URL = ""; // AWS RDS를 이용중인데 여기 엔드포인트 주소를 적어줘야함
// “jdbc:Driver 종류://IP:포트번호/DB명”
String USR = ""; // DB 사용자 계정
String PWD = ""; // DB 비번 보안상의 이유로 비워놓았다.
Connection conn=null; // 데이터베이스와 연결하는 객체
try {
Class.forName(DRV); // Class.forName 을 이요해 드라이버 로드
conn = DriverManager.getConnection(URL,USR,PWD); //DB접속하기
} catch (ClassNotFoundException e) {
System.out.println("드라이버 접속 오류");
} catch (SQLException throwables) {
System.out.println("DB접속 오류");
}
return conn;
}
// DB연결 해제
public static void destroyConn(Connection conn, PreparedStatement pstmt, ResultSet rs){
if (conn != null) try { conn.close(); } catch (SQLException throwables) { }
if (pstmt != null) try { pstmt.close(); } catch (SQLException throwables) { }
if (rs != null) try { rs.close(); } catch (SQLException throwables) { }
}
// DB연결 해제2 (데이터 입력 메서드에서 사용하기위해 추가생성)
public static void destroyConn(Connection conn, PreparedStatement pstmt ){
if (conn != null) try { conn.close(); } catch (SQLException throwables) { }
if (pstmt != null) try { pstmt.close(); } catch (SQLException throwables) { }
}
}
3. EmployeeJDBC 클래스 생성 후 EmployeeUtil 클래스 상속받기
JDBC클래스에서는 MySql 코드를 String 변수를 static 으로 선언하여 저장해두고
DB에 데이터를 입력하거나 조회하는 메서드 안에서 작업하기 위해 만들어 둔다
또한 기존에 만들어놓은 Util 클래스에서의 DB접속/해제 기능을 한개의 클래스에서 사용하기 위해
상속을 해준다.
package semiproject12_16;
public class EmployeeJDBC extends EmployeeV2Util{
// 데이터입력 하기위한 쿼리문 , 동적쿼리문(PreparedStatement)으로 구현
public static String insertEmployee =
"insert into EmployeeManage (empno,fname,lname,email,phone,hdate,jobid,sal,comm,mgrid,deptid) values" +
"(?,?,?,?,?,?,?,?,?,?,?)";
// 사원의 모든 정보 조회 쿼리문
public static String selectEmployee =
"select * from EmployeeManage";
// 특정사원 정보 조회 쿼리문
public static String selectOneEmployee =
"select * from EmployeeManage where empno = ?";
}
4. EmployeeVO클래스 생성하기
VO( Value Object):
데이터베이스 테이블 값들을 자바에서 변수로 만들어 놓은것 ?
package semiproject12_16;
public class EmployeeVO {
private int empno;
private String fname;
private String lname;
private String email;
private String phone;
private String hdatd;
private String jobid;
private int sal;
private double comm;
private int mgrid;
private int deptid;
private String date;
public EmployeeVO() {
}
public EmployeeVO(int empno, String fname, String lname, String email, String phone, String hdatd, String jobid, int sal, double comm, int mgrid, int deptid) {
this.empno = empno;
this.fname = fname;
this.lname = lname;
this.email = email;
this.phone = phone;
this.hdatd = hdatd;
this.jobid = jobid;
this.sal = sal;
this.comm = comm;
this.mgrid = mgrid;
this.deptid = deptid;
}
public EmployeeVO(int empno, String fname, String lname, String email, String phone, String hdatd, String jobid, int sal, double comm, int mgrid, int deptid, String date) {
this.empno = empno;
this.fname = fname;
this.lname = lname;
this.email = email;
this.phone = phone;
this.hdatd = hdatd;
this.jobid = jobid;
this.sal = sal;
this.comm = comm;
this.mgrid = mgrid;
this.deptid = deptid;
this.date = date;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public int getEmpno() {
return empno;
}
public void setEmpno(int empno) {
this.empno = empno;
}
public String getFname() {
return fname;
}
public void setFname(String fname) {
this.fname = fname;
}
public String getLname() {
return lname;
}
public void setLname(String lname) {
this.lname = lname;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getHdatd() {
return hdatd;
}
public void setHdatd(String hdatd) {
this.hdatd = hdatd;
}
public String getJobid() {
return jobid;
}
public void setJobid(String jobid) {
this.jobid = jobid;
}
public int getSal() {
return sal;
}
public void setSal(int sal) {
this.sal = sal;
}
public double getComm() {
return comm;
}
public void setComm(double comm) {
this.comm = comm;
}
public int getMgrid() {
return mgrid;
}
public void setMgrid(int mgrid) {
this.mgrid = mgrid;
}
public int getDeptid() {
return deptid;
}
public void setDeptid(int deptid) {
this.deptid = deptid;
}
}
5. 인터페이스, 제네릭클래스 생성후 데이터입력,조회 메서드를 작성할 서비스 클래스 생성하기.
package semiproject12_16;
import java.sql.*;
public abstract class EmployeeInterface {
// 새로운 사원 입력 메서드
public abstract void newEmployee();
// 사원조회 메서드
public abstract void readEmployee();
// 특정사원 조회 메서드
public abstract void readOneEmployee();
}
// 제네릭클래스 생성 후 인터페이스 상속
// 생성이유는 인터페이스에서 만들어놓은 메서드들은 재정의? 가 꼭 필요한데 제네릭클래스에서
// 재정의후 서비스클래스에서 상속을통해 편리하게 필요한 메서드만 가져와 정의를 내릴수 있다
package semiproject12_16;
public abstract class EmployeeGenericClass impelements EmployeeInterface {
@Override
public void newEmployee() {
}
@Override
public void readEmployee() {
}
@Override
public void readOneEmployee() {
}
@Override
public void modifyEmployee() {
}
@Override
public void removeEmployee() {
}
}
6. EmployeeService, EmployeeDAO 클래스 생성하기
package semiproject12_16;
import java.util.ArrayList;
import java.util.Locale;
import java.util.Scanner;
public class EmployeeService extends EmployeeGenericClass{
public void displayMenu(){
StringBuilder sb = new StringBuilder();
sb.append("-------------------\n")
.append("인사정보 처리프로그램 v1\n")
.append("-------------------\n")
.append("1. 인사 정보 입력\n")
.append("2. 인사 정보 조회\n")
.append("3. 인사 정보 상세조회\n")
.append("4. 인사 정보 수정\n")
.append("5. 인사 정보 삭제\n")
.append("0. 프로그램 종료\n")
.append("-------------------\n")
.append("원하시는 작업은 ? [1,2,3,4,5,0] ");
System.out.print(sb);
}
// 데이터입력 메서드
// DB에 데이터값 넣는메서드는 DAO클래스에서 정의
@Override
public void newEmployee() {
int empno;
String fname;
String lname;
String email;
String phone;
String hdatd;
String jobid;
int sal;
double comm;
int mgrid;
int deptid;
Scanner sc = new Scanner(System.in);
System.out.print("사번을 입력하세요 : ");
empno = Integer.parseInt(sc.nextLine());
System.out.print("이름을 입력하세요 : ");
fname = sc.nextLine();
System.out.print("성을 입력하세요 : ");
lname = sc.nextLine();
System.out.print("이메일을 입력하세요 : ");
email = sc.nextLine();
System.out.print("전화번호를 입력하세요 : ");
phone = sc.nextLine();
System.out.print("입사일을 입력하세요 : ");
hdatd = sc.nextLine();
System.out.print("직책을 입력하세요 : ");
jobid = sc.nextLine();
System.out.print("급여를 입력하세요 : ");
sal = sc.nextInt();
System.out.print("수당 입력하세요 : ");
comm = sc.nextInt();
System.out.print("상사번호를 입력하세요 : ");
mgrid = sc.nextInt();
System.out.print("부서번호를 입력하세요 : ");
deptid = sc.nextInt();
EmployeeV2VO emp = new EmployeeV2VO(empno,fname,lname,email,phone,hdatd,jobid,sal,comm,mgrid,deptid);
String result = EmployeeV2DAO.insertEmployee(emp); // DAO클래스참조
System.out.println(result);
}
// 조회할 성적데이터를 DAO로부터 넘겨받아 출력
@Override
public void readEmployee() {
String fmt = "사원번호 : %s, 성 :%s, 이름 :%s, 이메일 :%s, 전화번호 :%s, 입사일 :%s, 직책 :%s 급여 :%s 수당 :%s, 사수 :%s, 부서번호 :%s, 데이터추가일 :%s\n";
StringBuilder sb = new StringBuilder();
ArrayList<EmployeeV2VO> emps = EmployeeV2DAO.selectEmployee();
for(EmployeeV2VO emp : emps){
String result = String.format(fmt,emp.getEmpno(),emp.getFname(),emp.getLname(),emp.getEmail(),emp.getPhone(),emp.getHdatd(),emp.getJobid(),emp.getSal(),
emp.getComm(),emp.getMgrid(),emp.getDeptid(),emp.getDate());
sb.append(result);
}
System.out.println(sb.toString());
}
// 특정사원 정보 출력
@Override
public void readOneEmployee() {
String fmt = "사원번호 : %s, 성 :%s, 이름 :%s, 이메일 :%s, 전화번호 :%s, 입사일 :%s, 직책 :%s, 급여 :%s 수당 :%s, 사수 :%s, 부서번호 :%s, 데이터추가일 :%s\n";
Scanner sc = new Scanner(System.in);
System.out.print("조회할 사원의 사원번호는 ? :");
String empno = sc.nextLine();
// DAO클래스에 위에서 받은 조회할사원번호를 매개변수로 보내주기
EmployeeV2VO emp = EmployeeV2DAO.selectOneEmployee(empno);
// DAO클래스의 메서드로 받아온 값들을 출력
String result = String.format(fmt,emp.getEmpno(),emp.getFname(),emp.getLname(),emp.getEmail(),emp.getPhone(),emp.getHdatd(),emp.getJobid(),emp.getSal(),
emp.getComm(),emp.getMgrid(),emp.getDeptid(),emp.getDate());
System.out.println(result.toString());
}
}
package semiproject12_16;
import stillgood96.SungJukJDBC;
import java.sql.*;
import java.util.ArrayList;
public class EmployeeDAO {
// EmployeeService에서 입력받은 데이터값들을 매개변수로 받는 메서드로 생성
public static String insertEmployee(EmployeeV2VO emp) {
// 연결객체 생성
Connection conn = null;
// DB쿼리문 실행하기위한 객체 생성
PreparedStatement pstmt = null;
// 데이터의 입력 유/무 알리기위한 result변수 선언
String result = null;
// JDBC(util을상속받음)에 상속받은 util의 makeConn 메서드이용해서 드라이버 로드 및 DB접속
conn = EmployeeV2JDBC.makeConn();
try {
// JDBC에 작성한 데이터입력 쿼리문 가져오기
pstmt = conn.prepareStatement(EmployeeV2JDBC.insertEmployee);
// 서비스클래스에서 매개변수로 받아온 데이터값을 넣기
pstmt.setInt(1,emp.getEmpno());
pstmt.setString(2,emp.getFname());
pstmt.setString(3,emp.getLname());
pstmt.setString(4,emp.getEmail());
pstmt.setString(5,emp.getPhone());
pstmt.setString(6,emp.getHdatd());
pstmt.setString(7,emp.getJobid());
pstmt.setInt(8,emp.getSal());
pstmt.setDouble(9,emp.getComm());
pstmt.setInt(10,emp.getMgrid());
pstmt.setInt(11,emp.getDeptid());
int cnt = pstmt.executeUpdate();
if (cnt>0)
result = "성적데이터 저장완료!";
} catch (SQLException throwables) {
System.out.println("DB 데이터 추가완료!");
}
EmployeeV2JDBC.destroyConn(conn,pstmt);
return result;
}
// 사원정보들을 동적배열에 저장해서 넘긴다.
public static ArrayList<EmployeeV2VO> selectEmployee() {
ArrayList<EmployeeV2VO> emps = new ArrayList<>();
Connection conn = null;
PreparedStatement pstmt = null;
// ResultSet
// select(조회)의 결과를 저장하는 객체
ResultSet rs = null;
conn = EmployeeV2JDBC.makeConn();
try {
pstmt = conn.prepareStatement(EmployeeV2JDBC.selectEmployee);
rs = pstmt.executeQuery();
// 반복문으로 모든 데이터를 가져오게 설정
while(rs.next()){
EmployeeV2VO emp= new EmployeeV2VO(
rs.getInt(1),
rs.getString(2),
rs.getString(3),
rs.getString(4),
rs.getString(5),
rs.getString(6),
rs.getString(7),
rs.getInt(8),
rs.getDouble(9),
rs.getInt(10),
rs.getInt(11),
rs.getString(12) );
emps.add(emp); // 행을 다읽어올때마다 동적배열에 저장후 다시 그다음행 읽어오기
}
} catch (SQLException throwables) {
System.out.println("selectEmployee 에서 오류 발생");
}
EmployeeV2JDBC.destroyConn(conn,pstmt,rs);
return emps;
}
// 특정사원 정보 긁어오기
// 서비스에서 받아온 특정사원번호를 매개변수로 받는 메서드로 생성
public static EmployeeV2VO selectOneEmployee(String empno) {
Connection conn = null;
PreparedStatement pstmt = null;
EmployeeV2VO emp = null;
ResultSet rs = null;
conn = EmployeeV2JDBC.makeConn();
try {
pstmt = conn.prepareStatement(EmployeeV2JDBC.selectOneEmployee);
pstmt.setString(1,empno);
rs= pstmt.executeQuery();
// 한개의 값만 가져오면 되니까 if문
if(rs.next()){
emp = new EmployeeV2VO(
rs.getInt(1),
rs.getString(2),
rs.getString(3),
rs.getString(4),
rs.getString(5),
rs.getString(6),
rs.getString(7),
rs.getInt(8),
rs.getDouble(9),
rs.getInt(10),
rs.getInt(11),
rs.getString(12)
);
}
} catch (SQLException throwables) {
System.out.println("selectOneSungJuk 에서 오류발생!");
throwables.printStackTrace();
}
SungJukJDBC.destroyConn(conn,pstmt,rs);
return emp;
}
}
결과출력
결과출력창을 다시보니
조회할때 테이블처럼 나오도록 양식 변경하면 좋을 것 같고
수업시간에 mysql 하다가 꽤 오랜시간 후에 다시 자바를 하는거여서 낯설기도 하고
새로운 부분을 타이트한 일정때문인지 훅훅 지나가서 묻지마 코딩으로 선생님 코딩을 옮겨쓰고 있었는데
이렇게 블로그에 정리하면서 코드들을 다시 봐보니 이해가 어느정도 간다 과연 백지상태에서 이렇게 다시 쓸수있을까
'JAVA & APP :국비지원 학원 복습 > JAVA' 카테고리의 다른 글
JDBC 집에서 백지상태에서 만들어본 삼광 (0) | 2020.12.21 |
---|---|
JAVA 예외처리 (0) | 2020.12.15 |
DAY1 자바,이클립스 설치 및 기본 용어 정리?(선행학습과정) (0) | 2020.10.28 |