미완
선생님이 수업시간에 만들 삼광기업? 이라는 임의의 회사 테이블 사진과 데이터 파일을 주셔서 그걸 기반으로 수업시간에 만들어 보았는데 전에 수업전에 만든 JDBC와 VO클래스를 필요할때마다 만드는 점이 달랐던거 같다. 집에서도 복습을 해보고 기존에 만들어놓은 코드들을 안보고 백지상태에서 써보면 뭔가 뿌듯할거 같아서 최대한 참고를 안해보고 복습 해보겠다. 백지가아닌건가 양심적으로 최대한 안보고 작성해보겠다.
일단 삼광기업? 의 테이블과 데이터파일들을 올려보겠다.
일단 처음으로 만들 클래스는 DB와의 연결을 도와줄 util 클래스부터 만들어보겠다.
package day12_20;
import java.sql.*;
public class JDBCUtil {
public static Connection makeConn(){
String DRV="org.mariadb.jdbc.Driver"; // 디비연결을 위한 드라이버
String URL=""; // aws호스트주소
String USR=""; 보안상 안적음
String PWD="";
Connection conn = null;
try {
Class.forName(DRV); // 드라이버 로드
conn = DriverManager.getConnection(URL,USR,PWD); // 드라이버 연결
} catch (ClassNotFoundException e) {
System.out.println("드라이버에 문제있어 ?");
e.printStackTrace();
} catch (SQLException throwables) {
System.out.println("로그인 실패");
throwables.printStackTrace();
}
return conn;
}
// 파괴 메서드
public static void destroyConn(Connection conn, PreparedStatement pstmt, ResultSet rs) {
if(conn !=null){
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (pstmt !=null){
try {
pstmt.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(rs !=null){
try {
rs.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
public static void destoryConn(Connection conn, PreparedStatement pstmt){
if(conn !=null){
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (pstmt !=null){
try {
pstmt.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
작성순서는 메인클래스에다 서비스클래스를 인스턴스후 서비스 클래스 안에 있는 디스플레이 메서드를 띄우고 나서 숫자 입력시 정해놓은 메서드가 실행되게 switch문을 작성한다. 이렇게 작성하면 서비스 클래스와 서비스 클래스 내부의 메서드가 생성되어있지 않는 상태여서 오류가 나오면서 빨간줄이 가게될텐데 이때 나는 IDE의 오류해결기능? 을 이용해서 클래스와 메서드를 생성하는데 생각보다 개꿀이다. 오류가난 빨간줄에 빨간전구를 클릭하면 오류 해결대책으로 여러가지 선택지가 있는데 거기서 클래스생성,메서드생성등을 입맛에 골라 선택하면 바로바로 만들어준다 이번에 만들때는 전체적인 틀에서 세부적인 기능을 넘어가게 만들어 보았다. 예를들어 삼광의 전체 테이블중 직원테이블을 관리하고자 인사관리라는 메뉴를 만들고 인사관리 메뉴를 선택하면 그안에 또 세부적인 인사추가 / 인사조회 라던지 이런 메뉴들이 나누어 지도록 일단 머리로 돌렸을때는 switch/case 문 안에다 IF 문을 이용해서 해봤는데 잘된다
package day12_20;
import java.util.Scanner;
public class SamKwangMain {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
SamKwangService sv = new SamKwangService();
sv.displaymenu();
int button = Integer.parseInt(sc.nextLine());
while(true) {
switch (button) {
case 1:
sv.employeeMenu();
button = Integer.parseInt(sc.nextLine());
if (button==1){
sv.newEmployee();
}else if(button==2){
sv.readEmployee();
}else if(button==3){
sv.readOneEmployee();
}else sv.displaymenu();
break;
case 2:
break;
case 3:
break;
case 0:
System.exit(0);
break;
}
}
}
}
이후 서비스 만들어지 서비스 클래스에서 콘솔창에 나올 디스플레이 메뉴 메서드들을 만들고
newEmployee() 메서드를 이용해 새로운 인사정보를 받는 메서드를 작성하는데 작성하는데 있어
인사정보의 값들을 DB에 전달해주기 전에 담아둘 그릇이 필요한데 이때 VO클래스를 생성해서 직원테이블을 참조해 직원 테이블에 있는 컬럼값들을 담을 변수들을 선언해준다. 이역시 오류해결기능을 이용하면 번거롭게 다시 프로젝트창에서 클래스 생성을 안해주어도 된다. 개꿀
VO클래스 생성해서 생성자와 getter/setter 를 생성해주자
package day12_20;
public class SamKwangVO {
private int 인사번호;
private String 주민등록번호;
private String 성명;
private String 소속부서;
private String 직책;
private String 인사일;
public SamKwangVO() {
}
public SamKwangVO(int 인사번호, String 주민등록번호, String 성명, String 소속부서, String 직책, String 인사일) {
this.인사번호 = 인사번호;
this.주민등록번호 = 주민등록번호;
this.성명 = 성명;
this.소속부서 = 소속부서;
this.직책 = 직책;
this.인사일 = 인사일;
}
public SamKwangVO(int 인사번호, String 성명, String 소속부서, String 직책) {
this.인사번호 = 인사번호;
this.성명 = 성명;
this.소속부서 = 소속부서;
this.직책 = 직책;
}
public int get인사번호() {
return 인사번호;
}
public void set인사번호(int 인사번호) {
this.인사번호 = 인사번호;
}
public String get주민등록번호() {
return 주민등록번호;
}
public void set주민등록번호(String 주민등록번호) {
this.주민등록번호 = 주민등록번호;
}
public String get성명() {
return 성명;
}
public void set성명(String 성명) {
this.성명 = 성명;
}
public String get소속부서() {
return 소속부서;
}
public void set소속부서(String 소속부서) {
this.소속부서 = 소속부서;
}
public String get직책() {
return 직책;
}
public void set직책(String 직책) {
this.직책 = 직책;
}
public String get인사일() {
return 인사일;
}
public void set인사일(String 인사일) {
this.인사일 = 인사일;
}
}
vo클래스를 작성했으면 다시 service 클래스로 돌아와서 vo클래스를 인스턴스해서 vo클래스의 생성자를 이용하여 입력받은 값들은 vo클래스에 넣어준다.
DB에 값을 전달해주는 DAO클래스의 메서드를 이용하는 코드를 작성하고 이때 매개변수로 아까 위에서 vo클래스를 인스턴스한 객체로 설정해준다.
package day12_20;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Scanner;
public class SamKwangService {
// 메뉴화면
public void displaymenu() {
StringBuilder sb = new StringBuilder();
sb.append("-----삼광관리프로그램V1-----\n")
.append("1.인사관리 실행\n")
.append("2.미정\n")
.append("3.미정\n")
.append("0.프로그램종료\n")
.append("입력 : ");
System.out.println(sb);
}
// 인사관리 화면
public void employeeMenu() {
StringBuilder sb = new StringBuilder();
sb.append("1. 인사정보 추가\n")
.append("2.인사정보 조회\n")
.append("3.인사정보 상세조회\n")
.append("종료시 아무키 (1/2/3/ 제외)\n")
.append("입력 :");
System.out.println(sb);
}
public void newEmployee() {
SamKwangVO vo = new SamKwangVO();
Scanner sc = new Scanner(System.in);
System.out.print("인사번호 입력 :");
vo.set인사번호(Integer.parseInt(sc.nextLine()));
System.out.print("주민등록번호 입력 :");
vo.set주민등록번호(sc.nextLine());
System.out.print("성명 입력 :");
vo.set성명(sc.nextLine());
System.out.print("소속부서 입력 :");
vo.set소속부서(sc.nextLine());
System.out.print("직책 입력 :");
vo.set직책(sc.nextLine());
System.out.print("입사일 입력 :");
vo.set인사일(sc.nextLine());
String result = SamKwangDAO.insertEMP(vo);
System.out.println(result);
}
public void readEmployee() {
ArrayList<SamKwangVO> emps = new ArrayList<>();
emps = SamKwangDAO.readEmp();
String fmt = "인사번호 :%s 성명 :%s 소속부서 :%s 직책 :%s\n";
StringBuilder sb = new StringBuilder();
for(SamKwangVO emp : emps){
String result = String.format(fmt,emp.get인사번호(),emp.get성명(),emp.get소속부서(),emp.get직책());
sb.append(result);
}
System.out.println(sb.toString());
}
public void readOneEmployee() {
}
}
dd
아까 위에서 설명했듯이 DAO에 빨간줄이 갈텐데 이때 오류해결기능으로 클래스/메서드 둘다 생성후 DAO클래스로 돌아가서 DB에 연결하는 코드를 작성해준다.
package day12_20;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
public class SamKwangDAO {
public static String insertEMP(SamKwangVO vo) {
Connection conn = null;
PreparedStatement pstmt = null;
String result = "데이터 입력중..?!";
conn = SamKwangJDBC.makeConn();
try {
pstmt = conn.prepareStatement(SamKwangJDBC.insertEmployee);
pstmt.setInt(1,vo.get인사번호());
pstmt.setString(2,vo.get주민등록번호());
pstmt.setString(3,vo.get성명());
pstmt.setString(4,vo.get소속부서());
pstmt.setString(5,vo.get직책());
pstmt.setString(6,vo.get인사일());
int cnt = pstmt.executeUpdate();
if(cnt >0){
result = "데이터 추가 완료!";
}
} catch (SQLException se) {
se.printStackTrace();
}
SamKwangJDBC.destoryConn(conn,pstmt);
return result;
}
public static ArrayList<SamKwangVO> readEmp() {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
ArrayList<SamKwangVO> emps = new ArrayList<>();
conn = SamKwangJDBC.makeConn();
try {
pstmt = conn.prepareStatement(SamKwangJDBC.readEMP);
rs= pstmt.executeQuery();
while(rs.next()) {
SamKwangVO emp = new SamKwangVO(rs.getInt(1),
rs.getString(2),
rs.getString(3),
rs.getString(4));
emps.add(emp);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
SamKwangJDBC.destroyConn(conn,pstmt,rs);
return emps;
}
}
conn.preparestatement 쪽을 보면 jdbc클래스에 연결되어있는 변수를 가져다 쓰는걸 볼 수 있는데 jdbc 클래스에 db에 동작할 쿼리문을 String 변수를 하나 만들어 거기다 저장해놓았다. 이때 preparedstatement를 이용하면 보안에도 좋고 효율도 좋다고 한다. . 보안은 쿼리문에 입력받을 부분을 '?' 으로 표현해서인거 같고 효율은 좋다고하니 그런갑다 하고있다.
package day12_20;
public class SamKwangJDBC extends JDBCUtil{
public static String insertEmployee =
"insert into 직원 (인사번호, 주민등록번호, 성명, 소속부서, 직책, 입사일) values ( ?,?,?,?,?,?)";
public static String readEMP=
"select 인사번호,성명,소속부서,직책 from 직원";
}
쓰다보니 졸려서.. 이만줄이겠다 시간날때마다 기능 추가해봐야지 개꿀잼~
'JAVA & APP :국비지원 학원 복습 > JAVA' 카테고리의 다른 글
JDBC를 이용한 사원정보 프로그램 만들어보기. (2) | 2020.12.17 |
---|---|
JAVA 예외처리 (0) | 2020.12.15 |
DAY1 자바,이클립스 설치 및 기본 용어 정리?(선행학습과정) (0) | 2020.10.28 |