MyBatis 本是 apache 的一個開源項目 iBatis,後更名爲 MyBatis,它 是一個優秀的持久層框架,對 jdbc 的操做數據庫的過程進行封裝,使開發者只須要關注 SQL 自己,而不須要花費精力去處理例如註冊驅動、建立connection、建立statement、手動設置參數、結果集檢索等jdbc繁雜的過程代碼。mysql
Mybatis 經過 xml 或註解的方式將要執行的各類 statement(statement、preparedStatemnt、CallableStatement)配置起來,並經過 Java 對象和 statement 中的 sql 進行映射生成最終執行的 sql 語句,最後由 Mybatis 框架執行 sql 並將結果映射成 Java 對象並返回。sql
(1)MyBatis 配置文件:數據庫
SqlMapConfig.xml: 此文件做爲 MyBatis 的全局配置文件,配置了 MyBatis 的運行環境等信息。apache
mapper.xml: 即 sql 映射文件,文件中配置了操做數據庫的 sql 語句。此文件須要在 SqlMapConfig.xml 中加載。編程
(2)經過 MyBatis 環境等配置信息構造 SqlSessionFactory, 即會話工廠。緩存
(3)由會話工廠建立 sqlSession ,即會話,操做數據庫須要經過 sqlSession 進行。微信
(4)MyBatis 底層自定義了 Executor 執行器接口操做數據庫,Executor 接口有兩個實現,一個是基本執行器、一個是緩存執行器。mybatis
(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 設置參數。app
(7)Mapped Statement 對 sql 執行輸出結果進行定義,包括 HashMap、基本類型、pojo,Executor經過Mapped Statement 在執行 sql 後將輸出結果映射至 Java 對象中,輸出結果映射過程至關於 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 對象解析比較方便。