問題背景
假設有一張表
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