ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [6회차] JDBC (DAO와DTO, 싱글톤)
    ORACLE 2021. 5. 5. 16:53

    강의명 : 오픈프레임워크 활용 디지털융합 SW엔지니어 양성 과정

    강의 날짜 : 21.05.03

     

     

    <각종 예제>

     

    PreparedStatement Statement
    prepareStatement(sql)
    executeQuery() / executeUpdate()
    createStatement()
    executeQuery(sql) / executeUpdate(sql)
    SQL명령문을 컴파일 시점에 Statement로 준비 후 바로 실행 SQL명령문을 실행 시에 Statement로 준다.
    실행 시 SQL injection이 되지 않아 보안 상 안전 실행 시 SQL injection 위험성

     

     

    1. PreparedStatement SELECT 예제

     

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    public class Ex21{
    public static void main(String[] args) {
    			String driver ="oracle.jdbc.driver.OracleDriver";
    			String url = "jdbc:oracle:thin:@localhost:1521:xe";
    			String user = "lion";
    			String pwd = "1234";
    			Connection con =null;
    			PreparedStatement pstmt = null;
    			ResultSet rs = null;
    			try {
    				Class.forName(driver);
    				
    				con =DriverManager.getConnection(url,user,pwd);
    				String query = "SELECT DEPTNO, DNAME, LOC FROM DEPT"
    						+" WHERE DEPTNO = ?";
    				pstmt = con.prepareStatement(query);
    				pstmt.setInt(1, 40);
    				rs=pstmt.executeQuery();
    				while(rs.next()) {
    					int deptno = rs.getInt("deptno");
    					String dname = rs.getString("dname");
    					String loc = rs.getString("loc");
    					System.out.println(deptno + " "+dname+" "+loc);
    				}
    			}catch(Exception e) {
    				e.printStackTrace();
    			}finally {
    				try {
    					rs.close();
    					pstmt.close();
    					con.close();
    				}catch(SQLException e ) {
    					e.printStackTrace();
    				}
    			}
    	}
    }

     

    PreparedStatement로 SQL문을 준비한 후 바로 executeQuery로 실행이 된다.

    이후 결과를 ResultSet에 담아서 next메소드로 레코드 단위로 레코드를 읽어온다.

     

     

     

    2. PreparedStatement INSERT 예제

     

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    
    public class Ex22{
    public static void main(String[] args) {
    			String driver ="oracle.jdbc.driver.OracleDriver";
    			String url = "jdbc:oracle:thin:@localhost:1521:xe";
    			String user = "lion";
    			String pwd = "1234";
    			Connection con =null;
    			PreparedStatement pstmt = null;
    			try {
    				Class.forName(driver);
    				
    				con =DriverManager.getConnection(url,user,pwd);
    				String query = "INSERT INTO DEPT (DEPTNO, DNAME, LOC)"
    						+ " VALUES (?,?,?)";
    				pstmt = con.prepareStatement(query);
    				pstmt.setInt(1, 60);
    				pstmt.setString(2, "관리");
    				pstmt.setString(3, "부산");
    				int n = pstmt.executeUpdate();
    				System.out.println(n+" 개 레코드 저장");
    			}catch(Exception e) {
    				e.printStackTrace();
    			}finally {
    				try {
    					pstmt.close();
    					con.close();
    				}catch(SQLException e ) {
    					e.printStackTrace();
    				}
    			}
    	}
    }

    콘솔 실행창
    DEPT 테이블

    마지막 줄에 (60, 관리, 부산) 데이터가 들어간 것을 확인할 수 있다.

     

     

     

    3. PreparedStatement UPDATE 예제

     

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    
    public class Ex23{
    public static void main(String[] args) {
    			String driver ="oracle.jdbc.driver.OracleDriver";
    			String url = "jdbc:oracle:thin:@localhost:1521:xe";
    			String user = "lion";
    			String pwd = "1234";
    			Connection con =null;
    			PreparedStatement pstmt = null;
    			try {
    				Class.forName(driver);
    				
    				con =DriverManager.getConnection(url,user,pwd);
    				String query = "UPDATE DEPT SET DNAME = ?, LOC = ? "
    						+" WHERE DEPTNO = ?";
    				pstmt = con.prepareStatement(query);
    				pstmt.setString(1, "인사");
    				pstmt.setString(2, "서울");
    				pstmt.setInt(3, 60);
    				int n = pstmt.executeUpdate();
    				System.out.println(n+" 개 레코드 수정");
    			}catch(Exception e) {
    				e.printStackTrace();
    			}finally {
    				try {
    					pstmt.close();
    					con.close();
    				}catch(SQLException e ) {
    					e.printStackTrace();
    				}
    			}
    	}
    }

    콘솔 실행창

     

     

    4. PreparedStatement DELETE 예제

     

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    
    public class Ex24{
    public static void main(String[] args) {
    			String driver ="oracle.jdbc.driver.OracleDriver";
    			String url = "jdbc:oracle:thin:@localhost:1521:xe";
    			String user = "lion";
    			String pwd = "1234";
    			Connection con =null;
    			PreparedStatement pstmt = null;
    			try {
    				Class.forName(driver);
    				
    				con =DriverManager.getConnection(url,user,pwd);
    				String query = "DELETE FROM DEPT WHERE DEPTNO = ?";
    				pstmt = con.prepareStatement(query);
    				pstmt.setInt(1, 60);
    				int n = pstmt.executeUpdate();
    				System.out.println(n+" 개 레코드 삭제");
    			}catch(Exception e) {
    				e.printStackTrace();
    			}finally {
    				try {
    					pstmt.close();
    					con.close();
    				}catch(SQLException e ) {
    					e.printStackTrace();
    				}
    			}
    	}
    }

     

     

     

    콘솔 실행창

     

    DEPT 테이블 확인

     

    5. 시스템 정보 확인

     

    import java.sql.Connection;
    import java.sql.DatabaseMetaData;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    public class Ex29{
    public static void main(String[] args) {
    			String driver ="oracle.jdbc.driver.OracleDriver";
    			String url = "jdbc:oracle:thin:@localhost:1521:xe";
    			String user = "lion";
    			String pwd = "1234";
    			Connection con =null;
    			try {
    				Class.forName(driver);
    				con =DriverManager.getConnection(url,user,pwd);
    				DatabaseMetaData data = con.getMetaData();
    				System.out.println(data.getDatabaseProductName());
    				System.out.println(data.getDatabaseProductVersion());
    				System.out.println(data.getDriverName());
    				System.out.println(data.getURL());
    				ResultSet rs = data.getSchemas();
    				while(rs.next()) {
    					System.out.println("계정명 : "+rs.getString(1));
    				}
    			}catch(Exception e) {
    				e.printStackTrace();
    			}finally {
    				try {
    					con.close();
    				}catch(SQLException e ) {
    					e.printStackTrace();
    				}
    			}
    	}
    }

     

     

    DataBaseMetaData 클래스는 접속되어 있는 계정을 통해 시스템 정보(메타 데이터)를 가져온다.

     

     

    데이버베이스는 이런 시스템 정보를 통한 버전 관리가 중요한데, 이런 것을 형상관리라고 한다.

     

    DB에서 우선 순위는 cmd가 가장 세므로 cmd에서 작업이 불가능하면 JAVA로 접근할 수 밖에 없다.

    다만, JAVA로도 권한 예외가 뜬다면 JAVA에서 접근하는 것 조차 막아둔 것이다.

      

     

     

    <DAO와 DTO>

     

    DAP, DTO, Connection은 디자인 패턴으로 이미 검증된 것을 재사용하는 것이다.

     

     

    1. main 클래스 

     

    import java.util.ArrayList;
    
    public class ExTest1 {
    
    	public static void main(String[] args) {
    		ExDAO dao = new ExDAO();
            
    		ArrayList<ExDTO> list = dao.select();
    		
    		for(ExDTO dto : list) {
    			int deptno = dto.getDeptno();
    			String dname = dto.getDname();
    			String loc = dto.getLoc();
    			System.out.println(deptno+" "+dname+" "+loc);
    		}
    	}
    }

     

     

    2. DAO 클래스 

     

    DAO = DataBase Access Object

     

    실질적으로 SQL명령을 실행하는 곳이다.

    무엇을 수행할 것이냐에 따라 메소드가 기술되어 있으며, 메소드명은 작업과 관련성이 있게 지어야 한다.

    즉, 데이터 처리를 위하여 DB에 직접 접근하는 객체이다. (CRUD기능)

     

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.ArrayList;
    
    public class ExDAO {
    	String driver ="oracle.jdbc.driver.OracleDriver";
    	String url = "jdbc:oracle:thin:@localhost:1521:xe";
    	String user = "lion";
    	String pwd = "1234";
    	
    	public ExDAO() {
    		try {
    			Class.forName(driver);
    		}catch (ClassNotFoundException e) {
    			e.printStackTrace();
    		}
    	}
    	
    	public ArrayList<ExDTO> select(){
    		ArrayList<ExDTO> list = new ArrayList<ExDTO>();
    		Connection con = null;
    		PreparedStatement pstmt = null;
    		ResultSet rs = null;
    		try {
    			con =DriverManager.getConnection(url,user,pwd);
    			String query = "SELECT DEPTNO, DNAME, LOC FROM DEPT";
    			pstmt = con.prepareStatement(query);
    			rs=pstmt.executeQuery();
    			while(rs.next()) {
    				ExDTO dto = new ExDTO();
    				dto.setDeptno(rs.getInt("deptno"));
    				dto.setDname(rs.getString("dname"));
    				dto.setLoc(rs.getString("loc"));
    				list.add(dto);
    			}
    		}catch (Exception e) {
    			e.printStackTrace();
    		}finally {
    			try {
    				rs.close();
    				pstmt.close();
    				con.close();
    			}catch(SQLException e) {
    				e.printStackTrace();
    			}
    		}
    		return list;	
    	}
    	
    	public void insert(int deptno, String dname, String loc) {
    		Connection con = null;
    		PreparedStatement pstmt = null;
    		try {
    			con =DriverManager.getConnection(url,user,pwd);
    			String query = "INSERT INTO DEPT (DEPTNO, DNAME, LOC) "
    					+ " VALUES (?,?,?)";
    			pstmt = con.prepareStatement(query);
    			pstmt.setInt(1, deptno);
    			pstmt.setString(2, dname);
    			pstmt.setString(3, loc);
    			int n = pstmt.executeUpdate();
    		}catch (Exception e) {
    			e.printStackTrace();
    		}finally {
    			try {
    				pstmt.close();
    				con.close();
    			}catch(SQLException e) {
    				e.printStackTrace();
    			}
    		}
    	}
    }

     

    DAO 클래스 생성자

     

     

    DAO 클래스 select 메소드

     

    DAO 클래스 select 메소드 다이어그램

     

    DAO 클래스 insert 메소드

     

     

    3. DTO 클래스

     

    DTO = Data Transfer Object

     

    데이터를 JAVA 객체화 시켜주는 객체이다.

    이때 데이터를 직렬화시켜준다.

     

    getter, setter 메소드로 데이터를 저장하고 받으며,

    데이터 전송 방식이 벡터 스트림 방식이라 VO라고도 불린다.

     

    public class ExDTO {
    	int deptno;
    	String dname;
    	String loc;
        
    	public int getDeptno() {
    		return deptno;
    	}
    	public void setDeptno(int deptno) {
    		this.deptno = deptno;
    	}
    	public String getDname() {
    		return dname;
    	}
    	public void setDname(String dname) {
    		this.dname = dname;
    	}
    	public String getLoc() {
    		return loc;
    	}
    	public void setLoc(String loc) {
    		this.loc = loc;
    	}
    }

     

     

    4. 전체 다이어그램

     

     

    <싱글톤>

     

    객체 생성의 남용을 막기 위한 객체이다.

    계속 객체를 만들 필요가 없으면 공유하도록 하는 것이다.

    (static과 비슷)

     

    생성자는 무조건 private로 밖에서 접근이 불가능하게 하고 

    public 메소드로 객체를 얻어갈 수 있도록 한다.

     

     

    1. 싱글톤 클래스

     

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    
    public class DBConn {
    
    	private static Connection  dbconn;
        
    	public static Connection getConnection(){
    		if(dbconn == null) {
    			try {
    			String url = "jdbc:oracle:thin:@localhost:1521:xe";
    			String user = "lion";
    			String pwd = "1234";
    			Class.forName("oracle.jdbc.driver.OracleDriver");
    			dbconn = DriverManager.getConnection(url,user,pwd);
    			}catch(Exception e) {
    				System.out.println(e.toString());
    			}
    		}
    		return dbconn;
    	}
        
    	public static Connection getConnection(String url, String user, String pwd){
    		if(dbconn == null) {
    			
    			try {
    			Class.forName("oracle.jdbc.driver.OracleDriver");
    			dbconn = DriverManager.getConnection(url,user,pwd);
    			}catch(Exception e) {
    				System.out.println(e.toString());
    			}
    		}
    		return dbconn;
    	}
        
    	public static void close() {
    		if(dbconn != null) {
    			try {
    				if(!dbconn.isClosed()) dbconn.close();
    			}catch (Exception e) {
    				System.out.println(e.toString());
    			}
    		}
    		dbconn = null;
    	}
    }

     

     

     

     

     

    2. 싱글톤 클래스에서 객체 얻어오기 예제1

     

    import java.sql.Connection;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    public class DBConnTest1 {
    	public static void main(String[] args) {
    
    		Connection conn = DBConn.getConnection();
            
    		if(conn == null) {
    			System.out.println("연결 실패");
    			System.exit(0);
    		}
    		System.out.println("연결 성공");
    		try {
    			Statement stmt = conn.createStatement();
    			String sql = "insert into dept values (90,'개발','강남')";
    			int result = stmt.executeUpdate(sql);
    			System.out.println(result+"개 행 실행");
    		}catch(SQLException e) {	
    			System.out.println(e.toString());
    		}
    		DBConn.close();
    	}
    }

     

     

    콘솔 실행창

     

     

    3. 싱글톤 클래스에서 객체 얻어오기 예제2

     

    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    public class DBConnTest2 {
    	public static void main(String[] args) {
    
    		Connection conn = DBConn.getConnection();
    		
    		if(conn == null) {
    			System.out.println("연결 실패");
    			System.exit(0);
    		}
    		System.out.println("연결 성공");
    		try {
    			String sql = "SELECT * FROM DEPT";
    			PreparedStatement pstmt = conn.prepareStatement(sql);
    			ResultSet rs = pstmt.executeQuery();
    			while(rs.next()) {
    			System.out.println(rs.getInt("deptno")+", "+
    			rs.getString("dname")+", "+rs.getString(3));
    			}
    			rs.close();
    			pstmt.close();
    		}catch(SQLException e) {	
    			System.out.println(e.toString());
    		}
    		DBConn.close();	
    	}
    }

     

     

    콘솔 실행창

     

     

    4. 전체 다이어그램

     

Designed by Tistory.