当前位置: 首页 > news >正文

深喉咙企业网站生成系统/微指数

深喉咙企业网站生成系统,微指数,宣传片的拍摄思路,wordpress家具主题Spring源码之JdbcTemplate中的坑,你中招了吗 情感的小恶魔 百家号 05-29 17:38我上篇文章分析了JdbcTemplate中各种回调类的使用,但是,我们平常用JdbcTemplate最多的还是query()方法和queryForObject()方法。同样,其中还有一个使用…

Spring源码之JdbcTemplate中的坑,你中招了吗

情感的小恶魔

百家号 05-29 17:38

我上篇文章分析了JdbcTemplate中各种回调类的使用,但是,我们平常用JdbcTemplate最多的还是query()方法和queryForObject()方法。同样,其中还有一个使用最多的是BeanPropertyRowMapper。

但是,在JdbcTemplate.queryForObject()中有一个很不起眼的坑,BeanPropertyRowMapper中也一样。

坑一:BeanPropertyRowMapper的mapRow()

我们在使用BeanPropertyRowMapper时,是给query()方法传递一个BeanPropertyRowMapper对象,让JdbcTemplate帮我们把查询结果集ResultSet的每一行结果都使用BeanPropertyRowMapper.mapRow()方法,转化成我们想要的Java类对象。从BeanPropertyRowMapper名称上也能够看出来,它是用来映射Java对象的属性和MySQL表的字段名称的。但是,在映射的过程中,如果不注意Java对象的属性名的规范,很可能就得不到我们想要的结果。

先来看一下,在创建BeanPropertyRowMapper对象时,会调用其中的initialize方法,我们看一下initialize方法的具体实现。

BeanPropertyRowMapper中的initialize方法

如图,

首选,说一下mappedFields,mapperFields是一个HashMap,用来匹配Java对象的属性和MySQL表的字段名的。mapperFields中存放所有可能与MySQL表的字段名映射上的那些Java属性名字。

如红色框框的第一行,在initialize方法中,BeanPropertyRowMapper会把传入的泛型Java类的所有属性名称的全小写形式放入mapperFields中,

第二行,把Java类的属性名转化成下划线分割的形式,如myName会被转化成my_name,这是因为,数据库在设计字段名称的时候,一般都会使用下划线分割形式,也就是my_name。

重点(敲黑板)

所以,如果在使用时,Java类名称要想和数据库字段名称匹配上,必须要把数据库字段名称设计成以下两种中的一种,

数据库字段名设计成全小写的形式,如myname;数据库字段名设计成下划线分割的形式,如my_name;

同时,Java属性名称应该尽量遵循Java编码风格,使用camelCase风格,如myName。

坑二:JdbcTemplate.queryForObject()

在使用queryForObject()方法时,我们一般是希望返回一个对象,而不是像query()方法一样返回一个列表。

但是,如果ResultSet结果集是空的话,queryForObject会抛出异常;如果ResultSet结果集的大小大于1的话,queryForObject也会抛出异常。

查看一下queryForObject源码:

queryForObject

其实,queryForObject使用的是一个SingleColumnRowMapper对象,其中,第二个queryForObject方法会调用第一个queryForObject方法,坑就在DataAccessUtils.requiredSingleResult(results)里面。

看一下DataAccessUtils.requiredSingleResult(results)源码:

requiredSingleResult

如图所示,如果结果集为空,或者结果集的数量大于1,都会抛出异常,导致queryForObject()无法返回期望结果。

在我们想查找出一个对象时,应该使用query()方法,如果返回结果不为空,那么取其中的第一个结果就好了。一般不要使用queryForObject方法,queryForObject会要求符合条件的数据库结果集有且仅有一条记录,记录不存在或者记录数大于1都会抛出异常。


http://www.lbrq.cn/news/1060399.html

相关文章:

  • 网站定位广告/河北网站推广公司
  • 沭阳网站建设多少钱/谷歌搜索引擎下载安装
  • 做网站怎么添加背景图片/友情链接查询工具
  • 做网站领券收佣金/嘉兴seo排名外包
  • 网上赚钱游戏/厦门seo厦门起梦
  • wordpress trash/深圳seo云哥
  • 做海淘的网站做海淘的网站有哪些/网站seo快速排名
  • wordpress 服务器配置/seo技术教程网
  • wordpress博客怎麽用/网站如何进行seo
  • 做网站使用什么语言好/网站开发月薪多少钱
  • 网站开发公司源码/重庆快速网络推广
  • 专业的丹阳网站建设/企业网站建设门户
  • 杭州网站建设专家/app开发工具
  • 内蒙古包头做网站的公司/新东方在线网上课程
  • 网站建设方法总汇/网络营销外包顾问
  • 提升网站页面打开速度/谷歌seo优化
  • 咨询网站开发/域名查询 ip
  • sublime做家乡网站/公司网络推广网站
  • 做网站模板的网页名称是m开头/企业网站建设方案范文
  • wordpress购物网站/广州百度关键词搜索
  • 南京市浦口区建设局网站/适合seo软件
  • 做网站用哪个服务器/手机app免费制作平台
  • 男女做暖免费网站 香蕉/百度网站提交了多久收录
  • 长沙市宁乡县建设局网站/产品推广方式有哪些
  • 付费网站建设模板/推广优化工具
  • 中国城乡和住房建设部网站/目前最火的自媒体平台
  • wordpress 只显示文字/win10优化
  • 网站推广要怎样做/正安县网站seo优化排名
  • 今日全世界疫情排名一览表/seo网站关键词优化
  • 百度竞价网站/百度服务电话6988
  • 跑yolov5的train.py时,ImportError: Failed to initialize: Bad git executable.
  • ELK是什么
  • 暑期算法训练.14
  • Redis备份方案:持久化与外部工具全解析
  • 分布式文件系统06-分布式中间件弹性扩容与rebalance冲平衡
  • 【原创】基于gemini-2.5-flash-preview-05-20多模态模型实现短视频的自动化二创