我们正在破解JDBC,因此您不必
我們喜歡使用JDBC
沒人說。 曾經
更嚴重的是,如果考慮一下,JDBC實際上是一個非常出色的API。 這也可能是Java成為當今流行平臺的原因之一 。 在JDK 1.1 之前 , 以及在ODBC之前 (這已經很久了),很難想象有任何平臺可以完全標準化數據庫訪問。 哎呀, SQL本身在當時甚至還沒有標準化,并且Java隨JDBC一起出現了,JDBC是一個簡單的API,在日常工作中您只需要了解幾項內容:
- Connection :建模所有數據庫交互的對象
- PreparedStatement :使您可以執行語句的對象
- ResultSet :使您可以從數據庫中獲取數據的對象
而已!
回到現實
那是理論。 實際上,在JDBC之上運行的企業軟件Swift發展為:
入侵JDBC。 圖片版權信息 這一頁
JDBC是Java開發人員的不得已的手段之一,在Java開發人員中,JDBC可以感覺像是真正的黑客,可以通過許多方式來入侵這種非常有狀態,非常冗長,非常神秘的API。 幾乎每個使用JDBC進行操作的人都將圍繞API實現包裝器,以至少防止:
- 常見語法錯誤
- 綁定變量索引不匹配
- 動態SQL構造
- 使用LOB周圍的邊緣情況
- 資源處理和關閉
- 陣列和UDT管理
- 存儲過程抽象
……等等。
因此,當每個人都在執行上述基礎結構工作時,他們并未在處理其業務邏輯。 在使用JDBC時,幾乎每個人都會做這些事情。 Hibernate和JPA幾乎沒有這些問題,但是它們也不再是SQL API。
這是我們已經在jOOQ內部解決的幾個示例,因此您不必:
如何在
case DERBY: case H2: case MARIADB: case MYSQL: {try {listener.executeStart(ctx);result = ctx.statement().executeUpdate();ctx.rows(result);listener.executeEnd(ctx);}// Yes. Not all warnings may have been consumed yetfinally {consumeWarnings(ctx, listener);}// Yep. Should be as simple as this. But it isn't.rs = ctx.statement().getGeneratedKeys();try {List<Object> list = new ArrayList<Object>();// Some JDBC drivers seem to illegally return null// from getGeneratedKeys() sometimesif (rs != null) {while (rs.next()) {list.add(rs.getObject(1));}}// Because most JDBC drivers cannot fetch all// columns, only identity columnsselectReturning(ctx.configuration(), list.toArray());return result;}finally {JDBCUtils.safeClose(rs);} }如何處理BigInteger和BigDecimal
else if (type == BigInteger.class) {// The SQLite JDBC driver doesn't support BigDecimalsif (ctx.configuration().dialect() == SQLDialect.SQLITE) {return Convert.convert(rs.getString(index),(Class) BigInteger.class);}else {BigDecimal result = rs.getBigDecimal(index);return (T) (result == null ? null :result.toBigInteger());} } else if (type == BigDecimal.class) {// The SQLite JDBC driver doesn't support BigDecimalsif (ctx.configuration().dialect() == SQLDialect.SQLITE) {return Convert.convert(rs.getString(index),(Class) BigDecimal.class);}else {return (T) rs.getBigDecimal(index);} }如何從SQL Server提取
switch (configuration.dialect().family()) {case SQLSERVER:consumeLoop: for (;;)try {if (!stmt.getMoreResults() &&stmt.getUpdateCount() == -1)break consumeLoop;}catch (SQLException e) {previous.setNextException(e);previous = e;} }說服了嗎
這是令人討厭的代碼。 我們在這里或在源代碼中有更多討厭的代碼示例 。
所有這些例子表明,使用JDBC時,你會寫代碼,你不希望/不應該在你的應用程序寫入。 這就是為什么…
我們一直在入侵JDBC,因此您不必
翻譯自: https://www.javacodegeeks.com/2014/04/were-hacking-jdbc-so-you-dont-have-to.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的我们正在破解JDBC,因此您不必的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Thymeleaf与Spring集成(第
- 下一篇: ActiveMQ中的温度,存储和内存使用