首页 > 其他分享 >typeHandler解决JSONArray类型无法使数据入库的问题

typeHandler解决JSONArray类型无法使数据入库的问题

时间:2023-07-28 18:46:26浏览次数:23  
标签:java string typeHandler JSONArray 类型 public 入库

  在java中,一个对象类往往会有很多用途,比如用于接口请求时的传参,或mapper入库时的传参,但请求接口需要的数据类型可能不能用于mapper插入数据库表。
  例如在请求接口时,需要传递一个数组类型的字段,但数据库只能插入varchar类型,需要将数组类型的字段转为字符串类型。
  可用typeHandler(类型转换器)实现一个对象类既适用于接口传参,又可以用于插入数据。

1.在字段中加入注解@ColumnType

@Data
public class test {
@ColumnType(jdbcType = JdbcType.VARCHAR,typeHandler = JsonArrayToStringHandler.class)
private JSONArray locs;
}

2.JsonArrayToStringHandler.class的具体实现

@Component
public class JsonArrayToStringHandler extends BaseTypeHandler<JSONArray> {


    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, JSONArray parameter, JdbcType jdbcType) throws SQLException {
        ps.setString(i, JSONUtil.toJsonStr(parameter));
    }

    @Override
    public JSONArray getNullableResult(ResultSet rs, String columnName) throws SQLException {
        String string = rs.getString(columnName);
        return JSONObject.parseArray(string);
    }

    @Override
    public JSONArray getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        String string = rs.getString(columnIndex);
        return JSONObject.parseArray(string);
    }

    @Override
    public JSONArray getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        String string = cs.getString(columnIndex);
        return JSONObject.parseArray(string);
    }
}

3.插入数据

public interface TestMapper extends CommonRepository<test> {

}
public class practis implements IPractisService {
  @Autowired
  private TestMapper testMapper ;

  @Override
  public void eventPublish(Test test) {
      testMapper.insert(test);
    }
}

  若使用xml实现插入,则可以如下写:

<insert id="insertPerson" parameterType="person">
        INSERT INTO person (id,name,sex,hobbys,data_time,locs) values(#{id},#{name},#{sex},#{locs,typeHandler=com.test.typeHandler.JsonArrayToStringHandler})
</insert>

4.TypeHandler概念

  TypeHandler,类型转换器,在mybatis中用于实现java类型和JDBC类型的相互转换;
  mybatis使用prepareStatement来进行参数设置的时候,需要通过typeHandler将传入的java参数设置成合适的jdbc类型参数,这个过程实际上是通过调用PrepareStatement不同的set方法实现的;在获取结果返回之后,也需要将返回的结果转换成我们需要的java类型,这时候是通过调用ResultSet对象不同类型的get方法时间的;所以不同类型的typeHandler其实就是调用PrepareStatement和ResultSet的不同方法来进行类型的转换,有些时候会在调用PrepareStatement和ResultSet的相关方法之前,可以对传入的参数进行一定的处理。
  当我们没有指定typeHandler的时候mybatis会根据传入参数的类型和返回值的类型调用默认的typeHandler进行处理;对于一个typeHandler需要配置java类型(javaType)和JDBC类型(jdbcType),typeHandler的作用就是实现这两种类型的转换,在传入的参数为指定的Java类型时,将其转换为指定的JDBC类型,当返回值为指定JDBC类型时将其转换为配置的Java类型。

标签:java,string,typeHandler,JSONArray,类型,public,入库
From: https://www.cnblogs.com/lal520/p/17588662.html

相关文章

  • 172 侧方入库
    7-27早上电车出了问题,我开车去维修站那里修下午去练侧方停车,又开始了折磨侧方注意点:看点位,控制车速,追线(控制车与边线的距离30cm,也要注意看点),先打左转向灯三秒以上继续加油吧塞翁失马焉知非福1.因为没有提前拿冰箱里面的东西解冻(给狗吃的,我误以为是我家人的晚饭,谁知道看起来......
  • Qt QJsonDocument以及与QJsonArray、QJsonObject、QJsonValue的关联
    0、说明QJsonDocument类提供了read/writeJSON文档的方法。用QJsonDocument::fromJson()方法,可以从将一个JSON文件(或者QByteArray数据)转换为QJsonDocument,用QJsonDocument::toJson()则能起到相反的用法。在此过程中的语法解析是很高效的,并且可以将JSON转换为Qt使用的二......
  • python:导入库、模块失败
    一般发生在程序开始部分:frompymodbus.client.syncimportModbusSerialClientfrompymodbus.payloadimportBinaryPayloadDecoderfrompymodbus.constantsimportEndianfrompymodbus.compatimportiteritemsimporttimeimportthreadingimportjsonfromdeviceimpor......
  • shell脚本:对开发入库的sql脚本进行检查
    shell脚本内容为:点击查看代码#!/bin/bashexportLANG=en_US.UTF-8exportNLS_LANG="AMERICAN_AMERICA.AL32UTF8"source/etc/profilesource/root/.bash_profileHOME=$(cd$(dirname$0);pwd)DOC_HOME=${HOME}/releasedocDOC_SVN_PATH=http://192.168.xx.xx/bushi......
  • C# 接口获取所有节假日并存入库(批量循环对象操作)
    //每年的1月1号自动更新节假日表varallHolidayStr=BaseHelper.Get_HttpRequest("https://api.jiejiariapi.com/v1/holidays/"+DateTime.Now.ToString("yyyy"));if(allHolidayStr.IsNotNullOrEmpty()){......
  • 字符串数组不能转化对象数组,jsonArray也转化报错
    刚开始写法------错误JSONArrayjsonArray=(JSONArray)this.getJsonFilter().get("ids");PltPayDuesModel[]payDuesModels=(PltPayDuesModel[])jsonArray.toArray();报这个[Ljava.lang.Object;cannotbecastto[Ljava.lang.String;由于无法直接,因此需要曲线救国......
  • 关于用友倒冲入库
    1.用友倒冲1.在制作BOM反冲领料修改供应类型:入库反冲领料同时选择仓库2.入库时会自动产生关联材料出库单3.在盘点单选择倒冲仓盘盈亏会自动分摊至成本4.成本配置核算对象及成本中心5.工定额倒挤:通过已完工入库成品,按领料计算在制品......
  • java.lang.ClassCastException: com.alibaba.fastjson2.JSONArray cannot be cast to
    是这样的,今天跟着写springboot项目的时候,前端登录的时候报403错误。检查了半天,是后端的问题报错代码: 第二句报错提示如下 说是JSONArray不能转String,但我这也不是JSONArry转String而是Object转String啊。网上搜了半天,用了好多种方法也没什么用最后索性死马当活马医,让它......
  • EBS实践—PO内部申请自动接收入库
    declareCURSORcur_req_dataISSELECTprl.*FROMpo_requisition_lines_allprl,po_requisition_headers_allprhWHEREprh.requisition_header_id=prl.requisition_header_idANDprl.requisition_line_id=p_requ......
  • SpringBoot中操作Redis解析JsonArray数据为对象List(ruoyi字典值sys_dict为例)
    场景若依前后端分离版手把手教你本地搭建环境并运行项目:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/108465662在上面搭建系统的基础上,会将系统的字典值缓存进redis中。看数据格式存储的是Json数组,如何从redis中读取并解析成对象的list从而进行数据处理。注......