본문 바로가기
Study/중앙정보처리학원과정

24일차(2). 이클립스(Eclipse)에서 DDL,DML 수행하기 Feat.메소드(Method)

by 얏옹이 2022. 11. 27.
반응형

24일차(1)의 지난 포스팅

 

2022.11.25 - [Study/중앙정보처리학원과정] - 24일차(1). 이클립스(Eclipse)에서 DDL, DML 수행하기

 

24일차(1). 이클립스(Eclipse)에서 DDL, DML 수행하기

이전글 2022.11.25 - [Study/중앙정보처리학원과정] - 23일차. 이클립스(eclipse)와 오라클 데이터베이스(Oracle database)11gR2 연동 23일차. 이클립스(eclipse)와 오라클 데이터베이스(Oracle database)11gR2 연동 수업

yat-ong.tistory.com

 

 

이전글에서 좀더 진화(?) 한, 중복되는 코드들을 메소드화 해서 호출해주는 방식으로 변환해보도록 하겠다.

 

먼저 DB 연결을 해주는 클래스를 하나 만들어서 각종 필드와 메소드를 선언해주도록 하겠다.

 

package db;

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

//DB 연결과 각종 쿼리문을 메소드화 해주는 클래스
public class DmlEx01 {
	//필드
	String url = "jdbc:oracle:thin:@localhost:1521/xe";
	String id = "scott";
	String pwd = "tiger";
	Connection conn = null;
	PreparedStatement psmt = null;
	
	//기본생성자
	DmlEx01() {
		
	}

	//메소드
	//DB 접속 및 객체 생성 메소드
	void dbConnect() {
		try {
			Class.forName("oracle.jdbc.OracleDriver");
			System.out.println("OracleDriver 연결 완료");
		} catch (ClassNotFoundException e) {
			System.out.println("OracleDriver 연결 실패");
			e.printStackTrace();
		}
		
		try {
			conn = DriverManager.getConnection(url, id, pwd);
			System.out.println("DB 연결 성공");
		} catch (SQLException e) {
			System.out.println("DB 연결 실패");
			e.printStackTrace();
		}
		
	}
}

 

 

현재 기본 DB 접속테스트를 위하여 코드를 작성해주었다. 이 클래스 안에 메소드를 추가해서 Select, Insert, Update등등 쿼리문에 관련된 메소드를 추가해줄것이다.

 

일단 테스트를 위해서 Main Method를 포함한 클래스를 새로 만들어 DmlEx01을 상속받았다.

 

 

package db;

//DmlEx01 클래스를 상속받아 DmlEx01의 실행클래스
public class DmlEx01_Main extends DmlEx01{
	public static void main(String[] args) {
		
		//객체 생성
		DmlEx01 dml = new DmlEx01();
		
		//DB연결 메소드
		dml.dbConnect();
		
	}
}

 

메소드를 호출해주니

 

정상적으로 DB 연결까지는 된것을 확인할수 있다. 자 그렇다면....!! 이제는 쿼리문이다!

 

자... 일단 EMP테이블의 전체 데이터를 조회하는 쿼리문을 메소드로 만들어주겠다.

 

