본문 바로가기
DBMS

[Oracle] DB접근&MVC분리

by amoomar 2022. 1. 20.
반응형

 

 

 

이번 포스팅에서는 SQL컬럼을 활용하여 main에서 다양한 방식으로 tableDB에 접근하고, 작성된 코드를 MVC개념에 접목하여 분리하여보는 실습 수업에 대한 내용을 다루었다. Model(DAO)에 포함되는 비즈니스메서드의 로직을 확인할 수 있다.

 

 

 


 

 

 

1. 컬럼 활용_main에서의 DB접근

 

1) JDBC 2복습 & 초기 tableDB 생성

: 실습을 위한 tableDB를 생성하며 동시에 이전 포스팅된 JDBC 2의 내용의 복습을 확인할 수 있다.

 

select * from user_tables;

--tableDB생성--
create table student(
   snum int primary key, --테이블은 반드시 pk가져야 하며, pk는 자동으로 not null
   sname varchar(5) not null,-- not null: 외부에서 반드시 값을 입력 받아야 한다.
   score int default 0,-- 입력 받지 않으면 0
   reg date default sysdate -- 입력 받지 않으면 현재날짜
);

--sname의 byte설정 변경--
alter table student modify(sname varchar(100)); 
--학생추가--
insert into student values(1,'홍길동',97,sysdate);
insert into student (snum,sname) values(2,'김첨지');

--pk값 자동 설정
insert into student (snum,sname) values((select nvl(max(snum),0)+1 from student), '왕밤빵');
insert into student (snum,sname,score) values((select nvl(max(snum),0)+1 from student), '왕밤빵',0);

--수정하기--
update student set score=100 where snum=1;
update student set score=64, snum=2 where snum=64;

--snum이 5이상인애들 지워줘--
delete from student where snum>5;

--이름 오름차순 정렬--
select sname from student order by sname desc;

--이름에 밤 들어가는애들 확인--
select * from student where sname like '%밤%'; 

--50점 미만인애들 이름 내림차순정렬--
select * from student where score>50 order by snum asc;

--table studet에 구성 개수--
select count(*) from student;

--DB전체정보조회--
select * from student;

 

 


 

 

 

2) VO생성

: VO의 생성을 통하여 각 단계의 로직에서마다 필요한 각기 다른 데이터를 제공하고, 사용할 수 있게 한다.

 

package class01;

public class StudentVO {
   // 테이블형 데이터--->>객체형 데이터(VO)
   // 기본생성자 + setter  VS  생성자 정의
   private int snum;
   private String sname;
   private int score;
   private String reg;
   
   public int getSnum() {
      return snum;
   }
   public void setSnum(int snum) {
      this.snum = snum;
   }
   public String getSname() {
      return sname;
   }
   public void setSname(String sname) {
      this.sname = sname;
   }
   public int getScore() {
      return score;
   }
   public void setScore(int score) {
      this.score = score;
   }
   public String getReg() {
      return reg;
   }
   public void setReg(String reg) {
      this.reg = reg;
   }
   
   @Override
   public String toString() {
      return "StudentVO [snum=" + snum + ", sname=" + sname + ", score=" + score + ", reg=" + reg + "]";
   }
}

 

 

 


 

 

 

3) main에서의 접근

: TableDB로부터 불러오기 된 데이터(stmt)를 통해 TableDB에 직접적인 접근이 가능하다. 이때, 지정한 data의 수정이 가능하도록하는 excuteUpdate( )와  지정한 data를 불러오는 excuteQuery( ), 총 두가지의 메서드가 사용된다.

 

  • excuteUpdate( );
    • 핵심 로직 중 CUD(insert, update, delete)의 수행이 이 메서드를 통해 가능하다.
    • 수행 결과는 int로 반환된다.
    • 즉, 몇개의 데이터가 삽입·수정·삭제 되었는지 확인 가능하다.
  • excuteQuery( );
    • 핵심 로직 중 R(select)의 수행이 이 메서드를 통해 가능하다.
    • 수행 결과는 ResultSet으로 반환된다.

 

