Jdbi3官方教程(三)|Jdbi3官方教程(三) Jdbi和Handle

Jdbi3官方教程(一) 简介
Jdbi3官方教程(二) 入门
Jdbi3官方教程(三) Jdbi和Handle
Jdbi3官方教程(四) 参数绑定
Jdbi3官方教程(五) 查询Query
Jdbi3官方教程(六) 映射器Mapper
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 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"); }

【Jdbi3官方教程(三)|Jdbi3官方教程(三) Jdbi和Handle】使用时jdbi.open(),应始终使用try-with-resources或try-finally块来确保释放数据库连接。未能释放Handle会导致连接泄漏。我们建议您在有可能的情况下尽量使用withHandleuseHandle而不是open
  • Jdbi3官方教程(一) 简介
  • Jdbi3官方教程(二) 入门
  • Jdbi3官方教程(三) Jdbi和Handle
  • Jdbi3官方教程(四) 参数绑定
  • Jdbi3官方教程(五) 查询Query
  • Jdbi3官方教程(六)映射器Mapper
  • Jdbi3官方教程(七)结果Result

    推荐阅读