void select() {
		sql = "select empno,ename,job,mgr,sal,comm,deptno"
				+ " from emp";
		
		try {
			//sql 변수에 담긴 select 쿼리문을 psmt에 대입
			psmt = conn.prepareStatement(sql);
			
			//select문이니 executeQuery로 실행. executeQuery는 리턴값으로 ResultSet 타입으로 반환한다
			//따라서 ResultSet 타입의 참조변수로 그 값을 받아준다.
			rs = psmt.executeQuery();
			
			//while문을 통해 rs에 담겨있는 모든 객체의 값들을 꺼내준다.
			while(rs.next()) {
				//SQL의 컬럼 데이터타입과 일치하는 데이터타입의 변수를 준비하고, 그 값을 다 대입
				//대입은 인덱스번호로도 가능하지만, 범용성을 위해 컬럼명으로 직접 대입한다.
				int eno = rs.getInt("empno");
				String ename = rs.getString("ename");
				String job = rs.getString("job");
				int mgr = rs.getInt("mgr");
				int sal = rs.getInt("sal");
				int comm = rs.getInt("comm");
				int deptno = rs.getInt("deptno");
				
				//출력
				System.out.println(eno+","+ename+","+job+","+mgr+","+sal+","+comm+","+deptno);
				
			}
		} catch (SQLException e) {
			System.out.println("selectEmp 실패");
			e.printStackTrace();
		}
		
		this.closePsmt();
	}
	
	//emp 테이블에 특정 데이터값을 받아와 해당넘버 데이터를 조회하는 select where문
	void select(int empno) {
		sql = "select empno,ename,job,mgr,sal,comm,deptno"
				+ " from emp"
				+ " where empno = ?";
		
		try {
			psmt = conn.prepareStatement(sql);
			//매개변수 empno를 받아와 ?에 대입해준다
			psmt.setInt(1, empno);
			
			rs = psmt.executeQuery();
			
			while(rs.next()) {
				int eno = rs.getInt("empno");
				String ename = rs.getString("ename");
				String job = rs.getString("job");
				int mgr = rs.getInt("mgr");
				//date타입은 표기를 위해 일단 String 타입으로 get해서 String타입으로 받아준다
				int sal = rs.getInt("sal");
				int comm = rs.getInt("comm");
				int deptno = rs.getInt("deptno");
				
				//출력
				System.out.println(eno+","+ename+","+job+","+mgr+","+sal+","+comm+","+deptno);
			}
			
			
		} catch (SQLException e) {
			System.out.println("select 실패");
			e.printStackTrace();
		}
		
		this.closePsmt();
		
	}
	//insert문
	void insert(int eno, String ename, String job, int mgr, int sal, int comm, int deptno) {
		sql = "insert into emp(empno,ename,job,mgr,sal,comm,deptno)"
				+ " values(?,?,?,?,?,?,?)";
		try {
			psmt = conn.prepareStatement(sql);
			psmt.setInt(1, eno);
			psmt.setString(2, ename);
			psmt.setString(3, job);
			psmt.setInt(4, mgr);
			psmt.setInt(5, sal);
			psmt.setInt(6, comm);
			psmt.setInt(7, deptno);
			
			int result = psmt.executeUpdate();
			System.out.println(result+"개의 행 업데이트");
		} catch (SQLException e) {
			System.out.println("insert 실패");
			e.printStackTrace();
		}
		
		this.closePsmt();
		
	}
	
	//delete문
	void delete(int empno) {
		sql = "delete from emp"
				+ " where empno = ?";
		
		try {
			psmt = conn.prepareStatement(sql);
			psmt.setInt(1, empno);
			
			int result = psmt.executeUpdate();
			System.out.println(empno+"번 삭제성공 "+result+"개의 행 삭제");
			
		} catch (SQLException e) {
			System.out.println("삭제 실패");
			e.printStackTrace();
		}
		this.closePsmt();
	}
	
	//update문
	void update(String name, int eno) {
		sql = "update emp"
				+ " set ename = ?"
				+ " where empno = ?";
		
		try {
			psmt = conn.prepareStatement(sql);
			psmt.setString(1, "데프트");
			psmt.setInt(2, 9006);
			
			int result = psmt.executeUpdate();
			System.out.println(result+"개의 행 업데이트");
		} catch (SQLException e) {
			System.out.println("update 실패");
			e.printStackTrace();
		}
		
		this.closePsmt();
	}
	
	void closeConn() {
		if(conn != null) {
			try {
				conn.close();
				System.out.println("conn 리소스 close");
			} catch (SQLException e) {
				System.out.println("conn 리소스 close fail");
				e.printStackTrace();
			}
		}
		
	}
	
	void closePsmt() {
		if(psmt != null) {
			try {
				psmt.close();
				System.out.println("psmt 리소스 close");
			} catch (SQLException e) {
				System.out.println("psmt close fail ");
				e.printStackTrace();
			}
		}
	}

 

와... 길다 길어 ㅠㅠ

 

하지만 상속 클래스에서 이렇게 선언을 다 해놓으면 메인메소드는 아주 간단하게 끝난다.

 

package db;


//DmlEx01 클래스를 상속받아 DmlEx01의 실행클래스
public class DmlEx01_Main extends DmlEx01{
	public static void main(String[] args) {
		
		//객체 생성
		DmlEx01 dml = new DmlEx01();
		
		
		
		//DB연결 메소드
		dml.dbConnect();
		
		//전체 emp 테이블 조회
		//dml.select();
		
		//특정 empno로 일부 테이블 조회(메소드 오버로딩)
		//dml.select(9000);
		
		//insert, 매개변수의 값들을 지정해주면 insert문의 values()안의 값들로 들어가게됨
		//dml.insert(9006,"데프트","ad", 9000,3000,500,30);
		
		//empno로 특정값 삭제
		//dml.delete(9006);
		
		//update
		dml.update("데프트", 9006);
		dml.select();
		
	}
}

 

메인메소드는 아주 간결하다.

 

자.. 이제 메인클래스에서 한번에 순서를 정해보겠다.

전체 emp 조회 -> insert -> update -> 특정값 조회 -> delete -> 다시 전체 조회 -> 종료 순으로 해주겠다.

 

 

package db;


