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程序。