JDBC API提供了以下接口和类:
DriverManager:管理数据库驱动程序的列表,用来管理不同的JDBC驱动程序,不同的驱动程序须到DriverManager中注册,以便使用。
Driver:表示驱动程序,由它来与数据库打交道,不同的数据库供应商通常会提供基于JDBC接口规范的驱动程序。
Connection:用来实现将应用程序连接到特定的数据库,一个Connection对象表示一个特定数据库上建立的一个连接,实际上也是由它来创建不同的声明对象(Statement对象、PreparedStatement对象、CallableStatement对象),进而来执行特定的SQL语句。
Statement:在一个给定的连接中,用于执行一个数据库SQL语句并返回相应结果的对象。
主要方法有:
(1)boolean execute(String sql) throws SQLException
(2)ResultSet executeQuery(String sql) throws SQLException
(3)int executeUpdate(String sql) throws SQLException
ResultSet:是SQL语句执行后,返回的数据结果集。该结果集可以通过特定的方法来进行访问。对象中具有指向当前数据行的指针。最初,指针被置于第一行之前。
主要方法有:
(1)boolean absolute(int row) throws SQLException
(2)boolean next()throws SQLException
SQLException:该类用于处理发生在数据库应用程序中的任何错误。
JDBC工作流程:如图4.15所示。
图4.15 JDBC工作流程
下面介绍用JDBC访问数据库的步骤。
1.与数据库建立连接
如果要对数据库进行操作,必须首先加载JDBC驱动程序,然后与数据库进行连接并创建一个Connection对象。加载驱动程序通过调用Class.forName()完成,例如加载MySQL数据库驱动程序:
Class.forName("com.mysql.jdbc.Driver");
DriverManager类管理各种数据库驱动程序,并负责建立新的数据库连接,JDBC建立数据库连接的方法包括:
DriverManager.getConnection(String url);
DriverManager.getConnection(String url,Properties properties);
DriverManager.getConnection(String url,String user,String password);
其中url指出使用哪个驱动程序以及连接数据所需得其他信息。其格式为:
jdbc:subprotocol://[host:port],[host:port].../[database][?参数名1][=参数值1][&参数名2][=参数值2]...
下面列举几个重要的连接MySQL数据库的参数,如表4.1所示。
表4.1 连接MySQL数据库参数
例如:
jdbc:mysql://localhost:3306/test?user=root&password=&useUnicode=true&characterEncod ing=gbk&autoReconnect=true
2.数据库操作
1)Statement
建立了到特定数据库的连接之后,就可用该连接发送SQL语句。
Statement 接口提供了三种执行SQL语句的方法:executeQuery、executeUpdate 和execute。使用哪一个方法由SQL语句所产生的内容决定。
executeQuery:用于产生单个结果集的语句,例如select语句。
executeUpdate:用于执行insert、update或delete语句以及SqlDDL(数据定义语言)语句,例如create table和drop table。insert、update或delete语句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一个整数,指示受影响的行数(即更新计数)。对于create table 或drop table 等不操作行的语句,executeUpdate 的返回值总是为零。
execute:用于执行任何SQL语句,返回一个boolean值,表明执行该SQL语句是否返回了ResultSet。如果执行后第一个结果是ResultSet,则返回true,否则返回false。
与数据库建立连接之后就可以对数据库进行操作了。接下来在Eclipse中创建名称为JDBC的Web工程,并将工程部署到Tomcat。
【例4.14】使用Statement在MySQL数据库中创建名称为studentDB数据库。
(1)在浏览器地址栏输入https://www.mysql.com/products/connector/,下载JDBC的MySQL驱动程序。解压后将文件mysql-connector-java-5.1.47-bin.jar放入“JDBC工程”→“WebContent”→“WEB-INF”→“lib”目录下。在JDBC的Web工程的src目录下新建DBUtil.java文件,在WebContent目录下新建createDB.jsp文件。DBUtil.java和createDB.jsp的内容如下所示:
// DBUtil.ja va
//createDB.jsp
(2)启动Tomcat,在浏览器的地址栏输入http://localhost:8080/JDBC/createDB.jsp,可以看到如图4.16所示结果,通过MySQLs命令行工具登录并查看数据是否创建成功,如图4.17所示。
图4.16 创建studentDB数据库
图4.17 MySQL命令查看studentDB数据库
程序说明:
在DBUtil.java类中首先定义了三个final的变量,分别是:
MYSQL_URL:连接MySQL数据库的URL;
USER:连接数据库的用户名;
PASSWORD:连接数据的密码。
接着在DBUtil类中定义了静态块,用于加载数据库的驱动程序。然后定义了静态方法createDB(),在createDB()方法内部声明了Connection类型的对象conn用于获取数据库连接,Statement类型的对象statement用于执行创建数据库的SQL语句。conn对象通过DriverManager类的静态方法getConnection()方法进行初始化,statement对象通过conn对象创建,最后调用execute()方法执行创建数据库SQL语句。最后在执行完相应的SQL语句后先关闭statement对象,再关闭conn对象,释放资源。
在createDB.jsp页面中是通过import指令引入DBUtil类的,并使用JSP脚本调用DBUtil类的静态方法createDB()创建数据库,然后返回布尔值。如果成功返回true,否则返回false。
最后通过JSP表达式显示studentDB数据库是否创建成功。
Connection接口常用方法如表4.2所示,Statement接口常用方法如表4.3所示。
表4.2 Connection接口常用方法
表4.3 Statement接口常用方法
2)PreparedStatement(www.xing528.com)
在需要频繁使用某个SQL语句时,PreparedStatement类的作用即凸现出来。它是Statement的子类。执行的SQL语句是经过预编译的,所以执行效率高。
它能够使用带有占位符(?)的SQL语句,在使用时只需动态地传入参数就可以重复地使用该SQL语句了。该对象仍然是通过Connection对象来创建的,在创建该对象的同时,传入相应的SQL语句进行预编译。如:
PreparedStatement ps = conn.preparedStatement(“inset into dept(deptno,dname,loc)values(?,?,?));
所以,在使用时,要用set()方法来设置占位符处的相应参数。
【例4.15】使用PreparedStatement向数据库表插入数据。
(1)在例4.14基础上,通过MySQL命令行工具登录studentDB数据库,并创建student表,其字段以字段及属性如表4.4所示。
表4.4 student表结构
(2)在DBUtil类中创建方法save(),用于向student表中插入一条记录。
//save()方法:
程序说明:
在程序中声明了PreparedStatement接口变量ps,PreparedStatement接口继承自Statement接口,PreparedStatement 实例包含已编译的SQL语句,这就是使语句“准备好”。作为Statement的子类,PreparedStatement继承了Statement的所有功能。另外它还添加了一整套方法,用于设置发送给数据库以取代IN参数占位符的值。同时,三种方法execute、executeQuery和executeUpdate已被更改,使之不再需要参数。这些方法的Statement形式(接受SQL语句参数的形式)不应该用于 PreparedStatement对象。
在本例中要对表进行数据操作,首先DriverManager的getConnection()方法的第一个参数URL,必须包含数据库名称,通过Connection对象conn创建,然后设置占位符的实际参数。接着在MySQL数据库中插入日期,以字符串的形式插入。最后通过PreparedStatement对象的execute()方法执行。程序运行结果通过MySQL命令行查看,结果如图4.18所示。
图4.18 通过JDBC插入数据
使用PreparedStatement的好处:
(1)提高代码的可读性和可维护性。
(2)最大限度地提高性能。JDBC驱动的最佳化是基于使用的是什么功能,选择PreparedStatement还是Statement取决于要怎么使用它们。对于只执行一次的SQL语句,选择Statement是最好的;相反,如果SQL语句被多次执行,选用PreparedStatement是最好的。PreparedStatement的第一次执行消耗是很高的,它的高效性能体现在后面的重复执行(缓存的作用)上面。例如,假设使用student表的ID字段来执行一个针对Student表的查询,JDBC驱动会发送一个网络请求到数据解析和优化这个查询,而执行时会产生另一个网络请求。在JDBC驱动中,减少网络通信是最终的目的。如果程序在运行期间只需要一次请求,那么就使用Statement。如果SQL语句被多次执行则应该选择使用PreparedStatement。
(3)可以防止SQL注入。
【例4.16】使用PreparedStatement更新数据。
(1)在DBUtil类中创建方法update(),将student表中主键为1的记录的name字段的值修改为“李四”。
//update方法
(2)调用update()方法,运行后的通过MySQL命令行查看结果,如图4.19所示。
图4.19 通过JDBC修改数据
3)ResultSet
该对象是一个结果集,用来保存满足条件的记录。在该对象中包含一个类似指针的部分,通常称为游标,用来管理游标中的记录,游标默认情况下会指向第一行记录的前面。游标的初始位置并没有相应的记录与之对应,需要调用next()方法使得游标移动到下一个位置。该方法返回一个布尔值,用来表示结果集中是否还有下一条记录。通常执行一个查询语句后,会返回一个结果集resultSet对象。表4.5列出了ResultSet常用方法。
表4.5 ResultSet常用方法
获取结果集中的数据通过以下2种方式:
(1)通过数据库表的字段名来获取某个字段的数据。
(2)通过字段在表结构的索引(从1开始)获取某个字段的数据。
【例4.17】使用Statement查询Student表的全部记录并通过ResultSet获取结果数据并输出到控制台。
(1)在DBUtil类中新建query()方法:
//query()方法
(2)在main函数中调用query()方法,执行后结果如图4.20所示。通过JDBC查询Stndent表全部记录,如图4.21所示。
图4.20 MySQL命令行查询student表全部记录
图4.21 JDBC查询Student表全部记录
4)CallableStatement
CallableStatement继承自PreparedStatement接口,为所有的DBMS提供了一种标准的形式去调用数据库中已存在的存储过程,在使用CallableStatement时可以接收存储过程的返回值。使用CallableStatement对象调用数据库中存储过程有两种形式:
(1)带结果参数。
(2)不带结果参数。结果参数是一种输出参数(存储过程中的输出OUT参数),是存储过程的返回值。两种形式都有带有数量可变的输入、输出、输入和输出类型的参数。用问号做占位符。
带结果参数语法格式:{ ? = call 存储过程名[(?, ?, ?, ...)]};
不带结果参数语法格式:{ call 存储过程名[(?, ?, ?, ...)]};
注意,方括号里面的内容可有可无。表4.6列出了CallableStatement接口常用方法。
表4.6 CallableStatement接口常用方法
【例4.18】使用CallableStatement调用studentDB数据库中存储过程statistisCount并输出结果。
(1)在StudentDB数据库创建存储过程statistisCount用于统计student表中记录总数,并返回结果。创建存储过程的方法如下所示:
(2)在DBUtil类中新建executePro()方法。
(3)在main()函数中调用executePro()函数,函数运行结果如图4.22所示。
图4.22 调用存储过程
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。