mybaties plus实体类设置typeHandler不生效的解决

 更新时间:2022年08月23日 14:15:28   作者:飘零未归人  
这篇文章主要介绍了mybaties plus实体类设置typeHandler不生效的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

实体类设置typeHandler不生效问题

实体类:

@Data
@TableName(value = "centre_manage_server_info")
public class ServerEntity {
 
    @TableId(value = "id")
    //@Column(name = "id", isKey = true, isNull = false, comment = "id" )
    private String id;
 
    /**
     * 服务器ip
     */
    @TableField(value = "ip", insertStrategy = FieldStrategy.NOT_EMPTY)
    //@Column(name = "ip", isNull = false, comment = "服务器ip" )
    private String ip;
    /**
     * 服务器port
     */
    @TableField(value = "port",  insertStrategy = FieldStrategy.NOT_NULL)
    //@Column(name = "port", isNull = false, comment = "服务器port" )
    private Integer port;
    /**
     * 服务器登录用户名
     */
    @TableField(value = "authentication_name", typeHandler = AesTypeHandler.class, insertStrategy = FieldStrategy.NOT_EMPTY)
    //@Column(name = "authentication_name", isNull = false, comment = "服务器登录用户名" )
    private String authenticationName;
    /**
     * 服务器登录密码
     */
    @TableField(value = "authentication_pwd", typeHandler = AesTypeHandler.class, insertStrategy = FieldStrategy.NOT_EMPTY)
    //@Column(name = "authentication_pwd", isNull = false, comment = "服务器登录密码" )
    private String authenticationPwd;
 
}

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

解决

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

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

2.mapper.xml的resultMap也需要 

<resultMap id="ServerEntity" type="com.zhong.core.centremanage.dbservice.server.entity.ServerEntity">
        <id column="id" property="id" />
        <result column="ip" property="ip" />
        <result column="port" property="port" />
        <result column="authentication_name" property="authenticationName" typeHandler="xxxx.AesTypeHandler"/>
        <result column="authentication_pwd" property="authenticationPwd" typeHandler="xxxx.AesTypeHandler"/>
    </resultMap>

mybaties中TypeHandler的使用 

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

解决

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

@MappedTypes({String[].class})
@MappedJdbcTypes({JdbcType.VARCHAR})
public class StringArrayTypeHandler implements TypeHandler<String[]> {
    @Override
    public void setParameter(PreparedStatement ps, int i, String[] parameter, JdbcType jdbcType) throws SQLException {
        if (parameter == null)
            ps.setNull(i, Types.VARCHAR);
        else {
           JSONArray array =  new JSONArray(Arrays.asList(parameter));
            ps.setString(i, array.toString());
        }
    }
    @Override
    public String[] getResult(ResultSet rs, String s) throws SQLException {
        String columnValue = rs.getString(s);
        return this.getStringArray(columnValue);
    }
    @Override
    public String[] getResult(ResultSet rs, int columnIndex) throws SQLException {
        String columnValue = rs.getString(columnIndex);
        return this.getStringArray(columnValue);
    }
    @Override
    public String[] getResult(CallableStatement cs, int i) throws SQLException {
        String columnValue = cs.getString(i);
        return this.getStringArray(columnValue);
    }
    private String[] getStringArray(String columnValue) {
        if (columnValue == null)
            return null;
        JSONArray jsonArr = JSONArray.parseArray(columnValue);
        return  jsonArr.toArray(new String[jsonArr.size()]);
    }

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

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

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

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

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

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

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

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

相关文章

  • Spring Boot 3 整合 Spring Cloud Gateway实践过程

    Spring Boot 3 整合 Spring Cloud 

    本文介绍了如何使用SpringCloudAlibaba2023.0.0.0版本构建一个微服务网关,包括统一路由、限流防刷和登录鉴权等功能,并通过一个项目实例进行详细说明,感兴趣的朋友一起看看吧
    2025-02-02
  • SpringCloud Ribbon负载均衡工具使用

    SpringCloud Ribbon负载均衡工具使用

    Ribbon是Netflix的组件之一,负责注册中心的负载均衡,有助于控制HTTP和TCP客户端行为。Spring Cloud Netflix Ribbon一般配合Ribbon进行使用,利用在Eureka中读取的服务信息,在调用服务节点时合理进行负载
    2023-02-02
  • 完美解决Spring声明式事务不回滚的问题

    完美解决Spring声明式事务不回滚的问题

    下面小编就为大家带来一篇完美解决Spring声明式事务不回滚的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Springboot 上传文件或头像(MultipartFile、transferTo)

    Springboot 上传文件或头像(MultipartFile、transferTo)

    本文主要介绍了Springboot 上传文件或头像(MultipartFile、transferTo),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • 如何解决EasyExcel导出文件LocalDateTime报错问题

    如何解决EasyExcel导出文件LocalDateTime报错问题

    这篇文章主要介绍了如何解决EasyExcel导出文件LocalDateTime报错问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • java中Class.getMethods()和Class.getDeclaredMethods()方法的区别

    java中Class.getMethods()和Class.getDeclaredMethods()方法的区别

    这篇文章主要介绍了java中Class.getMethods()和Class.getDeclaredMethods()方法的区别 ,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-09-09
  • Java 动态加载jar和class文件实例解析

    Java 动态加载jar和class文件实例解析

    这篇文章主要介绍了Java 动态加载jar和class文件实例解析,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • springboot中使用groovy的示例代码

    springboot中使用groovy的示例代码

    Groovy就是一种继承了动态语言的优良特性并运行在JVM上的编程语言,Groovy支持动态输入,闭包,元编程,运算符重载等等语法,这篇文章主要介绍了springboot中使用groovy的相关知识,需要的朋友可以参考下
    2022-09-09
  • Spring中Bean注入源码示例解析

    Spring中Bean注入源码示例解析

    这篇文章主要为大家介绍了Spring中Bean注入源码示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • 浅谈Spring Boot中如何干掉if else的方法

    浅谈Spring Boot中如何干掉if else的方法

    这篇文章主要介绍了Spring Boot中如何干掉if else的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09

最新评论