JdbcTemplate(4)

JdbcTemplate(4)

前面已经介绍了如何使用Jdbc模板模式设计数据库的更新、查询操作,那么今天仍然处理查询模块,只不过该方案不将业务实现延迟到开发人员。

JDBC步骤

取得数据库连接

预编译SQL语句

对占位符进行赋值

执行查询操作

关闭数据库连接

看见没有,基本上数据库的JDBC操作都是按照该“生产线” 进行处理,因此在这里我认为这套操作是流水线生产。在计算机设计模式上命名为模板模式。那么我们重构出来的工具类,美其名为JdbcTemplate(借鉴Spring框架)

01

重构

抽取流水线代码段

在这里将JDBC的流水线操作代码抽取出来,如下图所示:

通过上述代码,已经完成了数据库连接,预编译,占位符赋值,数据库执行,数据库连接关闭操作。那么剩下的操作就是如何面对不同的业务需求?因为数据库的查询操作,每个业务查询的字段是不一样的,因此这种变化性使得无法进行代码封装。

举个例子:

目前执行用户表的数据查询,那么while循环里面进行的是用户表相关字段的查询操作,然后将查询的结果存储于List容器中。

如果现在执行角色表的数据查询,那么while循环里面则进行的是角色表相关字段的查询操作,然后将查询结果存储于List中。

由此可见,不同的业务查询的内容不一样,那么代码如何去面对这种变动的情况了?

02

重构

变化的代码转换为Map数据结构

由于任何人都无法预测业务的执行过程,因此结果集面对不同的业务过程,想进行封装显的无能为力。

本文讲述第二种解决方式:

解决方式

在JAVA面向对象语言中,对象和容器Map在数据结构上具有极高的相似性。Map的键相当于对象的属性,Map的值相当于属性的值。因此第二种解决方案就是如何将行数据转换为Map结构,而不是具体的业务对象。

从上述代码中,可发现关键代码是利用ResultSet对象获取ResultSetMetaData对象,获取到表的数据字典信息。

获取结果集中的所有列信息

获取第几列的名字,即列名

因此这个类ResultSetMetaData是个好玩意,从此再也不用担心查询的sql语句对应的行字段映射到对象的哪个属性。无论多么复杂的SQL语句,反正通过ResultSetMetaData类获取到列名,将其设置为Map中的键,将ResultSet对象中该列对应的值映射上Map该键对应的值。从而一行记录通过转换,变成了一个Map集合。

好了,基本思路已经描述清楚,后续一个rs.next()对应一行记录,也就是一个Map数据结构。同时在外层套用一个List存储每次循环的Map,从而得出最终的查询结果数据结构为:

List>

不得不说,这样封装之后,代码变得很轻巧,开发人员省事多了。那么有个疑问,省什么事了嘞?

调用的方法参数相较JdbcTemplate(3)中方式少了一个传参

可以不用专门写对象了啊,按之前的方式数据库行的记录要映射到对象上,那必须要写一个对象啊。

03

重构

调用

查询操作的代码已封装好,那么下面就是如何进行调用了?

看见没有,现在的操作由以前一堆重复的流水线代码,变成现在这么精简的几行代码,确实是beautiful。这里再次感叹,代码很美!

好了,查询操作讲述到这里,留个问题,如何查询一行记录。我想这个问题同样没必要进行讲述,思考一下,看如何利用该方式,完成数据库JdbcTemplate模板模式的当行记录查询操作。

此文是否对你有所启发,如果对你有所帮助,请关注本公众号

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181027A1EB9L00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券