package class01;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Scanner;

public class Test01 {

   public static void main(String[] args) {

      final String driverName="oracle.jdbc.driver.OracleDriver";
      final String url="jdbc:oracle:thin:@localhost:1521:xe";
      final String user="kim";
      final String passwd="1234";

      Connection conn=null;
      Statement stmt=null;

      final String sql_insert="insert into student (snum,sname,score) values((select nvl(max(snum),0)+1 from student),'";
      final String sql_update="update student set score=";
      final String sql_delete="delete from student where snum=";

      final String sql_selectAll="select * from student order by snum asc";
      final String sql_selectOne="select * from student where snum=";
      final String sql_select="select * from student where sname like '%"; // +?+"%'"
      try {
         Class.forName(driverName);

         conn=DriverManager.getConnection(url, user, passwd);

         stmt=conn.createStatement();

         /// CRUD
         Scanner sc=new Scanner(System.in);
         while(true) {
            System.out.println("----------");
            System.out.println("1. 추가");
            System.out.println("2. 전체목록");
            System.out.println("3. 학번검색");//1명출력
            System.out.println("4. 정보검색");//N명출력
            System.out.println("5. 학생정보변경");
            System.out.println("6. 삭제");
            System.out.println("7. 종료");
            System.out.println("----------");
            System.out.print(">>> ");
            int action=sc.nextInt();
            if(action==1) {
               // 1. 사용자로부터 정보를 입력받아와야함
               // 1-2. 이름,점수
               // 2. sql(insert)로 DB(table)에 정보 write
               System.out.print("이름>>> ");
               String sname=sc.next();
               System.out.print("점수>>> ");
               int score=sc.nextInt();
               stmt.executeUpdate(sql_insert+sname+"',"+score+")");
               System.out.println("로그: insert 완료");
            }
            else if(action==2) {
               // 1. 전체 테이블 정보를 출력
               ArrayList<StudentVO> datas=new ArrayList<StudentVO>();

               ResultSet rs=stmt.executeQuery(sql_selectAll);
               while(rs.next()) {

                  StudentVO data=new StudentVO(); // 기본생성자로 data객체 생성
                  data.setReg(rs.getString("reg")); // setter로 정보세팅
                  data.setScore(rs.getInt("score"));
                  data.setSname(rs.getString("sname"));
                  data.setSnum(rs.getInt("snum"));

                  datas.add(data); // 완성된 data객체를 datas에 추가
               }
               rs.close();

               System.out.println("===전체목록===");
               //출력로직 1 : for문
               for(int i=0;i<datas.size();i++) {
                  System.out.println(datas.get(i));
               }
               //출력로직 2 : for each
               for(StudentVO v:datas) {
                  System.out.println(v);
               }
               //출력로직 3 : iterator
               Iterator itr=datas.iterator();
               while(itr.hasNext()) {
                  System.out.println(itr.next());
               }
               System.out.println("============");
            }
            else if(action==3) {
               // 1. 단 1명을 출력할 예정->사용자로부터 pk를 입력받아와야만한다!
               // 2-1. 존재한다면 출력
               // 2-2. 존재x, 해당학생없음!
               System.out.print("출력대상 학번>>> ");
               int snum=sc.nextInt();
               ResultSet rs=stmt.executeQuery(sql_selectOne+snum);

               if(rs.next()) {
                  StudentVO data=new StudentVO(); // VO객체 생성.기본생성자
                  data.setReg(rs.getString("reg"));
                  data.setScore(rs.getInt("score"));
                  data.setSname(rs.getString("sname"));
                  data.setSnum(rs.getInt("snum"));
                  System.out.println(data); // toString() 오버라이딩되어있어서 출력가능            
               }
               else {
                  System.out.println("로그: select 대상없음!");
               }

               rs.close();
            }
            else if(action==4) {
               // 1. 사용자는 검색하고싶은 이름정보를 입력
               // 2. 그 단어가 들어가있는 학생의 정보들이 출력
               // 3-1. AL
               // 3-2. AL.size() == 0 : xxx 해당 문자열이 들어간 이름을 가진 학생은 없습니다!
               // 1. 전체 테이블 정보를 출력
               System.out.print("검색대상 이름>>> ");
               String sname=sc.next();
               ArrayList<StudentVO> datas=new ArrayList<StudentVO>();
               ResultSet rs=stmt.executeQuery(sql_select+sname+"%'");
               while(rs.next()) {
                  StudentVO data=new StudentVO();
                  data.setReg(rs.getString("reg"));
                  data.setScore(rs.getInt("score"));
                  data.setSname(rs.getString("sname"));
                  data.setSnum(rs.getInt("snum"));
                  datas.add(data);
               }
               rs.close();
               if(datas.size()==0) {
                  System.out.println("로그: select 대상없음!");
                  continue;
               }
               System.out.println("===검색결과===");
               for(StudentVO v:datas) {
                  System.out.println(v);
               }
               System.out.println("============");
            }
            else if(action==5) {
               // 1. 사용자로부터 pk를 입력받아와야만한다!
               //  1-1. 해당 데이터가 존재하는 경우 -> 2
               //  1-2. 해당 데이터가 존재하지않는 경우 -> 사용자에게 알림
               // 2. 점수를 변경하는 로직으로 해보자...
               System.out.print("변경대상 학번>>> ");
               int snum=sc.nextInt();
               System.out.print("변경할 점수>>> ");
               int score=sc.nextInt();
               int result=stmt.executeUpdate(sql_update+score+" where snum="+snum);
               // result는 sql문으로 처리된 대상 데이터의 개수를 의미함!
               if(result>0) {
                  System.out.println("로그: update 완료");
               }
               else {
                  System.out.println("로그: update 대상없음!");
               }
            }
            else if(action==6) {
               // 1. 사용자로부터 pk를 입력받아와야만한다!
               // 2. 해당 데이터의 존재여부 출력
               System.out.print("삭제대상 학번>>> ");
               int snum=sc.nextInt();
               int result=stmt.executeUpdate(sql_delete+snum);
               // result는 sql문으로 처리된 대상 데이터의 개수를 의미함!
               if(result>0) {
                  System.out.println("로그: delete 완료");
               }
               else {
                  System.out.println("로그: delete 대상없음!");
               }
            }
            else if(action==7) {
               break;
            }
         }

      } catch (Exception e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      } finally {
         try {
            stmt.close();
            conn.close();
         } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
         }
      }

   }

}

 

 

 

