淺談JDBC與MyBatis
MyBatis是一個基于Java的、封裝了JDBC的持久層框架。
1 JDBC
JDBC(Java Data Base Connectivity)表示Java數據庫連接。在Java語言中,我們使用JDBC來操作關系型數據庫。
1.1 案例代碼
package core;
import java.sql.*;
/**
* JDBC案例類.
*
* @author 李程鵬
*/
public class JDBC {
public static void main(String[] args) {
// 定義連接對象
Connection connection = null;
// 定義預編譯語句對象
PreparedStatement preparedStatement = null;
// 定義結果集對象
ResultSet resultSet = null;
try {
// 加載數據庫驅動
Class.forName("com.mysql.jdbc.Driver");
// 通過數據庫驅動獲取數據庫連接
connection = DriverManager.
getConnection("jdbc:mysql://localhost:3306/jdbc?characterEncoding=utf-8", "root", "root");
// 定義并初始化SQL語句
String sql = "select * from user where id = ?";
// 創建預編譯語句對象
preparedStatement = connection.prepareStatement(sql);
// 設置查詢參數
preparedStatement.setString(1, "1");
// 向數據庫發出SQL并執行查詢,獲取查詢結果集.
resultSet = preparedStatement.executeQuery();
// 遍歷查詢結果集
while (resultSet.next()) {
// 輸出查詢結果
System.out.println("id = " + resultSet.getString("id"));
System.out.println("name = " + resultSet.getString("name"));
}
} catch (Exception e) {
e.printStackTrace();
} finally { // 釋放資源
if (resultSet != null) {
try {
// 關閉結果集對象
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (preparedStatement != null) {
try {
// 關閉預編譯語句對象
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection != null) {
try {
// 關閉連接對象
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
1.2 問題分析
上面的JDBC代碼存在以下幾個問題:
- 頻繁地開啟和關閉數據庫連接,嚴重地影響了數據庫的性能。
- 代碼中存在硬編碼。每當需求變更時,都需要修改源代碼然后重新編譯,系統不易維護。硬編碼的具體體現:
- SQL語句中的查詢條件(String sql = "select * from user where id = ?";)。如果需求變更,改為根據用戶主鍵和用戶名進行查詢,那么就需要修改源代碼。
- 設置查詢參數時的參數位置和參數值(preparedStatement.setString(1, "1");)。如果SQL語句由于需求變更而發生變化,那么原來編寫的賦值語句就可能出錯,需要修改源代碼。
- 獲取查詢結果時指定的列名(resultSet.getString("name");)。如果數據表的字段名發生了變化,那么就需要修改源代碼。
- 設置查詢參數的過程繁瑣。因為在設置查詢參數的過程中,需要為查詢語句中不同位置上的占位符設置不同的值。
- 獲取查詢結果的過程繁瑣。因為在獲取查詢結果的過程中,需要遍歷查詢結果集,而且在遍歷的過程中還需要根據數據表的列名才可以獲取出其值。
2 MyBatis
MyBatis是一個優秀的持久層框架,它對JDBC操作數據庫的過程進行了封裝,使開發者只需要關注SQL本身,而不需要花費精力去處理例如注冊驅動、創建連接、創建執行語句、手動設置參數和結果集檢索等繁雜的過程。
MyBatis通過封裝JDBC解決了它在編程中出現的問題,解決的技術方案主要有以下五種:
- 數據庫連接池。我們可以在MyBatis的全局配置文件SqlMapConfig.xml中配置數據庫連接池,使用它來管理數據庫連接,這樣就可以避免由于頻繁地創建和釋放數據庫連接而造成的資源浪費。
- SQL配置文件。MyBatis將SQL語句與Java源文件進行分離,將SQL語句放置到配置文件Mapper.xml中。如果有需求變更需要修改SQL語句,那么只需要修改配置文件即可。修改配置文件的維護成本比修改Java源文件的成本要低,因為修改配置文件后重啟系統就可以生效,但是如果修改的是Java源文件,那么就需要經過修改、編譯、打包、發布和重啟五個步驟。
- 動態SQL語句。MyBatis使用動態SQL技術解決了JDBC編程中存在的SQL硬編碼的問題。
- 輸入映射。MyBatis通過輸入映射技術將Java對象映射至SQL語句,SQL語句可以通過使用該Java對象取出查詢參數值,簡化了JDBC中設置查詢參數的過程。
- 輸出映射。MyBatis通過輸出映射技術將SQL的執行結果映射至Java對象,省去了JDBC編程中對結果集檢索的過程。