热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【JavaWeb】66:JDBC封装

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


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

感谢你的观看,谢谢你。

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

很多优秀的框架中都封装有jdbc,可以直接使用,都不用我们自己写的,特别方便。

但本着学习的原则:知其然也要知其所以然。

所以决定还是学一下jdbc具体是如何写的?以及是如何一步步封装的?其中JDBC一共有6步:

  • 注册驱动

  • 获取连接

  • 创建执行语句

  • 执行语句

  • 处理结果集

  • 释放资源

一、注册驱动、获取连接详解

注册驱动:

①看下Driver源码

该Driver类是mysql编写的一个实现类,用来实现Java中规定的Driver接口。

②静态代码块

Driver类中有一个静态代码块,已经写出了注册驱动这个步骤,并且静态代码块是随着类的加载而加载的。

也就是说我们第一步注册驱动其实是多余的,只需要让Driver类加载就好了。

如何加载?

前面学反射的时候就接触过,每一个类都有其唯一对应的Class对象。做一个回顾,Class对象的获取有三种方式:

①通过对象调用getClass()方法

将注册驱动这个步骤替换成这一步,会发现运行Java程序,照样能得到一样的结果。

但是这个步骤有一个问题就是driver对象根本就没用到。要知道对象是要进堆内存的,那为何还要它进堆占用内存呢?

②通过类名.class也可以获取Class对象

这个呢也是可以的,但是要保证Driver是mysql中的Driverl类。

③用Java中的Class类调用forName()方法

这种是最稳妥的,不用担心出错。

“com.mysql.jdbc.Driver”这个是全限定名,也就是包名+类名。通俗一点理解就是:

  • com是一个文件夹

  • mysql是com下的一个文件夹

  • jdbc是mysql下的一个文件夹

  • Driver是jdbc下面的一个文件

这样理解下来也就很好记下来了。

值得注意的是:

注册驱动这个步骤其实都不用写的、因为MySQL驱动3.0之后就实现自动注册驱动了。

但是3.0之前是需要我们自己实现注册的。

要知道也有很多企业喜欢用旧的版本。

现在jdk都更新到14了,还不是有那么多用jdk8的,有的银行还用jdk6呢。

所以了解一下肯定是没问题的。

  • 就算有自动注册,这样写的话也不会错。

  • 但是不写的话,如果遇到旧版本没法自动注册的就会报错。

说完注册驱动,再仔细讲讲获取连接。

①jdbc:mysql

这个就有点类似于http,所以后面要接“://”

其中jdbc是一个协议,mysql是jdbc的子协议。

②ip+端口

因为是本地主机,数据库就在我自己的电脑上。

所以ip为127.0.0.1,其中用localhost也就是本地主机,效果是一样的。

③liuxiaoai

这是我MySQL里创建的一个数据库名。

以上3点组成的就是url,也就是知道了我想访问的数据库在哪儿了。

而想要访问数据库,还要知道用户名和密码,这也就是另外两个参数。

二、statement和resultSet详解

statement就相当于是连接Java程序和数据库的一个通道,通过它来传输sql语句,也就是IO流?

sql语句可以用来增删改查。

①executeQuery()方法

当sql为查询语句时,就用该方法。

其返回值是一个结果集,我们可以遍历这个结果集得到我们想要的数据。

②executeUpdate()方法

当sql为增删改语句时,就用该方法。

其返回值是updateCount,也就是sql语句执行影响了几行数据:

  • ②中增加了1行数据,所以返回值为1;

  • ③中删除了2行数据,所以返回值为2。

④execute()方法

这个方法是用来判断sql语句的。

其返回值是一个boolean值:

  • 如果为查询语句,则执行executeQuery()方法;

  • 如果为增删改语句,则执行executeUpdate()方法。

但是该方法不怎么实用,原因很简单:

其返回值是不确定的,所以很难将该方法封装。

resultSet结果集

其本质上其实就是集合中的迭代器:

①next()方法

用于判断下一行是否有数据

  • 如果下一行有数据,就继续循环;

  • 如果下一行没有数据了,就停止循环。

②getString()方法

  • 参数可以填数据表中的列名,那么得到的结果就是列名对应的具体值。

  • 参数也可以填数字,如果是1就是第一个列名也就是id,这样依次往下推。

但是一般都是填列名,这样阅读性强,直接就知道获取的是什么数据。

如果填数字,要对数据表了如指掌,不然时常会搞不清楚数字具体对应的是哪一列。

三、JDBC的封装

将jdbc封装到一个工具类JdbcUtil中,我们使用时直接可以用工具类获取连接,会方便很多。

