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 {