JdbcTemplate(3)
上文已经介绍了如何使用Jdbc模板模式设计数据库的更新操作,那么下面介绍如何执行查询操作。继续搬好板凳,坐不下就站着听课了。
JDBC步骤
取得数据库连接
预编译SQL语句
对占位符进行赋值
执行查询操作
关闭数据库连接
看见没有,基本上数据库的JDBC操作都是按照该“生产线” 进行处理,因此在这里我认为这套操作是流水线生产。在计算机设计模式上命名为模板模式。那么我们重构出来的工具类,美其名为JdbcTemplate(借鉴Spring框架)
01
重构
抽取流水线代码段
在这里将JDBC的流水线操作代码抽取出来,如下图所示:
通过上述代码,已经完成了数据库连接,预编译,占位符赋值,数据库执行,数据库连接关闭操作。那么剩下的操作就是如何面对不同的业务需求?因为数据库的查询操作,每个业务查询的字段是不一样的,因此这种变化性使得无法进行代码封装。
举个例子:
目前执行用户表的数据查询,那么while循环里面进行的是用户表相关字段的查询操作,然后将查询的结果存储于List容器中。
如果现在执行角色表的数据查询,那么while循环里面则进行的是角色表相关字段的查询操作,然后将查询结果存储于List中。
由此可见,不同的业务查询的内容不一样,那么代码如何去面对这种变动的情况了?
02
重构
变化的代码延迟出去
由于任何人都无法预测业务的执行过程,因此结果集面对不同的业务过程,想进行封装显的无能为力。
本文讲述第一种解决方式:
解决方式
我无法封装,我就不做,延迟给开发人员自己进行业务处理
定义一个接口,发布方法,用于实现数据库行和对象的一一映射。此处应该很好理解,因为对象的组成是由属性构成。同理,数据库一行记录是由多个字段组成。那么我们可以认为一行记录与一个对象完全能形成一一映射。
那么我们思路跳跃一下,假如现在我们实例化了一个RowMapper接口对应的实体对象,那么这个对象就可以执行rowMapper方法,其中传递的参数是ResultSet。刚才的模板代码在执行while循环的时候,每循环一次,则游标向下移动,相当于一行数据一行数据移动。因此只需要拥有RowMapper接口对象,那么每次执行rowMapper方法相当于将行数据转换了对象。从而可以将返回的对象添加到List容器中。
从上图代码可以发现,每次循环的结果赋值给t,从而通过泛型处理,添加到List容器。此处是回调的一种表现结构。不得不说,这样封装之后,很巧妙,代码也变得很美!
03
重构
调用
查询操作的代码已封装好,那么下面就是如何进行调用了?
看见没有,现在的操作由以前一堆重复的流水线代码,变成现在这么精简的几行代码,业务实现延迟给开发人员自己进行编写,封装类通过回调进行调用返回。这里再次感叹,代码很美!
另外通过匿名内部类的方式进行调用,减少了代码中类的编写数量。
好了,查询操作讲述到这里,留个问题,如何查询一行记录。我想这个问题没必要进行讲述,思考一下,看如何利用该方式,完成数据库JdbcTemplate模板模式的当行记录查询操作。
此文是否对你有所启发,如果对你有所帮助,请关注本公众号
领取专属 10元无门槛券
私享最新 技术干货