15158846557 在线咨询 在线咨询
15158846557 在线咨询
所在位置: 首页 > 营销资讯 > 网站运营 > Java Web开发实战—JDBC基础—JDBC开发及基本操作

Java Web开发实战—JDBC基础—JDBC开发及基本操作

时间:2023-05-24 16:36:01 | 来源:网站运营

时间:2023-05-24 16:36:01 来源:网站运营

Java Web开发实战—JDBC基础—JDBC开发及基本操作:


上一篇学习了JDBC入门(Java Web开发实战—JDBC基础—JDBC入门),本篇继续学习JDBC开发及基本操作。

JDBC开发

JDBC程序的开发步骤

编写一个JDBC程序需要完成六个步骤,具体如下。

l 加载并注册数据库驱动(Driver类)

l 获取数据库连接(Connection对象)

l 获取SQL语句执行者(Statement对象)

l 执行SQL语句

l 操作结果集(ResultSet对象)

l 回收数据库资源

编写JDBC程序的每个步骤都离不开JDBC相关API的支持,下面将对编写JDBC程序的具体步骤进行详细的讲解。

加载并注册数据库驱动

JDBC定义了驱动接口java.sql.Driver,MySQL数据库的驱动包为接口java.sql.Driver提供了实现类com.mysql.jdbc.Driver。在实际的开发过程中,一般采用Class类的forName方法加载驱动类,具体实现代码如下。

类加载时,将执行被加载类的静态代码块,而com.mysql.jdbc.Driver类有一个静态代码块,具体如下。

因此,Driver类在加载过程中即完成了对驱动的注册。

获取数据库连接

DriverManager类是驱动管理类,管理一组JDBC驱动程序,它通过属性drivers存入很多驱动类。当DriverManager获取连接的时候,它会把drivers里的各个驱动的URL和创建连接时传进来的URL逐一比较,遇到对应的URL,则会尝试建立连接。通过DriverManager类获取连接(Connection对象)的具体实现代码如下。

从上述代码片段可以看出,DriverManager类的getConnection()方法共有三个参数,它们分别表示数据库URL、登录数据库的用户名和密码,如果三者均匹配成功,就可获取数据库连接,为JDBC实现对数据库的操作奠定基础。

获取SQL语句执行者

Connection对象提供了三种获取SQL语句执行者(Statement对象)的方法,其中,调用createStatement()方法获取Statement对象,调用prepareStatement()方法获取PreparedSatement对象,调用prepareCall()方法获取CallableStatement对象,以获取Statement对象为例,具体实现代码如下。

如果获取PreparedStatement对象和CallableStatement对象,还需传入String类型的SQL语句作为参数。

执行SQL语句并操作结果集

Statement对象提供了三种方法执行SQL语句,其中,execute()方法可以执行任何SQL语句;executeUpdate()方法用于执行DDL语句和DML语句,执行DDL语句时,返回值为0,执行DML语句时,返回值为影响的行数;executeQuery()方法用于执行实现查询功能的SQL语句,返回值是一个结果集(ResultSet对象)。

以executeQuery()方法为例,具体实现代码如下。

结果集(ResultSet对象)封装了执行查询SQL语句后返回的结果,程序可以通过遍历结果集获取每一行的数据。ResultSet对象具有指向其当前数据行的指针,在最开始的时候指针被置于第一行之前,可调用ResultSet接口的next()方法将指针移动到下一行,在实际应用中常将ResultSet接口的next()方法放在while()循环当中,如果有下一行,则返回True,遍历继续进行,如果没有下一行,则返回False,遍历结束。

从结果集中获取数据分为两个步骤,首先调用next()、previous()、first()、last()等方法移动指针,其次调用getXxx()方法获取指针指向行的特定列的值。该方法既可以使用列索引作为参数,也可以使用列名称作为参数。使用列索引作为参数的性能更好,使用列名称作为参数的可读性更好,操作结果集的具体实现代码如下。

其中,参数“1”表示获取当前指针指向行的第一列的数据,除此之外,getObject()方法的参数名称也可以是String类型的数据表的列名,此时getObject()方法获取该列名对应的数据。

回收数据库资源

为了节省资源,提升性能,包括 Connection、Statement、ResultSet在内的JDBC资源在使用之后要及时关闭。正确的关闭顺序是:先得到的后关闭,后得到的先关闭。回收数据库资源的具体实现代码如下。

编写一个JDBC程序

前面讲解了编写JDBC程序的具体步骤,接下来通过一个实例来演示JDBC程序的具体实现。

(1)在MySQL中创建数据库chapter01和数据表student,SQL语句如下。

(2)向数据表student添加数据,SQL语句如下。

(3)通过SQL语句测试数据是否添加成功,执行结果如下。

从以上执行结果可以看出,数据添加成功。

(4)在Eclipse中新建Java工程chapter01,在工程chapter01下新建目录lib,将MySQL数据库的驱动jar包mysql-connector-java-5.1.37-bin.jar复制到lib目录下,右击lib目录下的mysql-connector-java-5.1.37-bin.jar,在弹出的菜单中选择Build Path→Add to Build Path,完成jar包的导入。在工程chapter01的src目录下新建com.qfedu.jdbc包。

在工程chapter01的src目录下新建com.qfedu.jdbc包,在该包下新建类TestJDBC01。




PreparedStatement对象的使用

SQL注入

SQL注入是比较常见的网络攻击方式,它利用现有程序的漏洞,将恶意的SQL命令注入到后台数据库,最终达到欺骗服务器并执行攻击者的意图的目的。在程序的运行过程中,SQL注入会造成数据库信息泄露、网页篡改、网站被挂木马等问题。

