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对象。
Handle
从Jdbi
创建时会继承配置。
由于
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");
});
withHandle
和useHandle
都会打开一个临时的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会导致连接泄漏。我们建议您在有可能的情况下尽量使用withHandle
或useHandle
而不是open
。
网友评论