開發與維運

MyBatis 常見錯誤

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 ... 異常

是金子 總會發光的
菅江暉

Leave a Reply

Your email address will not be published. Required fields are marked *