背景:订单快照信息(收货地址、商品信息、优惠券信息等)存储,使用Mysql的json类型字段存放一个java对象的json,但是mybatis不支持json类型,所以通过扩展typeHandler来实现mysql的json字段与java对象的自动转换,以下为通用typeHandler源码,可以用来自动转换java类型。
直接上源码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; import org.apache.ibatis.type.MappedJdbcTypes; import org.apache.ibatis.type.MappedTypes; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.shikuai.domain.json.CommodityJson; import com.shikuai.domain.json.CouponJson; import com.shikuai.domain.json.CustomerAddressJson; /** * <b>Description:用以mysql中json格式的字段,进行转换的自定义转换器,转换为实体类的T类型 属性</b> * <br><b>ClassName:</b> GenericTypeHandler * <br><b>Date:</b> 2019年2月17日 下午4:25:07 * <br>@author <b>jianb.jiang</b> */ @MappedTypes(value = {JSONObject.class, CustomerAddressJson.class, CouponJson.class, CommodityJson.class}) @MappedJdbcTypes(value = {JdbcType.VARCHAR}, includeNullJdbcType = true) public class GenericTypeHandler<T extends Object> extends BaseTypeHandler<T> { private Class<T> clazz; public GenericTypeHandler(Class<T> clazz) { if (clazz == null) throw new IllegalArgumentException("Type argument cannot be null"); this.clazz = clazz; } /** * 设置非空参数 * @param ps * @param i * @param parameter * @param jdbcType * @throws SQLException */ @Override public void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException { ps.setString(i, JSON.toJSONString(parameter)); } /** * 根据列名,获取可以为空的结果 * @param rs * @param columnName * @return * @throws SQLException */ @Override public T getNullableResult(ResultSet rs, String columnName) throws SQLException { String sqlJson = rs.getString(columnName); if (null != sqlJson) { return JSONObject.parseObject(sqlJson, clazz); } return null; } /** * 根据列索引,获取可以为空的结果 * @param rs * @param columnIndex * @return * @throws SQLException */ @Override public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException { String sqlJson = rs.getString(columnIndex); if (null != sqlJson) { return JSONObject.parseObject(sqlJson, clazz); } return null; } @Override public T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { String sqlJson = cs.getString(columnIndex); if (null != sqlJson) { return JSONObject.parseObject(sqlJson, clazz); } return null; } }
注意:
1、@MappedTypes注解中的类代表此转换器可以自动转换为的java对象,@MappedJdbcTypes注解中设置的是对应的jdbctype,mysql的json对象对应的jdbctype为VARCHAR。
2、spring boot配置中开启typeHandler包路径的自动扫描配置:
mybatis.type-handlers-package=com.shikuai.dao.handler
3、使用上,只需在pojo的属性中定义需要自动转换的java对象属性,如@MappedTypes注解中的CustomerAddressJson,在订单的pojo中有一个属性:
1
2
3
4
5/** * 收货地址快照json */ private CustomerAddressJson reAddressJson;
操作和其他pojo的属性完全一样,如果像对json对象中的某个属性进行操作,可以使用mysql支持的json相关函数,具体可以参考这篇文章:https://www.cnblogs.com/ooo0/p/9309277.html
遗留和扩展:如果pojo对象有一个集合属性呢?这种如何处理?是否可以自定义一个ArrayTypeHandler?pojo中存在集合属性是否本身就不合理是个伪需求?对于集合属性的情况,有一篇文章可以参考:https://www.cnblogs.com/kylindai/p/3563818.html
参考文档:http://www.mybatis.org/mybatis-3/zh/configuration.html#typeHandlers
最后
以上就是长情小丸子最近收集整理的关于mybatis通用typeHandler(将mysql的json类型转换为java对象)的全部内容,更多相关mybatis通用typeHandler(将mysql内容请搜索靠谱客的其他文章。
发表评论 取消回复