2.6 測試
PersistenceException 持久化異常...
BuilderException 構建異常 ...
ReflectionException 反射異常...
BindingException(數據捆綁) 注入異常...
SQLSyntaxErrorException SQL 語句錯誤異常
ExpressionSyntaxException 表達式語法錯誤
2.6.1 Could not find resoure
資源未找到所導致的異常..
- getResource時資源路徑寫錯了 或者 是主配置文件 mapper 中的resource寫錯了
2.6.2 Cannot find class
沒有找到class...
- 去看看你包導入了嗎或者看看你類名是不是寫錯了。
2.6.3 ...does not contain value for ...
所指定的集(set、collection)中不包含指定內容(key、value) 使用getMepperStatement()方法來獲取不存在的的statement id 時會報此類異常
- 去看看statement id 是否存在於配置文件
例: Mapped Statements collection does not contain value for 123.electAll
- 值 123.electAll 在 Mapped Statements collection(映射聲明集) 中不存在
2.6.4 Type ${interface} is not known to the MapperRegistry.
所指定的接口類型在映射倉庫中不存在 使用動態代理獲取指定接口時會遇到這種異常
- 你寫的mapper配置文件是否對應接口,去看看 mapper 的namespace
例: Type interface com.mybatis.dao.UserMapper is not known to the MapperRegistry.
- 接口類型 com.mybatis.dao.UserMapper 不存在於映射倉庫
2.6.5 Type ${interface} is already known to the MapperRegistry.
所指定的接口類型在映射倉庫中已存在
- 添加映射倉庫中不存在的接口類型
2.6.6 Invalid bound statement (not found): ...
非法範圍聲明(未找到) 使用動態代理執行接口方法時會遇到這種異常
- 檢查 mapper 文件中CRUD id 是否與 接口方法名相同。
例: Invalid bound statement (not found): com.mybatis.dao.UserMapper.selectAll
- 指定的 com.mybatis.dao.UserMapper.selectAll 在 聲明範圍中不存在
2.6.7 Mapping is missing column attribute for property ...
使用resultMap 在映射屬性中找不到 column 屬性 ... 使用resultMap映射類時,未指定cloumn 會拋出此異常
- 寫出 column 屬性即可
例:
<resultMap type="User" id="User">
<id />
<result property="id" />
</resultMap>
上面兩種 都會拋出此異常
2.6.8 Cannot determine value type from string '${str}'
無法從字符串${str}中確定值類型
cloumn 映射至 POJO字段時,屬性類型對不上。或者自動映射出現問題
- 手動指定類型/檢查映射字段是否符合java類型要求
2.6.9 There is no setter for property named '${name}' in 'class ${class}'
在 ${class} 類 中找不到屬性為${name} 的set方法 使用resultMap 指定映射property值時 對不上pojo的set方法和字段
- 寫出set方法 或者 將映射property的值設置為 pojo 擁有的set方法名
- 你知道嗎? mybatis 會先去尋找 名稱為${name} 的set方法。找不到時會去尋找 名稱為${name}的字段 如果還是找不到才會拋出這個異常。2.6.10同理
2.6.10 There is no getter for property named '${name}' in '${class}'
在 ${class} 類 中找不到屬性為${name} 的get方法
- 寫出get 方法
2.6.11 java.lang.NoSuchMethodException: ${class01}.()
低版本的mybatis映射對象時 對象必須擁有無參構造方法
- 創建無參構造即可
- 課外知識:這個異常也存在於反射中 當getMethod("${methodName}"); 沒有權限訪問或者${methodName}不存在時會拋出此異常
2.6.12 java.lang.ClassCastException: ${class0} cannot be cast to ${class1}
不能將${class0} 轉化成 ${class1} 十分經典的運行時異常,例如不能將String 轉換為Integer 一樣。 一般出現在 CUD parameterType中
- 請檢查你傳入的參數類型 是否與 parameterType所指定的類型一致。
2.6.13 Parameter ${name} not found. Available parameters are [${collection}]
你指定的${name}並不存在於 ${collection} 中
- 請確定你的name存在於${collection} 中
2.6.14 Invalid argument value: java.io.NotSerializableException
不可序列化異常 沒有實現Serializable 接口????? implements Serializable
- collection 指定為 list |map。 避免直接使用 list|map..
例:
<insert id="insertUser">
INSERT INTO `user`(`name`,`role_id`)
values
<foreach collection="list" separator=",">
(#{list},#{list})
</foreach>
</insert>
<insert id="insertUser">
INSERT INTO `user`(`name`,`role_id`)
values
<foreach collection="map" separator=",">
(#{map},#{map})
</foreach>
</insert>
- 避免發生上面的錯誤即可
2.6.15 java.lang.UnsupportedOperationException
不支持的操作異常 操作Arrays 內部類 ArrayList也會拋出此異常 。
mybatis 動態sql 中 沒有給list|map起別名 使用list|map會拋出此異常(list|map是整個集合。)
- 請指定別名並用別名來操作屬性
例:
<insert id="insertUser">
INSERT INTO `user`(`name`,`role_id`)
values
<foreach collection="list" separator="," >
(#{list.name},#{list.role_id})
</foreach>
</insert>
<insert id="insertUser">
INSERT INTO `user`(`name`,`role_id`)
values
<foreach collection="map" separator="," >
(#{map.name},#{map.role_id})
</foreach>
</insert>
- WoW , 能在mybatis中遇到這個異常,都不是一般人 。
- 為 foreach 指定 item 屬性,並 使用item起的別名來 .方法
注: 如果你的collection 指定的是 array ,傳入的實參也是array 那麼則會拋出 2.6.10 There is no getter..異常,其實也很好理解,因為數組是對象,而數組對象並不存在 #{array.name}這種奇特的set方法或字段
2.6.15 The expression '${value}' evaluated to a null value.
表達式 ${value} 計算結果為空值
- foreach元素中的屬性collection所指定的值不存在
2.6.16 Malformed OGNL expression: ...
表達式語法錯誤...
- 請檢查你的表達式是否正確
例:
<if test="${name} != null and name != '' ">AND `name` LIKE concat('%',#{name},'%')</if>
<if test="name ! null and name != '' ">AND `name` LIKE concat('%',#{name},'%')</if>
瞭解
Mybatis高版本支持自動有參構造方法創建對象。參數類型順序需要和數據庫中數據一一對應)
- 注意:Mybatis自動使用有參構造方法構建對象後也會執行pojo的set方法 。就像Mybatis正常執行無參構造方法創建對象後會去尋找set方法為字段賦值時一樣。
- Mybatis自動使用有參構造方法是用來更靈活的創建對象的,並非是新增的一種映射對象的方式。
- 當然你不寫set方法或者字段名跟數據庫列對不上的時候,它默認也就按照有參構造形參的順序來進行傳參(這就可以實現你想象中的mybatis構造方法映射對象的方式)
- 注:如果傳入實參不能被賦值給字段就會拋出 2.6.8 SQLDataException:Cannot determine value type from ... 異常
是金子 總會發光的
菅江暉