我来Hacking JDBC,你并不需要它

标签: 基础技术 JDBC | 发表时间:2014-05-06 08:08 | 作者:wudy
出处:http://www.importnew.com

我们喜欢和JDBC打交道,以前从未有人这样说过。很严肃的说,JDBC是一个非常优秀的API。这可能是 现在Java能够成为一个受欢迎的平台的重要原因之一。 在JDK1.1之前, ODBC出现之前(很久之前的事情了),很难去想象有平台会标准化数据库的访问。在那个时候 SQL语言甚至本身还没有标准化,随后出现的面向Java的简单的JDBC API,工作中你需要也就是一下几点:

这些都是理论,在实际中,企业级软件操作JDBC却是像下面这样:

JDBC是Java开发者的最后一种手段之一,你可以用很多方式来探索解密这个非常详细的神秘的API。几乎每个人都在JDBC操作将实现基于这些API的包装器来防止:

  • 常见的语法错误
  • 绑定变量索引不匹配
  • 动态的SQL构建
  • 在使用lob引起的边界情况
  • 资源的操作与关闭
  • 数组和UDT(户定义类型(User Defined Type))管理
  • 存储过程的抽象

所以当大多数的人在设计上层框架的时候,他们不是在和业务逻辑打交道,但是相当多的人在使用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 and 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的时候,你要在你的程序中写那些你不想写或者不是很必要的代码,这就是为什么:“ 我们已经在Hacking JDBC了,你就不需要掺和了”。

关于作者:Lukas 是一个狂热的Java和SQL开发者。他创建了 the Data Geekery GmbH。他是 jOOQ的创建者之一,一个面向Java的综合的SQL库,他的博客主要关注三个话题:Java,SQL和JOOQ。

相关文章

相关 [hacking jdbc 需要] 推荐:

我来Hacking JDBC,你并不需要它

- - ImportNew
我们喜欢和JDBC打交道,以前从未有人这样说过. 很严肃的说,JDBC是一个非常优秀的API. 这可能是 现在Java能够成为一个受欢迎的平台的重要原因之一. 在JDK1.1之前, ODBC出现之前(很久之前的事情了),很难去想象有平台会标准化数据库的访问. 在那个时候 SQL语言甚至本身还没有标准化,随后出现的面向Java的简单的JDBC API,工作中你需要也就是一下几点:.

Hacking Team 武器库

- - 开源中国社区最新新闻
事先声明本人并不是全栈安全工程师,仅仅是移动安全小菜一枚,所以对泄漏资料的分析难免会有疏忽或着错误,望各位围观的大侠手下留情. 首先来看安全界元老对Hacking Team(以下简称HT)被黑这个事件的看法:. @tombkeeper: Stuxnet 让公众知道:“原来真有这种事”,Snowden 让公众知道:“原来这种事这么多”,Hacking Team 让公众知道:“原来这种事都正经当买卖干了”.

HA-JDBC -

- -
The state manager component is responsible for storing the active status of each database in the cluster, as well as any durability state.

JDBC性能小贴

- - 开源软件 - ITeye博客
本文收集了一些用于提升JDBC性能的方法. Java应用或者JavaEE Web应用的性能是很重要的,尤其是数据库后端对应用的性能影响. 不知你是否经历过Java、JavaEE web应用非常慢的案例没有(处理一个简单的请求都要花上好几秒的时间用于数据库访问,分页、排序等). 下面这些贴士也许能提升Java应用的性能.

oracle的jdbc驱动

- - Oracle - 数据库 - ITeye博客
oracle的jdbc驱动主要有下面三类:.   1、JDBC OCI: oci是oracle call interface的缩写,此驱动类似于传统的ODBC 驱动. 因为它需要Oracle Call Interface and Net8,所以它需要在运行使用此驱动的JAVA程序的机器上安装客户端软件,其实主要是用到orcale客户端里以dll方式提供的oci和服务器配置.

Hacking Team无需越狱即可监控iOS用户

- - FreeBuf.COM | 关注黑客与极客
在HackingTeam泄漏的文件,我们发现了有针对IOS进行监控的代码,一旦用户点击运行,就会请求获取一些数据的访问权限并追踪用户的位置,日历和联系人. 相关代码在\core-ios-master.zip\core-ios-master\ios-newsstand-app\newsstand-app文件夹下,通览全部源码之后,我们发现,监控的实现,主要是通过在目标设备上安装一个报刊杂志应用,该应用安装后显示为一个空白应用,也没有图标.

jdbc日志,Log4jbdc-remix使用

- - 企业架构 - ITeye博客
   做项目的时候给jdbc做日志,只打印出代. 由是看看有没有给jdbc做日志的框架. 找到了log4jdbc,但是觉得还不是很理想,由是又看了看,还有一个护展插件log4jdbc-remix. 先不扯这么多,先来教大家怎么使用吧. 使用这个插件依赖4个类:log4j,slf4j-log4j,slf4j-api,log4j-remix.

JDBC事务控制管理

- - 编程语言 - ITeye博客
事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功. 例如:A——B转帐,对应于如下两条sql语句. 数据库默认事务是自动提交的,也就是发一条sql它就执行一条. 如果想多条sql放在一个事务中执行,则需要使用如下语句. 方式一:利用SQL语句管理事务. start transaction;--开启事务,这条语句之后的sql语句将处在一个事务当中,这些sql语句并不会立即执行.

Sharding-JDBC 1.3.1 发布,当当 JDBC 增强驱动

- - 开源中国社区最新新闻
Sharding-JDBC 1.3.1 发布了,Sharding-JDBC是当当应用框架ddframe中,从关系型数据库模块dd-rdb中分离出来的数据库水平分片框架,实现透明化数据库分库分表 访问. Sharding-JDBC是继dubbox和elastic-job之后,ddframe系列开源的第3个项目.

sharding-jdbc 1.4.1 发布,当当 JDBC 增强驱动

- - 开源中国社区最新新闻
sharding-jdbc 1.4.1 发布了. Sharding-JDBC是一个轻量级的关系型数据库中间件,提供分库分表、读写分离和柔性事务等功能. 它直接封装JDBC协议,可以理解为增强版的JDBC驱动,旧代码迁移成本几乎为零. 它使用客户端直连数据库,以jar包形式提供服务,无proxy代理层,无需额外部署,无其他依赖,DBA也无需改变原有的运维方式.