天天看點

關于mybatis的思考(2)——mybatis映射檔案的深入了解

關于mybatis的思考(2)——mybatis映射檔案的深入了解

1.配置檔案

    mybatis進行持久化操作是以SqlSessionFactory對象為基礎的,這個對象是整個資料庫映射關系經過編譯後的記憶體鏡像。

InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");

sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
      

    在這裡,根據配置檔案mybatis-config.xml建立SqlSessionFactory對象,然後産生SqlSession,執行sql語句。

關于mybatis的思考(2)——mybatis映射檔案的深入了解

2.配置檔案結構

  • properties 屬性
  • settings 設定
  • typeAliases 類型命名
  • typeHandlers 類型處理器
  • objectFactory 對象工廠
  • plugins 插件
  • environments 環境
    • enviroment 環境變量
    • transactionManager 事務管理器
    • dataSource 資料源
  • databaseIdProvider 資料庫廠商辨別
  • mappers 映射器

  2.1 properties 屬性

    這些屬性都是可外部配置且動态替換的,既可以在java屬性檔案中配置,也可以通過properties元素的子元素來傳遞。

    未使用properties的時候:

        資料源資訊是通過environments的子節點dataSource來進行配置的。

<environments default="mysql">
        <!-- 環境配置,即連接配接的資料庫。 -->
        <environment id="mysql">
            <!--  指定事務管理類型,type="JDBC"指直接簡單使用了JDBC的送出和復原設定 -->
            <transactionManager type="JDBC"/>
            <!--  dataSource指資料源配置,POOLED是JDBC連接配接對象的資料源連接配接池的實作。 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="hello"/>
            </dataSource>
        </environment>
    </environments>
      

  使用properties屬性的時候:

    首先在resources(在maven使用的時候,我們在pom中指定了src/main/resources/mybatis-config.xml作為配置檔案的來源)下增加一個db.properties的java屬性檔案。

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/mybatis
username=root
password=hello
      

  然後在配置檔案mybatis-config.xml中增加<properties>屬性。

<properties resource="db.properties"/>
      

    此時,指明了資料源的資訊。其中的屬性就可以在整個配置檔案中使用來替換需要動态配置的屬性值。

<dataSource type="POOLED">
    <property name="driver" value="${driver}"/>
    <property name="url" value="${url}"/>
    <property name="username" value="${username}"/>
    <property name="password" value="${password}"/>
</dataSource>
      

  

    2.2 setting 設定

    settings會改變mybatis的運作行為,我們在表中給出了各項的參數和預設值等資訊。

<!-- settings是 MyBatis 中極為重要的調整設定,它們會改變 MyBatis 的運作時行為。 -->
	<settings>
		<!-- 該配置影響的所有映射器中配置的緩存的全局開關。預設值true -->
	  <setting name="cacheEnabled" value="true"/>
	  <!--延遲加載的全局開關。當開啟時,所有關聯對象都會延遲加載。 特定關聯關系中可通過設定fetchType屬性來覆寫該項的開關狀态。預設值false  -->
	  <setting name="lazyLoadingEnabled" value="true"/>
	  	<!-- 是否允許單一語句傳回多結果集(需要相容驅動)。 預設值true -->
	  <setting name="multipleResultSetsEnabled" value="true"/>
	  <!-- 使用列标簽代替列名。不同的驅動在這方面會有不同的表現, 具體可參考相關驅動文檔或通過測試這兩種不同的模式來觀察所用驅動的結果。預設值true -->
	  <setting name="useColumnLabel" value="true"/>
	  <!-- 允許 JDBC 支援自動生成主鍵,需要驅動相容。 如果設定為 true 則這個設定強制使用自動生成主鍵,盡管一些驅動不能相容但仍可正常工作(比如 Derby)。 預設值false  -->
	  <setting name="useGeneratedKeys" value="false"/>
	 <!--  指定 MyBatis 應如何自動映射列到字段或屬性。 NONE 表示取消自動映射;PARTIAL 隻會自動映射沒有定義嵌套結果集映射的結果集。 FULL 會自動映射任意複雜的結果集(無論是否嵌套)。 --> 
	 <!-- 預設值PARTIAL -->
	  <setting name="autoMappingBehavior" value="PARTIAL"/>
	  
	  <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
	 <!--  配置預設的執行器。SIMPLE 就是普通的執行器;REUSE 執行器會重用預處理語句(prepared statements); BATCH 執行器将重用語句并執行批量更新。預設SIMPLE  -->
	  <setting name="defaultExecutorType" value="SIMPLE"/>
	  <!-- 設定逾時時間,它決定驅動等待資料庫響應的秒數。 -->
	  <setting name="defaultStatementTimeout" value="25"/>
	  
	  <setting name="defaultFetchSize" value="100"/>
	  <!-- 允許在嵌套語句中使用分頁(RowBounds)預設值False -->
	  <setting name="safeRowBoundsEnabled" value="false"/>
	  <!-- 是否開啟自動駝峰命名規則(camel case)映射,即從經典資料庫列名 A_COLUMN 到經典 Java 屬性名 aColumn 的類似映射。  預設false -->
	  <setting name="mapUnderscoreToCamelCase" value="false"/>
	  <!-- MyBatis 利用本地緩存機制(Local Cache)防止循環引用(circular references)和加速重複嵌套查詢。
	  		 預設值為 SESSION,這種情況下會緩存一個會話中執行的所有查詢。
	   		若設定值為 STATEMENT,本地會話僅用在語句執行上,對相同 SqlSession 的不同調用将不會共享資料。  -->
	  <setting name="localCacheScope" value="SESSION"/>
	  <!-- 當沒有為參數提供特定的 JDBC 類型時,為空值指定 JDBC 類型。 某些驅動需要指定列的 JDBC 類型,多數情況直接用一般類型即可,比如 NULL、VARCHAR 或 OTHER。  -->
	  <setting name="jdbcTypeForNull" value="OTHER"/>
	<!--   指定哪個對象的方法觸發一次延遲加載。  -->
	  <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
	</settings>      

  在此,我們給出一個完整的settings設定的執行個體。

