1、什麼是 MyBatis
MyBatis 本是 apache 的一個開源專案 iBatis,後改名為 MyBatis,它 是一個優秀的持久層框架,對 jdbc 的運算元據庫的過程進行封裝,使開發者只需要關注 SQL 本身,而不需要花費精力去處理例如註冊驅動、建立connection、建立statement、手動設定引數、結果集檢索等jdbc繁雜的過程程式碼。
Mybatis 通過 xml 或註解的方式將要執行的各種 statement(statement、preparedStatemnt、CallableStatement)配置起來,並通過 Java 物件和 statement 中的 sql 進行對映生成最終執行的 sql 語句,最後由 Mybatis 框架執行 sql 並將結果對映成 Java 物件並返回。
2、MyBatis 架構詳解
(1)MyBatis 配置檔案:
SqlMapConfig.xml: 此檔案作為 MyBatis 的全域性配置檔案,配置了 MyBatis 的執行環境等資訊。
mapper.xml: 即 sql 對映檔案,檔案中配置了運算元據庫的 sql 語句。此檔案需要在 SqlMapConfig.xml 中載入。
(2)通過 MyBatis 環境等配置資訊構造 SqlSessionFactory, 即會話工廠。
(3)由會話工廠建立 sqlSession ,即會話,運算元據庫需要通過 sqlSession 進行。
(4)MyBatis 底層自定義了 Executor 執行器介面運算元據庫,Executor 介面有兩個實現,一個是基本執行器、一個是快取執行器。
(5)Mapped Statement 是 MyBatis 一個底層封裝物件,它包裝了 MyBatis 配置資訊及 sql 對映資訊等。mapper.xml 檔案中一個 sql 對應一個 Mapped Statement 物件,sql 的 id 即是 Mapped statement 的 id。
(6)Mapped Statement 對 sql 執行輸入引數進行定義,包括 HashMap、基本型別、pojo,Executor 通過Mapped Statement 在執行 sql 前將輸入的 Java 物件對映至 sql 中,輸入引數對映就是 jdbc 程式設計中對preparedStatement 設定引數。
(7)Mapped Statement 對 sql 執行輸出結果進行定義,包括 HashMap、基本型別、pojo,Executor通過Mapped Statement 在執行 sql 後將輸出結果對映至 Java 物件中,輸出結果對映過程相當於 jdbc 程式設計中對結果的解析處理過程。
3、傳統的 JDBC 程式設計問題總結
(1)JDBC 程式設計步驟
1)載入資料庫驅動
2)建立並獲取資料庫連結
3)建立 jdbcstatement 物件
4)設定 sql 語句
5)設定 sql 語句中的引數(使用preparedStatement)
6)通過 statement 執行 sql 並獲取結果
7)對 sql 執行結果進行解析處理
8)釋放資源(resultSet、preparedstatement、connection)
(2)JDBC 程式例項
public class Test {
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/mybatis?characterEncoding=utf-8", "root", "root");
// 定義sql語句 ?表示佔位符
String sql = "select * from user where username = ?";
// 獲取預處理statement
preparedStatement = connection.prepareStatement(sql);
// 設定引數,第一個引數為sql語句中引數的序號(從1開始),第二個引數為設定的引數值
preparedStatement.setString(1, "王五");
// 向資料庫發出sql執行查詢,查詢出結果集
resultSet = preparedStatement.executeQuery();
// 遍歷查詢結果集
while (resultSet.next()) {
System.out.println(resultSet.getString("id") + " " + resultSet.getString("username"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 釋放資源
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (preparedStatement != null) {
try {
preparedStatement.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
複製程式碼
(3)傳統 JDBC 程式問題總結
1)資料庫連線建立、釋放頻繁造成系統資源浪費,從而影響系統效能。如果使用資料庫連線池可解決此問題。
2)sql 語句在程式碼中硬編碼,造成程式碼不易維護,實際應用中 sql 變化的可能較大,sql 變動需要改變 Java 程式碼。
3)使用 preparedStatement 向佔有位符號傳引數存在硬編碼,因為 sql 語句的 where 條件不一定,可能多也可能少,修改 sql 還要修改程式碼,系統不易維護。
4) 對結果集解析存在硬編碼(查詢列名),sql 變化導致解析程式碼變化,系統不易維護,如果能將資料庫記錄封裝成 pojo 物件解析比較方便。