今天在專案中遇到一個需要從資料中讀取一段字元然後轉化成list型別。由於忘記了TypeHandler
的存在,就定義了一個物件,內部新增了一個String
和List
型別的成員變數,處理起來比較麻煩。突然想到TypeHandler
不就是處理這種情景的嗎?!!
概述
TypeHandler
是Mybatis中用來將Java資料型別中和資料庫型別進行相互轉化的,mybatis中已經幫我們封裝了大量的型別處理器,夠工作中使用了。以下為mybatis中預設的的型別處理器。含有處理日期型別的DateTypeHandler
,處理字元創型別的StringTypeHandler
等。如下:
程式碼清單
自定義typeHandler有兩種實現方式:
- 實現TypeHandler介面
- 繼承BaseTypeHandler類
實現TypeHandler介面
package com.sxt.typehandler;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.type.*;
import java.sql.*;
import java.util.Arrays;
import java.util.List;
@MappedTypes({List.class})
@MappedJdbcTypes(JdbcType.VARCHAR)
public class MyTypeHandler implements TypeHandler<List<String>> {
@Override
public void setParameter(PreparedStatement ps, int i, List<String> strings, JdbcType jdbcType) throws SQLException {
String s = StringUtils.join(strings, ",");
ps.setString(i,s);
}
@Override
public List<String> getResult(ResultSet resultSet, String s) throws SQLException {
return Arrays.asList(resultSet.getString(s).split(","));
}
@Override
public List<String> getResult(ResultSet resultSet, int i) throws SQLException {
String s = resultSet.getString(i);
return Arrays.asList(s.split(","));
}
@Override
public List<String> getResult(CallableStatement callableStatement, int i) throws SQLException {
String s = callableStatement.getString(i);
return Arrays.asList(s.split(","));
}
}
複製程式碼
註冊TypeHandler
- 方式一:逐個註冊
<typeHandlers>
<typeHandler handler="com.fcl.MyTypeHandler"/>
</typeHandlers>
複製程式碼
- 方式二:掃描包
<typeHandlers>
<package name="com.fcl"/>
</typeHandlers>
複製程式碼
返回結果指定TypeHandler
<resultMap id="query1" type="person">
<id property="id" column="id"/>
<result property="hobbys" column="hobbys" typeHandler="com.fcl.MyTypeHandler"/>
</resultMap>
複製程式碼