Mybatis步步進階(四)——Mybatis框架流程及核心配置詳解

     Mybatis框架的主要做用是讓程序的主要精力都放在sql上,經過my提供的映射,半自動化的生成sql操做數據。經過想PrepareStatement中輸入的參數自動進行輸入映射,將結果集ResultSet映射成java對象做爲輸出映射。html

1、Mybatis運行流程及相關核心類 java

 

一、SqlMapConfig.xml是Mybatis的全局配置文件,相似於Hibernate中的hibernate.cfg.xml,主要用於配置數據源、事務、加載實體mapper.xml配置文件(同上圖Config.xml)mysql

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-config.dtd">
<configuration>
    <environments default="development">
        <environment id="development">
            <!-- 使用jdbc事務管理,事務控制由mybatis管理 -->
            <transactionManager type="JDBC" />
            <!-- 數據庫鏈接池 ,由mybatis管理 -->
            <dataSource type="POOLED">
                <property name ="driver" value ="com.mysql.jdbc.Driver" />
                <property name ="url" value ="jdbc:mysql://127.0.0.1:3306/mybatisdemo?characterEncoding=utf-8"/>
                <property name ="username" value ="root" />
                <property name ="password" value ="dannyhoo" />
            </dataSource>
        </environment>
    </environments>
    <!-- 使用resource方式加載映射文件 -->
    <mappers>
        <mapper resource="sqlmap/User.xml"/>
    </mappers>
</configuration>

二、SqlSessionFactory:會話工廠 是每個MyBatis Application必有的,根據config配置文件建立,它主要用於建立Sqlsession會話,由sqlSessionBuilder經過new 的方式建立,SessionFatoryBuider可直接看成一個工具類使用,不須要使用單例進行管理,而由它建立的SqlSessionFactory是最好經過單例模式來建立,保證工廠一旦建立一次,就使用一個SqlSessionFactory實例。而且SqlSessionFactory的做用範圍是應用程序級的,在一個application中可僅有一個SqlSessionFactory,因此用單例控制SqlSessionFactory的建立。sql

三、Sqlsession:會話工廠建立出Sqlsession會話後,回話方可執行DB操做,執行sql語句、事務控制等,執行後可commit提交到數據庫;SqlSession的做用範圍和生命週期須要開發人員特別注意,由於它不是線程安全的,除了操做方法以外,還有數據屬性。因此它的做用範圍最好界定到方法級別,定義爲方法的局部變量,也就是一個方法獨有一個SqlSession實例。數據庫

     Exucutor:Mybatis在Sqlsession中提供了Exucutor類(執行器),是SqlSession用於執行sql操做數據庫的接口類apache

     Mapped Statement:另外Mapped Statement是底層封裝對象,對操做數據庫的參數進行封裝,包括sql語句、輸入參數、輸出參數緩存

2、SqlMapConfig.xml屬性詳解安全

一、properties  session

1)以JDBC爲例,若是將上面datasource屬性靈活可配置,例如換一個數據庫鏈接,可將value參數值以${}變量的形式傳入mybatis

抽象db.properties文件以下

     jdbc.driver=com.mysql.jdbc.Driver

     jdbc.url=jdbc:mysql://localhost:3306/max?characterEncoding=utf-8

     jdbc.username=rootjdbc.password=123456

修改datasource 標籤,同時在SqlMapConfig.xml中加載db.properties文件     

     <properties resouce=」db.properties」/>

          .................

     <dataSource type="POOLED">

         <property name ="driver" value ="${jdbc.dirver}" />

         <property name ="url" value ="${jdbc.url"/>

         <property name ="username" value ="${jdbc.username}" />

         <property name ="password" value ="${jdbc.password}" />

     </dataSource>

2)配置讀取優先級問題

     若是在db中有一個username參數,同時,在user實體的mapper映射中也有一個username參數,則my存在一個讀取配置優先級問題,properties元素體內定義的屬性優先於properties元素中的resource或url加載的屬性,最後讀取parameterType傳遞的屬性。若是出現同屬性名,則後面讀取的屬性值會覆蓋前面已經讀取的相同屬性名的值。

     針對這個問題,首先保證properties resource加載的文件中屬性名具備必定特殊性,如jdbc.username;其次,不要再properties元素體內添加其餘屬性值,均將它定義到.properties文件中,統一加載。

二、settings

Mybatis的全局配置參數,用於添加延遲加載、緩存配置信息。後面詳細介紹

三、aliase

     別名的使用場景也很是普遍,例如在輸入、輸出映射中,若是輸入pojo類型,則須要填寫這個pojo的全路徑,這時能夠把這些pojo類使用別名標記,簡化開發;

1)自定義別名

<typeAliases>
          <typeAliase type=」cn.max.po.User」 alias=」user」/>
</typeAliases>
在resultType中引用別名

<!-- 查詢-->
    <select id="findUserById" parameterType="int" resultType="user">
        select * from user where id=#{id}
    </select>

2)批量定義別名

<typeAliases>
     <!--自動掃描包中的類,爲每個類定義別名,別名==類名-->
     <package name=」cn.max.po」/>
     <package name=」cn.max.server」/>
     <package name=」cn.max.en」/>
</typeAliases>

四、typeHandlers類型處理器

     Mybatis自動提供多中類型處理器,主要用於處理輸入、輸出映射、參數java類型和jdbc數據類型的映射。、

五、mapper映射

1)經過resouce加載單個pojo映射文件

     <mapper resource="mapper/UserMapper.xml"/>

2)經過mapper接口class加載

<mapper class=」cn.max.po.UserMapper」/>

     經過class加載的好處在於能夠直接寫到包名,如class=「cn.max.po」,則po包下的全部mapper.java接口都會被加載,但這要求mapper.java接口和mapper.xml配置文件在同一目錄下且名稱一致,經過mapper代理可找到該映射信息。

3)經過url加載

<mapper url=」file:///d:\work\map\User.xml」/>-本地全路徑