3,JDBC API详解

3.1 DriverManager

DriverManager(驱动管理类)作用:

3.2 Connection

Connection(数据库连接对象)作用:

3.2.1 获取执行对象

3.2.2 事务管理

先回顾一下MySQL事务管理的操作:

MySQL默认是自动提交事务

接下来学习JDBC事务管理的方法。

Connection几口中定义了3个对应的方法:

具体代码实现如下:

3.3 Statement

3.3.1 概述

Statement对象的作用就是用来执行SQL语句。而针对不同类型的SQL语句使用的方法也不一样。

 

3.3.2 代码实现

3.4 ResultSet

3.4.1 概述

ResultSet(结果集对象)作用:

而执行了DQL语句后就会返回该对象,对应执行DQL语句的方法如下:

那么我们就需要从 ResultSet 对象中获取我们想要的数据。ResultSet 对象提供了操作查询结果数据的方法,如下:

boolean next()

方法返回值说明:

xxx getXxx(参数):获取数据

如下图为执行SQL语句后的结果

image-20210725181320813

一开始光标指定于第一行前,如图所示红色箭头指向于表头行。当我们调用了 next() 方法后,光标就下移到第一行数据,并且方法返回true,此时就可以通过 getInt("id") 获取当前行id字段的值,也可以通过 getString("name") 获取当前行name字段的值。如果想获取下一行的数据,继续调用 next() 方法,以此类推。

3.4.2 代码实现

3.5 案例

 

3.6 PreparedStatement

PreparedStatement作用:

对上面的作用中SQL注入问题大家肯定不理解。那我们先对SQL注入进行说明.

3.6.1 SQL注入

SQL注入是通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法。

在今天资料下的 day03-JDBC\资料\2. sql注入演示 中修改 application.properties 文件中的用户名和密码,文件内容如下:

在MySQL中创建名为 test 的数据库

在命令提示符中运行今天资料下的 day03-JDBC\资料\2. sql注入演示\sql.jar 这个jar包。

image-20210725184701026

此时我们就能在数据库中看到user表

image-20210725184817731

接下来在浏览器的地址栏输入 localhost:8080/login.html 就能看到如下页面

image-20210725185024731

我们就可以在如上图中输入用户名和密码进行登陆。用户名和密码输入正确就登陆成功,跳转到首页。用户名和密码输入错误则给出错误提示,如下图

image-20210725185320875

但是我可以通过输入一些特殊的字符登陆到首页。

用户名随意写,密码写成 ' or '1' ='1

image-20210725185603112

这就是SQL注入漏洞,也是很危险的。当然现在市面上的系统都不会存在这种问题了,所以大家也不要尝试用这种方式去试其他的系统。

那么该如何解决呢?这里就可以将SQL执行对象 Statement 换成 PreparedStatement 对象。

3.6.2 代码模拟SQL注入问题

上面代码是将用户名和密码拼接到sql语句中,拼接后的sql语句如下

从上面语句可以看出条件 username = 'sjdljfld' and password = '' 不管是否满足,而 or 后面的 '1' = '1' 是始终满足的,最终条件是成立的,就可以正常的进行登陆了。

接下来我们来学习PreparedStatement对象.

3.6.3 PreparedStatement概述

PreparedStatement作用:

3.6.4 使用PreparedStatement改进

执行上面语句就可以发现不会出现SQL注入漏洞问题了。那么PreparedStatement又是如何解决的呢?它是将特殊字符进行了转义,转义的SQL如下:

 

3.6.5 PreparedStatement原理

PreparedStatement 好处:

image-20210725195756848

Java代码操作数据库流程如图所示:

接下来我们通过查询日志来看一下原理。

==小结:==