2013年9月7日 星期六

MyBatis - 使用resultType回傳單一SELECT資料時都是Null


今天用Mybatis的時候發生一個問題,回傳的Data怎樣都是Null,確認SQL語法無任何問題,資料也都正常,查了半天才發現是我使用上的錯誤:


使用code如下:
UserMapper.xml
  < select id="getByUserId" parametertype="String" resulttype="UserData">
     SELECT *
     FROM UserData 
     WHERE USERID = #{xx}
  </ select>  

UserMapper.java
public interface UserDataMapper{
 public UserData getByUserId(String userId);
}


UserData.java
public class UserData {
 private String _userid;
 private int     _money;

...
}

但是不管我傳入甚麼userid,getByUserId(userid)永遠回傳Null,
查了好久才發現我使用方式錯誤,其實我們在UserMapper.xml中定義的<resultMap>
(resultMap使用請見MyBatis - 使用resultMap(1))
這種方式並不適用在使用resultType的時候,因此我們的UserMapper.xml得改為如下:
  < select id="getByUserId" parameterType="String" resultType="UserData" >
     SELECT userid  as _userid,
   money as _money
     FROM UserData
     WHERE USERID = #{xx}
  < /select>  

還是得乖乖用 sql field as java field name的方式一一指定而不能只是使用 SELECT * 否則就會發生一直都回傳Null的問題。
不過我也是mybatis的初學者,所以說不定有方式只是我還沒發現用法而已。

2013/10/19更新:

可以回傳*,mybatis設定欄位的方式為查找setter,setter的規則為setParamName
,因此假設SELECT * FROM TEST 其中一個欄位名稱為paramName,那麼只要對應的resultType擁有 setParamName這個名稱的setter,mybatis就會呼叫此setter將paramName的value丟入assign囉 (大小寫不限)

沒有留言:

張貼留言