【JavaWeb】JdbcTemplate的使用讲解

一、Jdbc回顾

dbc核心六步骤,但是每次都这样写的话太繁琐了,所以将其中第1、2、6步封装进JdbcUtil工具类,优化JdbcUtil工具类:

在这里插入图片描述
①Jdbc核心六步骤

这是Jdbc最基础的六步。
其中第1步注册驱动,在MySQL3.0开始实现自动注册,但最好自己还是知道怎么写的好。
其中第6步释放资源,因为每次连接完需要释放资源,故将其封装进工具类,减少代码冗余。

②连接池的学习

两大开源连接池的学习,本质上其实就是对核心六步骤中的第二步(获取连接)的进一步优化,同样,将其封装进工具类JdbcUtil中。

③预编译的学习

sql注入的问题,以及预编译的引入,说白了也就是对核心六步骤中的第3、4步的优化。
预编译比常规方法更加地安全,也更有效率。
而今天要学一个小框架JdbcTemplate,准确地说,它是spring这个大框架中的一个模块。
Template,模板的意思,也就是Jdbc的一个模板。
它的出现也就是对核心六步骤中第3、4、5步的再一次优化,同时进一步简化代码,使用起来会更加地方便。

二、JdbcTemplate之增删改

翻来覆去,其实无外乎就是增删改查。
在这里插入图片描述

①创建JdbcTemplate对象
直接创建JdbcTemplate对象,会发现构造函数参数需要传入数据源。
在自己编写的工具类Jdbcutil中封装一个获取一个数据源的方法,然后直接获取即可。

②对数据表本身的操作:execute()
execute,执行的意思,对于数据表本身的操作(增删改查),都是用这个方法。
我们创建一个数据表student,有3列:id,name,age。
当然在Java中很少直接操作数据表本身,一般都是用于对表里数据的操作。

③对表中数据的增删改:update()
update,修改的意思,对于数据表里的数据修改(增删改在这儿都属于修改),都是用这个方法,我们给Student表新增一条数据。
其中update方法有两个参数:一个是sql语句,一个是可变参数(也就是sql语句中预编译中的“?”)。
该方法让预编译更加地简洁了,不用我们自己设定每个“?”的具体值是多少。
如果使用常规方法的话,我们需要这样编写:
在这里插入图片描述
利用工具类JdbcUtil获取连接,使用预编译,然后需要逐个设定预编译中“?”的值,。
所以通过对比可以发现JdbcTemplate模板使代码更加地简洁了,其底层其实就是做了这样的封装。

二、JdbcTemplate之查询

对于表里数据的增删改查中,无疑查询是最重要的存在。
这也很好理解,我们经常都需要登入各种APP各种网站,其本质就是对于数据的查询,而修改注销创建账号的频率无疑要少很多,并且查询要复杂的多,我们画图分析:

在这里插入图片描述
查询的结果共有三种情况,在Java中每种情况有其对应的API:

①单行单列:queryForObject()
查询出来的结果是一个数据,所以Java中用的返回值是Objcet。
现在编写对应的代码:
在这里插入图片描述
queryForObject()方法有三个参数:
sql语句,查询到的数据类型对应的class对象,以及预编译中的参数。
其中第一个例子查询的是数据数量,所以只有前两个参数。

②单行多列:queryForMap()
查询出来的结果是一行数据,所以Java中用的返回值是Map集合。
Map集合是由key和vlaue组成,其中这行的列名就相当于key值,这一行的数据就相当于value。
代码编写如下:
在这里插入图片描述

queryForMap中有两个参数:
sql语句,以及预编译中的参数。

③多行多列:queryFroList()
查询出来的结果是多行数据,所以Java中用的返回值是list集合,就相当于在list集合中装入很多个Map。
其中多行单列也就是属于多行多列。
代码编写如下:
在这里插入图片描述
返回值就是很多个map,自己将list遍历打印map即可。
以上便是对于数据表的查询操作。
然后发现使用JdbcTemplate,大大地简化了核心6步骤中的第5步(处理结果)。
以前需要处理结果集也就是ResultSet,写一个迭代器再获取其中具体的值,非常地繁琐。
现在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对象。

猜你喜欢

转载自blog.csdn.net/wang_qiu_hao/article/details/125222196