首页 理论教育 JavaEE开发教程:JDBC编程

JavaEE开发教程:JDBC编程

时间:2023-11-03 理论教育 版权反馈
【摘要】:图4.15 JDBC工作流程下面介绍用JDBC访问数据库的步骤。接下来在Eclipse中创建名称为JDBC的Web工程,并将工程部署到Tomcat。在浏览器地址栏输入https://www.mysql.com/products/connector/,下载JDBC的MySQL驱动程序。解压后将文件mysql-connector-java-5.1.47-bin.jar放入“JDBC工程”→“WebContent”→“WEB-INF”→“lib”目录下。

JavaEE开发教程:JDBC编程

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 调用存储过程

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