MyBatis借助BaseTypeHandler實現特殊的字段(數組或json)映射


問題背景

假設有一張表
CREATE TABLE `tb_event_info` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵', `event_no` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '事件編號', `event_title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '事件標題', `event_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '事件類型多個用\',\'隔開' PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 1298 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '事件信息' ROW_FORMAT = Dynamic;

對應的entity

@TableName("event_info") @Data public class EventInfo extends Model<EventInfo> { private static final long serialVersionUID = 1L; /** * 主鍵 */ @TableId(value = "id", type = IdType.AUTO) private Long id; /** * 事件編號 */ private String eventNo; /** * 事件標題 */ private String eventTitle; /** * 事件類型 */ private String[] eventType; }

event_type 存的是英文逗號隔開的字符串,如(11001,11002,11003), eventType 用String類型可以正常映射,如果我想用數組String[]來映射eventType,查出來的結果是[ 11001,11002,11003 ],這樣的數組,如何操作呢?

實現代碼

我們可以借助 org.apache.ibatis.type.BaseTypeHandler 這個類來實現,定義一個MyArrayTypeHandler類,繼承它。

 import org.apache.commons.lang3.StringUtils; import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; import org.apache.ibatis.type.TypeException; import java.sql.*; /** * @Author: java890.com * @Date: 2021/10/19 14:05 */ public class MyArrayTypeHandler extends BaseTypeHandler<String[]> { private static final String TYPE_NAME_VARCHAR = "varchar"; private static final String TYPE_NAME_INTEGER = "integer"; private static final String TYPE_NAME_BOOLEAN = "boolean"; private static final String TYPE_NAME_NUMERIC = "numeric"; @Override public void setNonNullParameter(PreparedStatement ps, int i, String[] parameter, JdbcType jdbcType) throws SQLException { String typeName = TYPE_NAME_VARCHAR; if (typeName == null) { throw new TypeException("ArrayTypeHandler parameter typeName error, your type is " + parameter.getClass().getName()); } // 這3行是關鍵的代碼,創建Array,然后ps.setArray(i, array)就可以了 Connection conn = ps.getConnection(); Array array = conn.createArrayOf(typeName, parameter); ps.setArray(i, array); } @Override public String[] getNullableResult(ResultSet rs, String columnName) throws SQLException { return getArray(rs.getString(columnName)); } @Override public String[] getNullableResult(ResultSet rs, int columnIndex) throws SQLException { return getArray(rs.getString(columnIndex)); } @Override public String[] getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { return getArray(cs.getString(columnIndex)); } /** * 該方法就是把在 mapper xml 里配置了typeHandler=MyArrayTypeHandler的字段, * 走我們這個自定義方法來實現字符串轉字符串數組 * 同理,我們可以把它轉成任何我們想轉的格式,如Json * @param value * @return */ private String[] getArray(String value) { if (StringUtils.isBlank(value)) { return null; } return value.split(","); } }

接下來就是EventInfoMapper.xml文件,只貼核心代碼

<resultMap id="eventMap" type="com.xxxxx.EventInfo"> <id column="id" property="id" /> <result column="event_no" property="eventNo" /> <result column="event_title" property="eventTitle" /> <!-- 這一行就是核心的地方,要加上我們自定義的typeHandler類 --> <result column="event_type" property="eventType" typeHandler="com.xxxxx.handler.MyArrayTypeHandler" /> </resultMap> <select id="pageSearch" resultMap="eventMap"> select * from event_info </select>

查詢結果

最后查出來就是我們想要的字符串數組結構

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM