Mybatis之TypeHandler使用教程
引言
MyBatis 是一款優秀的持久層框架,它支持定制化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 可以使用簡單的 XML 或注解來配置和映射原生信息,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記錄。
1、typeHandles的基礎知識
TypeHandler 在 MyBatis 中是一個用于處理 Java 類型和數據庫類型之間映射轉換的接口。簡而言之,它負責:
-
Java到數據庫的映射:在執行 SQL 語句時,TypeHandler 將 Java 類型轉換為數據庫可以理解的類型。
-
數據庫到Java的映射:在讀取數據庫結果時,TypeHandler 將數據庫類型轉換回 Java 類型。
2、場景復現
首先建立了一個t_user表存儲用戶信息,這個表中有一欄favorites是記錄個人愛好的,愛好包括籃球、足球、排球:
在Java的User對象對應的是一個String類型的List,而在數據庫中是用分號分隔的字符表示,比如:"basketball;football;volleyball",
所以我們需要創建一個繼承了BaseTypeHandler
@MappedTypes定義需要被攔截的java類型 @MappedJdbcTypes配置jdbc類型,這里的JdbcType必須org.apache.ibatis.type.JdbcType中的枚舉類型,
然后還需要實現BaseTypeHandler
@MappedJdbcTypes(JdbcType.VARCHAR)
@MappedTypes(List.class)
public class ListVarcharTypeHandler extends BaseTypeHandler<List<String>> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, List<String> list, JdbcType jdbcType) throws SQLException {
System.out.println("setNonNullParameter ...... "); //a,b,c,d
//處理數據 將List轉換為特定格式的字符串
StringBuffer sb = new StringBuffer();
String msg = null;
if(list != null){
for(String p : list){
sb.append(p).append(";");
}
msg = sb.toString();
msg = msg.substring(0,msg.length()-1);
}
ps.setString(i,msg);
}
/**
* 獲取非空的結果集
* @param rs
* @param columnName
* @return
* @throws SQLException
*/
@Override
public List<String> getNullableResult(ResultSet rs, String columnName) throws SQLException {
System.out.println(111);
System.out.println( Arrays.asList(rs.getString(columnName).split(";")));
return Arrays.asList(rs.getString(columnName).split(";"));
}
@Override
public List<String> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
System.out.println(222);
return Arrays.asList(rs.getString(columnIndex).split(";"));
}
@Override
public List<String> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
System.out.println(333);
return Arrays.asList(cs.getString(columnIndex).split(";"));
}
}
創建完類后,我們還需要配置xml文件,一個是映射文件,一個mybatis配置文件:
...
<!-- 使用將集合轉化為對應的數據類型的注解 -->
<typeHandlers>
<typeHandler handler="com.doing.typehandle.ListVarcharTypeHandler" />
</typeHandlers>
...
...
<!-- 對指定的結果進行類型轉換 -->
<resultMap id="userMap" type="com.doing.pojo.User">
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="address" column="address"/>
<result property="gender" column="gender"/>
<result property="favorites" column="favorites" typeHandler="com.doing.typehandle.ListVarcharTypeHandler"/>
</resultMap>
<!-- 添加用戶信息 -->
<insert id="addUser" parameterType="com.doing.pojo.User" >
insert into t_user (id,username,address,gender,favorites)values(#{id},#{username},#{address},#{gender},#{favorites,typeHandler=com.doing.typehandle.ListVarcharTypeHandler})
</insert>
<!-- 查詢所有用戶信息 -->
<select id="queryAll" resultMap="userMap">
select * from t_user
</select>
<!-- 根據用戶編號查詢用戶信息 -->
<select id="queryById" parameterType="java.lang.Integer"
resultMap="userMap">
select * from t_user where id = #{id};
</select>
...
在配置完成之后,點擊運行:
3、總結
TypeHandler是一個用于處理 Java 類型和數據庫類型之間映射轉換的接口,BaseTypeHandler
使用BaseTypeHandler
總結
以上是生活随笔為你收集整理的Mybatis之TypeHandler使用教程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 通过 KernelUtil.dll 劫持
- 下一篇: Java日期时间处理详解