Java8의 람다를 이용해서 JDBC 쿼리 간단하게 만들기
JDBC 코딩을 하다보면 전처리 후처리 코드를 매번 넣어줘야 합니다.
public class NormalJDBC {
public static Dict select_query(String userid) throws SQLException {
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rset = null;
Dict map = null;
try {
conn = DataSrc.getConnection();
stmt = conn.prepareStatement("SELECT * FROM TABLE_NAME WHERE TYP in (?, ?, ?) and ID = ?");
stmt.setString(1, "1");
stmt.setString(2, "2");
stmt.setString(3, userid);
rset = stmt.executeQuery();
ResultSetMetaData md = rset.getMetaData();
int columns = md.getColumnCount();
if (rset.next()) {
map = new Dict(columns);
for(int i=1; i<=columns; ++i)
map.put(md.getColumnName(i),rset.getString(i));
}
return map;
} finally {
try { if (rset != null) rset.close(); } catch(Exception e) { }
try { if (stmt != null) stmt.close(); } catch(Exception e) { }
try { if (conn != null) conn.close(); } catch(Exception e) { }
}
}
}
자바 8 의 Lambda 를 이용하면 다음처럼 쿼리문과 파라미터로 코드를 구성할 수 있습니다.
public static HashMap<String, String> calling_lambda_jdbc() throws CustomException
return select("SELECT fields from table where id=?", (params) -> {
params.add("user_id");
});
}
아래는 람다를 인자로 받는 함수입니다. 핵심은 processor.process() 입니다.
import java.util.List;
import java.util.ArrayList;
import java.util.HashMap;
import java.sql.*;
public class LambdaJDBC {
public static HashMap<String, String> select(String query, ParamProcessor processor) throws ApsException {
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rset = null;
HashMap<String, String> map = null;
try {
conn = DbSrc.getConnection(); // external data pool
stmt = conn.prepareStatement(query);
List<String> params = new ArrayList<String>();
processor.process(params); // calling function parameter.
int index = 1;
for(String s : params) {
stmt.setString(index, s);
index++;
}
rset = stmt.executeQuery();
ResultSetMetaData md = rset.getMetaData();
int columns = md.getColumnCount();
if (rset.next()) {
map = new HashMap<String, String>(columns);
for(int i=1; i<=columns; ++i)
map.put(md.getColumnName(i),rset.getString(i));
}
return map;
} catch (SQLException e) {
throw new ApsQueryException(e.toString());
} finally {
try { if (rset != null) rset.close(); } catch(Exception e) { }
try { if (stmt != null) stmt.close(); } catch(Exception e) { }
try { if (conn != null) conn.close(); } catch(Exception e) { }
}
}
}
전체 소스는 깃헙에 올렸습니다.
https://gist.github.com/jinto/54512d2927d06529d052a3477859d2dc