会员可以在此提问,百战程序员老师有问必答
对大家有帮助的问答会被标记为“推荐”
看完课程过来浏览一下别人提的问题,会帮你学得更全面
截止目前,同学们一共提了 132359个问题

看视频的时候,老师在将使用反射创建对象,并给对象的属性赋值的时候

图片.png

这段代码我认为有一点问题,老师利用rsmd的原因是,想得到数据库表department里面有多少个列。得到列的数量。

这里写了一个for循环,然后在for循环的底下,通过clazz字节码对象获取到属性对象数组。

然后通过for循环遍历属性对象数组,得到属性的名称,由于我们设置的属性名与列名相同,可以作为列名,使用结果集rs的getObject(“colunm列名”)方法,得到列的值。

这里注意,假如一共有3列,那么在第一层for循环下的第一轮循环下,里面for循环会执行3次,因为clazz字节码对象也有3个属性。那第一轮循环就rs.getObject(f[j].getName())三次,得到了3个属性的值。

如果接着按老师的这种方式写:这是视频原图

image.png

接着写,就是 

//首先关闭安全检查,可以对private修饰的属性进行操作

f[i].setAccessible(true);

//然后给t对象的当前遍历到的属性赋值,值为rs.getObject(f[j].getName()),从rs结果集中取出的列名为f[j].getName()的值。注意filed属性对象没有setObject方法。视频里好像老师提了一嘴

f[i].set(t,rs.getObject(f[j].getName()));

那么我们会发现,假如一共有3列,那么在第一层for循环下的第一轮循环下,里面for循环会执行3次,因为clazz字节码对象也有3个属性。那第一轮循环就f[i].set(t,rs.getObject(f[j].getName()));设置了三个属性的值,显然已经设置好了。

第二轮循环会重复操作,set(t,rs.getObject(f[j].getName()));设置了三个属性的值,第三轮循环也是如此,所以根本没有必要写第一轮循环。

当然也可以写foreach循环,以下是我的代码:

image.png

结果:可以正确查出:

image.png

但是有弊端,这里没有用rs.getMetadata()得到一系列值,包括列的个数,所以要保证列的个数与属性的个数一致,上面的代码才能用。

假如属性有4个,而数据库的列只有2个,那在rs.getObject(属性名)的时候就会找不到那个列。

为此我在Dept实体类里新加了一个属性并提供get/set方法

image.png

此时再去执行方法:表示74行找不到flag这一列。

image.png

所以我想可以利用获得列的个数,与当前的属性赋值进行判断,前多少个属性对应列,后面的就不再赋值了,也成功了。

image.png


JAVA 全系列/第三阶段:数据库编程/JDBC技术(旧) 1653楼
JAVA 全系列/第三阶段:数据库编程/Oracle 数据库的使用 1654楼
JAVA 全系列/第三阶段:数据库编程/JDBC技术 1656楼
JAVA 全系列/第三阶段:数据库编程/MySQL数据库的使用 1662楼
JAVA 全系列/第三阶段:数据库编程/Oracle 数据库的使用 1664楼
JAVA 全系列/第三阶段:数据库编程/Oracle 数据库的使用 1665楼

课程分类

百战程序员微信公众号

百战程序员微信小程序

©2014-2025百战汇智(北京)科技有限公司 All Rights Reserved 北京亦庄经济开发区科创十四街 赛蒂国际工业园
网站维护:百战汇智(北京)科技有限公司
京公网安备 11011402011233号    京ICP备18060230号-3    营业执照    经营许可证:京B2-20212637