package student1007;

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

public class StudentDAO {

        private Connection conn;
        private Statement stmt;
        private PreparedStatement pstmt;
        private ResultSet rs;

        private final String url = "jdbc:oracle:thin:@192.168.1.100:1521:xe";
        private final String user = "c##itbank";
        private final String password = "it";

        public StudentDAO() {
                try {
                        Class.forName("oracle.jdbc.OracleDriver");
                        conn = DriverManager.getConnection(url, user, password);
                } catch (ClassNotFoundException | SQLException e) {
                        e.printStackTrace();
                }
        }

        // 반복되는 코드 1. close()
        // 연결, 상태, 결과셋 요소가 멤버 필드로 등록되어 있어야 한다
        // 서로 다른 메서드가 공통으로 참조하려면 멤버 필드로 등록이 되어야 한다
        private void close() {
                try {
                        if(rs != null)                 rs.close();
                        if(pstmt != null)         pstmt.close();
                        if(stmt != null)         stmt.close();
                        if(conn != null)         conn.close();

                } catch(SQLException e) {
                        System.out.println("close 에서 예외 발생 : " + e);
                }
        }

        private ArrayList<StudentDTO> select(String sql) {
                ArrayList<StudentDTO> list = new ArrayList<StudentDTO>();
                // NullPointerException 생기지 않도록~
                // forEach() 쓸꺼면 길이가 0일 경우 상관 없음

                try {
                        stmt = conn.createStatement();
                        rs = stmt.executeQuery(sql);

                        while(rs.next()) {
                                StudentDTO dto = new StudentDTO();
                                dto.setIdx(rs.getInt("idx"));
                                dto.setName(rs.getString("name"));
                                dto.setKor(rs.getInt("kor"));
                                dto.setEng(rs.getInt("eng"));
                                dto.setMat(rs.getInt("mat"));
                                dto.setTotal(rs.getInt("total"));
                                dto.setAvg(rs.getDouble("avg"));
                                list.add(dto);

                                if(sql.contains("where idx")) {        // SQL문이 idx에 대한 조건을 사용한다면 반복문안에서 바로 반환(함수 종료)
                                        return list;
                                }
                        }
                } catch (SQLException e) {
                        System.out.println("select 예외 : " + e);
                } finally { close(); }
                return list;
        }

        // select * from student order by idx;                                // 다수의 레코드
        // select * from student order by avg;                                // 다수의 레코드
        // select * from student where name like '%홍길동%';        // 다수의 레코드
        // select * from student where idx = 5;                                // 조건으로 PK를 사용하면 결과는 1개이거나 0개이거나

        public ArrayList<StudentDTO> selectList() {
                return select("select * from student order by idx");
        }

        public ArrayList<StudentDTO> selectList(String name) {
                // 1. 서식 문자를 넣었다면 반드시 처리하여 사용하자
                // 2. SQL에서는 문자열을 표현하기 위해서 따옴표를 사용해야 한다(')
                // 3. where 전에는 ,를 사용하지 않는다

                String sql = "select * from student where name like '%%%s%%'";
                sql = String.format(sql, name);
                return select(sql);
        }

        public ArrayList<StudentDTO> selectListOrderByAvg() {
                return select("select * from student order by avg desc");
        }

        public StudentDTO searchByIdx(int idx) {
                return select("select * from student where idx = " + idx).get(0);
        }



}





Hashmap을 사용해서 컬럼의 이름과 데이터 타입을 찾아올 수 있다

//int colCount = rs.getMetaData().getColumnCount();
//for(int i = 0; i < colCount; i++) {
//String colName = rs.getMetaData().getColumnName(i +1);
//String colType = rs.getMetaData().getColumnTypeName(i +1);
//}
profile
with me

0개의 댓글