手把手從零開始學習入門mybatis

簡介

MyBatis 是支持定製化 SQL、存儲過程以及高級映射的優秀的持久層框架。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 可以對配置和原生Map使用簡單的 XML 或註解,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記錄。

安裝

要使用Mybatis只需要到官網下載Mybatis的Jar包,並複製到ClassPath下即可。如果您是使用Maven來構建Java項目,那只需要在其pom.xml文件中加入Mybatis的依賴關係即可。

    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
         <version>3.3.0</version>
     </dependency>

連接數據庫

在使用Mybatis之前,我們要先確保其可以正確連接到我們要使用的目標數據庫。Mybatis連接數據庫也是非常的簡單,和JDBC類似,只需要在XML文件中指定要使用的數據庫驅動、連接字符串、數據庫用戶名和密碼信息即可。

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration
      PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
      "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
      <environments default="development">
        <environment id="development">
          <transactionManager type="JDBC"/>
          <dataSource type="POOLED">
            <property name="driver" value="com.mysql.jdbc.Driver"/>
            <property name="url" value="${url}"/>
            <property name="username" value="${username}"/>
            <property name="password" value="${password}"/>
          </dataSource>
        </environment>
        <environment id="product">
          <transactionManager type="JDBC"/>
          <dataSource type="POOLED">
            <property name="driver" value="com.mysql.jdbc.Driver"/>
            <property name="url" value="${url}"/>
            <property name="username" value="${username}"/>
            <property name="password" value="${password}"/>
          </dataSource>
        </environment>
      </environments>
    </configuration>

Mybatis允許我們在同一個配置文件中指定多個數據庫連接信息,實際工作中也是需要這樣的。開發環境,我們需要一個用於開發的數據庫;測試環境,我們需要一個用於系統測試的數據庫;生產環境,我們需要一個保存真實數據的生產數據庫。在Mybatis中,使用enviroments標籤即可定義多個環境中需要使用的數據庫連接信息,並使用default關鍵字指示出當前使用的環境信息。

數據庫連接配置寫好之後,我們就可以開始編寫操作數據庫的Java代碼了。大家可以回想一下,使用JDBC是如何操作數據庫的呢?熟悉Java開發模式的同學一定知道,我們需要在DAO層編寫以下功能代碼:

  • 加載數據庫驅動類 Class.forName(“com.mysql.jdbc.driver”);
  • 獲得數據庫連接 DeriverManager.getConnection(url, username, password)
  • 執行SQL語句
  • 獲取查詢結果,進行封裝
  • 返回封裝後的結果

其中前兩步,通常我們會提取出來,封裝在一個專門數據與數據庫連接的類DBUtils中。爲什麼這樣做呢?因爲DAO層要做的只是後面三步的工作,至於如何連接數據庫、連接哪個數據庫,DAO層是不關心的。她需要的是一個能夠與數據庫交互,交執行SQL語句的對象。在使用JDBC時,就是Connection對象。那麼在Mybatis中有沒有這樣一個對象呢?又是如何向DAO層提供這個對象的呢?

在正式開始編寫Java代碼之前,我們先了解一下Mybatis的相關基礎知識。

答案是肯定的,在Mybatis中向DAO層提供的這個能夠與數據庫交互並執行SQL語句的對象叫做SqlSession。這個是Mybatis最核心的一個對象。SqlSession完全包含了面向數據庫執行SQL命令所需的全部方法。

那麼如何獲得這個對象呢?分爲三步。

  • 通過配置文件獲取數據庫連接相關信息
  • 通過配置信息創建SqlSessionFactory對象。一眼就可以看出這是一個工廠類,負責創建SqlSession對象實例
  • 使用SqlSessionFactory創建SqlSession對象,打開一個數據庫會話。

下面的代碼展示了數據庫連接實踐。

    Reader reader;
    SqlSessionFactory sqlSessionFactory;
    try {
      //讀取配置文件
        reader = Resources.getResourceAsReader("mybatis.xml");
    } catch (IOException e) {
    e.printStackTrace();
    }
    //創建SqlSessionFactory對象實例
    sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
    //獲得數據庫會話對象實例
    SqlSession session = sqlSessionFactory.openSession();
    try {
        //數據庫操作
        ……
    } finally {
        //關閉數據庫會話
        session.close();
    }

範圍和生命週期

這裏順帶提一下上述代碼中使用到的幾個主要對象的範圍和生命週期。

SqlSessionFactoryBuilder

這個類可以被實例化、使用和丟棄,一旦創建了 SqlSessionFactory,就不再需要它了。因此 SqlSessionFactoryBuilder 實例的最佳範圍是方法範圍(也就是局部方法變量)。你可以重用 SqlSessionFactoryBuilder 來創建多個 SqlSessionFactory 實例,但是最好還是不要讓其一直存在以保證所有的 XML 解析資源開放給更重要的事情。

SqlSessionFactory

SqlSessionFactory 一旦被創建就應該在應用的運行期間一直存在,沒有任何理由對它進行清除或重建。使用 SqlSessionFactory 的最佳實踐是在應用運行期間不要重複創建多次,多次重建 SqlSessionFactory 被視爲一種代碼“壞味道(bad smell)”。因此 SqlSessionFactory 的最佳範圍是應用範圍。有很多方法可以做到,最簡單的就是使用單例模式或者靜態單例模式。

SqlSession

每個線程都應該有它自己的 SqlSession 實例。SqlSession 的實例不是線程安全的,因此是不能被共享的,所以它的最佳的範圍是請求或方法範圍。絕對不能將 SqlSession 實例的引用放在一個類的靜態域,甚至一個類的實例變量也不行。也絕不能將 SqlSession 實例的引用放在任何類型的管理範圍中,比如 Serlvet 架構中的 HttpSession。如果你現在正在使用一種 Web 框架,要考慮 SqlSession 放在一個和 HTTP 請求對象相似的範圍中。換句話說,每次收到的 HTTP 請求,就可以打開一個 SqlSession,返回一個響應,就關閉它。這個關閉操作是很重要的,你應該把這個關閉操作放到 finally 塊中以確保每次都能執行關閉。

通過本篇的學習,我們對Mybatis有了一個大體的瞭解。後續我還會和大家一起分享我的Mybatis學習路程。靜請期待。

作者:禹爸爸 
原文:https://blog.csdn.net/chris_mao/article/details/48803545 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章