package k_jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class JDBCUtil {
//싱글톤 패턴 : 인스턴스의 생성을 제한하여 하나의 인스턴스만 사용하는 디자인 패턴
//인스턴스(객체) 하나만 생성을 한다. ->
//현재 있는 클래스에 객체를 생성하고 다른 클래스가 객체가 필요하면 빌려주게 된다.
//private 을 붙여서 다른 클래스에서 생성자를 호출할 수 없다.
private JDBCUtil (){
}
//다른 클래스에서 생성자를 호출 할 수 없으니까,
//인스턴스를 보관할 변수
private static JDBCUtil instance;
//인스턴스를 빌려주는 메서드
public static JDBCUtil getInstance(){
if (instance == null){
instance = new JDBCUtil ();
}
return instance;
}
private String url = "jdbc:oracle:thin:@localhost:1521:xe";
private String user = "Aurora";
private String password = "java";
private Connection con = null ;
private PreparedStatement ps = null ;
private ResultSet rs = null ;
/*메소드 종류
*
* Map<String, Object> selectOne(String sql ) //물음표가 없는 경우
* Map<String, Object> selectOne(String sql , List<Object> param) //물음표가 있는경우 List<Object> param 물음표에 담을것 List 는 Arraylist 의
* List<Map<String, Object>> selectList(String sql ) //물음표가 없는 경우
* List<Map<String, Object>> selectList(String sql , List<Object> param ) //물음표가 있는 경우
* int update(String sql) //물음표가 있는경우 -> return 값은
* int update(String sql, List<Object> param) //물음표가 없는경우
*/
//메소드를 생성했다.
List<Map<String, Object>> selectList(String sql , List<Object> param ){
// 리턴타입이 List<Map<String, Object>> 이다. 메소드 이름이 selectList 이고 파라미터가 String sql 과 List<Object> param 이다.
// String 타입의 sql 을 받았고 ( insert나 select 등등 ) 물음표에 넣어줘서 대괄호를 수행할 때 필요한 값을 List<Object> param 으로 받아준것.
List<Map<String, Object>> list = new ArrayList<>();
//이 메소드는 리턴을 해줘야하기때문에 try 안에다가 만들어 줄 수 없다. 트라이 밖에 만들어줌
try {
con = DriverManager.getConnection(url, user, password);
ps = con.prepareStatement(sql);
for(int i = 0 ; i < param.size(); i++){
ps.setObject(i+1, param.get(i));
}
rs = ps.executeQuery();
ResultSetMetaData md = rs.getMetaData();
int columnCount = md.getColumnCount();
while(rs.next()){
Map<String, Object > row = new HashMap<>();
//hashMap 을 바깥에 놔주면 HashMap이 저장이 안되서 얘는 while 문 안에 있어야 한다.
for(int i = 1; i <= columnCount; i++){
String key = md.getColumnName(i);
Object value = rs.getObject(i);
row.put(key, value);
}
list.add(row);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if(rs != null) try { rs.close(); } catch(Exception e) { }
if(ps != null) try { ps.close(); } catch(Exception e) { }
if(con != null) try { con.close(); } catch(Exception e) { }
}
return list;
}
//물음표가 없는 경우 -> sql에서 컬럼값이 모두 정해져있는것.
public Map<String, Object> selectOne(String sql){
Map<String, Object> map = new HashMap<>() ;
try {
con = DriverManager.getConnection(url, user, password);
ps = con.prepareStatement(sql);
rs = ps.executeQuery();
ResultSetMetaData md = rs.getMetaData();
int columnCount = md.getColumnCount();
while(rs.next()){
for( int i = 1 ; i <=columnCount ; i++){
String key = md.getColumnName(i);
Object value = rs.getObject(i);
map.put(key, value);
}
} //while(rs.next()) 얘의 것
} catch (SQLException e) {
e.printStackTrace();
}finally {
if(rs != null) try { rs.close(); } catch(Exception e) { }
if(ps != null) try { ps.close(); } catch(Exception e) { }
if(con != null) try { con.close(); } catch(Exception e) { }
}
return map ;
} //Map<String, Object> selectOne(String sql ) 의 끝
public Map<String, Object> selectOne(String sql , List<Object> param){ //물음표가 있는경우 List<Object> param 물음표에 담을것 List 는 Arraylist 의
Map<String, Object> map = new HashMap<>() ;
try {
con = DriverManager.getConnection(url, user, password);
ps = con.prepareStatement(sql);
for(int i = 0 ; i < param.size(); i++){
ps.setObject(i+1, param.get(i));
}
rs = ps.executeQuery();
ResultSetMetaData md = rs.getMetaData();
int columnCount = md.getColumnCount();
while(rs.next()){
for(int i = 1 ; i < columnCount; i++ ) {
String key = md.getColumnName(i);
Object value = rs.getObject(i);
map.put(key, value);
}
}//while 의 끝
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if(rs != null) try { rs.close(); } catch(Exception e) { }
if(ps != null) try { ps.close(); } catch(Exception e) { }
if(con != null) try { con.close(); } catch(Exception e) { }
}
return map ;
} //Map<String, Object> selectOne(String sql , List<Object> param) 의 끝
public List<Map<String, Object>> selectList(String sql ){ //물음표가 없는 경우, 여러열이 있는경우
//파라미터를 받은 메소드
List<Map<String, Object>> list = new ArrayList<>();
// 리턴타입 먼저 선언해줌
try {
con = DriverManager.getConnection(url, user, password);
ps = con.prepareStatement(sql);
rs = ps.executeQuery();
ResultSetMetaData md = rs.getMetaData();
int columnCount = md.getColumnCount();
while(rs.next()){
Map<String, Object> row = new HashMap<>();
for(int i = 1 ; i <=columnCount; i++){
String key = md.getColumnName(i);
Object value = rs.getObject(i);
row.put(key, value);
}
list.add(row);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if(rs != null) try { rs.close(); } catch(Exception e) { }
if(ps != null) try { ps.close(); } catch(Exception e) { }
if(con != null) try { con.close(); } catch(Exception e) { }
}
return list;
} //List<Map<String, Object>> selectList(String sql ) 의 끝 // 물음표가 없는 경우.
}
댓글
댓글 쓰기