<settings>
  <setting name="cacheEnabled" value="true"/>
  <setting name="lazyLoadingEnabled" value="true"/>
  <setting name="multipleResultSetsEnabled" value="true"/>
  <setting name="useColumnLabel" value="true"/>
  <setting name="useGeneratedKeys" value="false"/>
  <setting name="autoMappingBehavior" value="PARTIAL"/>
  <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
  <setting name="defaultExecutorType" value="SIMPLE"/>
  <setting name="defaultStatementTimeout" value="25"/>
  <setting name="defaultFetchSize" value="100"/>
  <setting name="safeRowBoundsEnabled" value="false"/>
  <setting name="mapUnderscoreToCamelCase" value="false"/>
  <setting name="localCacheScope" value="SESSION"/>
  <setting name="jdbcTypeForNull" value="OTHER"/>
  <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>
      

  2.3 typeAliases 類型

    類型别名是為java類設定一個短名字,存在的意義僅在于減少類完全限定名的備援。

<typeAliases>
        <typeAlias type="com.fayuan.domain.User" alias="User"/>
    </typeAliases>
      

  在這裡,我們使用User作為com.fayuan.domain.User這個類的别名,此時我們在UserMapping.xml中就可以使用User來代替com.fayuan.domain.User。

<!--
        id="save"是唯一的标示符
        parameterType屬性指明插入時使用的參數類型
        useGeneratedKeys="true"表示使用資料庫的自動增長政策
     -->
    <insert id="save" parameterType="com.fayuan.domain.User" useGeneratedKeys="true">
        insert into tb_user (name,sex,age) VALUES (#{name},#{sex},#{age})
    </insert>

    <!-- select操作
    parameterType="int"表示該查詢語句需要一個int類型的參數
    resultType="user"表示傳回的是一個user對象 -->
    <select id="select" parameterType="int" resultType="User">
        select * from tb_user where id=#{id}
    </select>
      

    在insert中沒有利用TypeAliases,需要将類的完全限定名全部寫出來;

    在select中利用TypeAliases,隻需要使用User即可表示這個類。

    也可以指定一個包。

<typeAliases>
    <package name="com.fayuan.domain"/>
</typeAliases>
      

    此時,每一個在包com.fayuan.domain下javaBean,

    在沒有注解的情況下,會使用Bean的首字母小寫的非限定名來作為别名,若設定了注解,則使用注解作為其注解值。

@Alias("user")
public class User{
    ...
}
      
關于mybatis的思考(2)——mybatis映射檔案的深入了解

能讓一個男孩子熱血的,不僅有夢想,還有姑娘。