文章來源:www.jianshu.com/p/1ee34c858…java
Java 的數據庫原生使用 jdbc,中間件有不少,例如說 hibernate、mybatis、jdbi,這幾種是最經常使用的中間件。git
jdbi 是我比較喜歡的一個數據庫中間件,它是非 ORM 的,特別適合於數據庫固定不變的場景,即不會對應多種數據庫,之後也不會更換數據庫的場景。若是不是這種場景,那麼使用 jdbc 或者最好選擇 hibernate 等對多種數據庫兼容較好的中間件。 基於上述使用場景,jdbi 的優勢有:sql
handle.createUpdate ("INSERT INTO user (id, name) VALUES (:id, :name)") .bind ("id", 2) .bind ("name", "Clarice") .execute (); 複製代碼
這裏就是 java8 的流式風格,用連貫式表達式將一個 sql 實現串在一塊兒數據庫
// Define your own declarative interface public interface UserDao { @SqlUpdate ("CREATE TABLE user (id INTEGER PRIMARY KEY, name VARCHAR)") void createTable (); @SqlUpdate ("INSERT INTO user (id, name) VALUES (?, ?)") void insertPositional (int id, String name); @SqlUpdate ("INSERT INTO user (id, name) VALUES (:id, :name)") void insertNamed (@Bind ("id") int id, @Bind ("name") String name); @SqlUpdate ("INSERT INTO user (id, name) VALUES (:id, :name)") void insertBean (@BindBean User user); @SqlQuery ("SELECT * FROM user ORDER BY name") @RegisterBeanMapper (User.class) List<User> listUsers (); } 複製代碼
聲明式的主要是使用註解來實現,在實際的面向對象風格的代碼中,我我的以爲聲明式的比較簡潔,容易閱讀和維護。因此下面都按照 Declarative Api 的方式。編程
對於 jdbi 的實現,須要本身去看 jdbi 的主頁,jdbi.org/,這裏講一些實際使用中…markdown
jdbc 方式怎麼作的呢?mybatis
try { Connection conn = DBUtil2.getConnection (); //PreparedStatement ps = // conn.prepareStatement (SAVE_SQL, new String [] { "id" }); // 應該返回生成的主鍵,上下兩種方式均可 PreparedStatement ps = conn.prepareStatement (SAVE_SQL,PreparedStatement.RETURN_GENERATED_KEYS); ps.setString (1, user.getName ()); ps.setFloat (2, user.getSalary ()); ps.setInt (3, user.getAge ()); if (ps.executeUpdate () > 0) { // 獲取主鍵 ResultSet rs = ps.getGeneratedKeys (); rs.next (); int i = rs.getInt (1); user.setId (i); ps.close (); return true; } ps.close (); } catch (SQLException e) { e.printStackTrace (); } finally { DBUtil2.closeConnection (); } 複製代碼
jdbi 提供的機制:app
public interface UserDao { @SqlBatch ("INSERT INTO users (name) VALUES (?)") @GetGeneratedKeys List<User> createUsers (String... names); } 複製代碼
很是直觀簡潔函數
jdbc 方式,咱們在查詢大數據量時,通常使用數據庫遊標,逐條查詢。 jdbi 的查詢是什麼樣的呢?以下:oop
public interface UserDao { @SqlQuery ("select name from users") List<String> listNames (); } 複製代碼
可是這個時候,若是遇到大數據量怎麼辦,jdbi 提供的解決方案:
public interface UserDao { @SqlQuery ("select name from users") ResultIterator<String> getNamesAsIterator (); } 複製代碼
這裏使用了迭代器,依次去查詢,和 jdbi 遊標的做用是同樣的。
jdbi 的插入,當一個列表插入,若是要提高效率,就是拆分插入,拆分插入 jdbi 提供了機制 SqlBatch
public interface UserDao { @SqlBatch ("insert into users (tenant_id, id, name)" + "values (:tenantId, :user.id, :user.name)") void bulkInsert (@Bind ("tenantId") long tenantId, @BindBean ("user") User... users); } 複製代碼
jdbi 是很是簡潔優美的數據庫中間件組件,當在數據庫惟一特別是 pg 數據庫,我的認爲是首選方式,有效的把 jdbc 封裝了一下,更加適合於開發。
資源後花園:gitee.com/alterem/pic…