오늘은 어제 만든 더미 테이블과 더미 데이터들을 기반으로
JAVA 클래스에서 각종 데이터를 입력 수정 삭제 조회 해보는 쿼리문을 Class에 옮겨 필드 및 메소드화 하여 구현하는 수업을 진행했다.
크게 JDBC 연결을 담당하는 JDBC 연결 패키지, 그리고 쿼리문 수행을 담당하는 쿼리문 클래스, 그리고 실행하는 메인클래스로 나뉘어서 진행하였다.
먼저 DB 접속과 객체 생성을 담당하는 JdbcUtil이라는 클래스를 생성하였다.
package db.dbEx2;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
//db 연결을 위한 클래스
public class JdbcUtil {
//field
private static final String url = "jdbc:oracle:thin:@localhost:1521/xe";
private static final String user = "scott";
private static final String pw = "tiger";
//constructor
static Connection getConnection() {
Connection conn = null;
//1.JDBC Driver를 등록, 대소문자와 스펠링에 유의할것
//oracle.jdbc까지는 라이브러리 내에 패키지이름. 그 안에 OracleDriver 클래스파일이 존재한다.
//예외처리 해줘야함, try-catch처리,
//2.연결
//DriverManager를 통해서 getConnection 메소드를 호출, 파라미터값은 3개)
//주소와 id password를 각자 String타입의 변수에 담아서 DriverManager파라미터값에는 변수만 대입
//기존에 try catch 절2개였던걸 하나로 합쳤다. 다중 try-catch문
//catch문 나열할때 큰 클래스순으로 아래로 나열
try {
Class.forName("oracle.jdbc.OracleDriver"); //문제가 없다면 try절에서 수행
conn = DriverManager.getConnection(url,user,pw);
} catch (ClassNotFoundException | SQLException e ) { //JAVA 7 이상부터 지원하는 multi catch
System.out.println("뭔가 문제가 있다잉");
e.printStackTrace(); //문제가 있다면 catch 절에서 console에 출력해준다.
}
return conn;
}
static void close(Connection conn) {
try {
if(conn != null) {
System.out.println("접속종료");
conn.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
static void close(Statement stmt) {
try {
if(stmt != null) {
System.out.println("객체종료");
stmt.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
다중 Try-catch절에 대해서는 별도로 언급하겠다.
여기서 DB 접속을 위한 URL 그리고 DB에 접근할 user의 id와 password는 변하지않는 고유 정보기때문에 final을 붙여주었다.
getConnection 메소드를 호출하기만 하면 DB 접속과 객체 생성이 동시에 이루어진다.
다음은 SQL 쿼리를 담당하는 NoticeDAO 클래스를 생성하였다.
package db.dbEx2;
import java.io.ObjectInputStream.GetField;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
public class NoticeBoardDAO {
private String sql = "";
Connection con = JdbcUtil.getConnection();
PreparedStatement stmt = null;
void allSelect() { //전체글조회
sql = "select nbno,title,cre_date,writer" +
" from noticeboard order by cre_date desc";
try {
stmt = con.prepareStatement(sql);
ResultSet rs = stmt.executeQuery();
while(rs.next()) {
int nbno = rs.getInt("nbno");
String title = rs.getString("title");
Date cre_date = rs.getDate("cre_date");
String writer = rs.getString("writer");
System.out.println(nbno+","+title+","+cre_date+","+writer);
}
} catch (SQLException e) {
System.out.println("allSelect 실패");
e.printStackTrace();
}
}
void select(int nno) { //특정글조회
sql = "select nbno,title,cre_date,writer" +
" from noticeboard" +
" where nbno = ?";
try {
stmt = con.prepareStatement(sql);
stmt.setInt(1, nno);
ResultSet rs = stmt.executeQuery();
while(rs.next()) {
int nbno = rs.getInt("nbno");
String title = rs.getString("title");
Date cre_date = rs.getDate("cre_date");
String writer = rs.getString("writer");
System.out.println(nbno+","+title+","+cre_date+","+writer);
}
} catch (SQLException e) {
System.out.println("select 실패");
e.printStackTrace();
}
}
void insert(String title, String contant, String writer, int rcnt,int eno) { //등록
sql = "INSERT INTO noticeboard(nbno,title,contant,cre_date,writer,rcnt,empno)" +
" VALUES(NOTICE_SEQ.nextval,?,?,SYSDATE,?,?,?)";
try {
stmt = con.prepareStatement(sql);
stmt.setString(1, title);
stmt.setString(2, contant);
stmt.setString(3, writer);
stmt.setInt(4, rcnt);
stmt.setInt(5, eno);
int result = stmt.executeUpdate();
System.out.println(result+"행 업데이트 완료");
} catch (SQLException e) {
e.printStackTrace();
}
}
void update(int nbno, String title, String contant, String writer) { //수정
sql = "update noticeboard" +
" set title = ?, contant = ?, writer=?" +
" where nbno = ?";
try {
stmt = con.prepareStatement(sql);
stmt.setString(1, title);
stmt.setString(2, contant);
stmt.setString(3, writer);
stmt.setInt(4, nbno);
int result = stmt.executeUpdate();
System.out.println(result+"행 수정완료");
} catch (SQLException e) {
e.printStackTrace();
}
}
void delete(int eno) { //삭제
sql = "delete noticeboard" +
" where nbno = ?";
try {
stmt = con.prepareStatement(sql);
stmt.setInt(1, eno);
int result = stmt.executeUpdate();
System.out.println(eno+"번글 "+result+"건 삭제완료");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
전체글 조회, 특정 게시글 조회, 수정, 삭제를 담당하는 쿼리문을 각각 메소드화 하여 처리해주었다.
다음은 실행 클래스인 Main 클래스를 작성하였다.
package db.dbEx2;
import java.sql.Connection;
import java.util.Scanner;
import java.util.StringTokenizer;
//jdbcutil의 main class
//나중에 웹에선 main method는 불필요
public class Main {
public static void main(String[] args) {
NoticeBoardDAO nbd = new NoticeBoardDAO();
Scanner sc = new Scanner(System.in);
while(true) {
System.out.println();
System.out.println("--1.전체조회 2.상세조회 3.등록 4.수정 5.삭제 6.종료");
System.out.print("메뉴 번호를 입력하세요▶");
int input = sc.nextInt();
if(input == 1) {
nbd.allSelect();
} else if(input == 2) {
System.out.print("조회할 글번호를 입력하세요▶");
int nno = sc.nextInt();
nbd.select(nno);
} else if(input == 3) {
System.out.println("등록할 값을 입력해주세요");
System.out.print("제목:");
String title = sc.next();
System.out.print("내용:");
String contant = sc.next();
System.out.print("작성자:");
String writer = sc.next();
nbd.insert(title, contant, writer,0,7369);
} else if(input == 4) {
System.out.print("수정할 글번호를 입력하세요▶");
int uno = sc.nextInt();
System.out.print("제목:");
String title = sc.next();
System.out.print("내용:");
String contant = sc.next();
System.out.print("작성자:");
String writer = sc.next();
nbd.update(uno,title,contant,writer);
} else if(input == 5) {
System.out.print("삭제할 글번호를 입력하세요▶");
int dno = sc.nextInt();
nbd.delete(dno);
} else if(input == 6) {
JdbcUtil.close(nbd.con);
JdbcUtil.close(nbd.stmt);
System.out.println("종료합니다");
break;
} else {
System.out.println("유효하지 않은 명령어입니다.");
}
}
}
}
Scanner 클래스를 이용하여 입력값을 받은다음. 입력값을 받는다면 if-else 문을 이용하여 해당 입력값에 맞는
메뉴가 실행되도록 처리해주었다.
여기에서 조금 난관이 있었는데 3번 수정부분에서 제목: 내용: 작성자: 각각 엔터를 쳐 가면서 입력하는것이 아닌
"제목 내용 작성자" 한줄로 입력 후에 띄어쓰기를 구분자로 String 변수에 담아 처리를 해보고 싶어서
String 타입의 배열도 선언해보고, Stringbuffer도 사용해보고 Stringtoknizer도 사용해보았지만 해결하지 못했다.
sc.next()를 이용하여 받아서 공백을 기준으로 자르면 인덱스가 1개만 생성이 되고, nextLine으로 설정해주었을때는 타 클래스에서 테스트 해봤을때 인덱스는 잘 받아오는거 같은데
3번 메뉴 선택후 엔터를 치면 바로 오류가 뿜어져 나온다. 이부분은 연구가 필요할거 같다.
실행하면 이런식으로 입력값을 받아 조회를 하거나 상세 조회를 하고
등록 수정 삭제 메뉴를 이용할수 있고 6번을 누르면 종료를 눌러 프로그램이 종료된다.
'Study > 중앙정보처리학원과정' 카테고리의 다른 글
31일차. ArrayList와 DTO (0) | 2022.12.07 |
---|---|
30일차. DTO(Data Tranfer Object) (0) | 2022.12.05 |
28일차. PL/SQL (0) | 2022.12.01 |
27일차. SQL 제약조건(CONSTRAINT) (0) | 2022.12.01 |
26일차(2). 뷰(View)와 시퀀스(Sequence) (0) | 2022.11.30 |