1. 程式人生 > >MyBatis 框架系列之基礎初始

MyBatis 框架系列之基礎初始

trace 使用 下一個 utf statement 公眾號 全局配置 註冊 例如

技術分享圖片

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 對象解析比較方便。

4、MyBatis 入門實例:鑒於導入 jar 包開發程序相對麻煩,因此接下來的框架和項目程序均使用 Maven 工具來進行項目管理,所以入門程序會在下一個 Maven 系列文章更新完後再重新講解。


掃描二維碼關註微信公眾號compassblog,了解更多

技術分享圖片

MyBatis 框架系列之基礎初始