주석을 통해 상단 코드의 풀이가 가능하다.

 

 


 

 

 

2. 분리작업_ModelDAO로 분리

: 상단의 로직을 가지고 MVC개념을 접목하여 각각 분리가 가능하다.

 

 

1) Utill클래스 생성

: connection과 statement에 관한 내용은 전부 Model(DAO)에서 다루어진다. 즉, conn과 stmt의 생성과 닫기가 Model(DAO)의 모든 비즈니스메서드에서 진행되어야한다는 의미로도 해석된다. 같은 코드가 수차례 반복됨에 따라 별도의 Class생성을 통해 conn, stmt를 즉각적으로 받아오는 방식으로 코드의 응집도를 높힐 수 있다. 이런 용도로 생성된 클래스를 일반적으로 Utill로 명명한다. 이때, 물론 생성자로 로직을 담아두어도 간편하게 사용이 가능하나 JDBC이외의 작업에서는 해당되지 않는 방법이기에 추천되지 않는다.

 

정리하면 Utill class를 생성하여 conn, stmt관련 기능을 가진 메서드를 담고, 이를 통해 필요시 Model(DAO)에 즉각적으로 받아올 수 있다.

 

package class01;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

// 공통되는 로직을 따로 관리하기 위한 클래스
public class JDBCUtill {
	//static변수를 사용하여 자원으로 선언
	static final String driverName="oracle.jdbc.driver.OracleDriver";
	static final String url="jdbc:oracle:thin:@localhost:1521:xe";
	static final String user="ham";
	static final String passwd="1234";
	
