簡介
內容
原始程式
// DAO 
// FunctionalInterface 格式 接收兩個參數,返回一個值
public class OhActivityDAO {
    public static List<OhActivity> findAll(Connection conn,Map<String,Object> map) throws SQLException {
        String sql = "SELECT * FROM  OH_ACTIVITY where 1=1 ";
        return DBQueryRunner.getBeanList(conn, OhActivity.class, sql);
  }
}
// Service
// 抽取模版
public class ActivityBO {
    public static List<OhActivity> findAll() throws SQLException {
        Connection conn = null;
        try {
            conn = DBPool.getInstance().getReadConnection();
            return OhActivityDAO.findAll(conn,new HashMap());
        } finally {
            DbUtils.close(conn);
        }
  }
}
修改後
// 函數式接口
@FunctionalInterface
public interface BiFunctionUnchecked<K, T, V> {
    V applyDao(K k, T t) throws SQLException; // 因為Dao會丟出SQLException
}
// 模版
public class DefaultBO {
    public static <R> Optional<R> readOptional(Map map, BiFunctionUnchecked<Connection, Map, R> function)
        throws Exception {
        Connection conn = null;
        try {
            conn = DBPool.getInstance().getReadConnection();
            R r = function.applyDao(conn, map); // 傳入2個參數,返回一個值
            return Optional.ofNullable(r);
        } finally {
            DbUtils.close(conn);
        }
    }
    public static <R> Optional<R> writeOptional(Map map, BiFunctionUnchecked<Connection, Map, R> function)
        throws Exception {
        Connection conn = null;
        try {
            conn = DBPool.getInstance().getWriteConnection();
            conn.setAutoCommit(false);
            R r = function.applyDao(conn, map);
            conn.commit();
            return Optional.ofNullable(r);
        } catch (Exception e) {
            conn.rollback();
            throw e;
        } finally {
            DbUtils.close(conn);
        }
    }
    public static <R> R read(Map map, BiFunctionUnchecked<Connection, Map, R> function) throws Exception {
        Connection conn = null;
        try {
            conn = DBPool.getInstance().getReadConnection();
            R r = function.applyDao(conn, map);
            return r;
        } finally {
            DbUtils.close(conn);
        }
    }
    public static <R> R write(Map map, BiFunctionUnchecked<Connection, Map, R> function) throws Exception {
        Connection conn = null;
        try {
            conn = DBPool.getInstance().getWriteConnection();
            conn.setAutoCommit(false);
            R r = function.applyDao(conn, map);
            conn.commit();
            return r;
        } catch (Exception e) {
            conn.rollback();
            throw e;
        } finally {
            DbUtils.close(conn);
        }
    }
}
// DAO
public class BeanDao {
    public static List<OhSystemConfig> currentSql(Connection conn, Map<String, Object> map) throws SQLException {
        String sql = "select * from  OH_SYSTEM_CONFIG where TYPE = ? ORDER BY DESCR ASC ";
        return DBQueryRunner.getBeanList(conn, OhSystemConfig.class, sql, map.get("type"));
    }
    public static List<OhSystemConfig> errorSql(Connection conn, Map<String, Object> map) throws SQLException {
        String sql = "select *!!!!!!!!!!! from  OH_SYSTEM_CONFIG where TYPE = ? ORDER BY DESCR ASC ";
        return DBQueryRunner.getBeanList(conn, OhSystemConfig.class, sql, map.get("type"));
    }
}
// 測試
public class TestBo {
    @Test
    public void testSimpleBoMethod() throws Exception {
        Map<String, Object> map = new HashMap<>();
        String type = "ACTIVITY_FIELD_LIST";
        map.put("type", type);
    List<OhSystemConfig> ohSystemConfigs = TestBo.simpleBoMethod(map); //
        ohSystemConfigs.stream().map(ToStringBuilder::reflectionToString).forEach(System.out::println);
    }
    private static List<OhSystemConfig> simpleBoMethod(Map<String, Object> map) throws Exception {
        return DefaultBO.read(map, BeanDao::currentSql); // 類名-靜態方法名
    }
}
參考資料