美文网首页
Jdbi3官方教程(三) Jdbi和Handle

Jdbi3官方教程(三) Jdbi和Handle

作者: 程序员文集 | 来源:发表于2018-10-06 11:31 被阅读472次

3.1 Jdbi

Jdbi类是使用库的主入口点。

每个Jdbi实例都包装一个JDBC DataSource。它也是数据库会话的配置存储库。

有几种方法可以创建Jdbi实例。您可以使用JDBC URL:

// H2 in-memory database
Jdbi jdbi = Jdbi.create("jdbc:h2:mem:test");

如果您有DataSource对象,可以直接使用它:

DataSource ds = ...
Jdbi jdbi = Jdbi.create(ds);

Jdbi 实例是线程安全的,不拥有任何数据库资源。

通常,应用程序创建单个共享Jdbi实例,并在那里设置任何通用配置。

在更有限的场景(例如HTTP请求或事件回调)中,您将从Jdbi实例请求一个Handle对象。

3.2 Handle

Handle表示一个激活的 数据库连接

Handle用于为数据库准备和运行SQL语句,以及管理数据库事务。它提供对fluent语句API的访问,这些API可以绑定参数,执行语句,然后将任何结果映射到Java对象。

HandleJdbi创建时会继承配置。

由于Handle会持有一个打开的数据库连接,因此必须注意确保每个Handle在完成后都关闭。无法关闭的Handles将最终因为连接过多淹没您的数据库,或者耗尽您的连接池。

有几种方法可以在运行时获取Handle实例。

如果您的操作将返回一些结果,请使用 jdbi.withHandle()

List<String> names = jdbi.withHandle(handle ->
    handle.createQuery("select name from contacts")
          .mapTo(String.class)
          .list());
assertThat(names).contains("Alice", "Bob");

如果您的操作不需要返回结果,请使用Jdbi.useHandle(HandleConsumer)

jdbi.useHandle(handle -> {
    handle.execute("create table contacts (id int primary key, name varchar(100))");
    handle.execute("insert into contacts (id, name) values (?, ?)", 1, "Alice");
    handle.execute("insert into contacts (id, name) values (?, ?)", 2, "Bob");
});

withHandleuseHandle都会打开一个临时的Handle,调用你的回调函数,并在回调函数返回的时候立即释放Handle。

在Jdbi的一些地方你可能会注意到“消费者”与“回调”的命名模式。回调返回一个值,并与with-方法结合。消费者不会返回值,而是与use-方法相结合。

或者,如果您想自己管理Handle的生命周期,请使用jdbi.open()

try (Handle handle = jdbi.open()) {
    handle.execute("insert into contacts (id, name) values (?, ?)", 3, "Chuck");
}

使用时jdbi.open(),应始终使用try-with-resources或try-finally块来确保释放数据库连接。未能释放Handle会导致连接泄漏。我们建议您在有可能的情况下尽量使用withHandleuseHandle而不是open

相关文章

网友评论

      本文标题:Jdbi3官方教程(三) Jdbi和Handle

      本文链接:https://www.haomeiwen.com/subject/eoxhaftx.html