	// DB에 연결 == connection 확보하기에 ouput으로 설정
	public static Connection connect() {
		Connection conn = null;
		try {
			Class.forName(driverName);
			conn=DriverManager.getConnection(url, user, passwd);
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return conn;
	}
	
	// conn, stmt 닫는 메서드
	public static void disconnect(Statement stmt, Connection conn) {
		try {
			stmt.close();
			conn.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

 

 

사용하는 멤버변수의 Static처리와 상수화(final)를 잊지 않는다.

 

 


 

 

 

2) DAO생성

: DAO는 핵심로직을 담는다. (가독성을 위해 메서드를 각각 분리하여 포스팅 하였다.)

 

  1. 변수의 선언_전처리작업
    //일단 얘네 쓸거고!
    //메서드에서마다 초기화 진행
    Connection conn;
    Statement stmt;
    	
    //사용할 sql속성들을 변수화 : 상수화필수
    final String sql_insert="insert into student (snum,sname,score) values((select nvl(max(snum),0)+1 from student),'";
    final String sql_update="update student set score=";
    final String sql_delete="delete from student where snum=";
    
    final String sql_selectAll="select * from student order by snum asc";
    final String sql_selectOne="select * from student where snum=";
    final String sql_select="select * from student where sname like '%"; // +?+"%'"​
  2. insert_C : 삽입
    //input & output을 정하기
    //로그를 달기위한 boolean처리
    public boolean studentInsert(StudentVO vo) {
    	conn=JDBCUtill.connect(); //DB연결
    
    	try {
    		stmt=conn.createStatement(); //연결된 DB load
    		//DB에 직접 접근 -> 수정
    		stmt.executeUpdate(sql_insert + vo.getSname()+"',"+vo.getScore()+")");
    	} catch (SQLException e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    		return false; //오류있으면 false
    	}finally {
    		JDBCUtill.disconnect(stmt, conn); //DB연결종료
    	}
    	return true; //오류 없으면 반환
    }​
    executeUpdate( )가 사용되었음을 확인할 수 있으며, 주석을 통해 풀이가 가능하다.                                        
  3. update_U : 수정
    public boolean studentUpdate(StudentVO vo) {
    	conn=JDBCUtill.connect(); //DB연결
    	int result=0; //update된 data의 개수를 저장
    	try {
    		stmt=conn.createStatement();
    		//executeUpdate시 int가 반환됨
    		result = stmt.executeUpdate(sql_update+vo.getScore()+" where snum="+vo.getSnum());
    	} catch (SQLException e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    		return false; //오류있으면 false
    	}finally {
    		JDBCUtill.disconnect(stmt, conn);
    	}if (result==0) {
    		return false; //결과가 없으면 false
    	}
    	return true; //아무 조건에도 걸리지 않으면 true
    }​
    executeUpdate( )가 사용되었음을 확인할 수 있으며, 주석을 통해 풀이가 가능하다.  
  4. delete_D : 삭제
    public boolean studentDelete(StudentVO vo) {
    	conn=JDBCUtill.connect(); //DB연결
    	int result=0; //Delete될 data의 개수를 저장
    	try {
    		stmt=conn.createStatement();
    		//executeUpdate시 int가 반환됨
    		result = stmt.executeUpdate(sql_delete+vo.getSnum());
    	} catch (SQLException e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    		return false;//오류있으면 false
    	}finally {
    		JDBCUtill.disconnect(stmt, conn);
    	}if (result==0) {
    		return false;//결과가 없으면 false
    	}	
    		return true;//아무 조건에도 걸리지 않으면 true
    }​
    : executeUpdate( )가 사용되었음을 확인할 수 있으며, 주석을 통해 풀이가 가능하다.  
  5. selectAll_R : 1개 이상의 결과 출력
    //당장은 input이 필요는 없지만 혹시 모르니까!
    public ArrayList<StudentVO> studentSelectAll(StudentVO vo){
    	String sql=sql_selectAll;
    	//이름의 입력이 있다면, sql=검색어 입력의 조건
    	//else, sql=변경 없음
    	if(vo.getSname()!=null) {
    		sql=sql_selectAll+vo.getSname()+"%'";
    	}
    	// 결과를 return할 배열리스트 생성
    	ArrayList<StudentVO> datas = new ArrayList<StudentVO>();
    	
    	conn=JDBCUtill.connect();
    	try {
    		stmt=conn.createStatement();
    		ResultSet rs = stmt.executeQuery(sql);
    		
    		while(rs.next()) {//배열에 필요한데이터 복사
    			StudentVO data = new StudentVO();
    			data.setReg(rs.getString("reg"));
    			data.setScore(rs.getInt("score"));
    			data.setSname(rs.getString("sname"));
    			data.setSnum(rs.getInt("snum"));
    			// 복사한 데이터만 반환할 목적
    			datas.add(data);
    		}
    		rs.close();
    	} catch (SQLException e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    	} finally {
    		JDBCUtill.disconnect(stmt, conn);
    	}
    	return datas;
    }​
    executeQuery( )가 사용되었음을 확인할 수 있으며, 주석을 통해 풀이가 가능하다. 
  6. selectOne_R : 1개의 결과 출력
    public StudentVO studentSelectOne(StudentVO vo) {
    	// 반환할 데이터의 기본값==null
    	StudentVO data= null;
    	conn = JDBCUtill.connect();//DB연결
    	try {
    		stmt = conn.createStatement();//DB load
    		ResultSet rs = stmt.executeQuery(sql_selectOne+vo.getSnum());
    		
    		if(rs.next()) { //반환 데이터가 1개라 while쓰지 않아도 됨
    			data = new StudentVO(); //데이터가 존재할때 new
    			//빈 멤버변수에 하나씩 찍어가며 저장
    			data.setReg(rs.getString("reg"));
    			data.setScore(rs.getInt("score"));
    			data.setSname(rs.getString("sname"));
    			data.setSnum(rs.getInt("snum"));
    		}
    		rs.close();//닫기
    		
    	} catch (SQLException e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    	} finally {//오류의 유무와 상관없이
    		JDBCUtill.disconnect(stmt, conn);
    	}
    	return data; //null 반환에 주의
    }
    executeQuery( )가 사용되었음을 확인할 수 있으며, 주석을 통해 풀이가 가능하다. 

 


 

 

 

3) 결합_DAO의 내용을 main에서 사용 가능하도록 수정

package class01;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.Scanner;

public class Test01 {

	public static void main(String[] args) {

		String mainMsg = "1. 추가  \n2. 전체목록 \n3. 학번검색  \n4. 정보검색 \n5. 정보변경 \n6. 학생삭제 \n7. 종료";
		Scanner sc=new Scanner(System.in);
		StudentDAO dao=new StudentDAO(); //DAO객체화

		try {

			while(true) {
				System.out.println("----------");
				System.out.println(mainMsg);
				System.out.println("----------");
				System.out.print(">>> ");
				int action=sc.nextInt();//사용자의 선택

				// [1. 학생추가]
				// 1. 사용자로부터 정보를 입력받아와야함
				// 1-2. 이름,점수
				// 2. sql(insert)로 DB(table)에 정보 write
				if(action==1) {
					// V
					System.out.print("이름>>> ");
					String sname=sc.next();
					System.out.print("점수>>> ");
					int score=sc.nextInt();
					// C
					StudentVO vo = new StudentVO();
					vo.setSname(sname);
					vo.setScore(score);
					// M
					// if, 반환이 있으면 insert완료
					if(dao.studentInsert(vo)) { 
						System.out.println("로그: insert 완료");
					}else {
						System.out.println("로그: insert 실패");
					}
				}	
				
				// [2. 학생목록]
				// 1. 전체 테이블 정보를 출력
				else if(action==2) {

					StudentVO vo = new StudentVO();
					// 배열리스트에 반환된 정보를 삽입
					ArrayList<StudentVO> datas=dao.studentSelectAll(vo);

					System.out.println("===전체목록===");
					Iterator itr=datas.iterator();
					while(itr.hasNext()) {
						System.out.println(itr.next());
					}
					System.out.println("============");
				}

				// [3. 학번조회]
				// 1. 단 1명을 출력할 예정->사용자로부터 pk를 입력받아와야만한다!
				// 2-1. 존재한다면 출력
				// 2-2. 존재x, 해당학생없음!
				else if(action==3) {
					// V
					System.out.print("출력대상 학번>>> ");
					int snum=sc.nextInt();
					// C
					StudentVO vo = new StudentVO();
					vo.setSnum(snum);
					// M
					vo = dao.studentSelectOne(vo);
					if(vo==null) {
						System.out.println("로그 : 검색결과 없음");
						continue;
					} else {
						System.out.println(vo);
					}

					// [4. 학생정보]
					// 1. 사용자는 검색하고싶은 이름정보를 입력
					// 2. 그 단어가 들어가있는 학생의 정보들이 출력
					// 3-1. AL
					// 3-2. AL.size() == 0 : xxx 해당 문자열이 들어간 이름을 가진 학생은 없습니다!
				} else if(action==4) {
					// V
					System.out.print("검색대상 이름>>> ");
					String sname=sc.next();
					// C
					StudentVO vo=new StudentVO();
					vo.setSname(sname);
					// M
					ArrayList<StudentVO> datas= dao.studentSelectAll(vo);
					// V
					if(datas.size()==0) {
						System.out.println("로그: select 대상없음!");
						continue;
					}
					System.out.println("===검색결과===");
					for(StudentVO v:datas) {
						System.out.println(v);
					}
					System.out.println("============");
				}

				// [5. 정보변경]
				// 1) 사용자로부터 pk를 입력받아와야만한다!
				// 1-1) 해당 데이터가 존재하는 경우 -> 2
				// 1-2) 해당 데이터가 존재하지않는 경우 -> 사용자에게 알림
				// 2) 점수를 변경하는 로직으로 해보자...
				else if(action==5) {
					// V
					System.out.print("변경대상 학번>>> ");
					int snum=sc.nextInt();
					System.out.print("변경할 점수>>> ");
					int score=sc.nextInt();
					// C
					StudentVO vo = new StudentVO();
					vo.setSnum(snum);
					vo.setScore(score);
					// M, C : 로그
					if(dao.studentUpdate(vo)) { //리턴이 돌아오면
						System.out.println("로그: update 완료");
					}
					else { //리턴이 돌아오지 않으면
						System.out.println("로그: update 대상없음!");
					}
				}
				
				// [6. 학생삭제]
				// 1. 사용자로부터 pk를 입력받아와야만한다!
				// 2. 해당 데이터의 존재여부 출력
				else if(action==6) {
					// V
					System.out.print("삭제대상 학번>>> ");
					int snum=sc.nextInt();
					// C
					StudentVO vo = new StudentVO();
					vo.setSnum(snum);
					// M, C : 로그
					if(dao.studentDelete(vo)) { //리턴이 돌아오면
						System.out.println("로그: delete 완료");
					}
					else { //리턴이 돌아오지 않으면
						System.out.println("로그: delete 대상없음!");
					}

				}else if(action==7) {
					break;
				}

			}

		} catch(Exception e) {
			e.printStackTrace();
		}
	}

}

 

 

주석을 통해 분석이 가능하다.

 

 

 


 

 

 

+ Model DAO 전체코드 첨부

package class01;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

//CRUD구현 예정
public class StudentDAO {

	//일단 얘네 쓸거고!
	//메서드에서마다 초기화 진행
	Connection conn;
	Statement stmt;
	
	//사용할 sql속성들을 변수화 : 상수화필수
	final String sql_insert="insert into student (snum,sname,score) values((select nvl(max(snum),0)+1 from student),'";
	final String sql_update="update student set score=";
	final String sql_delete="delete from student where snum=";

	final String sql_selectAll="select * from student order by snum asc";
	final String sql_selectOne="select * from student where snum=";
	final String sql_select="select * from student where sname like '%"; // +?+"%'"

	//input & output을 정하기
	//로그를 달기위한 boolean처리
	public boolean studentInsert(StudentVO vo) {
		conn=JDBCUtill.connect(); //DB연결

		try {
			stmt=conn.createStatement(); //연결된 DB load
			//DB에 직접 접근 -> 수정
			stmt.executeUpdate(sql_insert + vo.getSname()+"',"+vo.getScore()+")");
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return false; //오류있으면 false
		}finally {
			JDBCUtill.disconnect(stmt, conn); //DB연결종료
		}
		return true; //오류 없으면 반환
	}

	public boolean studentUpdate(StudentVO vo) {
		conn=JDBCUtill.connect(); //DB연결
		int result=0; //update된 data의 개수를 저장
		try {
			stmt=conn.createStatement();
			//executeUpdate시 int가 반환됨
			result = stmt.executeUpdate(sql_update+vo.getScore()+" where snum="+vo.getSnum());
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return false; //오류있으면 false
		}finally {
			JDBCUtill.disconnect(stmt, conn);
		}if (result==0) {
			return false; //결과가 없으면 false
		}
		return true; //아무 조건에도 걸리지 않으면 true
	}
	
	public boolean studentDelete(StudentVO vo) {
		conn=JDBCUtill.connect(); //DB연결
		int result=0; //Delete될 data의 개수를 저장
		try {
			stmt=conn.createStatement();
			//executeUpdate시 int가 반환됨
			result = stmt.executeUpdate(sql_delete+vo.getSnum());
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return false;//오류있으면 false
		}finally {
			JDBCUtill.disconnect(stmt, conn);
		}if (result==0) {
			return false;//결과가 없으면 false
		}	
			return true;//아무 조건에도 걸리지 않으면 true
	}
	
	//당장은 input이 필요는 없지만 혹시 모르니까!
	public ArrayList<StudentVO> studentSelectAll(StudentVO vo){
		String sql=sql_selectAll;
		//이름의 입력이 있다면, sql=검색어 입력의 조건
		//else, sql=변경 없음
		if(vo.getSname()!=null) {
			sql=sql_selectAll+vo.getSname()+"%'";
		}
		// 결과를 return할 배열리스트 생성
		ArrayList<StudentVO> datas = new ArrayList<StudentVO>();
		
		conn=JDBCUtill.connect();
		try {
			stmt=conn.createStatement();
			ResultSet rs = stmt.executeQuery(sql);
			
			while(rs.next()) {//배열에 필요한데이터 복사
				StudentVO data = new StudentVO();
				data.setReg(rs.getString("reg"));
				data.setScore(rs.getInt("score"));
				data.setSname(rs.getString("sname"));
				data.setSnum(rs.getInt("snum"));
				// 복사한 데이터만 반환할 목적
				datas.add(data);
			}
			rs.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			JDBCUtill.disconnect(stmt, conn);
		}
		return datas;
	}

	public StudentVO studentSelectOne(StudentVO vo) {
		// 반환할 데이터의 기본값==null
		StudentVO data= null;
		conn = JDBCUtill.connect();//DB연결
		try {
			stmt = conn.createStatement();//DB load
			ResultSet rs = stmt.executeQuery(sql_selectOne+vo.getSnum());
			
			if(rs.next()) { //반환 데이터가 1개라 while쓰지 않아도 됨
				data = new StudentVO(); //데이터가 존재할때 new
				//빈 멤버변수에 하나씩 찍어가며 저장
				data.setReg(rs.getString("reg"));
				data.setScore(rs.getInt("score"));
				data.setSname(rs.getString("sname"));
				data.setSnum(rs.getInt("snum"));
			}
			rs.close();//닫기
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {//오류의 유무와 상관없이
			JDBCUtill.disconnect(stmt, conn);
		}
		return data; //null 반환에 주의
	}
	
	
}

 

 

 

 

 

반응형

'DBMS' 카테고리의 다른 글

[Oracle] 웹크롤링_기초  (0) 2022.01.24
[Oracle] 트랜잭션  (0) 2022.01.22
[Oracle] pstmt  (0) 2022.01.21
[Oracle] 개요 & SQL문법  (0) 2022.01.19
[Oracle] 설치와 오류  (0) 2022.01.18