ssm中mybatis處理資料庫(mysql)與pojo屬性中型別不一致(string轉date)
一般在表設計的時候會考慮到資料庫欄位型別和java中屬性一致的問題,但是也有可能會出現一些情況導致型別不一致的問題,比如:二次開發中需求更改等。此時資料庫和java中的程式碼不能隨便更改,所以考慮的思路是通過typeHandler作為中間體來把型別轉換。
當然,如果可以直接在獲取欄位後,直接通過simpleFormart來轉換後,來處理資料就可以了。
此方法是在獲取不了欄位的情況下進行的。
資料庫中型別:varchar
java的pojo屬性:Date
實現型別轉換功能其實就是三步:
一.定義一個轉換工具類進行自己需要型別的轉換(比如在工具包中新建一個TypeHandlerToString類,繼承 BaseTypeHandler<Date>或者
二.註冊剛定義的轉換工具類,使它可以起作用
三.在UserMapper.xml檔案中給出要用哪個TypeHandler
第一:新增一個工具類來定義轉換的型別
a.在工具類包中定義一個工具類,如:TypeHandlerToString 繼承 BaseTypeHandler<Date>,泛型選擇要java的pojo需要的型別:Date
b.重寫相應的四個方法(一個set,三個get---get方法只是引數不一樣)
一個set方法
三個get方法@Override public void setNonNullParameter(PreparedStatement ps, int i, Date parameter, JdbcType jdbcType) throws SQLException { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss"); ps.setString(i,simpleDateFormat.format(parameter)); }
至此,自定義的轉換工具類已經完成@Override public Date getNullableResult(ResultSet rs, String columnIndex) throws SQLException { String varchartime = rs.getString(columnIndex); if(varchartime != null){ return new Date(Long.parseLong(varchartime)); } else return null; } @Override public Date getNullableResult(ResultSet rs, int columnIndex) throws SQLException { String varchartime = rs.getString(columnIndex); if(varchartime != null){ return new Date(Long.parseLong(varchartime)); } else return null; } @Override public Date getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { String varchartime = cs.getString(columnIndex); if(varchartime != null){ return new Date(Long.parseLong(varchartime)); } else return null; }
注意:如果是實現介面的話,在重寫的set方法中需要處理下parameter為null的情況
第二:在mybatis-config.xml檔案中註冊,新增typeHandler元件,包含了handler,jdbcType,javaType
註冊可以兩種方式:在實現類上添加註解 或 在mybatis-config.xml新增標籤
handler:自己定義的轉換工具類來對映,如:cn.lung.flower.utils.TypeHandlerToString,這個屬性是一定要有的
jdbcType:資料庫中欄位的型別,如:varchar
javaType:java中的屬性,如:Date
此處需要注意:java的pojo類的date型別一定要是java.util.Date,如果是java.sql.Date的資料會出現錯誤。而在mybatis-config.xml檔案中的型別mybatis-config.xml檔案中的型別也可以是java.sql.Date,但是最好和pojo一致。
至此,型別的轉換功能已經可以使用了
-----------------------------------------------------------------------------------------------
擴充套件一下:
在註冊的時候,可以分為多種情況(拿註解舉例子):
只新增@MappedJdbcTypes註解,不新增@MappedTypes : 個人測試,顯示的資料和資料庫中不一致
只新增@MappedTypes註解,不新增@MappedJdbcTypes : 個人測試,資料一致
兩種註解都不新增 : 個人測試,資料一致
在mybatis-config.xml檔案中新增或者不新增 jdbcType,javaType 屬性,和註解的情況是一樣的
它內部是如何匹配到的在這就不詳細解釋了,這個連結有詳細分析:http://blog.csdn.net/a1258531/article/details/51822875
-----------------------------------------------------------------------------------------------
第三:在UserMapper.xml檔案的resultMap元件中新增 javaType+jdbcType或者 typeHandler ,可以匹配到之前定義的轉換工具類
這一步會涉及到mybatis內部是如何找到轉換類的(如果是string和data型別之間的轉換,整個第三步都可以不要。如果是,如:String<---->varchar的話,需要下面的操作)
如果註冊時 只新增@MappedTypes註解,不新增@MappedJdbcType 對應的UserMapper檔案中resultMap就只新增javaType,
或者是用typeHandler代替,直接指定實現類,如下:
所以最簡單的做法是:
自定義的實現類繼承BaseTypeHandler +mytis-config.xml檔案元件只新增handler屬性 +
UserMapper.xml檔案resultMap欄位用typeHandler
測試一下:
寫一個User類,定義一個型別為java.util.Date的屬性date,重寫toString(),加入SimpleDateFormat,指定格式
SimpleDateFormat s = new SimpleDateFormat("yyyy/MM/dd/ HH:mm:ss");
@Override
public String toString() {
return " date=" s.format(date) ;
}
隨便找一個地方呼叫user物件,打印出來,結果:
注意一個基本問題:格式設定時要和資料庫的格式一樣,比如:資料庫精確到秒,則java端也要精確到秒,否則資料丟失
LG