为什么要用MyBatis-JDBC 连接数据库
在Java 程序里面去連接數據庫,最原始的辦法是使用JDBC 的API。我們先來回顧一下使用JDBC 的方式,我們是怎么操作數據庫的。
// 注冊JDBC 驅動 Class.forName("com.mysql.jdbc.Driver"); // 打開連接 conn = DriverManager.getConnection(DB_URL, USER, PASSWORD); // 執行查詢 stmt = conn.createStatement(); String sql= "SELECT bid, name, author_id FROM blog"; ResultSet rs = stmt.executeQuery(sql); // 獲取結果集 while(rs.next()){int bid = rs.getInt("bid");String name = rs.getString("name");String authorId = rs.getString("author_id"); }首先,我們在maven 中引入MySQL 驅動的依賴(JDBC 的包在java.sql 中)。
第一步,注冊驅動,第二步,通過DriverManager 獲取一個Connection,參數里面填數據庫地址,用戶名和密碼。
第三步,我們通過Connection 創建一個Statement 對象。
第四步,通過Statement 的execute()方法執行SQL。當然Statement 上面定義了非常多的方法。execute()方法返回一個ResultSet 對象,我們把它叫做結果集。
第五步,我們通過ResultSet 獲取數據。轉換成一個POJO 對象。
最后,我們要關閉數據庫相關的資源,包括ResultSet、Statement、Connection,它們的關閉順序和打開的順序正好是相反的。
這個就是我們通過JDBC 的API 去操作數據庫的方法,這個僅僅是一個查詢。如果我們項目當中的業務比較復雜,表非常多,各種操作數據庫的增刪改查的方法也比較多的話,那么這樣代碼會重復出現很多次。
在每一段這樣的代碼里面,我們都需要自己去管理數據庫的連接資源,如果忘記寫close()了,就可能會造成數據庫服務連接耗盡。
另外還有一個問題就是處理業務邏輯和處理數據的代碼是耦合在一起的。如果業務流程復雜,跟數據庫的交互次數多,耦合在代碼里面的SQL 語句就會非常多。如果要修改業務邏輯,或者修改數據庫環境(因為不同的數據庫SQL 語法略有不同),這個工作量是也是難以估計的。
還有就是對于結果集的處理,我們要把ResultSet 轉換成POJO 的時候,必須根據字段屬性的類型一個個地去處理,寫這樣的代碼是非常枯燥的:
int bid = rs.getInt("bid"); String name = rs.getString("name"); String authorId = rs.getString("author_id"); blog.setAuthorId(authorId); blog.setBid(bid); blog.setName(name);也正是因為這樣,我們在實際工作中是比較少直接使用JDBC 的。那么我們在Java程序里面有哪些更加簡單的操作數據庫的方式呢?
Apache DbUtils
https://commons.apache.org/proper/commons-dbutils/
DbUtils 解決的最核心的問題就是結果集的映射, 可以把ResultSet 封裝成JavaBean。它是怎么做的呢?
首先DbUtils 提供了一個QueryRunner 類,它對數據庫的增刪改查的方法進行了封裝,那么我們操作數據庫就可以直接使用它提供的方法。
在QueryRunner 的構造函數里面,我們又可以傳入一個數據源,比如在這里我們Hikari,這樣我們就不需要再去寫各種創建和釋放連接的代碼了。
queryRunner = new QueryRunner(dataSource);那我們怎么把結果集轉換成對象呢?比如實體類Bean 或者List 或者Map?在DbUtils 里面提供了一系列的支持泛型的ResultSetHandler。
我們只要在DAO 層調用QueryRunner 的查詢方法,傳入這個Handler,它就可以自動把結果集轉換成實體類Bean 或者List 或者Map。
String sql = "select * from blog"; List<BlogDto> list = queryRunner.query(sql, new BeanListHandler<>(BlogDto.class));沒有用過DbUtils 的同學,可以思考一下通過結果集到實體類的映射是怎么實現的?也就是說,我只傳了一個實體類的類型,它怎么知道這個類型有哪些屬性,每個屬性是什么類型?然后創建這個對象并且給這些字段賦值的?答案正是反射。
大家也可以去看一下源碼映證一下是不是這樣。
問題:輸出的結果中,authorId 為什么是空的?DbUtils 要求數據庫的字段跟對象的屬性名稱完全一致,才可以實現自動映射。
BlogDto{bid=3, name='MyBatis 源碼分析', authorId='null'}?
總結
以上是生活随笔為你收集整理的为什么要用MyBatis-JDBC 连接数据库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在Spring 中可以注入null 或空
- 下一篇: 为什么要用MyBatis-Spring