//DmlEx01 클래스를 상속받아 DmlEx01의 실행클래스
public class DmlEx01_Main extends DmlEx01{
	public static void main(String[] args) {
		
		//객체 생성
		DmlEx01 dml = new DmlEx01();
		
		
		
		//DB연결 메소드
		dml.dbConnect();
		
		
		//전체 emp 테이블 조회
		System.out.println();
		System.out.println("------------select------------");
		dml.select();
		
		//insert, 매개변수의 값들을 지정해주면 insert문의 values()안의 값들로 들어가게됨
		System.out.println();
		System.out.println("------------insert------------");
		dml.insert(9006,"데프트","ad", 9000,3000,500,30);
		
		//update
		System.out.println();
		System.out.println("------------update------------");
		dml.update("deft", 9006);
		dml.select();
		
		//특정 empno로 일부 테이블 조회(메소드 오버로딩)
		System.out.println();
		System.out.println("------------where------------");
		dml.select(9006);
		
		//empno로 특정값 삭제
		System.out.println();
		System.out.println("------------delete------------");
		dml.delete(9006);
		
		//다시 전체 emp 테이블 조회
		System.out.println();
		System.out.println("------------select------------");
		//dml.select();
		
		//close
		dml.closeConn();
		
	}
}

 

 

순서를 잘 기억해두고 실행을 돌리기 전. 9006번이 DB에 없어야하니 먼저 Developer에서 EMP 테이블을 조회했다.

 

9006번 없제...?

 

empno는 primary key라서 unique 해야하기때문에 중복이 되면 오류가 발생한다.

 

자.. 9006번이 없는것을 확인했으니 이제 메인메소드를 실행해보겠다.

 

 

 

9006번에 "데프트" 라고 insert 했던게 중간에 update를 거치면서 "deft"로 변하였고

 

변한것을 확인후에 다시 지워주고 정상적으로 지워진것을 확인하기 위해 전체 EMP 조회를 했고,

 

9006번이 사라진것을 확인할수 있었다.

 

다시한번 메소드 클래스 전체와 메인메소드 전체를 하단에 남긴다.

 

 

--부모클래스 DmlEx01

package db;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;

//DB 연결과 각종 쿼리문을 메소드화 해주는 클래스
public class DmlEx01 {
	//필드
	String url = "jdbc:oracle:thin:@localhost:1521/xe";
	String id = "scott";
	String pwd = "tiger";
	String sql;
	Connection conn = null;
	PreparedStatement psmt = null;
	ResultSet rs = null;
	
	//기본생성자
	DmlEx01() {
		
	}

	//메소드
	//DB 접속 및 객체 생성 메소드
	void dbConnect() {
		try {
			Class.forName("oracle.jdbc.OracleDriver");
			System.out.println("OracleDriver 연결 완료");
		} catch (ClassNotFoundException e) {
			System.out.println("OracleDriver 연결 실패");
			e.printStackTrace();
		}
		
		try {
			conn = DriverManager.getConnection(url, id, pwd);
			System.out.println("DB 연결 성공");
		} catch (SQLException e) {
			System.out.println("DB 연결 실패");
			e.printStackTrace();
		}
		
	}
	
	//emp 테이블을 전체 조회하는 전체 select문
	void select() {
		sql = "select empno,ename,job,mgr,sal,comm,deptno"
				+ " from emp";
		
		try {
			//sql 변수에 담긴 select 쿼리문을 psmt에 대입
			psmt = conn.prepareStatement(sql);
			
			//select문이니 executeQuery로 실행. executeQuery는 리턴값으로 ResultSet 타입으로 반환한다
			//따라서 ResultSet 타입의 참조변수로 그 값을 받아준다.
			rs = psmt.executeQuery();
			
			//while문을 통해 rs에 담겨있는 모든 객체의 값들을 꺼내준다.
			while(rs.next()) {
				//SQL의 컬럼 데이터타입과 일치하는 데이터타입의 변수를 준비하고, 그 값을 다 대입
				//대입은 인덱스번호로도 가능하지만, 범용성을 위해 컬럼명으로 직접 대입한다.
				int eno = rs.getInt("empno");
				String ename = rs.getString("ename");
				String job = rs.getString("job");
				int mgr = rs.getInt("mgr");
				int sal = rs.getInt("sal");
				int comm = rs.getInt("comm");
				int deptno = rs.getInt("deptno");
				
				//출력
				System.out.println(eno+","+ename+","+job+","+mgr+","+sal+","+comm+","+deptno);
				
			}
		} catch (SQLException e) {
			System.out.println("selectEmp 실패");
			e.printStackTrace();
		}
		
		this.closePsmt();
	}
	
