Mybaits的核心配置

1、mybatis主要有兩種配置文件:

  1. mybatis-config.xml(配置文件)html

  2. mybatis的映射文件(以mapper作後綴的文件)

2、mybaits的核心對象

  1. SqlSessionFactory:主要用於建立SqlSession,至關於整個數據庫在內存中的鏡像,因此說在一個項目中只能有一個工程。採用單利模式建立對象便可完成只有一個工廠類的操做。java

  2. SqlSession:應用層與持久層進行交互的(執行sql語句) 在一個項目當中SqlSession能夠有多個,每當執行sql操做時就應當建立一個Sqlsession,執行完畢後最後關閉釋放資源便可。能夠建立一個工具類哦mysql

    (1)Sqlssion中的一些重要方法sql

    • selectOne:返回一條記錄的查詢(能夠重載,重載中第一個參數爲你要執行的sql語句的絕對路徑,第二個參數爲你要傳的參數條件)
    • selectList:返回多條記錄的查詢(可重載,不須要傳參時用一個參數的,須要傳參時用傳遞兩個參數的,若是想要用它來進行分頁操做就要使傳遞第三個參數的)
    • insert:執行插入操做時。(能夠重載,重載中第一個參數爲你要執行的sql語句的絕對路徑,第二個參數爲你要傳的參數條件)
    • update:執行修改操做時使用。(能夠重載,重載中第一個參數爲你要執行的sql語句的絕對路徑,第二個參數爲你要傳的參數條件)
    • delete:執行刪除操做時使用。(可重載。若是想要刪除全部沒有where條件時就只須要執行傳遞一個參數的方法便可;若是有where條件則調用傳遞兩個參數的方法)
    • commit:sqlsession中的事務默認不自動提交,而commit()方法正是在進行事務提交的時候調用。若是不執行commit()方法,且執行不出錯只是表明內存當中的數據發生了改變而數據庫中的信息不會發生改變。因此所只有在調用了commit() 方法後纔會將內存中的改變提交個數據庫,從而使得數據庫中的信息發生改變。
    • rollback:回滾操做。當內存當中的所進行的操做發生錯誤時讓其進行回滾操做,(反悔)通過驗證後沒有問題是再進行提交操做。提交後將不能再次進行回滾操做
    • close:關閉SqlSession,釋放資源
    • getMapper:該方法會返回Mapper接口的代理對象,該對象關聯了SqlSession對象,開發人員可以使用該對象直接調用方法操做數據庫,參數type是Mapper的接口類型。
    • getConnection:獲取JDBC數據庫鏈接對象的方法

3、mybatis配置文件詳解

