MyBatis之參數配置

MyBatis最簡單的實例也已跑通,實現了增刪改查,涉及到複雜情況就是兩眼一抹黑。這篇主要講講參數配置,方便後期項目,我這裏沒有從頭到尾地去講每個參數的使用,而是在實際使用中遇到了問題纔會去看,故可能沒法給您提供有效的幫助。

參數表參考自:http://blog.csdn.net/chris_mao/article/details/48804493

設置參數 描述 有效值 默認值
cacheEnabled 該配置影響的所有映射器中配置的緩存的全局開關。 true | false true
lazyLoadingEnabled 延遲加載的全局開關。當開啓時,所有關聯對象都會延遲加載。 特定關聯關係中可通過設置fetchType屬性來覆蓋該項的開關狀態。 true | false false
aggressiveLazyLoading 當啓用時,對任意延遲屬性的調用會使帶有延遲加載屬性的對象完整加載;反之,每種屬性將會按需加載。 true | false true
multipleResultSetsEnabled 是否允許單一語句返回多結果集(需要兼容驅動)。 true | false true
useColumnLabel 使用列標籤代替列名。不同的驅動在這方面會有不同的表現, 具體可參考相關驅動文檔或通過測試這兩種不同的模式來觀察所用驅動的結果。 true | false true
useGeneratedKeys 允許 JDBC 支持自動生成主鍵(使用jdbc的getGenereatedKeys方法獲取主鍵並賦值到keyProperty設置的屬性中,useGeneratedKeys="true"時,keyProperty也必須同時設置),需要驅動兼容。 如果設置爲 true 則這個設置強制使用自動生成主鍵,儘管一些驅動不能兼容但仍可正常工作(比如 Derby)。 true | false false
autoMappingBehavior 指定 MyBatis 應如何自動映射列到字段或屬性。 NONE 表示取消自動映射;PARTIAL 只會自動映射沒有定義嵌套結果集映射的結果集。 FULL 會自動映射任意複雜的結果集(無論是否嵌套)。 NONE, PARTIAL, FULL PARTIAL
defaultExecutorType 配置默認的執行器。SIMPLE 就是普通的執行器;REUSE 執行器會重用預處理語句(prepared statements); BATCH 執行器將重用語句並執行批量更新。 SIMPLE REUSE BATCH SIMPLE
defaultStatementTimeout 設置超時時間,它決定驅動等待數據庫響應的秒數。 Any positive integer Not Set (null)
defaultFetchSize Sets the driver a hint as to control fetching size for return results. This parameter value can be override by a query setting. Any positive integer Not Set (null)
safeRowBoundsEnabled 允許在嵌套語句中使用分頁(RowBounds)。 true | false False
mapUnderscoreToCamelCase 是否開啓自動駝峯命名規則(camel case)映射,即從經典數據庫列名 A_COLUMN 到經典 Java 屬性名 aColumn 的類似映射。 true | false False
localCacheScope MyBatis 利用本地緩存機制(Local Cache)防止循環引用(circular references)和加速重複嵌套查詢。 默認值爲 SESSION,這種情況下會緩存一個會話中執行的所有查詢。 若設置值爲 STATEMENT,本地會話僅用在語句執行上,對相同 SqlSession 的不同調用將不會共享數據。 SESSION | STATEMENT SESSION
jdbcTypeForNull 當沒有爲參數提供特定的 JDBC 類型時,爲空值指定 JDBC 類型。 某些驅動需要指定列的 JDBC 類型,多數情況直接用一般類型即可,比如 NULL、VARCHAR 或 OTHER。 JdbcType enumeration. Most common are: NULL, VARCHAR and OTHER OTHER
lazyLoadTriggerMethods 指定哪個對象的方法觸發一次延遲加載。 A method name list separated by commas equals,clone,hashCode,toString
defaultScriptingLanguage 指定動態 SQL 生成的默認語言。 A type alias or fully qualified class name. org.apache.ibatis.scripting.xmltags.XMLDynamicLanguageDriver
callSettersOnNulls 指定當結果集中值爲 null 的時候是否調用映射對象的 setter(map 對象時爲 put)方法,這對於有 Map.keySet() 依賴或 null 值初始化的時候是有用的。注意基本類型(int、boolean等)是不能設置成 null 的。 true | false false
logPrefix 指定 MyBatis 增加到日誌名稱的前綴。 Any String Not set
logImpl 指定 MyBatis 所用日誌的具體實現,未指定時將自動查找。 SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING Not set
proxyFactory 指定 Mybatis 創建具有延遲加載能力的對象所用到的代理工具。 CGLIB | JAVASSIST JAVASSIST (MyBatis 3.3 or above)
vfsImpl Specifies VFS implementations Fully qualified class names of custom VFS implementation separated by commas. Not set

