【Mybatis】標籤中statementType,databaseId,flushCache,keyColumn,keyProperty,timeout,useGeneratedKeys的使用

mybatis的xml文件中,配置SQL語句時。在標籤上有很多屬性可以選擇,這些屬性包括:

statementType,databaseId,flushCache,keyColumn,keyProperty,timeout,useGeneratedKeys

所寫的位置爲:

在這裏插入圖片描述
爲了後續做項目時減少思考的時間,故在此進行一次彙總。

statementType的使用

StatementType有三個值,分別爲:STATEMENT,PREPARED 或 CALLABLE。其中:
STATEMENT

普通的不帶參的查詢SQL;
支持批量更新,批量刪除;
Statement每次執行sql語句,數據庫都要執行sql語句的編譯 ,
最好用於僅執行一次查詢並返回結果的情形,效率高於PreparedStatement。 
對應於Statement對象,有SQL注入的風險。

PREPARED:

可變參數的SQL,編譯一次,執行多次,效率高;
安全性好,有效防止Sql注入等問題;
支持批量更新,批量刪除;
PreparedStatement是預編譯的,使用PreparedStatement有幾個好處:
1. 在執行可變參數的一條SQL時,PreparedStatement比Statement的效率高,因爲DBMS預編譯一條SQL當然會比多次編譯一條SQL的效率要高。
2. 安全性好,有效防止Sql注入等問題。
3. 對於多次重複執行的語句,使用PreparedStament效率會更高一點,並且在這種情況下也比較適合使用batch;
4. 代碼的可讀性和可維護性。 

CALLABLE:

繼承自PreparedStatement,支持帶參數的SQL操作;
支持調用存儲過程,提供了對輸出和輸入/輸出參數(INOUT)的支持;
當使用存儲過程的時候,需要指定statementType的值爲CALLABLE

databaseId

databaseId用於指定所配置的數據源id,在多數據源的時候,可以使用。如配置的數據源:

<bean id="vendorProperties"
      class="org.springframework.beans.factory.config.PropertiesFactoryBean">
    <property name="properties">
        <props>
            <prop key="Oracle">oracle</prop>
            <prop key="MySQL">mysql</prop>
        </props>
    </property>
</bean>

SQL語句在使用指定數據源時:

<select id="qryAllUserInfo" databaseId="oracle" parameterType="****" >
    select * from sys_user
</select>
<select id="qryAllUserInfo" databaseId="mysql" parameterType="****" >
    select * from sys_user
</select>

flushCache和useCache

這兩者是針對二級緩存使用的,在沒有配置的情況下,mybatis二級緩存默認如下:

flushCache默認爲false,表示任何時候語句被調用,都不會去清空本地緩存和二級緩存。
useCache默認爲true,表示會將本條語句的結果進行二級緩存。
在insert、update、delete語句時: flushCache默認爲true,表示任何時候語句被調用,都會導致本地緩存和二級緩存被清空。 useCache屬性在該情況下沒有。update 的時候如果 flushCache="false",則當你更新後,查詢的數據數據還是老的數據。

keyColumn,keyProperty,useGeneratedKeys

這三者可配合使用,使用場景有很多,比如:

在插入數據庫後,還返回插入的主鍵如id值到相應的pojo模型中。這非常方便的在進行業務插入時,無需再次查詢最後一次插入的數值id。

詳細解釋:

   keyColumn ,指定數據庫的主鍵名是什麼,如id 。對特定數據庫(如PostgreSQL),若自動生成的主鍵不是第一個字段則必須設置

   keyProperty ,默認值unset,用於設置getGeneratedKeys方法或selectKey子元素返回值將賦值到領域模型的哪個屬性中

   useGeneratedKeys ,取值範圍true|false(默認值),設置是否使用JDBC的getGenereatedKeys方法獲取主鍵並賦值到keyProperty設置的領域模型屬性中。MySQL和SQLServer執行auto-generated key field,因此當數據庫設置好自增長主鍵後,可通過JDBC的getGeneratedKeys方法獲取。但像Oralce等不支持auto-generated key field的數據庫就不能用這種方法獲取主鍵了

舉例1:

<insert id="addHuser" parameterType="com.xx.authorization.model.HUsers" useGeneratedKeys="true" keyColumn="USER_ID" keyProperty="userId">  
        INSERT INTO H_USERS(PHONE,PASSWORD,GENDERS,REGISTER_DATE,STATUS)  
        values (#{phone},#{password},  
        #{genders,typeHandler=org.apache.ibatis.type.EnumOrdinalTypeHandler},  
        #{registerDate},#{status})  
    </insert> 

當執行完該條語句後,語句會獲取插入的最新一條數據的主鍵,即USER_ID的值,然後映射到userId,最後再映射到實體類HUsers的userId中,所以執行完畢後你會發現HUsers的userId是最新的id數據。

舉例2

<mapper namespace="com.dao.EmployeeDao">
 
    <insert id="insert">
        <selectKey order="BEFORE" keyColumn="employeeId,employeeGender" keyProperty="employeeId,employeeGender" resultType="com.entity.Employee">
            select employee_id employeeId,employee_gender employeeGender from employee where employee_id=13
        </selectKey>
        insert into subtable(employee_id,employee_name,employee_gender) values (#{employeeId},"mdzz",#{employeeGender})
    </insert>
</mapper>

該條語句,表示從employee 中查詢employee_id=13的數據,查詢到employeeId和employeeGender 並映射到keyProperty中,然後再下一個insert語句中,直接注入#{employeeId},#{employeeGender},這種情況多用在表2需要表1字段信息時,減少代碼和SQL的編寫。提高SQL執行速度

timeout

默認爲unset(依賴jdbc驅動器的設置),設置執行該操作的最大時限,超時將拋異常

發佈了48 篇原創文章 · 獲贊 73 · 訪問量 95萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章