	//emp 테이블에 특정 데이터값을 받아와 해당넘버 데이터를 조회하는 select where문
	void select(int empno) {
		sql = "select empno,ename,job,mgr,sal,comm,deptno"
				+ " from emp"
				+ " where empno = ?";
		
		try {
			psmt = conn.prepareStatement(sql);
			//매개변수 empno를 받아와 ?에 대입해준다
			psmt.setInt(1, empno);
			
			rs = psmt.executeQuery();
			
			while(rs.next()) {
				int eno = rs.getInt("empno");
				String ename = rs.getString("ename");
				String job = rs.getString("job");
				int mgr = rs.getInt("mgr");
				//date타입은 표기를 위해 일단 String 타입으로 get해서 String타입으로 받아준다
				int sal = rs.getInt("sal");
				int comm = rs.getInt("comm");
				int deptno = rs.getInt("deptno");
				
				//출력
				System.out.println(eno+","+ename+","+job+","+mgr+","+sal+","+comm+","+deptno);
			}
			
			
		} catch (SQLException e) {
			System.out.println("select 실패");
			e.printStackTrace();
		}
		
		this.closePsmt();
		
	}
	//insert문
	void insert(int eno, String ename, String job, int mgr, int sal, int comm, int deptno) {
		sql = "insert into emp(empno,ename,job,mgr,sal,comm,deptno)"
				+ " values(?,?,?,?,?,?,?)";
		try {
			psmt = conn.prepareStatement(sql);
			psmt.setInt(1, eno);
			psmt.setString(2, ename);
			psmt.setString(3, job);
			psmt.setInt(4, mgr);
			psmt.setInt(5, sal);
			psmt.setInt(6, comm);
			psmt.setInt(7, deptno);
			
			int result = psmt.executeUpdate();
			System.out.println(result+"개의 행 업데이트");
		} catch (SQLException e) {
			System.out.println("insert 실패");
			e.printStackTrace();
		}
		
		this.closePsmt();
		
	}
	
	//delete문
	void delete(int empno) {
		sql = "delete from emp"
				+ " where empno = ?";
		
		try {
			psmt = conn.prepareStatement(sql);
			psmt.setInt(1, empno);
			
			int result = psmt.executeUpdate();
			System.out.println(empno+"번 삭제성공 "+result+"개의 행 삭제");
			
		} catch (SQLException e) {
			System.out.println("삭제 실패");
			e.printStackTrace();
		}
		this.closePsmt();
	}
	
	//update문
	void update(String name, int eno) {
		sql = "update emp"
				+ " set ename = ?"
				+ " where empno = ?";
		
		try {
			psmt = conn.prepareStatement(sql);
			psmt.setString(1, name);
			psmt.setInt(2, eno);
			
			int result = psmt.executeUpdate();
			System.out.println(result+"개의 행 업데이트");
		} catch (SQLException e) {
			System.out.println("update 실패");
			e.printStackTrace();
		}
		
		this.closePsmt();
	}
	
	void closeConn() {
		if(conn != null) {
			try {
				conn.close();
				System.out.println("conn 리소스 close");
			} catch (SQLException e) {
				System.out.println("conn 리소스 close fail");
				e.printStackTrace();
			}
		}
		
	}
	
	void closePsmt() {
		if(psmt != null) {
			try {
				psmt.close();
				System.out.println("psmt 리소스 close");
			} catch (SQLException e) {
				System.out.println("psmt close fail ");
				e.printStackTrace();
			}
		}
	}
	
}

 

--자식클래스이자 Main Method를 가지고 있는 실행 클래스

 

package db;


//DmlEx01 클래스를 상속받아 DmlEx01의 실행클래스
public class DmlEx01_Main extends DmlEx01{
	public static void main(String[] args) {
		
		//객체 생성
		DmlEx01 dml = new DmlEx01();
		
		
		
		//DB연결 메소드
		dml.dbConnect();
		
		
		//전체 emp 테이블 조회
		System.out.println();
		System.out.println("------------select------------");
		dml.select();
		
		//insert, 매개변수의 값들을 지정해주면 insert문의 values()안의 값들로 들어가게됨
		System.out.println();
		System.out.println("------------insert------------");
		dml.insert(9006,"데프트","ad", 9000,3000,500,30);
		
		//update
		System.out.println();
		System.out.println("------------update------------");
		dml.update("deft", 9006);
		
		
		//특정 empno로 일부 테이블 조회(메소드 오버로딩)
		System.out.println();
		System.out.println("------------where------------");
		dml.select(9006);
		
		//empno로 특정값 삭제
		System.out.println();
		System.out.println("------------delete------------");
		dml.delete(9006);
		
		//다시 전체 emp 테이블 조회
		System.out.println();
		System.out.println("------------select------------");
		dml.select();
		
		//close
		dml.closeConn();
		
	}
}
반응형