​ configuration標籤中的子標籤必定要按照順序來寫properties,settings,typeAliases,typeHandlers,objectFactory,objectWrapperFactory,reflectorFactory,plugins,environment-s,databaseIdProvider,mappers數據庫

  • properties:是一個配置屬性的元素,一般用於將內部的標籤外在化。將四個鏈接數據庫的串單獨放到一個配置文件中進行編輯(db.properties)以鍵值對的方式來進行建立。在mybatis的配置文件中導入db.propertiessession

    <properties resource="db.properties"></properties>
    <!--引入該屬性後再<dataSource>標籤中value值得地方替換成db.properties中的鍵名(關鍵字進行調用。關鍵字可自定義)-->
    <dataSource type="POOLED">
                    <property name="driver" value="${jdbc.driver}"/>
                    <property name="url" value="${jdbc.url}"/>
                    <property name="username" value="${jdbc.username}"/>
                    <property name="password" value="${jdbc.password}"/>
    </dataSource>
  • setting:一些標籤的開關能夠再次標籤中進行設置mybatis

  • typeAliases:能夠定義別名,在mapper映射文件中能夠直接使用別名app

    <typeAliases>
            <!-- 設置類型的別名 若是不寫alias屬性,系統默認的別名爲類名的首字母小寫-->
             <!--<typeAlias alias="customer" type="com.ruanyuan.pojo.Customer" />-->
             <!-- <typeAlias alias="user" type="com.ruanyuan.pojo.User" />-->
        <!--能夠給整個實體類的包進行建立,默認是類名首字母小寫-->
              <package name="com.runayuan.pojo"/> 
    </typeAliases>
  • typeHandlers:用於數據庫的數據類型和java的數據類型之間的轉換ide

  • environments:是環境配置的根元素,它包含一個default屬性,該屬性用於指定默認的環境ID。其中<enviroment>是它的子元素,能夠定義多個,其中ID屬性用於表示所定義環境的ID值。在子標籤中包含事務管理和數據源的配置信息,其中transactionManager 元素用於配置事務管理,它的type屬性用於指定事務管理的方式,即便用哪一個事務管理器;dataSource元素用於配置數據源,他的type屬性用於指定使用哪一種數據源。工具

    在mybatis中,能夠配置兩種類型的事務管理器,分別是JDBC和MANACED。

    • JDBC:此配置直接使用了JDBC的提交和回滾設置,它依賴於從數據源獲得的鏈接來管理事務的做用域。
    • MANACED:此配置歷來不提交或回滾一個鏈接,而是讓容器來管理事務的整個生命週期。在默認狀況下,它會關閉鏈接,但一些容器不但願這樣,爲此能夠將closeConnection屬性設置爲false來阻止它默認的關閉行爲。
    <environments default="mysql">
            <environment id="mysql">
                <transactionManager type="JDBC" />
                <!-- 啓動數據鏈接池 -->
                <dataSource type="POOLED">
                    <property name="driver" value="${jdbc.driver}" />
                    <property name="url" value="${jdbc.url}" />
                    <property name="username" value="${jdbc.username}" />
                    <property name="password" value="${jdbc.password}" />
                </dataSource>
            </environment>
    </environments>
  • mappers:指定映射文件的具體位置其中第二種方式是隻有在使用接口的形式下才可使用

    <mappers>
        <!--第一種-->
        <mapper resourse="com/mapper/UserMapper.xml"></mapper>
        <!--第二種使用包名引入-->
        <package name="com.mapper"/>
    </mappers>

4、mybaits映射文件配置詳解

在將來實際項目開發中,全部的標籤都必需要寫id屬性

select標籤中的paramterType屬性能夠省略不寫,resultType屬性必須得寫。但根據java開發手冊中的ORM映射規範來說 不要用 resultClass 當返回參數,即便全部類屬性名與數據庫字段一一對應,也須要 定義<resultMap>;反過來,每個表也必然有一個<resultMap>與之對應。 說明: 配置映射關係,使字段與 DO 類解耦,方便維護。

因此說最好使用resultMap標籤,當使用resultMap標籤時,不得使用resultType標籤。兩個標籤只能寫一個

<mapper namespace="">

對於<insert><update><delete>這3個標籤,一般咱們只寫id屬性,其餘屬性一律不寫。
    在xml中寫sql語句時,涉及到傳參時要使用#{}的方式。其中的參數名稱要和實體類中屬性名稱保持一致,只有這樣在mybatis的ORM映射才能真正的起到做用。

namespace爲工做空間,其中的屬性都爲當前mapper文件的絕對路徑例:com.mapper,UserMapper

select:該標籤在你執行查詢語句時進行使用

<!--id具備惟一性,要將id的名稱和接口類中所定義的方法名保持一致
 parameterType:傳入參數的類型
resultType:返回的數據類型
-->
<select id="getCustomerById" parameterType="Integer"
        resultType="customer">
        select
        <include refid="customerColums"></include>
        customer where cust_id = #{cust_id}
</select>

模糊查詢時要用concat拼接

例如:

