以下文章来源于何先振,责编小何

获取了数据库连接对象之后,那么我们下一步就需要通过数据库连接对象去给数据库服务器发送SQL指令了。
具体如何发送指令,在java.sql包下给我们提供了三个接口,分别以不同的方式去给数据库发送SQL指令。
Statement:用于执行静态SQL语句并且返回它所生成结果对象。我们查看JDK的工具文档。

PreparedStatement:用于执行预编译的SQL语句。通常我们使用的最多就是这个接口,因为使用Statement会存在一些弊端,后面我们会讲解。

CallableStatement:用于执行存储过程。

总结:通过JDBC访问数据库的三种方式。

通过上一讲,我们知道了如何获取连接对象。我们把他封装成一个方法。

使用时只需要调用方法,即可获取连接对象。

有了连接对象,我们可以通过连接对象创建发送SQL的Statement对象。

查看JDK使用文档,这是连接对象中提供的一个方法。

在第2讲中我们在数据库中创建了一张用户表。

现在就使用Statement对象通过账号、密码查询用户信息。
首先我们准备好要查询的账号和密码。比如:以查询张三为例子。

然后准备SQL语句

我们查看Statement接口给我们提供的发送SQL语句的方法。带有execute的方法都是执行SQL的方法。

但是一般我们重点关注,两个方法,一个是执行查询SQL的方法。另外一个是执行非查询的方法。

我们的SQL可分为:
DDL(表、数据库的创建、删除、修改)
DML(表数据的插入、删除、修改)
DQL(表数据的查询)
DCL(数据库的权限控制)
TPL(事务控制语句)
所有非查询的操作都可以使用这个方法。

所有查询的SQL就可以使用这个方法。

我们现在是要通过账号和密码查询用户,就使用查询的方法。调用方法返回的是一个结果集对象。ResultSet

看JDK的帮助文档,可以看到这个对象保存的就是返回的数据。
本身提供了一个游标,默认是第一行的前面,调用一下next方法就可以定位到一行的数据。如果没有数据就返回false。
还可以通过get方法获取游标定位的值。

调用get方法,获取每一列的数据,可以传索引值,从1开始,也可以传列的名称。如果有别名就传别名。两种方式。


运行程序,我们看到就可以接收到用户信息,打印出来了。

虽然通过Statement方式可以发送SQL,但是一般情况下不推荐使用。
因为他只能发送静态的SQL语句,什么是静态的SQL语句就是SQL要全部准备好,参数要一个一个拼接上。

如果是insert语句,参数比较多,拼接起来就比较费劲。
还有就是因为要拼接SQL参数,还会引发SQL注入问题。
下面的代码,在参数中注入sql语句。

打断点,调试拼接成的SQL语句就是这个样子的。

执行后可以把系统所有用户都查出来。


拼接参数如果不嫌麻烦你可以接受,但是SQL注入带来的安全问题,这个就无法接受了。
要想解决这个问题,JDBC中提供了PreparedStatement接口,可以执行预编译好的SQL,防止这种SQL注入引发的安全问题发生。
下讲我们开始讲解PreparedStatement接口的使用,请持续关注。






