我们喜欢和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。

原文链接: javacodegeeks 翻译: ImportNew.comwudy
译文链接: http://www.importnew.com/11116.html
转载请保留原文出处、译者和译文链接。]

[转]我来Hacking JDBC,你并不需要它的更多相关文章

  1. The Best Hacking Tools

    The Best Hacking Tools Hacking Tools : List of security tools specifically aimed toward security pro ...

  2. Java数据库连接技术——JDBC

    大家好,今天我们学习了Java如何连接数据库.之前学过.net语言的数据库操作,感觉就是一通百通,大同小异. JDBC是Java数据库连接技术的简称,提供连接各种常用数据库的能力. JDBC API ...

  3. 玩转spring boot——结合AngularJs和JDBC

    参考官方例子:http://spring.io/guides/gs/relational-data-access/ 一.项目准备 在建立mysql数据库后新建表“t_order” ; -- ----- ...

  4. [原创]java使用JDBC向MySQL数据库批次插入10W条数据测试效率

    使用JDBC连接MySQL数据库进行数据插入的时候,特别是大批量数据连续插入(100000),如何提高效率呢?在JDBC编程接口中Statement 有两个方法特别值得注意:通过使用addBatch( ...

  5. JDBC MySQL 多表关联查询查询

    public static void main(String[] args) throws Exception{ Class.forName("com.mysql.jdbc.Driver&q ...

  6. JDBC增加删除修改

    一.配置程序--让我们程序能找到数据库的驱动jar包 1.把.jar文件复制到项目中去,整合的时候方便. 2.在eclipse项目右击"构建路径"--"配置构建路径&qu ...

  7. JDBC简介

    jdbc连接数据库的四个对象 DriverManager  驱动类   DriverManager.registerDriver(new com.mysql.jdbc.Driver());不建议使用 ...

  8. JDBC Tutorials: Commit or Rollback transaction in finally block

    http://skeletoncoder.blogspot.com/2006/10/jdbc-tutorials-commit-or-rollback.html JDBC Tutorials: Com ...

  9. FineReport如何用JDBC连接阿里云ADS数据库

    在使用FineReport连接阿里云的ADS(AnalyticDB)数据库,很多时候在测试连接时就失败了.此时,该如何连接ADS数据库呢? 我们只需要手动将连接ads数据库需要使用到的jar放置到%F ...

随机推荐

  1. C#TextBox自动滚动到最低端

    C#中一个RichTextBox,当新写入内容时,超过当前显示区域后,自动滚动到最低端,方便查看内容. private void txtInfo_TextChanged(object sender,  ...

  2. git学习笔记06-创建分支合并分支-比svn快多了,因为只有指针在改变

    一开始git只有一条时间线,这个分支叫主分支,即master分支. HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支. 每次提交,mas ...

  3. ie8不支持transform: translateY,ie9支持不友好

    transform: translateY(0);  ie8 不支持这个属性  但是我觉得用css实现的效果特好 特自然 也许是我的脚本写的不够完善 呵呵    现在我希望其他 主流的浏览器应用CSS ...

  4. 了解OpenStack

    OpenStack是一个由NASA(美国国家航空航天局)和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目. OpenStack支持几乎所有类型的云环境,项目目标 ...

  5. Python学习笔记7—集合

    set 拥有类似 dict 的特点:可以用{}花括号来定义:其中的元素没有序列,也就是是非序列类型的数据;而且,set 中的元素不可重复,这就类似 dict 的键. >>> s1 = ...

  6. 【Todo】Lucene系统学习

    之前已经写过一篇关于Lucene安装学习的文章:http://www.cnblogs.com/charlesblc/p/5980525.html 还有一篇关于Solr安装使用的文章:http://ww ...

  7. proxool在web环境中的使用

    proxool在web环境中的使用 简介 Proxool连接池是sourceforge下的一个开源项目,这个项目提供一个健壮.易用的连接池,最为关键的是这个连接池提供监控的功能,方便易用,便于发现连接 ...

  8. OpenGL的glOrtho平行投影函数详解[转]

    glortho函数可以将当前的可视空间设置为正投影空间.基参数的意义如图,如果绘制的图空间本身就是二维的,可以使gluOrtho2D.他的使用类似于glOrtho 原型是: void glOrtho( ...

  9. JavaScript 同名方法的处理

    在JS中,如果存在同名同参的方法,它会先调用哪一个?先看两个例子: 例1: <html> <head> <title></title> <scri ...

  10. 论APP测试中黑盒测试方案的重要性?

    运筹帷幄之中,决胜千里之外.古人足不出户,通过正确的部署就能决定千里之外战争的胜利!而于测试人员而言,制定正确的测试方案,就是日后测试就是是否顺利的决定性因素. 在整个测试过程中,对测试人员.资源以及 ...