【JavaWeb】73:JdbcTemplate详细解析

今天是刘小爱自学Java的第73天。

感谢你的观看,谢谢你。

话不多说,开始今天的学习:

昨天对Jdbc做了个全面的回顾,同时引出了Jdbc模板的学习,不得不说,代码编写确实方便了很多。正当我惊喜于JdbcTemplate的简便之处时。

有位小伙伴们对我说了如下的一段话:

当时我立马就惊呆了,这特么,怎么感觉学的以后都用不着了,并且JdbcTemplate竟然只是江南七怪级别的?那五绝是指?

我倒是听说过三大框架,有人说是SSH,也有人说是SSM。S肯定有一个是指Spring了,毕竟JdbcTemplate就是Sping框架里的一个模块。

后来也有小伙伴给我说什么Mybatis,Hibernate,这读都不知道怎么读,还有什么JPA,Spring Data JPA。

emmm这种时候也就只能默默地来一句:路漫漫其修远兮,吾将上下而求索。

毕竟要知道:郭靖一开始还不如江南七怪呢,后来还不是成了名震天下的新五绝?

当然前提也要像郭靖一样傻傻地坚持做好一件事。

一、JdbcTemplate回顾与分析

先对昨天的代码做一个回顾,以quaryForList为例:

①JdbcTemplate的使用

直接一个queryForList()方法就能得出想要的结果。

增强for循环直接遍历打印即可。

②常规方法的使用

准确地说,JdbcTemplate底层就是做了类似的封装,所以我们才可以直接调用queryForList()方法即可。

通过这两种方法的编写,也更能体现出JdbcTemplate的简便之处,此外关于查询的Api还有一种没有学完。

也就是query()方法的使用。

在Java中可以用一个JavaBean来表示数据表:

Java与数据表之间满足如下关系:

  • 类名就相当于数据表名。

  • 成员变量就相当于数据表列名(字段)。

  • 每一个User对象就可以用来表示表中一行的数据。

  • queryForMap(),就相当于一个User对象。

  • queryForList(),也就相当于装有很多个User对象的List集合。

好,理解了这一层关系后,再来编写代码:

二、JdbcTemplate查询操作

①query方法

该方法有三个参数:sql语句,rowMapper以及args。

sql语句这好理解,不用多说,args就是指sql语句中的“?”,例子中是全表查询,故没有args。

最关键的就是这个rowMapper了。

②rowMapper接口

row是“行”的意思,Mapper是映射器的意思。

说白了这个接口就是将数据表中一行的数据映射成一个JavaBean对象。

上述例子中的JavaBean就是User这个类。

这个接口就和动态代理中的调用处理器特别的类似

当template调用query的时候,rowMapper就会调用它自己的mapRow()方法。

接口调用方法,面向接口编程,也就是其实现类重写后的方法(例子中用匿名内部类表示,也可以使用lambda)

③遍历list集合

其中User中重写String方法,即可直接打印。

好,代码编写完毕,运行测试

一个User对象,对应的就是数据表user中的一行数据。

上述quary方法中是使用的匿名内部类的方式来表示rowMapper。

事实上在JavaTemplate中定义有一个实现类,可以使quary方法更加地简单。

BeanPropertyRowMapper是RowMapper中的一个实现类,直接使用它即可。

不用再去重写rowMapper接口中的mapRow方法了。

而其底层使用的技术就是反射,所以需要传入对应JavaBean中的Class对象。

三、元数据

通过自定义一个update方法来理解该知识点。

同样是给数据表中添加一条数据,分别用常规方法和JdbcTemplate编写。

①是常规方法,②是JdbcTemplate。显然②更加简洁。

那它是如何封装的呢?

可以尝试着自定义封装一个update方法,让其达到和JdbcTemplate一样的效果。

把握一个原则,数据不写死,让代码更具有拓展性:

①连接池以及预编译

连接池用哪个需要让调用者自己去确定,所以将数据源作为成员变量。

创建MyTemplate对象时,指定对应连接池即可。

②方法参数

第一个为sql语句,调用者去编写具体的语句。

第二个为args,这个指定是sql语句中的“?”代表的值。“?”可以有多个,所以用数组Object[]表示。

③args具体的值。

预编译中是这样给sql语句中的“?”赋值的:

数据类型不一样,用setObject就可以解决这个问题。

第1个参数是指“?”的索引位,是以1开始。

第2个参数是指“?”具体的值,是以args这个可变参数(也就是数组)来表示的,而数组的索引是以0开始的。

所以③中的封装时这样编写的:

封装有个特点就是很少看到具体的值,都是用变量。

④元数据

参数args是sql语句中的“?”代表的值,args的长度也就是“?”的数量。

那么现在问题来了,参数args是调用者填的,他是可以瞎填的,也就是说他编写sql语句时有2个“?“,但是他传参时偏要传一个长度为3的args。

这显然是不行的,那如何判断args的长度和sql语句中的“?”个数是否相等?

这就需要就需要引入元数据的概念了。

getParameterMetaData(),翻译就是获取参数元数据。

其中元数据又有一个方法叫getParameterCount(),翻译就是获取参数数量,也就是“?”的数量。

它为什么知道sql语句中“?”的数量?

看①中statement是如何来的?预编译了sql语句,所以它知道语句中“?”的数量,不相等就报错并提示。

好,代码编写完成,做个测试:

①是用的自定义MyTemplate中封装的update方法。

②是用的JdbcTemplate中的update方法。

可以发现其使用方法是一样的,也能达到一样的结果。

也就是说JdbcTemplate中的update方法的封装,和刚自定义的update方法的逻辑是类似的。

只不过JdbcTemplate更加地复杂,功能也更加地强大。

最后

谢谢你的观看。

如果可以的话,麻烦帮忙点个赞,谢谢你。

猜你喜欢

转载自blog.csdn.net/qq_41228864/article/details/107006098
73