我们正在破解JDBC,因此您不必

我们喜欢使用JDBC

没人说。 曾经

更严重的是,如果考虑一下,JDBC实际上是一个非常出色的API。 这也可能是Java成为当今流行平台的原因之一 。 在JDK 1.1 之前以及在ODBC之前 (这已经很久了),很难想象有任何平台可以完全标准化数据库访问。 哎呀, SQL本身在当时甚至还没有标准化,并且Java随JDBC一起出现了,JDBC是一个简单的API,在日常工作中您只需要了解几项内容:

而已!

回到现实

那是理论。 实际上,在JDBC之上运行的企业软件Swift发展为:

入侵JDBC。此页面上的图像版权信息

入侵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 yet
    finally {
        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() sometimes
        if (rs != null) {
            while (rs.next()) {
                list.add(rs.getObject(1));
            }
        }

        // Because most JDBC drivers cannot fetch all
        // columns, only identity columns
        selectReturning(ctx.configuration(), list.toArray());
        return result;
    }
    finally {
        JDBCUtils.safeClose(rs);
    }
}

如何处理BigInteger和BigDecimal

else if (type == BigInteger.class) {
    // The SQLite JDBC driver doesn't support BigDecimals
    if (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 BigDecimals
    if (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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值