8. Mybatis typeHandlers標籤
MyBatis 在預處理語句(PreparedStatement)中設定一個引數時,還是從結果集中取出一個值時, 都會用 型別處理器將獲取的值以合適的方式轉換成 Java 型別。下表描述了一些預設的型別處理器(擷取部分):
你可以重寫型別處理器或建立你自己的型別處理器來處理不支援的或非標準的型別。
具體做法為:實現 org.apache.ibatis.type.TypeHandler 介面, 或繼承一個很便利的類 org.apache.ibatis.type.BaseTypeHandler,
然後可以選擇性地將它對映到一個JDBC型別。
例如需求:一個Java中的Date資料型別,我想將之存到資料庫的時候存成一 個1970年至今的毫秒數,取出來時轉換成java的Date,即java的Date與資料庫的varchar毫秒值之間轉換。
步驟分3步走:
① 定義轉換類繼承類BaseTypeHandler
② 覆蓋4個未實現的方法,其中setNonNullParameter為java程式設定資料到資料庫的回撥方法,getNullableResult 為查詢時 mysql的字串型別轉換成 java的Type型別的方法
③ 在MyBatis核心配置檔案中進行註冊
④ 測試轉換是否正確
我們就寫 寫繼承的吧:
1.首先在資料庫user中新增 birthday 欄位 然後設定為bigint型(毫秒 所以bigint) 、Bean加上欄位 birthday 是Date型別
【這裡省略 寫介面 和 寫 對映檔案,就是一個普通的加入使用者:】
2.我們繼承BaseTypeHandler類吧 泛型為你要轉換的型別:
package com.bihu.handler; import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Date;DateTypeHandler 【時間型別轉換器】public class DateTypeHandler extends BaseTypeHandler<Date> { //這個是java資料中的型別 到 資料庫中的資料型別 的回撥方法 @Override public void setNonNullParameter(PreparedStatement preparedStatement, int i, Date date, JdbcType jdbcType) throws SQLException { preparedStatement.setLong(i,date.getTime()); //i就是位置 ,然後設定一下Date轉換一下毫秒值 } //這個是資料庫中的型別 到 java資料型別 的回撥方法【下面三個都是】 /** * * @param resultSet 查詢出來的結果集 * @param s 要轉換的欄位名稱 */ @Override public Date getNullableResult(ResultSet resultSet, String s) throws SQLException { long aLong = resultSet.getLong(s);//按照欄位獲取到資料庫的Long【bigint】 return new Date(aLong); // Long轉Date返回 } //這個是資料庫中的型別 到 java資料型別 的回撥方法 @Override public Date getNullableResult(ResultSet resultSet, int i) throws SQLException { long aLong = resultSet.getLong(i); //按照index找 return new Date(aLong); // Long轉Date返回 } //這個是資料庫中的型別 到 java資料型別 的回撥方法 @Override public Date getNullableResult(CallableStatement callableStatement, int i) throws SQLException { long aLong = callableStatement.getLong(i); //按照index找 return new Date(aLong); // Long轉Date返回 } }
3.我們在核心配置檔案註冊一下即可:
然後我們測試:
package com.bihu.Service; import com.bihu.Bean.User; import com.bihu.Dao.UserMapper; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.InputStream; import java.util.Date; public class UserService { public static void main(String[] args) throws IOException { User bihu = new User(); bihu.setId(10086); bihu.setUsername("中國一動不動"); bihu.setPassword("1008611"); bihu.setBirthday(new Date()); InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml"); SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = build.openSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); mapper.addUser(bihu); sqlSession.commit(); //提交事務 sqlSession.close(); //關閉(回收)連線口 } }Service 測試
執行發現:
語句和引數都正確 發現date變了 一長串毫秒數。
返回查詢來也一樣 這裡給出結果 不給出過程 自己測:
本文來自部落格園,作者:Bi-Hu,轉載請註明原文連結:https://www.cnblogs.com/bi-hu/p/15162821.html