1.主鍵自增長:

見過多數教程都說自增長要加useGeneratedKeys="true"和keyProperty="主鍵字段",然而MySQL在對錶設置了auto_increment之後即可實現自增長,那麼爲何要用useGeneratedKeys="true"和keyProperty屬性呢?

答:加了useGenerateKeys=“true”和keyProperty可返回插入數據後的主鍵,參考自:http://www.cnblogs.com/lilh/archive/2016/05/23/5521271.html

int pk = sqlSession.insert("UserMapper.insertUser",user1);
System.out.println("輸出:"+pk);

不管是否設置useGenerateKeys="true"都返回1,這個1爲操作的記錄條數;

要返回主鍵用操作的對象get該主鍵,例如:System.out.println("我纔是主鍵:"+ user1.getId());

useGenerateKeys="false"則user1.getId()返回0;

[plain] view plain copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. <insert id="insertUser" parameterType="sysUser" useGeneratedKeys="true" keyProperty="id">  
  2.   insert into `user`(userName, birthday, salary, address)   
  3.   values(#{userName}, #{birthday}, #{salary}, #{address})  
  4. </insert>  

至於另一種方式適用於解決Insert數據時不支持主鍵自動生成的問題,例如Oracle,參考自:http://blog.csdn.net/isea533/article/details/21153791(這個比較詳細):

[plain] view plain copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. <insert id="insert" parameterType="map">  
  2.   insert into table1 (name) values (#{name})  
  3.   <selectKey resultType="java.lang.Integer" keyProperty="id">  
  4.     CALL IDENTITY()  
  5.   </selectKey>  
  6. </insert>  

2.實體類屬性和表字段不一致:

表結構:

[sql] view plain copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. CREATE TABLE `user` (  
  2.   `id` INT(11) PRIMARY KEY AUTO_INCREMENT,  
  3.   `user_name` VARCHAR(50),  
  4.   `birthday` DATE,  
  5.   `salary` DECIMAL(8,2),  
  6.   `address` VARCHAR(200)  
  7. ) ENGINE=INNODB CHARSET=utf8;  

實體類屬性:

[java] view plain copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. public class Users {  
  2.     private int id;  
  3.     private String userName;  
  4.     private Date birthday;  
  5.     private Double salary;  
  6.     private String address;  
  7.     ...  
  8. }  

類的配置文件修改

[plain] view plain copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. <insert id="insertUser" parameterType="sysUser" useGeneratedKeys="true" keyProperty="id">  
  2.     insert into `user`(user_name, birthday, salary, address)   
  3.     values(#{userName}, #{birthday}, #{salary}, #{address})  
  4. </insert>  

發現直接這樣對應就可以解決類屬性和表字段不一致的問題,那麼什麼時候才需要在類的配置文件中設置resultMap呢?

答:insert sql語句中values與表字段一一對應所以不存在相關問題,其它方式sql語句沒有對應的情況則

查詢中出現的問題:

[plain] view plain copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. <select id="findUserById" parameterType="int" resultType="sysUser">  
  2.     select * from `user` where id = #{id}  
  3. </select>  

返回記錄的user.getUserName() == null(沒報錯,由於實體類屬性和數據表字段無法對應出現的問題
第一種方法:對sql語句的表字段取別名,字段別名與實體類屬性一致即可(如果我要查詢全表字段,字段一致的也要列出來,會比較煩);

[plain] view plain copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. <select id="findUserById" parameterType="int" resultType="sysUser">  
  2.     select user_name userName, address from `user` where id = #{id}  
  3. </select>  

第二種方式:在類配置文件mapper內設置resultMap;

[plain] view plain copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. <!--通過<resultMap>映射實體類屬性名和表的字段名對應關係 -->  
  2.   <resultMap type="com.chensan.sys.Users" id="sysUser">  
  3.     <!-- 用id屬性來映射主鍵字段 -->  
  4.     <id property="id" column="id"/>  
  5.     <!-- 用result屬性來映射非主鍵字段 -->  
  6.     <result property="userName" column="user_name"/>  
  7. </resultMap>  

然後第二種方式測出的結果user.getUserName() == null,搞了半天發現resultType需要改成resultMap,真的是要抽自己;

[plain] view plain copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. <select id="findUserById" parameterType="int" resultMap="sysUser">  
  2.   select * from `user` where id = #{id}  
  3. </select>  
發佈了102 篇原創文章 · 獲贊 49 · 訪問量 33萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章