经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Spring Boot » 查看文章
mybaties plus实体类设置typeHandler不生效的解决
来源:jb51  时间:2022/8/23 15:37:18  对本文有异议

实体类设置typeHandler不生效问题

实体类:

  1. @Data
  2. @TableName(value = "centre_manage_server_info")
  3. public class ServerEntity {
  4. @TableId(value = "id")
  5. //@Column(name = "id", isKey = true, isNull = false, comment = "id" )
  6. private String id;
  7. /**
  8. * 服务器ip
  9. */
  10. @TableField(value = "ip", insertStrategy = FieldStrategy.NOT_EMPTY)
  11. //@Column(name = "ip", isNull = false, comment = "服务器ip" )
  12. private String ip;
  13. /**
  14. * 服务器port
  15. */
  16. @TableField(value = "port", insertStrategy = FieldStrategy.NOT_NULL)
  17. //@Column(name = "port", isNull = false, comment = "服务器port" )
  18. private Integer port;
  19. /**
  20. * 服务器登录用户名
  21. */
  22. @TableField(value = "authentication_name", typeHandler = AesTypeHandler.class, insertStrategy = FieldStrategy.NOT_EMPTY)
  23. //@Column(name = "authentication_name", isNull = false, comment = "服务器登录用户名" )
  24. private String authenticationName;
  25. /**
  26. * 服务器登录密码
  27. */
  28. @TableField(value = "authentication_pwd", typeHandler = AesTypeHandler.class, insertStrategy = FieldStrategy.NOT_EMPTY)
  29. //@Column(name = "authentication_pwd", isNull = false, comment = "服务器登录密码" )
  30. private String authenticationPwd;
  31. }

结果插入时时有效的,但是i查询时会出现部分没有解密的问题。

解决

1.实体类注解TableName  补充  autoResultMap = true

  1. @TableName(value = "centre_manage_server_info", autoResultMap = true)

2.mapper.xml的resultMap也需要 

  1. <resultMap id="ServerEntity" type="com.zhong.core.centremanage.dbservice.server.entity.ServerEntity">
  2. ? ? ? ? <id column="id" property="id" />
  3. ? ? ? ? <result column="ip" property="ip" />
  4. ? ? ? ? <result column="port" property="port" />
  5. ? ? ? ? <result column="authentication_name" property="authenticationName" typeHandler="xxxx.AesTypeHandler"/>
  6. ? ? ? ? <result column="authentication_pwd" property="authenticationPwd" typeHandler="xxxx.AesTypeHandler"/>
  7. ? ? </resultMap>

mybaties中TypeHandler的使用 

在实际项目中,有一个物品表,其中有一个规格的字段,存入了JSON数组的字符串,但是后续在使用实体类的过程中,发现些不方便,到处要转 String 和 String[]很不方便。因此希望可以直接映射。

解决

发现网上有一个TypeHandler可以做到枚举和数据字段的相互对应,那么用来做数组和String的转化应该也是可以的。代码如下:

  1. @MappedTypes({String[].class})
  2. @MappedJdbcTypes({JdbcType.VARCHAR})
  3. public class StringArrayTypeHandler implements TypeHandler<String[]> {
  4. ? ? @Override
  5. ? ? public void setParameter(PreparedStatement ps, int i, String[] parameter, JdbcType jdbcType) throws SQLException {
  6. ? ? ? ? if (parameter == null)
  7. ? ? ? ? ? ? ps.setNull(i, Types.VARCHAR);
  8. ? ? ? ? else {
  9. ? ? ? ? ? ?JSONArray array = ?new JSONArray(Arrays.asList(parameter));
  10. ? ? ? ? ? ? ps.setString(i, array.toString());
  11. ? ? ? ? }
  12. ? ? }
  13. ? ? @Override
  14. ? ? public String[] getResult(ResultSet rs, String s) throws SQLException {
  15. ? ? ? ? String columnValue = rs.getString(s);
  16. ? ? ? ? return this.getStringArray(columnValue);
  17. ? ? }
  18. ? ? @Override
  19. ? ? public String[] getResult(ResultSet rs, int columnIndex) throws SQLException {
  20. ? ? ? ? String columnValue = rs.getString(columnIndex);
  21. ? ? ? ? return this.getStringArray(columnValue);
  22. ? ? }
  23. ? ? @Override
  24. ? ? public String[] getResult(CallableStatement cs, int i) throws SQLException {
  25. ? ? ? ? String columnValue = cs.getString(i);
  26. ? ? ? ? return this.getStringArray(columnValue);
  27. ? ? }
  28. ? ? private String[] getStringArray(String columnValue) {
  29. ? ? ? ? if (columnValue == null)
  30. ? ? ? ? ? ? return null;
  31. ? ? ? ? JSONArray jsonArr = JSONArray.parseArray(columnValue);
  32. ? ? ? ? return ?jsonArr.toArray(new String[jsonArr.size()]);
  33. ? ? }

由于在项目中使用了mybatisplus,所以使用如下:

  1. ?/**
  2. ? ? ?* 商品货品的规格列表
  3. ? ? ?*/
  4. ? ? @TableField(value = "specifications",el = "specifications,typeHandler=com.seven.wechatshop.shopapi.typehandle.StringArrayTypeHandler")
  5. ? ? private String[] specifications;

但是上面的代码,并没有生效。后来阅读文档,发现是缺少了一个配置。如下

  1. //注意使用了plus的是添加下面这个
  2. mybatis-plus.type-handlers-package = com.seven.wechatshop.shopapi.typehandle

如果只是mybatis,那么添加的配置为

  1. mybatis.type-handlers-package=com.seven.wechatshop.shopapi.typehandle

由于也是第一次使用mybatis-plus,有很多不熟悉的地方,但是渐渐熟悉以后,确实方便了很多,加快了开发的节奏和步伐。下面附上,一些条件参数说明

以上为个人经验,希望能给大家一个参考,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号