位置: 编程技术 - 正文

Mybatis调用PostgreSQL存储过程实现数组入参传递(mybatis调用存储过程详解)

编辑:rootadmin

推荐整理分享Mybatis调用PostgreSQL存储过程实现数组入参传递(mybatis调用存储过程详解),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:mybatis调用dao报空指针,mybatis调用存过,mybatis调用存储过程慢,mybatis调用function,mybatis调用存过,mybatis调用dao报空指针,mybatis调用存储过程详解,mybatis调用存储过程详解,内容如对您有帮助,希望把文章链接给更多的朋友!

前言

项目中用到了Mybatis调用PostgreSQL存储过程(自定义函数)相关操作,由于PostgreSQL自带数组类型,所以有一个自定义函数的入参就是一个int数组,形如:

如上所示,参数是一个int数组,Mybatis提供了对调用存储过程的支持,那么PostgreSQL独有的数组类型作为存储过程的参数又将如何处理呢?其实很简单,mybatis提供了typeHandlers可以创建一个数组类型的类型处理器,具体做法为:实现 org.apache.ibatis.type.TypeHandler 接口, 或继承一个很便利的类 org.apache.ibatis.type.BaseTypeHandler, 然后可以选择性地将它映射到一个 JDBC 类型,先稍作了解,后面再做详细说明,接下来依旧结合一个示例来看看。

创建自定义函数

如图,第一步首先是创建一个用于调用的自定义函数,功能也很简单,遍历参数数组的每一个元素和t_student表的stuid做比较,若一致,则修改那条记录的stuname(在其后拼接一段字符串),该自定义函数的DLL语句如下:

很简单,获取到参数数组的长度后开始循环,匹配stuid并更新stuname,直接在数据库调用一下看看结果:

如上图,可以看到成功修改了stuid为,和的stuname,自定义函数已经没问题了,接下来就具体看一下如何通过mybatis调用。

调用自定义函数

mybatis中调用自定义函数很简单,Mapper XML文件中的select元素直接提供了属性支持——statementType,在官方文档中可以看到:

如上图,statementType的值默认是PREPARED,也就是说底层默认会使用jdbc的PreparedStatement,而我们都知道jdbc调用存储过程时需要用CallableStatement,所以在这里我们需要将statementType的值设置为CALLABLE。

mybatis默认的ArrayTypeHandler

Mybatis调用PostgreSQL存储过程实现数组入参传递(mybatis调用存储过程详解)

调用存储过程很简单,那么接下来的问题是如何在mybatis中传一个数组参数到存储过程中呢?这里就要用到另外一个概念——TypeHandler,这是mybatis提供的自定义类型转换器,mybatis在预编译语句对象(PreparedStatement)设置参数时或是从结果集中取值时都会用类型处理器将获取的值以合适的方式转换成Java类型,mybatis默认实现了一部分TypeHandler供我们使用,当我们没有指定TypeHandler时(大多数情况都不会指定),mybatis会根据参数或者返回结果的不同,默认为我们选择合适的TypeHandler处理,下面可以通过查看源码大概看一下默认的TypeHandler,导入源码后可以在org.apache.ibatis.type包下找到一个TypeHandlerRegistry类,typeHandler正是通过这个类管理的,先看一下它的构造方法:

如上所示,这就是全部默认的typeHandler了,注意一下,行可以看到默认有一个ArrayTypeHandler,顺便看一下它的源码:

那它能否识别PostgreSQL的数组类型并将它自动转换成Java数组类型呢?按官方的说法,既然这是默认的typeHandler,那么我们无需做任何配置mybatis会自动尝试适配,所以直接写测试代码看看:

如上所示,参数传的是一个Integer[],直接运行一下junit看看测试结果:

Can't infer the SQL type to use for an instance of [Ljava.lang.Integer;. Use setObject() with an explicit Types value to specify the type to use.

异常log如上所示,在调用AbstractJdbc2Statement类的setObject方法时抛出异常,那么再看看这个方法的源码:

我们参数传进去的Integer[]数组是一个Object数组,而 setObject(int parameterIndex, Object x)方法的第二个参数是Object,所以这里这里自然无法匹配也就报错了,那么换成int[]可以吗?在上面的else if语句中明显没有x instanceof int[]这行代码,所以当然也不行,说到这里也就明确了mybatis默认提供的ArrayTypeHandler是无法自动识别PostgreSQL的数组类型,我们必须自定义一个参数为Object[]的ArrayTypeHandler才能实现匹配。

