mybatis通過TypeHandler?list轉(zhuǎn)換string類型轉(zhuǎn)換方式
mybatis通過TypeHandler list轉(zhuǎn)換string類型轉(zhuǎn)換
問題描述
因為需要存入list數(shù)據(jù)類型所以mybatis端需要TypeHandler進行類型轉(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)類似如下報錯 其實是雙引號多了
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 實現(xiàn)TypeHandler接口。。泛型是你要轉(zhuǎn)換的類型
@MappedJdbcTypes(JdbcType.VARCHAR) //映射的jdbctype類型 @MappedTypes(List.class) // 要轉(zhuǎn)換的數(shù)據(jù)類型 public class List2StringTypeHandler implements TypeHandler<List<String>> { // 實現(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)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java Web 實現(xiàn)QQ登錄功能一個帳號同一時間只能一個人登錄
對于一個帳號在同一時間只能一個人登錄,下文給大家介紹的非常詳細,對java web qq 登錄功能感興趣的朋友一起看看吧2016-11-11Spring?Boot中自動執(zhí)行sql腳本的方法實例
在SpringBoot的架構(gòu)中,DataSourceInitializer類可以在項目啟動后初始化數(shù)據(jù),我們可以通過自動執(zhí)行自定義sql腳本初始化數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于Spring?Boot中自動執(zhí)行sql腳本的相關(guān)資料,需要的朋友可以參考下2022-01-01Java獲取調(diào)用當前方法的類名或方法名(棧堆信息)的四種方式舉例
在Java編程中我們經(jīng)常需要在運行時獲取當前執(zhí)行的方法名稱,這在日志記錄、性能監(jiān)控、調(diào)試等方面非常有用,這篇文章主要給大家介紹了關(guān)于Java獲取調(diào)用當前方法的類名或方法名(棧堆信息)的四種方式,需要的朋友可以參考下2024-09-09Java設(shè)計模式之中介者模式的實現(xiàn)方式
Java中介者模式是一種行為型設(shè)計模式,它通過一個中介者對象來協(xié)調(diào)多個對象之間的交互,降低對象之間的耦合度,提高系統(tǒng)的可維護性和可擴展性。本文將介紹該設(shè)計模式的原理、使用場景和實現(xiàn)方法2023-04-04Mybatis RowBounds 限制查詢條數(shù)的實現(xiàn)代碼
Oracle 數(shù)據(jù)庫查詢增加RowBounds限制查詢條數(shù),默認是0到1000條。下面給大家分享Mybatis RowBounds 限制查詢條數(shù)的實現(xiàn)代碼,需要的朋友參考下吧2016-11-11