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模板模式的当行记录查询操作。
此文是否对你有所启发,如果对你有所帮助,请关注本公众号
领取专属 10元无门槛券
私享最新 技术干货