[JDBC 응용] 학생 Table , Query로 접근하기
🛠Tools
Oracle 18C XE (sqlplus),
Eclips 2021-12,
JDK-java SE 8,
Server - apache Tomcat 9.0
📰테이블 작성.
create table student(
name varchar2(15) not null,
value varchar2(15),
code number
);
이번 Program의 요구사항은 다음과 같습니다.
- 입력
- Code를 입력받아 각 Code별로 Value항목이 달라집니다.
- 학생 : 이름,학번
- 교수 : 이름,과목
- 관리자 : 이름 , 부서
- Code를 입력받아 각 Code별로 Value항목이 달라집니다.
- 검색
- 이름검색 (1개의 글자가 포함된 모든 레코드 검색)
- 코드검색
- 전체검색
- 수정
- 이름을 통해서 Code와 Value를 수정합니다.
- 삭제
- 이름이 일치한 레코드를 삭제합니다.
- 종료
📢 참고사항. 기본적으로 DTO와 DAO의 Class 형식을 지켜서 작성합니다. 저같은 경우엔 총 3번의 수정을 통해 Program의 확장성을 넓히고자 하였으며, 각 기능별로 Method를 세분화하여 사용하려 노력하였습니다.
또한, SQL문은 전부 prepardStatment로 처리하였습니다.
핵심적인 Method들을 제외한 총합 코드 길이가 많아 전부 포스팅에 담기엔 가독성이 안좋아서 Git 주소로 대체합니다.
https://github.com/madbo2/JSP-Study/tree/main/Student_improvement
GitHub - madbo2/JSP-Study
Contribute to madbo2/JSP-Study development by creating an account on GitHub.
github.com
Code 파헤치기
📢 Table에 있는 code,value,name 은 각 항목별로 따로 입력받는 Method를 작성하였습니다. 아래 참조
private int chooseInput() {
System.out.print(
"****************\r\n" +
" 1. 이름검색\r\n" +
" 2. 코드검색\r\n" +
" 3. 전체검색\r\n" +
" 4. 이전으로\r\n" +
"****************\r\n" +
" 번호선택 : ");
int select = sc.nextInt();
return select;
}
private int codeInput() {
System.out.print("****************\r\n"
+ " 1. 학생\r\n"
+ " 2. 교수\r\n"
+ " 3. 관리자\r\n"
+ " 4. 이전메뉴\r\n"
+ "****************\r\n"
+ " 번호선택 : ");
int code = sc.nextInt();
return code;
}
private String nameInput(String msg) {
System.out.print(msg + "이름 입력 : ");
String name = sc.next();
return name;
}
private String valueInput(int code) {
if(code==1) {
System.out.print("학번 입력 : ");
} else if (code==2) {
System.out.print("과목 입력 : ");
} else {
System.out.print("부서 입력 : ");
}
return sc.next();
}
📜 InsertArticle Method
private void insertArticle() {
int code = codeInput(); // 확장성을 위한 입력 메소드 작성
if(code==4) {
return;
} else if(code <1 || code >4) {
System.out.println("잘못된 선택입니다");
return;
}
String name = nameInput("");
String value = valueInput(code);
StudentDTO dto = new StudentDTO(name, value, code);
StudentDAO dao = new StudentDAO();
boolean check = dao.insert(dto); //결과창 출력을 위한 Boolean
if(check) {
System.out.println(name + "님의 정보가 추가 되었습니다.");
}else {
System.out.println("정보 추가에 실패하였습니다.");
}
}
📜 SelectArticle Method
private void selectArticle1() {
int select = chooseInput();
if(select == 4) {
System.out.println("이전 메뉴로 돌아갑니다.");
} else if(select <1 || select >4) {
System.out.println("잘못된 선택입니다. 이전메뉴로 돌아갑니다");
return;
}
StudentDTO dto = null;
if(select == 1) {
dto = new StudentDTO();
System.out.println("검색할 이름 입력 : ");
dto.setName(sc.next());
} else if (select == 2) {
int code = codeInput();
if(select ==4) {
System.out.println("이전 메뉴로");
return;
} else if( select <1 || select > 4) {
System.out.println("잘못된 선택입니다.");
return;
}
dto = new StudentDTO();
dto.setCode(code);
}
StudentDAO dao = new StudentDAO();
List<StudentDTO> list = dao.select(dto);
if(list == null) {
System.out.println("검색 결과가 없습니다.");
} else {
for(StudentDTO d : list) {
System.out.print("이름 : " + d.getName() + "\t");
if(d.getCode() == 1) {
System.out.println("학번 : " + d.getvalue());
}else if(d.getCode() == 2) {
System.out.println("과목 : " + d.getvalue());
}else if(d.getCode() == 3) {
System.out.println("부서 : " + d.getvalue());
}
}
}
}
📜 UpdateArticle Method
private void updateArticle2() {
String name = nameInput("수정할 ");
StudentDAO dao = new StudentDAO();
StudentDTO dto = dao.selectOne(name); // 1개의 레코드만검색하는 메소드
if(dto == null) {
System.out.println("검색 실패 이전메뉴로 돌아갑니다.");
return;
}
System.out.println(dto.getName()+"님의 정보");
System.out.println(valueString(dto.getCode())+dto.getvalue());
int code = codeInput();
if(code == 4) {
return;
}else if(code < 1 || code > 4) {
System.out.println("잘못된 선택!..이전 메뉴로..");
return;
}
String value = valueInput(code);
dto.setValue(value);
dto.setCode(code);
int su = dao.update(dto);
if(su!=0) {
System.out.println(name + "님의 정보가 성공적으로 수정되었습니다.");
} else {
System.out.println("수정 작업에 실패하였습니다.");
}
}
private String valueString(int code) {
if(code == 1) {
return "학번 : ";
} else if (code==2) {
return "과목 : ";
} else {
return "부서 : ";
}
}
📜 DeletArticle Method
private void deleteArticle() {
String name = nameInput("");
StudentDTO dto = new StudentDTO(name);
StudentDAO dao = new StudentDAO();
boolean check = dao.delete(dto);
if(check) {
System.out.println(name + "님의 정보가 삭제 되었습니다.");
}else {
System.out.println("정보 삭제에 실패하였습니다.");
}
}
📜 StudentDTO.java
package student.StudentDTO;
import java.util.Scanner;
public class StudentDTO {
Scanner sc = new Scanner(System.in);
private String name;
private String value;
private int code;
public StudentDTO() {
}
public StudentDTO(int code) {
this.code = code;
}
public StudentDTO(String name) {
this.name = name;
}
public StudentDTO(String name, String value, int code) {
this.name = name;
this.value = value;
this.code = code;
}
public void setName(String name) {
this.name = name;
}
public void setValue(String value) {
this.value = value;
}
public void setCode(int code) {
this.code = code;
}
public String getName() {
return name;
}
public String getvalue() {
return value;
}
public int getCode() {
return code;
}
}
📜 StudentDAO() [ 생성자 , 드라이버 로딩 ]
public StudentDAO() {
try {
Class.forName("oracle.jdbc.OracleDriver");
} catch(ClassNotFoundException e) {
e.printStackTrace();
}
}
📜 StudentDAO.getConnection [ DB와 연결 ]
private void getConnection() {
String url = "jdbc:oracle:thin:@localhost:1521:xe";
String user = "c##jsp";
String password = "oracle";
try {
con = DriverManager.getConnection(url, user, password);
} catch(SQLException e) {
e.printStackTrace();
}
}
📜 StudentDAO . Insert Method
public boolean insert(StudentDTO dto) {
boolean check = false;
String sql = "insert into student values(?,?,?)";
try {
this.getConnection();
ps = con.prepareStatement(sql);
ps.setString(1, dto.getName());
ps.setString(2, dto.getvalue());
ps.setInt(3, dto.getCode());
if(ps.executeUpdate() != 0 ) {
check = true;
}
} catch (SQLException e ) {
e.printStackTrace();
} finally {
try {
if(ps!=null) ps.close();
if(con !=null) con.close();
} catch(SQLException e) {
e.printStackTrace();
}
}
return check;
}
📜 StudentDAO . select Method
public List<StudentDTO> select(StudentDTO dto){
List<StudentDTO> list = new ArrayList<StudentDTO>();
String sql = null;
if(dto == null) {
sql = "select * from student";
} else if(dto.getName() != null) {
sql = "select * from student where name like ?";
} else {
sql = "select * from student where code = ?";
}
try {
this.getConnection();
ps = con.prepareStatement(sql);
if(dto != null) {
if(dto.getName() != null) {
ps.setString(1,"%"+ dto.getName() + "%");
} else {
ps.setInt(1, dto.getCode());
}
}
rs = ps.executeQuery();
while(rs.next()) {
String name = rs.getString("name");
String value = rs.getString("value");
int code = rs.getInt("code");
StudentDTO dt = new StudentDTO(name, value, code);
list.add(dt);
}
}catch (SQLException e) {
e.printStackTrace();
}finally {
try {
if(rs != null) rs.close();
if(ps != null) ps.close();
if(con != null) con.close();
}catch(SQLException e) {
e.printStackTrace();
}
}
if(list.isEmpty()) {
list = null;
}
return list;
}
📜 StudentDAO . Delete Method
public boolean delete(StudentDTO dto) {
boolean check = false;
String sql = "delete from Student where name=?";
try {
this.getConnection();
ps = con.prepareStatement(sql);
ps.setString(1, dto.getName());
if(ps.executeUpdate() != 0 ) {
check = true;
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if(ps!=null) ps.close();
if(con !=null) con.close();
} catch(SQLException e) {
e.printStackTrace();
}
}
return check;
}
📜 StudentDAO . Update Method
public int update(StudentDTO dto) {
String sql = "update Student set code=? , value=? where name = ?";
int su = 0;
try {
this.getConnection();
ps = con.prepareStatement(sql);
ps.setInt(1, dto.getCode());
ps.setString(2, dto.getvalue());
ps.setString(3, dto.getName());
su = ps.executeUpdate();
} catch (SQLException e ) {
e.printStackTrace();
}finally {
try {
if(ps!=null) ps.close();
if(con !=null) con.close();
} catch(SQLException e) {
e.printStackTrace();
}
}
return su;
}
필수적인 Method들은 이렇게 있습니다.
여담.💦
이 코드들을 작성하면서 기능의 구현만이 아닌 여러가지를 고민해 볼 필요가 있다고 생각했습니다.
Class를 세분화하고, Method들도 세분화하기에 그 Method들을 이용하면서 접근지정자들은 어떻게 설정할 지, 반환값의 유무, 객체를 생성할 때 굳이 모든 데이터를 집어넣을 필요가 있을지, 예외처리 등 여러 요소들을 생각하면서 작성함으로써 정말 다양하게 생각할 수 있었고, 수많은 방법들 중 가장 효율적이라고 생각되는 그런 코드들을 작성하게 되더라구요. 코딩을 함에 있어서 좋은 경험이었던 것 같아요.