我们喜欢使用JDBC
没人说。 曾经
更严重的是,如果考虑一下,JDBC实际上是一个非常出色的API。 这也可能是Java成为当今流行平台的原因之一 。 在JDK 1.1 之前 , 以及在ODBC之前 (这已经很久了),很难想象有任何平台可以完全标准化数据库访问。 哎呀, SQL本身在当时甚至还没有标准化,并且Java随JDBC一起出现了,JDBC是一个简单的API,在日常工作中您只需要了解几项内容:
-
Connection
:建模所有数据库交互的对象 -
PreparedStatement
:使您可以执行语句的对象 -
ResultSet
:使您可以从数据库中获取数据的对象
而已!
回到现实
那是理论。 实际上,在JDBC之上运行的企业软件Swift发展为:
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