前言
說起Mybatis,相信大家都不會感到陌生,它是一款優秀的持久層框架,應用於java后端開發中,為客戶端程序提供訪問數據庫的接口。
我們都知道,JDBC是Java語言中用來規范客戶端程序如何來訪問數據庫的應用程序接口,提供了諸如查詢和更新數據庫中數據的方法。這也就是Mybatis所具備的功能,那既然已經有了JDBC了,為什么還要用Mybatis呢?
原因很簡單,因為單純使用JDBC進行開發會出現效率低下、耗費資源及影響程序拓展性等問題。
JDBC基本用法及問題分析
首先來看一下使用JDBC對數據庫進行訪問的一段代碼:
1 import java.sql.*; 2 3 public class JDBCTest { 4 5 public static final String URL = "jdbc:mysql://localhost:3306/mybatis_study?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC"; 6 public static final String USER = "root"; 7 public static final String PASSWORD = "root"; 8 9 public static void main(String[] args) throws Exception { 10 Connection connection = null; 11 PreparedStatement preparedStatement = null; 12 ResultSet resultSet = null; 13 User user = new User(); 14 15 try { 16 // 加載數據庫驅動 17 /* 注意事項: 18 1、這里需要提前找好mysql驅動的jar包,復制到項目庫中,或者直接通過maven導入。 19 2、注意jar包版本要與本機的mysql一致。 20 沒有做到以上兩點必然會報錯。*/ 21 Class.forName("com.mysql.cj.jdbc.Driver"); 22 // 獲取數據庫連接 23 connection = DriverManager.getConnection(URL, USER, PASSWORD); 24 // 定義sql語句 25 String selectSql = "select * from user where username = ?"; 26 // 獲取預處理statement 27 preparedStatement = connection.prepareStatement(selectSql); 28 // 設置參數,第一個參數為sql語句中參數的序號(從1開始),第二個參數為設置的參數值 29 preparedStatement.setString(1, "hardy"); 30 // 向數據庫發出sql執行查詢,查詢出結果集 31 resultSet = preparedStatement.executeQuery(); 32 // 遍歷查詢結果集 33 while (resultSet.next()) { 34 int id = resultSet.getInt("id"); 35 String username = resultSet.getString("username"); 36 // 封裝User 37 user.setId(id); 38 user.setUsername(username); 39 } 40 System.out.println(user); 41 42 } catch (Exception e) { 43 e.printStackTrace(); 44 } finally { 45 // 釋放資源 46 if (resultSet != null) { 47 try { 48 resultSet.close(); 49 } catch (SQLException e) { 50 e.printStackTrace(); 51 } 52 } 53 54 if (preparedStatement != null) { 55 try { 56 preparedStatement.close(); 57 } catch (SQLException e) { 58 e.printStackTrace(); 59 } 60 } 61 62 if (connection != null) { 63 try { 64 connection.close(); 65 } catch (SQLException e) { 66 e.printStackTrace(); 67 } 68 } 69 } 70 } 71 }
代碼運行結果:
觀察上述代碼,不難發現以下問題:
- 數據庫配置信息存在硬編碼問題。(當我們從mysql數據庫切換到oracle數據庫時,代碼中的數據驅動信息和數據庫連接信息都需要修改。)
- 需要頻繁創建和釋放數據庫連接。
- sql語句、設置參數及獲取結果集參數均存在硬編碼問題。(不同數據庫的sql語法,參數及結果集參數均有所不同)
- 需要手動封裝返回結果集。
為什么要用Mybatis?
針對JDBC存在的問題,來解釋一下為什么要使用Mybatis:
- Mybatis使用配置文件加載數據庫配置信息,很好地解決了硬編碼問題。
- 對於創建和釋放數據庫連接等步驟,Mybatis直接使用連接池進行解決。
- 針對“sql語句、設置參數及獲取結果集參數均存在硬編碼”的問題,Mybatis也使用配置文件解決了該問題。(這里一般不和數據庫配置信息在同一個配置文件中進行配置,因為數據庫配置信息在一個項目中只配置一次,但sql語句等經常會發生變化)。
- 對於結果集的封裝操作,Mybatis使用反射和內省進行解決。
以上幾點說明了用Mybatis的好處,不過Mybatis其實也只是對JDBC進行了封裝,說到底原理還是和JDBC一樣,只是Mybatis用起來更加高效率。