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

目录
  • 实体类设置typeHandler不生效问题
    • 解决
  • mybaties中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,有很多不熟悉的地方,但是渐渐熟悉以后,确实方便了很多,加快了开发的节奏和步伐。下面附上,一些条件参数说明

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

(0)

相关推荐

  • MyBatis-Plus如何通过注解使用TypeHandler

    目录 通过注解使用TypeHandler 官方示例 Kotlin案例 自定义TypeHandler使用 通过注解使用TypeHandler 在使用MyBatis时,我们与数据表中字段映射的java中的bean的属性字段,往往包含了自定义复杂类型,比如一个varchar保存的json字符串映射到的java字段是Person类型的时候,就需要用到 “字段类型处理器了”,也就是TypeHandler. 使用MyBatis的TypeHandler的时候,自定义实现起来还是比较麻烦,需要统一配置,自动识别

  • Mybatis自定义TypeHandler解决特殊类型转换问题详解

    我们知道,Java和MySQL中的数据类型是不同的,Java中除了基本数据类型,还有对象. 有时候使用MySQL存储数据,或者从MySQL中读取数据时,会有一些特殊需求 weary ,比如: 将Integer数组直接存入MySQL,保存为BLOB形式,读取出来时又是正常的Integer数组 将Integer数组转换为String,然后存入MySQL,使用varchar类型,读取出来时又是正常的Integer数组 这也太难了叭! 解决办法有两种: Basic Method:Java在存入数据之前,

  • mybatis plus框架@TableField注解不生效问题及解决方案

    目录 一.问题描述 二.解决方案 三.关于@TableField注解失效原因的思考 四.Mapper接口LambdaQuery方法调用过程梳理 1.Mapper接口调用实际上使用的是动态代理技术 2.mybatisplus对查询的单独处理 3.findOne实际上还是要查询List 4.mybatis接口上下文信息MappedStatement 5.mybatisplus别名自动设置的逻辑 6.mybatisplus的sql日志打印 7.最终查询的执行 8.结果集处理 9.每一条数据的单独处理

  • Mybatis实战之TypeHandler高级进阶

    上篇文章分享了在项目实战中自定义Mybatis的TypeHandler来处理枚举类型.文章结尾也指出了美中不足之处,那就是每次都需要指定我们自定义的枚举TypeHandler. 随着项目枚举类型的增多,每次都要写一遍这个会令人很反感.那么,本次我们就来解决这一痛点. 思路分析 上篇文章讲到, mybatis有默认的处理枚举类型的TypeHandler,因此,我们要将我们自定义的枚举TypeHandler注册进入Mybatis. 注册完我们自定义的TypeHandler后,还得告诉Mybatis只

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

    目录 实体类设置typeHandler不生效问题 解决 mybaties中TypeHandler的使用 解决 实体类设置typeHandler不生效问题 实体类: @Data @TableName(value = "centre_manage_server_info") public class ServerEntity { @TableId(value = "id") //@Column(name = "id", isKey = true, i

  • vue-cli设置css不生效的解决方法

    我们有的项目使用的是老的vue-cli脚手架生成的,今天想写点东西,发现.vue文件里面 style 里面写的样式都不生效了,很自然就想到是不是loader的问题. 在这种项目的webpack.base.config.js一般设置loader的 rules: [ ...(config.dev.useEslint ? [createLintingRule()] : []), { test: /\.vue$/, loader: 'vue-loader', options: vueLoaderConf

  • Vue项目中使用iView组件库设置样式不生效的解决方案

    目录 使用iView组件库设置样式不生效问题 解决使用iview或者element-ui组件修改样式不生效 1.样式如果定义为 2.样式如果没有定义 使用iView组件库设置样式不生效问题 找到要设置样式的类名,直接按照下面写法设置就可以了! <style lang="less" scoped> @deep: ~'>>>'; @{deep}.ivu-transfer-operation {     visibility: hidden !important

  • swagger @ApiModel添加实体类不生效的解决

    目录 @ApiModel添加实体类不生效 Models实体类无法显示 解决办法 @ApiModel添加实体类不生效 swagger, @ApiModel, Models, 实体类无法加载 在使用swagger时, 以为加上@ApiModel在实体类上就可以在swagger-ui.html的Models里面显示. 但是我创建了很多实体类, 但怎么也只显示了一个??? Models中无论如何只有User这一个实体类. 后来发现不是加上@ApiModel就可以加入Models中的,必须要在contro

  • Mybatis通过数据库表自动生成实体类和xml映射文件

    环境:maven+idea. 1. 需要的jar包 基本的spring和mybatis依赖包就不说了,在pom文件的build->plugins节点下需要添加(两个依赖包也可以直接添加到pom的依赖里面去,这里是为了直接通过maven的插件来生成.如果不是使用maven,自行百度下): <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-mave

  • JPA如何使用nativequery多表关联查询返回自定义实体类

    目录 JPA nativequery多表关联查询返回自定义实体类 JPA多表关联的实现方式 优缺点对比 使用sql并返回自定义实体类 JPA多表关联动态查询(自定义sql语句) 实体类 注解解释 测试类 打印结果 TestVo实体接收类 JPA nativequery多表关联查询返回自定义实体类 JPA官方推荐的多表关联查询使用不便,接触的有些项目可能会使用JPA 做简单查询,Mybaits做复杂查询.所以想要寻找一种好用的解决方案. JPA多表关联的实现方式 1.使用Specification

  • Spring Data JPA 实体类中常用注解说明

    目录 javax.persistence 介绍 基本注解 关联关系注解 关于关系查询的一些注意事项 javax.persistence 介绍 Spring Data JPA 采用约定大于配置的思想,默认了很多东西 JPA是存储业务实体关联的实体来源,它显示定义了如何定义一个面向普通Java对象(POJO)作为实体,以及如何与管理关系实体提供一套标准 javax.persistence位于hibernate-jpa-**.jar 包里面 jpa类层次结构: JPA类层次结构的显示单元: 单元 描述

  • Mybatis实体类对象入参查询的笔记

    目录 Mybatis实体类对象入参查询 测试实体类对象结构如下 测试文件内容 Mybatis中的参数深入 一.mybatis的参数 parameterType参数 二.mybatis的输出结果的封装 resultType(输出类型) Mybatis实体类对象入参查询 测试实体类对象结构如下 /** 使用lobmok插件 */ @Getter @Setter @NoArgsConstructor @ToString @EqualsAndHashCode public class Vendor {

  • IDEA中实体类(POJO)与JSON快速互转问题

    目录 POJO TO JSON JSON TO POJO POJO TO JSON 下载POJO to Json插件找到目录File->Settings->Plugins 点击Installed下载勾选上一般插件安装之后重启IDEA即可生效 找到我们要转换的实体类,鼠标右击类名,选择POJO To Json 然后就去我们想要的地方直接粘贴就行了 JSON TO POJO 下载GsonFormatPlus插件(基于 GsonFormat 做的二次开发)找到目录File->Settings-

  • Mybatis实体类和表映射问题(推荐)

    本文是小编给大家带来的mybatis中实体类和表映射问题的知识,学习本教程能够快速帮助我们解决字段名与实体类属性名不相同的冲突问题,需要的朋友一起看看吧! 一.准备演示需要使用的表和数据 CREATE TABLE orders( order_id INT PRIMARY KEY AUTO_INCREMENT, order_no VARCHAR(20), order_price FLOAT ); INSERT INTO orders(order_no, order_price) VALUES('a

随机推荐