2222import java .util .List ;
2323import java .util .function .Function ;
2424
25+ /**
26+ * Jdbi module: https://jooby.io/modules/hikari.
27+ *
28+ * Usage:
29+ *
30+ * - Add hikari and jdbi dependency
31+ *
32+ * - Install them
33+ *
34+ * <pre>{@code
35+ * {
36+ * install(new HikariModule());
37+ *
38+ * install(new JdbiModule());
39+ * }
40+ * }</pre>
41+ *
42+ * - Use it
43+ *
44+ * <pre>{code
45+ * {
46+ *
47+ * get("/", ctx -> {
48+ * Jdbi jdbi = require(Jdbi.class);
49+ * // do with jdbi
50+ * });
51+ *
52+ * }
53+ * }</pre>
54+ *
55+ * Handle instances are also available:
56+ *
57+ * <pre>{code
58+ * {
59+ *
60+ * get("/", ctx -> {
61+ * try(Handle handle = require(Handle.class)) {
62+ * // do with handle
63+ * }
64+ * });
65+ *
66+ * }
67+ * }</pre>
68+ *
69+ * The use of try-with-resources is required here. Handle must be closed once you finish.
70+ *
71+ * For automatic handle managment see the {@link TransactionalRequest} class.
72+ *
73+ * @author edgar
74+ * @since 2.0.0
75+ */
2576public class JdbiModule implements Extension {
2677
2778 private String name ;
@@ -30,26 +81,78 @@ public class JdbiModule implements Extension {
3081
3182 private List <Class > sqlObjects = Collections .emptyList ();
3283
84+ /**
85+ * Creates a new Jdbi module using the <code>db</code> property key. This key must be
86+ * present in the application configuration file, like:
87+ *
88+ * <pre>{@code
89+ * db.url = "jdbc:url"
90+ * db.user = dbuser
91+ * db.password = dbpass
92+ * }</pre>
93+ */
3394 public JdbiModule () {
3495 this ("db" );
3596 }
3697
98+ /**
99+ * Creates a new Jdbi module. The database parameter can be one of:
100+ *
101+ * - A property key defined in your application configuration file, like <code>db</code>.
102+ * - A special h2 database: mem, local or tmp.
103+ * - A jdbc connection string, like: <code>jdbc:mysql://localhost/db</code>
104+ *
105+ * @param name Database key, database type or connection string.
106+ */
37107 public JdbiModule (@ Nonnull String name ) {
38108 this .name = name ;
39109 this .factory = null ;
40110 }
41111
42- public JdbiModule (Function <DataSource , Jdbi > factory ) {
43- this ();
44- this .factory = factory ;
112+ /**
113+ * Creates a new Jdbi module using the given jdbi factory. The jdbi service is registered as
114+ * <code>db</code>.
115+ *
116+ * @param factory Jdbi factory.
117+ */
118+ public JdbiModule (@ Nonnull Function <DataSource , Jdbi > factory ) {
119+ this ("db" , factory );
45120 }
46121
47- public JdbiModule (String name , Function <DataSource , Jdbi > factory ) {
122+ /**
123+ * Creates a new Jdbi module using the given jdbi factory.
124+ *
125+ * @param name Name for registering the service.
126+ * @param factory Jdbi factory.
127+ */
128+ public JdbiModule (@ Nonnull String name , @ Nonnull Function <DataSource , Jdbi > factory ) {
48129 this (name );
49130 this .factory = factory ;
50131 }
51132
52- public JdbiModule sqlObjects (Class ... sqlObjects ) {
133+ /**
134+ * Attach SQL objects to a jdbi handle.
135+ *
136+ * This method simplify the injection or require of SQL objects. So, it is just a
137+ * shortcut for {@link Handle#attach(Class)}. Due the SQL objects depends on a Handle this
138+ * method is only available when the {@link TransactionalRequest} decorator is present.
139+ *
140+ * <pre>{@code
141+ * install(new JdbiModule()
142+ * .sqlObjects(UserDAO.class)
143+ * );
144+ *
145+ * decorator(new TransactionalRequest());
146+ *
147+ * get("/users", ctx -> {
148+ * UserDAO dao = require(UserDAO.class);
149+ * });
150+ * }</pre>
151+ *
152+ * @param sqlObjects List of SQL object to register as services.
153+ * @return This module.
154+ */
155+ public @ Nonnull JdbiModule sqlObjects (@ Nonnull Class ... sqlObjects ) {
53156 this .sqlObjects = Arrays .asList (sqlObjects );
54157 return this ;
55158 }
@@ -73,7 +176,7 @@ public JdbiModule sqlObjects(Class... sqlObjects) {
73176
74177 /** SQLObjects: */
75178 for (Class <?> sqlObject : sqlObjects ) {
76- registry .put (sqlObject , new SqlObjectProvider (provider , sqlObject ));
179+ registry .put (sqlObject , new SqlObjectProvider (jdbi , sqlObject ));
77180 }
78181 }
79182
0 commit comments