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