<!--paramerType:傳入的參數類型,resultType:返回的數據類型-->
<select id="getCustomerByName" parameterType="String"
        resultType="com.xiangyu.pojo.Customer">
        select * from customer where cust_name like
        concat('%',#{value},'%')
</select>
若是在查詢全部信息時,paramterType爲List集合中的泛型的絕對路徑

update:執行修改語句時進行使用

delete:執行刪除語句時進行使用

insert:執行插入語句時進行使用

  • 在插入數據後想要經過對象獲取到該用戶id時,一般狀況下會獲取不到,因此咱們要來使用useGeneratedKeys="true" keyProperty="" 這兩個屬性來進行配置其中keyProperty中的值爲咱們定義的實體類中的數據庫的主鍵名稱。

    <!-- 插入語句 數據庫能夠實現自動增加時 -->
        <insert id="isnertCustomer" parameterType="customer"
            useGeneratedKeys="true" keyProperty="custId"> insert into customer
            (cust_name,cust_userId,cust_create_id,cust_sourrce,cust_industry,cust_address)
            values
            (#{custName},#{custUserid},#{custCreateId},#{custSourrce},#{custIndustry},#{custAddress})
        </insert>
    <!-- 插入語句,數據庫不會實現自動增加時 -->
         <insert id="isnertCustomer" parameterType="customer"> <selectKey keyProperty="cust_id" 
            resultType="Integer" order="BEFORE"> select if(max(cust_id) is null,1,max(cust_id)+1) 
            as newId from customer </selectKey> insert into customer (cust_name,cust_userId,cust_create_id,cust_sourrce,cust_industry,cust_address) 
            values (#{custName},#{custUserid},#{custCreateId},#{custSourrce},#{custIndustry},#{custAddress}) 
            </insert>

(1)resultMap

有的時候在建立數據庫中的字段時兩個單詞之間會用‘__’進行鏈接,但在定義java實體類中的屬性值時一般喜歡使用駝峯命名法來命名兩個單詞,而正由於如此在mybatis中orm映射機制會因爲實體類中的屬性值和數據庫中字段的值不一致而致使映射失敗,傳值無效報錯

解決方法:(1)在mybatis的配置文件中(mybatis-config.xml)

<!--configuration標籤中的settings標籤進行全局設置-->
<!--在一般狀況下,java中的實體類中的屬性通常是採用駝峯命名命名的,而數據庫中表的字段則用下劃線區分字母。在這種狀況下,Mybatis提供了一個全局屬性mapUnderscoreToCamelCase來解決二者名字不一致的問題。-->
<setting name="mapUnderscoreToCamelCase" value="true" />

(2)也能夠直接使用上文所說起到的resultMap進行自定義映射(important)

<resultMap id="BaseResultMap" type="com.ruanyuan.pojo.User">
    <!--主鍵-->
        <id column="user_id" jdbcType="BIGINT" property="userId" />
    <!--columu:數據庫中的字段名,jdbctype:字段的數據類型,property:你在實體類中本身定義的一個實體類屬性名稱-->
        <result column="user_code" jdbcType="VARCHAR"
            property="userCode" />
        <result column="user_name" jdbcType="VARCHAR"
            property="userName" />
        <result column="user_password" jdbcType="VARCHAR"
            property="userPassword" />
        <result column="is_state" jdbcType="CHAR" property="state" />
</resultMap>

一個實體類對應一個mapper.xml文件,實體類的名稱和mapper的名稱保持一致,sql語句寫到mapper.xml文件z中,將mybatis-config配置文件放在根目錄下,在該文件中進行鏈接數據庫操做。而且還要映射有sql語句的mapper.xml文件。

(2)Sql元素:在一個映射文件中,一般須要定義多條sql語句,這些sql語句的組成可能有一部分是相同的

若是每個sql語句都重寫一遍相同的部分,那勢必會增長代碼量,致使映射文件過於臃腫

此時就須要使用sql元素將SQL語句中的相同的組成部分抽取出來,而後在須要的地方用<include>標籤進行插入便可。

<sql id="Base_Column_List">
        user_id, user_code, user_name, user_password, is_state,
        create_time,
        update_time
</sql>
<select id="selectByPrimaryKey" parameterType="Integer"
        resultMap="BaseResultMap">
        select
        <include refid="Base_Column_List" />
        from login_user
        where user_id = #{userId}
</select>
相關文章
相關標籤/搜索