mybatis通過TypeHandler?list轉(zhuǎn)換string類型轉(zhuǎn)換方式
mybatis通過TypeHandler list轉(zhuǎn)換string類型轉(zhuǎn)換
問題描述
因?yàn)樾枰嫒雔ist數(shù)據(jù)類型所以mybatis端需要TypeHandler進(jìn)行類型轉(zhuǎn)換
代碼
1.轉(zhuǎn)換工具類
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.springframework.stereotype.Component;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
/**
* @ClassName ListToStringHandler
* @Description mybatis list轉(zhuǎn)換為String 相互轉(zhuǎn)換工具類
* @Author ygt
* @Date 2021/3/3 14:49
* @Version V1.0
*/
@Component
public class ListToStringHandler extends BaseTypeHandler<List> {
@Override
public void setNonNullParameter(PreparedStatement preparedStatement, int i, List list, JdbcType jdbcType) throws SQLException {
preparedStatement.setString(i, JSON.toJSONString(list));
}
@Override
public List getNullableResult(ResultSet resultSet, String s) throws SQLException {
JSONArray jsonArray = JSONArray.parseArray( resultSet.getString(s));
return jsonArray;
}
@Override
public List getNullableResult(ResultSet resultSet, int i) throws SQLException {
JSONArray jsonArray = JSONArray.parseArray( resultSet.getString(i));
return jsonArray;
}
@Override
public List getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
JSONArray jsonArray = JSONArray.parseArray( callableStatement.getString(i));
return jsonArray;
}
}2.sql xml 部分代碼
需要注意 有的地方需要加雙引號有的地方不需要加雙引號否則有可能會出現(xiàn)類似如下報(bào)錯 其實(shí)是雙引號多了
mybatis: No enum constant org.apache.ibatis.type.JdbcType.“VARCHAR”
<resultMap id="BaseResultMap" type="xxxx.GameMatch">
<id column="id" jdbcType="INTEGER" property="id" />
<result column="game_id" jdbcType="INTEGER" property="gameId" />
<result column="positions" jdbcType="VARCHAR" property="positions" typeHandler="xxx.util.ListToStringHandler" />
<result column="sub_channels" jdbcType="VARCHAR" property="subChannels" typeHandler="xxx.util.ListToStringHandler" />
</resultMap>
<delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
delete from game_match
where id = #{id,jdbcType=INTEGER}
</delete>
<insert id="insert" parameterType="xxx.model.GameMatch">
insert into game_match (id, game_id, positions,
sub_channels)
values (#{id,jdbcType=INTEGER}, #{gameId,jdbcType=INTEGER}, #{positions, jdbcType=VARCHAR ,typeHandler=xxx.util.ListToStringHandler},
#{subChannels,jdbcType=VARCHAR})
</insert>
<update id="updateByPrimaryKey" parameterType="xxx.model.GameMatch">
update game_match
set game_id = #{gameId,jdbcType=INTEGER},
positions = #{positions, jdbcType=VARCHAR ,typeHandler=xxx.util.ListToStringHandler},
sub_channels = #{subChannels, jdbcType=VARCHAR ,typeHandler=xxx.util.ListToStringHandler}
where id = #{id,jdbcType=INTEGER}
</update>mybatis轉(zhuǎn)換器TypeHandler
寫一個自己的TypeHandler 實(shí)現(xiàn)TypeHandler接口。。泛型是你要轉(zhuǎn)換的類型
@MappedJdbcTypes(JdbcType.VARCHAR) //映射的jdbctype類型
@MappedTypes(List.class) // 要轉(zhuǎn)換的數(shù)據(jù)類型
public class List2StringTypeHandler implements TypeHandler<List<String>> {
// 實(shí)現(xiàn)TypeHandler<要轉(zhuǎn)換的java數(shù)據(jù)類型
/**
* 將字段處理到數(shù)據(jù)庫中
* @param ps prestatement
* @param i prestatement 設(shè)置參數(shù) 對應(yīng)的索引
* @param parameter 要轉(zhuǎn)換的數(shù)據(jù)。。 這個類型和泛型類型一致
* @param jdbcType
* @throws SQLException
*/
@Override
public void setParameter(PreparedStatement ps, int i, List<String> parameter, JdbcType jdbcType) throws SQLException {
// 手動將 list 處理為 string
StringBuilder sb = new StringBuilder();
for (String s : parameter) {
sb.append(s).append(".");
}
ps.setString(i,sb.toString());
}
/**
* 將resultSet 轉(zhuǎn)換為 對象對應(yīng)的字段類型
* @param rs
* @param columnName
* @return
* @throws SQLException
*/
@Override
public List<String> getResult(ResultSet rs, String columnName) throws SQLException {
// 將字符串 轉(zhuǎn)換為 list
String s = rs.getString(columnName);
String[] arr = s.split(",");
return Arrays.asList(arr);
}
@Override
public List<String> getResult(ResultSet rs, int columnIndex) throws SQLException {
return null;
}
// 存儲過程用到
@Override
public List<String> getResult(CallableStatement cs, int columnIndex) throws SQLException {
return null;
}
}將這個TypeHandler注入到mybatis配置文件中,讓mybatis知道這個TypeHandler
<configuration>
<properties resource="db.properties"></properties>
<!-- 注冊typeHandler-->
<typeHandlers>
<package name="com.cj.typehandler"/>
</typeHandlers>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${db.driver}"/>
<property name="url" value="jdbc:mysql:///test01?serverTimezone=Asia/Shanghai"/>
<property name="username" value="root"/>
<property name="password" value="${db.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- 用斜杠-->
<!-- <mapper resource="com/cj/mapper/UserMapper.xml"/>-->
<mapper resource="com/cj/UserMapper.xml"/>
<!-- <package name="com.cj"/>-->
<mapper resource="com/cj/TypeHandlerTransfer.xml" />
</mappers>
</configuration>在寫mapper映射文件的時候,要指定這個字段使用的是什么類型轉(zhuǎn)換器。。在讀取的時候指定,,在寫入的時候也要指定(全限定類名)
讀取的時候指定
<resultMap id="TypeHandlerMap" ?type="com.cj.TypeHandlerModel"> ? ? ? ?<id property="id" column="id"/> ? ? ? ?<result property="hobby" column="hobby" ?typeHandler="com.cj.typehandler.List2StringTypeHandler"/> ? ?</resultMap> ? ?<select ?id="getEntity" ?resultMap="TypeHandlerMap"> ? ? ? ?select * from typehandler ? ?</select>
寫入的時候指定
?<insert id="insertEntity" >
? ? ? ?insert into typeHandler (hobby) values (#{hobby,typeHandler=com.cj.typehandler.List2StringTypeHandler})
? ? </insert>springboot可以指定typeHandler位置:
# 設(shè)置typehandler包位置 mybatis.type-handlers-package=com.cj.typeHandler
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java面試題沖刺第二十六天--實(shí)戰(zhàn)編程
這篇文章主要為大家分享了最有價值的三道java實(shí)戰(zhàn)面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目、經(jīng)典面試編程題等,感興趣的小伙伴們可以參考一下2021-08-08
Java Web 實(shí)現(xiàn)QQ登錄功能一個帳號同一時間只能一個人登錄
對于一個帳號在同一時間只能一個人登錄,下文給大家介紹的非常詳細(xì),對java web qq 登錄功能感興趣的朋友一起看看吧2016-11-11
Spring?Boot中自動執(zhí)行sql腳本的方法實(shí)例
在SpringBoot的架構(gòu)中,DataSourceInitializer類可以在項(xiàng)目啟動后初始化數(shù)據(jù),我們可以通過自動執(zhí)行自定義sql腳本初始化數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于Spring?Boot中自動執(zhí)行sql腳本的相關(guān)資料,需要的朋友可以參考下2022-01-01
Java獲取調(diào)用當(dāng)前方法的類名或方法名(棧堆信息)的四種方式舉例
在Java編程中我們經(jīng)常需要在運(yùn)行時獲取當(dāng)前執(zhí)行的方法名稱,這在日志記錄、性能監(jiān)控、調(diào)試等方面非常有用,這篇文章主要給大家介紹了關(guān)于Java獲取調(diào)用當(dāng)前方法的類名或方法名(棧堆信息)的四種方式,需要的朋友可以參考下2024-09-09
Java設(shè)計(jì)模式之中介者模式的實(shí)現(xiàn)方式
Java中介者模式是一種行為型設(shè)計(jì)模式,它通過一個中介者對象來協(xié)調(diào)多個對象之間的交互,降低對象之間的耦合度,提高系統(tǒng)的可維護(hù)性和可擴(kuò)展性。本文將介紹該設(shè)計(jì)模式的原理、使用場景和實(shí)現(xiàn)方法2023-04-04
Mybatis RowBounds 限制查詢條數(shù)的實(shí)現(xiàn)代碼
Oracle 數(shù)據(jù)庫查詢增加RowBounds限制查詢條數(shù),默認(rèn)是0到1000條。下面給大家分享Mybatis RowBounds 限制查詢條數(shù)的實(shí)現(xiàn)代碼,需要的朋友參考下吧2016-11-11
java 中動態(tài)代理機(jī)制的實(shí)例講解
這篇文章主要介紹了java 中動態(tài)代理機(jī)制的實(shí)例講解的相關(guān)資料,希望通過本文大家能夠理解掌握動態(tài)代理機(jī)制,需要的朋友可以參考下2017-09-09

