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);
//}