javascript
为什么要用MyBatis-Spring JDBC
除了DbUtils 之外,Spring 也對原生的JDBC 進行了封裝,并且給我們提供了一個模板方法JdbcTemplate,來簡化我們對數據庫的操作。第一個,我們不再需要去關心資源管理的問題。
第二個,對于結果集的處理,Spring JDBC 也提供了一個RowMapper 接口,可以把結果集轉換成Java 對象。
看代碼:比如我們要把結果集轉換成Employee 對象,就可以針對一個Employee創建一個RowMapper 對象,實現RowMapper 接口,并且重寫mapRow()方法。我們在mapRow()方法里面完成對結果集的處理。
public class EmployeeRowMapper implements RowMapper {@Overridepublic Object mapRow(ResultSet resultSet, int i) throws SQLException {Employee employee = new Employee();employee.setEmpId(resultSet.getInt("emp_id"));employee.setEmpName(resultSet.getString("emp_name"));employee.setEmail(resultSet.getString("emial"));return employee;} }在DAO 層調用的時候就可以傳入自定義的RowMapper 類,最終返回我們需要的類型。結果集和實體類類型的映射也是自動完成的。
public List<Employee> query(String sql){new JdbcTemplate( new DruidDataSource());return jdbcTemplate.query(sql,new EmployeeRowMapper()); }通過這種方式,我們對于結果集的處理只需要寫一次代碼,然后在每一個需要映射的地方傳入這個RowMapper 就可以了,減少了很多的重復代碼。
但是還是有問題:每一個實體類對象,都需要定義一個Mapper,然后要編寫每個字段映射的getString()、getInt 這樣的代碼,還增加了類的數量。
所以有沒有辦法讓一行數據的字段,跟實體類的屬性自動對應起來,實現自動映射呢?當然,我們肯定要解決兩個問題,一個就是名稱對應的問題,從下劃線到駝峰命名;
第二個是類型對應的問題,數據庫的JDBC 類型和Java 對象的類型要匹配起來。
我們可以創建一個BaseRowMapper<T>,通過反射的方式自動獲取所有屬性,把表字段全部賦值到屬性。
上面的方法就可以改成:
return jdbcTemplate.query(sql,new BaseRowMapper(Employee.class));這樣,我們在使用的時候只要傳入我們需要轉換的類型就可以了,不用再單獨創建一個RowMapper。
我們來總結一下,DbUtils 和Spring JDBC,這兩個對JDBC 做了輕量級封裝的框架,或者說工具類里面,都幫助我們解決了一些問題:
1、無論是QueryRunner 還是JdbcTemplate,都可以傳入一個數據源進行初始化,也就是資源管理這一部分的事情,可以交給專門的數據源組件去做,不用我們手動創建和關閉;
2、對操作數據的增刪改查的方法進行了封裝;
3、可以幫助我們映射結果集,無論是映射成List、Map 還是實體類。
但是還是存在一些缺點:
1、SQL 語句都是寫死在代碼里面的,依舊存在硬編碼的問題;
2、參數只能按固定位置的順序傳入(數組),它是通過占位符去替換的,不能自動映射;
3、在方法里面,可以把結果集映射成實體類,但是不能直接把實體類映射成數據庫的記錄(沒有自動生成SQL 的功能);
4、查詢沒有緩存的功能。
?
總結
以上是生活随笔為你收集整理的为什么要用MyBatis-Spring JDBC的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 为什么要用MyBatis-JDBC 连接
- 下一篇: 为什么要用MyBatis-Hiberna
