天天看點

MyBatis 架構詳解 (一)

持久層架構:直接操作對象  将查詢結果轉換成對象集合   把對象儲存到資料庫  你不用寫太多sql 語句(容易出錯,不利于面向對象)

 MyBatis:是一個持久層的架構,避免了幾乎所有的 JDBC 代碼和手動設定參數以及擷取結果集。MyBatis 可使用簡單的 XML 或注解來配置和映射原生資訊,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對象)映射成資料庫中的記錄。

                建構工廠模式  ,拿到資料源,拿到基本配置檔案通過資料源拿到session (專門操作資料庫)

引入jar包:

   1.要使用 MyBatis, 隻需将 mybatis-x.x.x.jar 檔案置于 classpath 中即可。

   2.maven建構項目:将以下加到pom.xml中;

MyBatis 架構詳解 (一)

從 XML 中建構 SqlSessionFactory

      xml隻是一種  擷取SqlSessionFactory方式 ( SqlSesionFactoryy有好幾個來源  xml/properties檔案/Configuration執行個體);

    可以使用classpath路徑下的資源檔案進行配置,也可以使用檔案流來得到路徑;MyBatis 包含一個名叫 Resources 的工具類,它包含一些實用方法,可使從 classpath 或其他位置加載資源檔案更加容易。

MyBatis 架構詳解 (一)

mybatis-config.xml配置檔案:

       mybatis核心配置(擷取資料庫連接配接的資料源+事務管理器--管理事務的)Configuration通過Resources的方式讀取配置檔案中資訊(SqlSessionFactoryBuilder 中的方法可以new 一個Configuration 執行個體去加載配置檔案的内容  後生成SqlSessionFactory)

<?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>
    <typeAliases>
        <typeAlias alias="student" type="com.spring.entry.Student" />
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://127.0.0.1/test" />
                <property name="username" value="root" />
                <property name="password" value="123456" />
            </dataSource>
        </environment>
    </environments>
    <!--所有的映射注冊-->
    <mappers>
        <mapper resource="com/spring/mybatis/StudentMapper.xml" />
        <mapper class="com.spring.mybatis.TeacherMapper"/>
    </mappers>
</configuration>
           

每個基于 MyBatis 的應用都是以一個 SqlSessionFactory 的執行個體為中心的SqlSessionFactory 的執行個體可以通過 SqlSessionFactoryBuilder 獲得。而 SqlSessionFactoryBuilder 則可以從 XML 配置檔案或一個預先定制的 Configuration 的執行個體建構出 SqlSessionFactory 的執行個體。

不使用 XML 建構 SqlSessionFactory

   直接用Java程式建立Configuration執行個體  Configuration添加了映射器類 (mappercalss) 含 SQL 映射語句的注解進而避免了 XML 檔案的依賴(xml裡面存sql  所有的sql語句都可以在xml); new 事務管理器

MyBatis 架構詳解 (一)

從 SqlSessionFactory 中擷取 SqlSession:

         SqlSession 完全包含了面向資料庫執行 SQL 指令所需的所有方法。你可以通過 SqlSession 執行個體來直接執行已映射的 SQL 語句; opensession相當于打開了一個連接配接;

   通過session的方法 相當于直接拿到了一個實體對象(沒有任何封裝)  

MyBatis 架構詳解 (一)

對于給定語句能夠合理描述參數和傳回值的接口(比如說StudentMapper.class)---你可以自定義session的方法(selectstudentmapper)  利用接口的方式進行可封裝;

MyBatis 架構詳解 (一)

     sql查出結果跟你的實體進行比對<mapper namespace=""> 通過id (方法名)調用sql   傳回一個對象類型

使用指定的完全限定名“org.mybatis.example.BlogMapper.selectBlog”來調用映射語句命名空間唯一;這個命名可以直接映射到在命名空間中同名的 Mapper 類,并将已映射的 select 語句中的名字、參數和傳回類型比對成方法;

 利用命名空間直接調用  實體類.calss

BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);
           

映射類:用注解替換xml形式(第三種)

     映射器是一個你建立來綁定你映射的語句的接口(StudentMapper)。

    映射器執行個體(Mapper Instances):從 SqlSession 中獲得的,任何映射器執行個體的最大作用域是和請求它們的 SqlSession 相同的,最好把映射器放在方法作用域(method scope)内;

     xml 對應了實體類  id即類中的方法 輸出類型就是該類的類型 

     session(可操作mapper檔案)                                              

     執行:session----->mapper(固定類) 【注解@/xml<....id>】------>mapper 去增删改查

映射器(mappers)

        告訴 MyBatis 到哪裡去找映射檔案,可以使用相對于類路徑的資源引用, 或完全限定資源定位符(包括 file:/// 的 URL),或類名和包名等.

MyBatis 架構詳解 (一)

Mapper XML 檔案:

      MyBatis 的真正強大在于它的映射語句,由于它的異常強大,映射器的 XML 檔案就顯得相對簡單。如果拿它跟具有相同功能的 JDBC 代碼進行對比,你會立即發現省掉了将近 95% 的代碼。MyBatis 就是針對 SQL 建構的。

MyBatis 架構詳解 (一)
MyBatis 架構詳解 (一)

select:預處理方面優勢‘??’  

MyBatis 架構詳解 (一)

标簽内置屬性:

MyBatis 架構詳解 (一)
MyBatis 架構詳解 (一)

Result Maps(解決聯合查詢問題)

resultMap 元素是 MyBatis 中最重要最強大的元素。它可以讓你從 90% 的 JDBC 

ResultSets 資料提取代碼中解放出來, 并在一些情形下允許你做一些 JDBC 不支援的事情

MyBatis 架構詳解 (一)

傳回值為HashMap類型,HashMap 不是一個很好的領域模型你的程式更可能會使用 JavaBean 或 POJO(Plain Old Java Objects,普通 Java 對象)作為領域模型。 MyBatis 對兩者都支援(對應到對象上)

解決字段名和屬性名不比對的問題

  1. 類别名:  

這些情況下,MyBatis 會在幕後自動建立一個 ResultMap,再基于屬性名來映射列到 JavaBean 的屬性上。如果列名和屬性名沒有精确比對,可以在 SELECT 語句中對列使用别名(這是一個 基本的 SQL 特性)來比對标簽。比如:

<select id="selectUsers" resultType="User">
  select
    user_id             as "id",
    user_name           as "userName",
    hashed_password     as "hashedPassword"
  from some_table
  where id = #{id}
</select>
           

2.resultMap :解決列名不比對的另外一種方式(對象裡的對象  1:n關系)

MyBatis 架構詳解 (一)

動态 SQL

  1.判斷(sql拼接的情況)true--拼接 false--不拼接

MyBatis 架構詳解 (一)

   2.周遊:

MyBatis 架構詳解 (一)

ps:mybatis架構功能強大,我們需要了解其内部原理,更好的運用它!

            mybatis官方文檔:http://www.mybatis.org/mybatis-3/zh/index.html

繼續閱讀