1. 程式人生 > >ssm中mybatis處理資料庫(mysql)與pojo屬性中型別不一致(string轉date)

ssm中mybatis處理資料庫(mysql)與pojo屬性中型別不一致(string轉date)

        一般在表設計的時候會考慮到資料庫欄位型別和java中屬性一致的問題,但是也有可能會出現一些情況導致型別不一致的問題,比如:二次開發中需求更改等。此時資料庫和java中的程式碼不能隨便更改,所以考慮的思路是通過typeHandler作為中間體來把型別轉換。

        當然,如果可以直接在獲取欄位後,直接通過simpleFormart來轉換後,來處理資料就可以了。

        此方法是在獲取不了欄位的情況下進行的。

資料庫中型別:varchar

java的pojo屬性:Date


實現型別轉換功能其實就是三步:

一.定義一個轉換工具類進行自己需要型別的轉換(比如在工具包中新建一個TypeHandlerToString類,繼承 BaseTypeHandler<Date>或者

實現 TypeHandler 介面)
二.註冊剛定義的轉換工具類,使它可以起作用
三.在UserMapper.xml檔案中給出要用哪個TypeHandler


第一:新增一個工具類來定義轉換的型別

a.在工具類包中定義一個工具類,如:TypeHandlerToString  繼承 BaseTypeHandler<Date>,泛型選擇要java的pojo需要的型別:Date

b.重寫相應的四個方法(一個set,三個get---get方法只是引數不一樣)

一個set方法

	@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));
		
	}
三個get方法
	@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,

一句話,註冊時添加了什麼,就要在使用時指定什麼,這樣mybatis才能匹配上

或者是用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