自定义ArrayTypeHandler

如题,先贴上代码:

如上所示,我们指定了参数类型为Object[],这样就可以接收Integer[]类型的参数了,关键是~行,postgresql的驱动类AbstractJdbc4Connection实现了Connect接口的createArrayOf方法,源码如下:

这样通过自定义的ArrayTypeHandler就可以在Mybatis中方便的操作数组类型数据了,最后再测试一下,测试类代码不变,仅需在调用存储过程时指定mapper文件的typeHandler即可:

再次运行junit看一下测试结果:

如上所示,此时已经可以成功调用参数为Integer[]数组的pg自定义函数了。

总结

简单记录一下在mybatis中调用postgresql自定义函数时传递数组参数的解决方案,希望对遇到同样问题的朋友有所帮助,The End。

标签: mybatis调用存储过程详解

本文链接地址:https://www.jiuchutong.com/biancheng/312222.html 转载请保留说明!

上一篇:Linux CentOS 7源码编译安装PostgreSQL9.5(centos7源码包安装)

下一篇:PostgreSQL分区表(partitioning)应用实例详解

  • 工会经费的计税依据是含税还是不含税
  • 税务金三系统是什么?
  • 销项税额的计算方法
  • 房地产企业递延所得税资产计算方法
  • 预收款开发票,不确认收入可以吗?
  • 机器设备一般折旧几年
  • 计提年终奖可以冲减利润
  • 配件和修理费能一起用吗
  • 企业回购股票会使所有者权益
  • 每月先报税还是先清卡
  • 税盘服务费抵税怎么做分录
  • 纸质发票如何查看电子发票
  • 核销债权债务依据
  • 单位补缴社保会罚款吗
  • 收到员工的罚款钱怎么写分录
  • 融资租赁的服务费的标准
  • 打款金额少于开票金额
  • 免税申请怎么办理
  • 上年的增值税专票,下年还能抵扣认证吗
  • 一般纳税人所得税2023年税率
  • 押金拿不到怎么解决
  • 给法院交的诉讼费怎么交
  • 什么是增值税
  • 设置戴尔笔记本锁屏时间
  • 怎么关闭win11安装软件提示
  • 奖励先进个人计划怎么写
  • 公交车的乘车凭证能报销吗
  • 怎么实现增删改查
  • 教育培训费能抵扣吗
  • 汇票到期收到款项会计分录
  • PHP:stream_get_wrappers()的用法_Stream函数
  • 增值税专票开错了可以作废吗
  • monaco编辑器的自定义提示
  • 增值税多交可以退税吗
  • 营业外支出会计准则
  • php图形图像处理技术
  • 差旅费报销应注意什么
  • 朴素贝叶斯算法
  • 二元运算例子
  • continue命令必须与locate
  • 销售费用占销售额比例怎么算
  • 股权收购账务处理
  • 公允价值变动损益借贷方向
  • 挂靠的工程如何进行账务处理?
  • 个人所得税大病医疗夫妻双方怎么扣除
  • mysql5.7.33压缩包安装教程
  • 盈余公积企业所得税税率
  • 商业承兑汇票在网银上怎么查询
  • 确认预计负债的三个条件
  • 应收账款是指什么
  • 企业办税人员如何实名认证
  • 给保安买大衣算贿赂吗
  • 银行承兑汇票到期日后多久可以承兑
  • 工会赞助费
  • 支付宝已经支付快递费怎么还支付
  • 房屋装修支出怎么做账
  • Mysql中FIND_IN_SET()和IN区别简析
  • windows怎么管理员权限
  • xp系统每次开机都重启
  • windows8正版
  • 电脑久了就会高温
  • 如何设置鼠标移入并停止时触发接口
  • c1.exe是什么
  • win7系统的磁盘管理在哪里,怎么打开
  • 如何配置centos7下的apache服务
  • runservice.exe - runservice是什么进程 有什么用
  • 有没有免费的win10
  • win10系统怎么cmd
  • 微软 系统设计
  • 零磁道的重要性
  • js解析机制
  • Node.js中的什么模块是用于处理文件和目录的
  • python调用cuda执行加法
  • 用javascript
  • jquery多级联动下拉菜单
  • JavaScript的History API使搜索引擎抓取AJAX内容
  • 吉林市无犯罪记录证明网上申请流程
  • 山西省税务局政审县级还是市级的
  • 什么叫做免抵税额
  • 江苏税务实名认证怎么更改
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设