Mybatis學習之自定義持久層框架(一) 為什么要用框架而不直接用JDBC?


前言

說起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 }

代碼運行結果:

觀察上述代碼,不難發現以下問題:

  1. 數據庫配置信息存在硬編碼問題。(當我們從mysql數據庫切換到oracle數據庫時,代碼中的數據驅動信息和數據庫連接信息都需要修改。)
  2. 需要頻繁創建和釋放數據庫連接。
  3. sql語句、設置參數及獲取結果集參數均存在硬編碼問題。(不同數據庫的sql語法,參數及結果集參數均有所不同)
  4. 需要手動封裝返回結果集。

為什么要用Mybatis?

針對JDBC存在的問題,來解釋一下為什么要使用Mybatis:

  1. Mybatis使用配置文件加載數據庫配置信息,很好地解決了硬編碼問題。
  2. 對於創建和釋放數據庫連接等步驟,Mybatis直接使用連接池進行解決。
  3. 針對“sql語句、設置參數及獲取結果集參數均存在硬編碼”的問題,Mybatis也使用配置文件解決了該問題。(這里一般不和數據庫配置信息在同一個配置文件中進行配置,因為數據庫配置信息在一個項目中只配置一次,但sql語句等經常會發生變化)。
  4. 對於結果集的封裝操作,Mybatis使用反射和內省進行解決。

以上幾點說明了用Mybatis的好處,不過Mybatis其實也只是對JDBC進行了封裝,說到底原理還是和JDBC一樣,只是Mybatis用起來更加高效率。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM