14

为了在我们的应用程序中实现数据访问代码,我们需要一些框架来包装 jdbc(ORM 不是我们的选择,因为可扩展性)。

我曾经使用过的最酷的框架是Spring-Jdbc。但是我公司的策略是避免外部依赖,尤其是spring,J2EE等。所以我们正在考虑写自己的手办jdbc框架,功能类似于Spring-jdbc:行映射,错误处理,支持java5的特性,但没有事务支持。

有没有人有编写这样的 jdbc 包装器框架的经验?如果有人有使用其他 jdbc 包装器框架的经验,请分享您的经验。

提前致谢。

4

8 回答 8

14

我们编写了自己的包装器。这个话题值得写一篇论文,但我怀疑我是否有时间写它,所以这里有一些关键点:

  • 我们接受了 sql,并没有试图隐藏它。唯一的调整是添加对命名参数的支持。参数很重要,因为我们不鼓励使用 on-the-fly sql(出于安全原因)并且我们总是使用 PreparedStatements。

  • 对于连接管理,我们使用了 Apache DBCP。这在当时很方便,但目前还不清楚现代 JDBC 实现需要多少这样的东西(缺少关于这些东西的文档)。DBCP 还汇集 PreparedStatements。

  • 我们没有打扰行映射。相反(对于查询),我们使用了类似于 Apache dbutil 的 ResultSetHandler 的东西,它允许您将结果集“提供”到一个方法中,然后该方法可以将信息转储到您想要的任何地方。这更灵活,实际上为行映射实现 ResultSetHandler 并不难。对于插入/更新,我们创建了一个通用记录类(基本上是一个带有一些额外花里胡哨的哈希图)。行映射(对我们而言)最大的问题是,一旦您执行“有趣”的查询,您就会陷入困境,因为您可能有映射到不同类的字段;因为你可能有一个分层的类结构但是一个扁平的结果集;或者因为映射很复杂并且依赖于数据。

  • 我们内置了错误记录。对于异常处理:在查询中我们捕获并记录,但对于更新,我们捕获、记录并重新抛出未经检查的异常。

  • 我们使用包装器方法提供事务支持。调用者提供执行事务的代码,我们确保事务得到妥善管理,不会忘记完成事务,并且内置回滚和错误处理。

  • 稍后,我们添加了一个非常简单的关系方案,它允许单个更新/插入应用到记录及其所有依赖项。为简单起见,我们没有在查询中使用它,我们特别决定不支持删除,因为使用级联删除更可靠。

迄今为止,该包装器已成功用于两个项目。它当然是轻量级的,但现在每个人都说他们的代码是轻量级的。更重要的是,它提高了程序员的工作效率,减少了错误的数量(并使问题更容易追踪),并且如果需要的话,它也相对容易追踪,因为我们不相信为了提供漂亮的架构而添加很多层。

于 2008-11-18T19:13:17.450 回答
5

Spring-JDBC 非常棒。考虑到像 Spring 这样的开源项目,外部依赖的负面影响最小化。您可以采用满足您的 JDBC 抽象要求的最稳定的 Spring 版本,并且您知道,如果遇到问题,您将始终能够自己修改源代码——而不依赖于外部方。您还可以通过外部方编写的代码检查您的组织可能存在的任何安全问题的实施。

于 2008-11-18T18:28:50.723 回答
3

我更喜欢的一个:Dalesbred。它是麻省理工学院许可的。

获取自定义类(部门)的所有行的简单示例。

List<Department> departments = db.findAll(Department.class,
    "select id, name from department");

当自定义类定义为:

public final class Department {
    private final int id;
    private final String name;

    public Department(int id, String name) {
        this.id = id;
        this.name = name;
    }
}

免责声明:这是由我工作的公司提供的。

于 2012-10-11T18:30:45.560 回答
1

JdbcSessionjcabi-jdbc尝试。它就像 JDBC 一样简单,例如:

String name = new JdbcSession(source)
  .sql("SELECT name FROM foo WHERE id = ?")
  .set(123)
  .select(new SingleOutcome<String>(String.class));

就是这样。

于 2012-05-17T11:46:54.023 回答
1

这听起来像是一个非常短视的决定。考虑开发/维护这样一个框架的成本,特别是当你可以得到它时,它是免费的源代码。您不仅不必自己进行开发,还可以根据需要随意修改它。

话虽如此,您真正需要复制的是 JdbcTemplate 的概念及其回调(PreparedStatementCreator、PreparedStatementCallback)以及 RowMapper/RowCallbackHandler。编写这样的东西不应该过于复杂(特别是考虑到您不必进行事务管理)。

但是,正如我所说,当您可以免费获得它并根据您认为合适的方式修改源代码时,为什么还要编写它呢?

于 2012-05-17T12:08:49.090 回答
0

mJDBC:https ://mjdbc.github.io/

我使用它多年,发现它非常有用(我是这个库的作者)。

它受到 JDBI 库的启发,但没有依赖项,增加了事务支持,提供性能计数器,并允许在您真正需要时轻松切换到 Java 中可能的最低 SQL 级别(旧的普通 JDBC API)。

于 2018-09-13T16:18:13.620 回答
0

杰杜

有一个名为Jedoo的包装类,它使用数据库连接池和单例模式将其作为共享变量进行访问。它有很多功能可以快速运行查询。

用法

要使用它,您应该将它添加到您的项目中并将其单例加载到 java 类中:

import static com.pwwiur.util.database.Jedoo.database;

使用它也很容易:

if(database.count("users") < 100) {
    long id = database.insert("users", new Object[][]{
        {"name", "Amir"},
        {"username", "amirfo"}
    });
    
    database.setString("users", "name", "Amir Forsati", id);

    try(ResultSetHandler rsh = database.all("users")) {
         while(rsh.next()) {
             System.out.println("User ID:" + rsh.getLong("id"));
             System.out.println("User Name:" + rsh.getString("name"));
         }
    }
}

您还可以在上面链接的文档中找到一些有用的功能。

于 2019-12-27T13:35:39.413 回答
0

试试我的图书馆作为替代方案:

<dependency>
  <groupId>com.github.buckelieg</groupId>
  <artifactId>jdbc-fn</artifactId>
  <version>0.2</version>
</dependency>

更多信息在这里

于 2020-05-18T17:42:59.473 回答