Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 简单jdbc包装器_Java_Jdbc_Data Access_Spring Jdbc - Fatal编程技术网

Java 简单jdbc包装器

Java 简单jdbc包装器,java,jdbc,data-access,spring-jdbc,Java,Jdbc,Data Access,Spring Jdbc,为了在我们的应用程序中实现数据访问代码,我们需要一些围绕jdbc的框架(由于可伸缩性,ORM不是我们的选择) 我曾经使用的最酷的框架是。然而,我公司的政策是避免外部依赖,特别是spring、J2EE等。 因此,我们正在考虑编写自己制作的jdbc框架,其功能类似于SpringJDBC:行映射、错误处理、支持java5的特性,但不支持事务 有没有人有编写这种jdbc包装器框架的经验? 如果有人有使用其他jdbc包装框架的经验,请分享您的经验 提前感谢。Spring JDBC非常棒。考虑到像Sprin

为了在我们的应用程序中实现数据访问代码,我们需要一些围绕jdbc的框架(由于可伸缩性,ORM不是我们的选择)


我曾经使用的最酷的框架是。然而,我公司的政策是避免外部依赖,特别是spring、J2EE等。 因此,我们正在考虑编写自己制作的jdbc框架,其功能类似于SpringJDBC:行映射、错误处理、支持java5的特性,但不支持事务

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


提前感谢。

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

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

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

  • 对于连接管理,我们使用ApacheDBCP。这在当时很方便,但现在还不清楚现代JDBC实现需要多少(这方面的文档还没有)。DBCP还汇集了PreparedStatements

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

  • 我们内置了错误日志。对于异常处理:对于查询,我们捕获并记录,但是对于更新,我们捕获、记录并重新显示未检查的异常

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

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

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

试试看。它和JDBC应该是一样简单,例如:

String name = new JdbcSession(source)
  .sql("SELECT name FROM foo WHERE id = ?")
  .set(123)
  .select(new SingleOutcome<String>(String.class));
String name=新JdbcSession(源代码)
.sql(“从foo中选择名称,其中id=?”)
.set(123)
.select(新的singleoutput(String.class));

就这样。

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

也就是说,您真正需要复制的是JdbcTemplate的概念及其回调(PreparedStatementCreator、PreparedStatementCallback)以及RowMapper/RowCallbackHandler。写这样的东西不应该太复杂(特别是考虑到你不必做事务管理)

但是,正如我所说的,既然可以免费获得并根据需要修改源代码,为什么还要编写它呢?

我更喜欢的一个:。它是麻省理工学院授权的

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

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

mJDBC:

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

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

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"));
         }
    }
}
if(database.count(“用户”)<100){
long id=database.insert(“用户”,新对象[][]{
{“姓名”,“阿米尔”},
{“用户名”,“阿米尔福”}
});
数据库.setString(“用户”、“名称”、“Amir Forsati”、id);
try(ResultSetHandler rsh=database.all(“用户”)){
当(
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"));
         }
    }
}
<dependency>
  <groupId>com.github.buckelieg</groupId>
  <artifactId>jdbc-fn</artifactId>
  <version>0.2</version>
</dependency>