jdbc中牵扯到如下变量:

  • Driver:com.mysql.jdbc.Driver

  • url:jdbc:mysql://localhost:3306/liuxiaoai

  • user:root

  • password:root

封装分析一:

这些变量并不是一成不变的,数据库不一样Driver就不一样,url、user以及password更是各不相同。

那根据代码的可拓展性原则:出现变化,要保证修改的代码越少越好。

那该怎么办是好?

编写一个配置文件即可。

①jdbc.properties文件

将这些变量抽取出来,放入配置文件中。

这样做有什么好处?

以后换数据库软件了,换数据库名了,数据库账号密码变了,都只需要修改配置文件就好了,代码都不用动。

②加载配置文件

在Java里有一个类叫Properties。

其有一个load()方法,可以用来加载对应的配置文件。

参数为一个输入流,将我们配置文件所在的路径填写进去即可。我这边的路径是在项目src文件夹下。

③获取配置文件信息

其中有一个getProperty()方法。

看方法名就知道该方法可以获取配置文件中对应的属性。

封装分析二:

这些配置文件需要获取几次?

只需要一次就够了的。

同样的道理,驱动注册也只需要一次就够了。

在一个类中,什么东西只随着类的加载而加载一次?

答案是:静态代码块。

所以封装如下:

static{"静态代码块"};即为静态代码块。

其中异常要try……catch,在静态代码块中也没法throws。

封装分析三:

既然获取连接需要的三个参数都被封装起来了,那么该方法也可以封装在工具类JdbcUtil中;

并且每次我们都需要释放资源,也就是关流,同样也可以将其封装起来。

代码如下:

①获取连接方法

工具类中的方法一般都是静态方法。

这里将getConnection()方法封装成一个静态方法,实际使用时直接用JdbcUtil类调用即可。

②释放资源

也就是close方法关流,其中的三个参数都为Java中对应的参数。

都要进行try…catch处理异常,前面为了方便直接抛异常了(为了省事、不然代码太多也不好截图)。

但实际上大多数时候都是需要try…catch处理的。

四、JDBC测试

直接用工具类JdbcUtil调用封装的方法即可获取连接。

当JdbcUtil类加载的时候,静态代码块就会执行,同时配置文件信息会被获取,驱动也会注册。

然后再就是具体的执行语句以及处理结果,就不再赘述。

最后释放资源直接调用封装的release方法即可。

以上就是对JDBC的封装以及测试。

我不清楚框架中是如何封装JDBC的,肯定没我这想的这么简单,但是我觉得思想上应该是大同小异。并且学习的过程本身也就是不断优化的过程。

最后

谢谢你的观看。

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



推荐阅读
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • 如何在php文件中添加图片?
    本文详细解答了如何在php文件中添加图片的问题,包括插入图片的代码、使用PHPword在载入模板中插入图片的方法,以及使用gd库生成不同类型的图像文件的示例。同时还介绍了如何生成一个正方形文件的步骤。希望对大家有所帮助。 ... [详细]
  • 本文介绍了Java后台Jsonp处理方法及其应用场景。首先解释了Jsonp是一个非官方的协议,它允许在服务器端通过Script tags返回至客户端,并通过javascript callback的形式实现跨域访问。然后介绍了JSON系统开发方法,它是一种面向数据结构的分析和设计方法,以活动为中心,将一连串的活动顺序组合成一个完整的工作进程。接着给出了一个客户端示例代码,使用了jQuery的ajax方法请求一个Jsonp数据。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • springboot项目引入jquery浏览器报404错误的解决办法
    本文介绍了在springboot项目中引入jquery时,可能会出现浏览器报404错误的问题,并提供了解决办法。问题可能是由于将jquery.js文件复制粘贴到错误的目录导致的,解决办法是将文件复制粘贴到正确的目录下。如果问题仍然存在,可能是其他原因导致的。 ... [详细]
  • 延迟注入工具(python)的SQL脚本
    本文介绍了一个延迟注入工具(python)的SQL脚本,包括使用urllib2、time、socket、threading、requests等模块实现延迟注入的方法。该工具可以通过构造特定的URL来进行注入测试,并通过延迟时间来判断注入是否成功。 ... [详细]
  • MySQL语句大全:创建、授权、查询、修改等【MySQL】的使用方法详解
    本文详细介绍了MySQL语句的使用方法,包括创建用户、授权、查询、修改等操作。通过连接MySQL数据库,可以使用命令创建用户,并指定该用户在哪个主机上可以登录。同时,还可以设置用户的登录密码。通过本文,您可以全面了解MySQL语句的使用方法。 ... [详细]
author-avatar
又ettl_329
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有