问题是这样的,mysql 5.7后支持json 字段 ,我有一张学生表,举例如下
字段名 | 字段类型 | 描述 |
---|---|---|
name | varchar | 姓名 |
status | json | 状态 如 正常、异常 |
对应的实体类如下
string name;
@ColumnType(column = "undertake_sc_uids",typeHandler=ListTypeHandler.class
List<string> status;
为了将数据插入db,我定义了一个typehandler
public class ListTypeHandler extends BaseTypeHandler<List<String>> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, List<String> parameter, JdbcType jdbcType) throws SQLException {
if (CollectionUtil.isNotEmpty(parameter)){
ps.setString(i,JSON.toJSONString(parameter));
}
}
@Override
public List<String> getNullableResult(ResultSet rs, String columnName) throws SQLException {
String value = rs.getString(columnName);
List<String> list=new ArrayList<>();
if (StringUtils.isNotBlank(value)){
list=JSON.parseArray(value,String.class);
}
return list;
}
@Override
public List<String> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
String value = rs.getString(columnIndex);
List<String> list=new ArrayList<>();
if (StringUtils.isNotBlank(value)){
list=JSON.parseArray(value,String.class);
}
return list;
}
@Override
public List<String> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
String value = cs.getString(columnIndex);
List<String> list=new ArrayList<>();
if (StringUtils.isNotBlank(value)){
list=JSON.parseArray(value,String.class);
}
return list;
}
}
然后通过tkmybatis插入数据库时发现,他把我status字段忽略掉了
将@ColumnType(column = "undertake_sc_uids",typeHandler=ListTypeHandler.class)拆分为
@ColumnType(typeHandler=ListTypeHandler.class)
@Column(name = "undertake_sc_uids") 试试,
如果不行同时在xml文件中仿照下图添加你自定义的转换器试试,注意观察控制台有没有报错,并在ListTypeHandler 中的setNonNullParameter方法中打断点debug模式测试,观察下sql语句及传值情况
如果你在全局配置了typehandler,xml文件中也配置了typehandler,发现还是无效,可以试一试下面这个解决方法。(个人感觉是tkmapper的问题,只使用mybatis就没有这个问题)
请在字段上添加@ColumnType注解。例如:
typeHandlersPackage配置了没
自己debug走了下,他这个只有通用mapper的基类方法才起作用,对于自己写的sql,需要自己去指定type Handler
@ColumnType(jdbcType= JdbcType.ARRAY,typeHandler=ListTypeHandler.class
@Column(name="undertake_sc_uids")
List<string> status;