Mybatis 中使用中java数据类型转换成string或json
在实际应用场景中我们经常会用到@onetoone @onetomany 这样的表关联 ,在mysql引入json类型后, 会发现有些关联表并不需要单独存储为一张表,这时可以直接存储到主表中的一个json字段
这里举例实际用到的List<Object>转 mysql中的json
配置typehandler的方法
- 在xml中配置(省略..)
- 在java bean中的字段配置
@TableField(typeHandler = ListTypeHandler.class) private List<User> parameters;
- 在配置文件中全局配置
mybatis:
type-handlers-package: com.xx.handlers
// 这里是 plus
mybatis-plus:
type-handlers-package: com.xx.mybatis.handlers
// handlers 是包
写自定义的handlertype
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
public class ListTypeHandler extends BaseTypeHandler<List<Object>> {
@Override
public void setNonNullParameter(PreparedStatement preparedStatement, int i, List<Object> objects, JdbcType jdbcType) throws SQLException {
ObjectMapper mapper = new ObjectMapper();
try {
preparedStatement.setString(i,mapper.writeValueAsString(objects));
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
@Override
public List<Object> getNullableResult(ResultSet resultSet, String s) throws SQLException {
ObjectMapper mapper = new ObjectMapper();
try {
return mapper.readValue(resultSet.getString(s),List.class);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return null;
}
@Override
public List<Object> getNullableResult(ResultSet resultSet, int i) throws SQLException {
return null;
}
@Override
public List<Object> getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
return null;
}
}
- 注意 如果是用的@TableField 需要开启bean的映射 否则查询回来的数据是null
@TableName(autoResultMap = true)
public class User {