1. JAVA/1.3 문제
220421_JDBC_정보 입력프로그램(2)
마느링
2022. 4. 21. 23:01
전에 했던 정보 입력 프로그램이 각 클래스별로 중복되는 코드가 너무 많았어서
추상클래스를 이용해서 한번 작성해보았다.
(NullPointException이 자꾸 떠서 애먹었다.ㅠㅠㅠ)
일단 틀은 똑같고 알맹이만 다르기 때문에
커넥션 연결, Statement ,PreparedStatement 는 공통적으로 중복되어 추상 클래스에 셋팅해두었고
학생 정보 프로그램, 선생님 정보 표현 프로그램이 상속받게 하였다..ㅎ
1. 추상클래스 : 학생, 선생님 정보 프로그램이 공통으로 구현되는 클래스를 추상클래스로 셋팅하였다.
package jdbc.tmt;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;
import jdbc.SQL.conSQL;
public abstract class Stmt {
protected PreparedStatement pstmt;
protected Statement stmt;
String name;
Connection con;
public Stmt(String name){
this.name = name;
}
public void setConnect() {
conSQL csql = new conSQL();
csql.setDriver();
con = csql.setCon();
System.out.println("==========연결 완료========");
}
public String[] setStr() {
String[] str = null;
str = new String[] {"테이블 생성","데이터 추가","테이블 조회","테이블 삭제","종료"};
return str;
}
public void arrPrint(String[] str) {
for(int i = 0; i<str.length;i++) {
System.out.println(" "+(i+1)+" : "+str[i]);
}
System.out.println();
}
public void setting() {
System.out.println("<<< "+this+" 정보 프로그램 >>> 다음 중 고르시오");
String[] str = setStr();
arrPrint(str);
System.out.print("선택 : ");
}
public int setInt(Scanner sc) {
return sc.nextInt();
}
public abstract String choose(int no);
public abstract String idCheck(String str);
public void idCheck(PreparedStatement pstmt,String id, String ch) {
if(! id.startsWith(ch)) {
System.out.println("다시 입력");
return;
}
else {
try {
pstmt.setString(1, id);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public Statement setStmt() {
Statement stmt = null;
try {
stmt = con.createStatement();
}
catch(Exception e) {
System.out.println("%%% stmt 실패%%%");
}
return stmt;
}
public PreparedStatement setPstmt(String sql) {
PreparedStatement pstmt = null;
try {
pstmt = con.prepareStatement(sql);
}
catch(Exception e) {
System.out.println("%%% pstmt 실패%%%");
}
return pstmt;
}
public String toString() {
return name;
}
}
2. 학생 정보 클래스 : 추상클래스를 상속받음.. 학생정보에 대하여 테이블 생성부터 추가입력, 조회, 삭제하는 기능
package jdbc.tmt.stmt;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Scanner;
import VO.StudVO;
import jdbc.SQL.studSQL;
import jdbc.tmt.Stmt;
public class Student extends Stmt{
ResultSet rs;
ArrayList<StudVO> list;
Scanner sc;
public Student(){
super("학생");
setConnect();
setData();
}
public void setData() {
while(true) {
setting();
sc = new Scanner(System.in);
int no = setInt(sc);
System.out.println();
String str = choose(no);
String[] ar = setStr();
System.out.println("**** ["+ar[no-1]+"] 선택 ****");
if(no==2) {
pstmt = setPstmt(str);
list = setArr(str);
toPrint(list);
}
else if(no==5) {
System.out.println("프로그램 종료");
break;
}
else {
stmt = setStmt();
rs = setStmtRs(no,str);
}
System.out.println(" ["+ar[no-1]+"] 성공");
}
}
@Override
public String choose(int no) {
String str = null;
studSQL sql = new studSQL();
str = sql.setData(no);
return str;
}
public String idCheck(String str) {
String id = null;
while(true) {
id = sc.next();
if(!id.startsWith(str)) {
System.out.print("\tID 다시 입력 : ");
continue;
}
else {
try {
pstmt.setString(1, id);
System.out.println("\t입력 완료");
return id;
}
catch(Exception e) {
e.printStackTrace();
}
}
}
}
public ArrayList<StudVO> setArr(String str) {
list = null;
try {
list = new ArrayList<StudVO>();
while(true) {
System.out.print("\tID : ");
String id = idCheck("s");
System.out.print("\t이름 :");
String name = sc.next();
pstmt.setString(2, name);
System.out.print("\t성별 :");
String gen= sc.next();
pstmt.setString(3, gen);
System.out.print("\t반 : ");
int ban = sc.nextInt();
pstmt.setInt(4, ban);
System.out.print("\t학년 : ");
int grade = sc.nextInt();
pstmt.setInt(5, grade);
rs = pstmt.executeQuery();
StudVO svo = new StudVO();
svo.setId(id);
svo.setName(name);
svo.setGen(gen);
svo.setGrade(grade);
svo.setBan(ban);
list.add(svo);
System.out.print("\t1.추가입력 / 2. 그만입력 : ");
int stop = sc.nextInt();
if(stop==2) {
System.out.println();
System.out.println("***** 입력 종료 *****");
break;
}
}
}
catch(Exception e) {
e.printStackTrace();
}
return list;
}
public void toPrint(ArrayList<StudVO> list) {
for(StudVO s : list) {
System.out.println(s);
}
}
public ResultSet setStmtRs(int no,String str) {
ResultSet rs = null;
try {
rs = stmt.executeQuery(str);
if(no==3) {
System.out.println(" < 조회 결과 > ");
while(rs.next()) {
String id = rs.getString("id");
String name =rs.getString("name");
String gen = rs.getString("gen");
int grade = rs.getInt("grade");
int ban = rs.getInt("ban");
System.out.println("id : "+id+" , name : "+name+" , 성별 : "+gen+"("+grade+"학년"+ban+"반)");
}
}
}
catch(Exception e) {
e.printStackTrace();
}
return rs;
}
}
3. 선생님 정보 클래스 : 추상클래스를 상속받음.. 선생님 정보에 대하여 테이블 생성부터 추가입력, 조회, 삭제하는 기능
package jdbc.tmt.stmt;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Scanner;
import VO.TeacVO;
import jdbc.SQL.teacSQL;
import jdbc.tmt.Stmt;
public class Teacher extends Stmt{
ResultSet rs;
ArrayList<TeacVO> list;
Scanner sc;
public Teacher(){
super("선생님");
setConnect();
setData();
}
public void setData() {
while(true) {
setting();
sc = new Scanner(System.in);
int no = setInt(sc);
System.out.println();
String str = choose(no);
String[] ar = setStr();
System.out.println("**** ["+ar[no-1]+"] 선택 ****");
if(no==2) {
pstmt = setPstmt(str);
list = setArr(str);
toPrint(list);
}
else if(no==5) {
System.out.println("프로그램 종료");
break;
}
else {
stmt = setStmt();
rs = setTtmtRs(no,str);
}
System.out.println(" ["+ar[no-1]+"] 성공");
}
}
@Override
public String choose(int no) {
String str = null;
teacSQL sql = new teacSQL();
str = sql.setData(no);
return str;
}
public String idCheck(String str) {
String id = null;
while(true) {
id = sc.next();
if(!id.startsWith(str)) {
System.out.print("\tID 다시 입력 : ");
continue;
}
else {
try {
pstmt.setString(1, id);
System.out.println("\t입력 완료");
return id;
}
catch(Exception e) {
e.printStackTrace();
}
}
}
}
public ArrayList<TeacVO> setArr(String str) {
list = null;
try { ////id,name,gen,type
list = new ArrayList<TeacVO>();
while(true) {
TeacVO tvo = new TeacVO();
System.out.print("\tID : ");
String id = idCheck("t");
System.out.print("\t이름 :");
String name = sc.next();
pstmt.setString(2, name);
System.out.print("\t성별 :");
String gen= sc.next();
pstmt.setString(3, gen);
System.out.print("담임선생님입니까? 1. 예, 2. 아니오");
int type = sc.nextInt();
String teac = null;
if(type==1) {
System.out.print("담당하는 학년과 반 : ");
int hak = sc.nextInt();
int ban = sc.nextInt();
teac = "담임선생님 ("+hak+"학년"+ban+"반)";
tvo.setGrade(hak);
tvo.setBan(ban);
}
if(type==2) {
System.out.print("담당 과목 : ");
String subj = sc.next();
teac = subj+"과목";
tvo.setsubj(subj);
}
pstmt.setString(4, teac);
rs = pstmt.executeQuery();
tvo.setId(id);
tvo.setName(name);
tvo.setGen(gen);
tvo.setType(type);
list.add(tvo);
System.out.print("\t1.추가입력 / 2. 그만입력 : ");
int stop = sc.nextInt();
if(stop==2) {
System.out.println();
System.out.println("***** 입력 종료 *****");
break;
}
}
}
catch(Exception e) {
e.printStackTrace();
}
return list;
}
public void toPrint(ArrayList<TeacVO> list) {
for(TeacVO t : list) {
System.out.println(t);
}
}
public ResultSet setTtmtRs(int no,String str) {
ResultSet rs = null;
try {
rs = stmt.executeQuery(str);
if(no==3) {
System.out.println(" < 조회 결과 > ");
while(rs.next()) {
String id = rs.getString("id");
String name =rs.getString("name");
String gen = rs.getString("gen");
String type = rs.getString("type");
System.out.println("id : "+id+" , name : "+name+" , 성별 : "+gen+"("+type+")");
}
}
}
catch(Exception e) {
e.printStackTrace();
}
return rs;
}
}
4번부터는 전에 했던것과 동일하다..
4. VO 클래스
package VO;
public interface VO {
public String getName();
public void setName(String name);
public String getId();
public void setId(String id);
public String getGen();
public void setGen(int no);
public int getGrade();
public void setGrade(int grade);
}
5. StudVO 클래스
package VO;
public class StudVO implements VO{
private String name,id,gen;
private int ban,grade;
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
public int getBan() {
return ban;
}
public void setBan(int ban) {
this.ban= ban;
}
@Override
public String getName() {
return name;
}
@Override
public void setName(String name) {
this.name= name;
}
@Override
public String getId() {
return id;
}
@Override
public void setId(String id) {
this.id = id;
}
@Override
public String getGen() {
return gen;
}
@Override
public void setGen(int no) {
this.gen = no==1?"여자":"남자";
}
public void setGen(String gen) {
this.gen = gen;
}
public String toString() {
return "학생 >> 이름 : "+name+"("+gen+") ID : "+id +", "+grade+"학년"+ban+"반";
}
}
6. TeacVO 클래스
package VO;
public class TeacVO implements VO{
private String name,id,gen,type,subj;
private int ban,grade;
public String getsubj() {
return subj;
}
public void setsubj(String subj) {
this.subj = subj;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public void setType(int no) {
this.type = no==1?grade+"학년"+ban+"반 담임선생님":"담당과목 : "+subj+"";
}
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
public int getBan() {
return ban;
}
public void setBan(int ban) {
this.ban= ban;
}
@Override
public String getName() {
return name;
}
@Override
public void setName(String name) {
this.name= name;
}
@Override
public String getId() {
return id;
}
@Override
public void setId(String id) {
this.id = id;
}
@Override
public String getGen() {
return gen;
}
public void setGen(String gen) {
this.gen = gen;
}
@Override
public void setGen(int no) {
this.gen = no==1?"여자":"남자";
}
public String toString() {
return "선생님"+">> 이름 : "+name+"("+gen+", "+type+") ID : "+id;
}
}
7. conSQL 클래스
package jdbc.SQL;
import java.sql.Connection;
import java.sql.DriverManager;
public class conSQL {
public conSQL() {
}
//드라이버 로딩, 커넥션 연결
public void setDriver() {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
}
catch(Exception e) {
System.out.println("=====드라이버 로딩 실패=====");
}
}
public Connection setCon() {
Connection con = null;
try {
String url = "jdbc:oracle:thin:@localhost:1521:xe";
String user = "scott";
String pw = "tiger";
con = DriverManager.getConnection(url,user,pw);
}
catch(Exception e) {
System.out.println("%%% 커넥션 연결 실패 %%%%");
}
return con;
}
}
8. studSQL 클래스
package jdbc.SQL;
import VO.StudVO;
public class studSQL {
public final static int CREATE = 1;
public final static int INSERT = 2;
public final static int SELECT = 3;
public final static int DELETE = 4;
public String setData(int num) {
StringBuffer buff = new StringBuffer();
switch(num) {
case CREATE:
buff.append("create table info (");
buff.append(" id varchar2(10 char) constraint info_id_pk primary key, ");
buff.append(" name varchar2(4 char) constraint info_name_nn not null, ");
buff.append(" gen varchar2(3 char) constraint info_gen_nn not null, ");
buff.append(" ban number(1) constraint info_ban_nn not null, ");
buff.append(" grade number(1) constraint info_grad_nn not null ) ");
break;
case INSERT:
buff.append("insert into info ");
buff.append(" values (?,?,?,?,?) ");
break;
case SELECT:
buff.append("select ");
buff.append(" id,name,gen,ban,grade ");
buff.append("from ");
buff.append(" info ");
break;
case DELETE:
buff.append("drop table info");
break;
}
return buff.toString();
}
}
9. teacSQL 클래스
package jdbc.SQL;
import VO.StudVO;
public class teacSQL {
//private String name,id,gen,type,subj;
//private int ban,grade;
public final static int CREATE = 1;
public final static int INSERT = 2;
public final static int SELECT = 3;
public final static int DELETE = 4;
public String setData(int num) {
StringBuffer buff = new StringBuffer();
switch(num) {
case CREATE:
buff.append("create table tinfo ( ");
buff.append(" id varchar2(10 char) constraint tinfo_id_pk primary key, ");
buff.append(" name varchar2(4 char) constraint tinfo_name_nn not null, ");
buff.append(" gen varchar2(3 char) constraint tinfo_gen_nn not null, ");
buff.append(" type varchar2(20 char) constraint tinfo_type_nn not null ) ");
break;
case INSERT:
buff.append("insert into tinfo ");
buff.append(" values (?,?,?,?) ");
break;
case SELECT:
buff.append("select ");
buff.append(" id, name, gen, type ");
buff.append("from ");
buff.append(" tinfo ");
break;
case DELETE:
buff.append("drop table tinfo");
break;
}
return buff.toString();
}
}
10. 메인 : 스캐너로 입력받게 하였다..
package Test;
import java.util.Scanner;
import jdbc.tmt.Stmt;
import jdbc.tmt.stmt.Student;
import jdbc.tmt.stmt.Teacher;
public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("1. 학생 조회, 2. 선생님 조회");
int no= sc.nextInt();
Stmt tmt = null;
if(no==1) {
tmt = new Student();
}
else if(no==2) {
tmt = new Teacher();
}
}
}
일단 내가 원하도록 출력은 되었지만..
제약조건도 수정하고 좀 더 간결하게 코드를 짤 수 있는 방법을 생각해봐야겠다.ㅠㅠㅠㅠ