接下来,将通过一个简单的实例来说明SQL注入发生的过程。如果在某个系统的登录模块有如下一个验证权限的SQL语句。

正常情况下,用户需要输入正确的登录名和密码才能完成登录。但是,用户如果把输入的密码改为“12345 or 1=1 ”,那么真正执行的SQL语句变为:

此时,上述查询已基本失效,无论密码对错,用户均可以成功登录,使得程序存在重大的安全隐患,这就是SQL注入的一个具体场景。

前文中已经介绍过,Statement对象可以通过三种方法向数据库发送SQL语句,而这三种方法均是通过传递字符串类型的SQL语句作为参数来实现的,由此可见,使用statement类会存在SQL注入的问题。

PreparedStatement与Statement对比

PreparedStatement是用来执行SQL查询语句的API之一,主要用于执行参数化的操作。PreparedStatment对象可以对SQL语句进行预编译,这可以有效地避免SQL注入引发的问题,同时也提升了代码的可维护性和可读性。

与Statement对比,PreparedStatement具有以下优点。

1. PreparedStatement能够执行参数化的SQL语句

由于PreparedStatement能够执行带参数的SQL语句,因此开发人员可以通过修改参数来反复调用同一SQL语句,这样可以避免反复书写相同SQL语句的烦琐。

参数化的SQL语句,具体如下。

其中,“?”是参数的占位符,程序可以通过传入不同的sid值完成参数化查询。

2. PreparedStatement比 Statement效率更高

使用PreparedStatement时,数据库系统会对sql语句进行预编译处理,执行计划同样会被缓存起来,这条预编译的SQL语句能在将来的查询中重用,这样一来,它比Statement对象生成的查询速度更快,性能更好。为了减少数据库的负载,实际开发中一般使用PreparedStatement。

3. PreparedStatement可以防止SQL注入攻击

使用PreparedStatement的参数化的操作可以阻止大部分的SQL注入。在使用参数化查询的情况下,数据库系统不会将参数的内容视为SQL指令的一部分来处理,而是在数据库完成SQL指令的编译后,才套用参数执行。

使用PreparedStatement对象操作数据库

PreparedStatement对象通过executeUpdate()方法实现对数据库的写入,通过executeQuery()方法实现对数据库的查询。使用PreparedStatement对象操作数据库的步骤与使用Statement对象类似,具体如下所示。

l 加载并注册数据库驱动(Driver类)。

l 获取数据库连接(Connection对象)。

l 书写要执行的SQL语句,其中,操作的数据用占位符“?”表示。

l 获取SQL语句执行者(PreparedStatement对象)。

l 为SQL语句中的参数赋值。

l 执行SQL语句。

l 操作结果集(ResultSet对象)。

l 回收数据库资源。

使用PreparedStatement对象实现批量处理

在实际的项目开发中,有时需要向数据库发送多条语句相同、但参数不同的SQL语句,这时需重复写上很多条SQL语句,具体如下。

为了避免重复发送相同的SQL语句,提升执行效率,在实际开发中常采用PreparedStatement对象的批处理机制。

JDBC基本操作

为了帮助大家熟练应用JDBC编程,接下来,本节将通过一个综合案例来讲解JDBC的基本操作,确保大家能够深刻理解JDBC的增、删、改、查,并能灵活地利用JDBC完成对数据库的各项操作。

1. 创建一个Java类Student

在工程chapter01下创建com.qfedu.jdbc.domain包,并在该包下创建用于保存学生数据的类Student,具体代码如例1.4所示。

2. 创建JDBCUtils工具类

在开发过程中,每次对数据库的操作都需要注册驱动、获取连接、关闭资源等,这样会造成大量的重复代码。为了降低冗余,提升开发效率,一般将JDBC的相关操作封装到JDBC工具类中。在src目录下新建com.qfedu.jdbc.utils包,并在该包下创建JDBCUtils工具类,具体代码如例1.5所示。

3. 新建StudentDao类

在src目录下新建com.qfedu.jdbc.dao包,并在该包下新建StudentDao类,该类提供对数据库表的增加、修改、删除、查询等操作,具体代码如例1.6所示。

4. 编写测试类TestInsert

在src目录下新建com.qfedu.jdbc.test包,并在该包下新建TestInsert类,该类用于测试向表中添加数据的操作,具体代码如例1.7所示。

5. 编写测试类TestUpdate

在src目录下的com.qfedu.jdbc.test包下新建TestUpdate类,该类用于测试更新表中数据的操作,具体代码如例1.8所示。

6. 编写测试类TestDelete

在src目录下的com.qfedu.jdbc.test包下新建TestDelete类,该类用于测试删除表中数据的操作,具体代码如例1.9所示。

7. 编写测试类TestSelectOne

在src目录下的com.qfedu.jdbc.test包下新建TestSelectOne类,该类用于测试查询表中单条数据的操作,具体代码如例1-10所示。

8. 编写测试类TestSelectAll

在src目录下的com.qfedu.jdbc.test包下新建TestSelectAll类,该类用于测试查询表中所有数据的操作。




小结:Java Web开发实战—JDBC基础

https://www.zhihu.com/video/1568238629100654592主要介绍了JDBC的基本知识,包括JDBC的概念、体系结构以及核心API,通过操作案例对知识点进行巩固和串联,通过对内容的学习,大家应该了解JDBC的概念,掌握JDBC的开发流程并可以开发简单的JDBC程序。



关键词:操作,基本,实战,基础

74
73
25
news

版权所有© 亿企邦 1997-2025 保留一切法律许可权利。

为了最佳展示效果,本站不支持IE9及以下版本的浏览器,建议您使用谷歌Chrome浏览器。 点击下载Chrome浏览器
关闭