美文网首页
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