《Java Web开发实战》一书更加趋于实战性。此教材由浅入深、循序渐进,在语法阐述时尽量避免术语和公式,使初学者能够快速入门,全面掌握实战技能。它既可以作为高等院校本、专科计算机相关专业的Java Web入门进阶教材,也可作为广大计算机编程爱好的学习参考书。
下面给大家分享点本书的干货内容,关于JDBC内容继续给大家学习,想要完整资料的可以衔接查看之前的文章。
1.1.1 JDBC程序的开发步骤
编写一个JDBC程序需要完成六个步骤,具体如下。
l 加载并注册数据库驱动(Driver类)
l 获取数据库连接(Connection对象)
l 获取SQL语句执行者(Statement对象)
l 执行SQL语句
l 操作结果集(ResultSet对象)
l 回收数据库资源
编写JDBC程序的每个步骤离不开JDBC相关API的支持,接下来,本书将对编写JDBC程序的具体步骤展开详细讲解。
1.1.2 加载并注册数据库驱动
JDBC定义了驱动接口java.sql.Driver,MySql数据库的驱动包为接口java.sql.Driver提供了实现类com.mysql.jdbc.Driver。在实际开发中,一般采用Class类的forName方法加载驱动类,具体实现代码如下。
Class.forName("com.mysql.jdbc.Driver");
类加载时,将执行被加载类的静态代码块,而com.mysql.jdbc.Driver类有一个静态代码块如下。
static{
try{
java.sql.DriverManager.registerDriver(newDriver());
}catch(SQLExceptione){
throw new RuntimeException("can't register driver!");
}
}
因此,Driver类在加载过程中即完成了对驱动的注册。
1.1.3 获取数据库连接
DriverManager类是驱动管理类,管理一组JDBC驱动程序,它通过属性drivers存入很多驱动类。当DriverManager获取连接的时候,它会把drivers里的各个驱动的URL和创建连接时传进来的URL逐一比较,遇到对应的URL,则会尝试建立连接。通过DriverManager类获取连接(Connection对象)的具体实现代码如下。
Connection conn = DriverManager.getConnection
(String url, String username, String password);
从上述代码片段可以看出,DriverManager类的getConnection()方法共有三个参数,它们分别表示数据库URL、登录数据库的用户名和密码,如果三者均匹配成功,就可获取数据库连接,为JDBC实现对数据库的操作奠定基础。
1.1.4 获取SQL语句执行者
Connection对象提供了3种获取SQL语句执行者(Statement对象)的方法,其中,调用createStatement()方法获取Statement对象,调用prepareStatement()方法获取PreparedSatement对象,调用prepareCall()方法获取CallableStatement对象,以获取Statement对象为例,具体实现代码如下。
Statement statement = conn.createStatement();
如果获取PreparedStatement对象和CallableStatement对象,还需传入String类型的SQL语句作为参数。
1.1.5 执行SQL语句并操作结果集
Statement对象提供了3种方法执行SQL语句,其中,execute()方法可以执行任何SQL语句;executeUpdate()方法用于执行DDL语句和DML语句,执行DDL语句时,返回值为0,执行DML语句时,返回值为影响的行数;executeQuery()方法用于执行实现查询功能的SQL语句,返回值是一个结果集(ResultSet对象)。
以executeQuery()方法为例,具体实现代码如下。
ResultSet resultSet = statement.executeQuery(sql);
结果集(ResultSet对象)封装了执行查询SQL语句后返回的结果,程序可以通过遍历结果集获取每一行的数据。ResultSet对象具有指向其当前数据行的指针,在最开始的时候指针被置于第一行之前,可调用ResultSet接口的next()方法将指针移动到下一行,实际应用时常将ResultSet接口的next()方法放在while()循环当中,如果有下一行返回True,遍历继续进行,没有下一行时返回False,遍历结束。
从结果集中获取数据分为两个步骤,首先调用next()、previous()、first()、last()等方法移动指针,其次调用getXxx()方法获取指针指向行的特定列的值。该方法既可以使用列索引作为参数,也可以使用列名称作为参数。使用列索引作为参数性能更好,使用列名称作为参数可读性更好,操作结果集的具体实现代码如下。
while (rs.next()) {
Object object = resultSet.getObject(1);
}
其中,参数“1”表示获取当前指针指向行的第1列的数据,除此之外,getObject()方法的参数名称也可以是String类型的数据表的列名,此时getObject()方法获取该列名对应的数据。
1.1.6 回收数据库资源
为了节省资源,提升性能,包括 Connection、Statement、ResultSet在内的JDBC资源在使用之后要及时关闭。关闭的正确顺序是:先得到的后关闭,后得到的先关闭。回收数据库资源的具体实现代码如下。
resultSet.close();
statement.close();
conn.close();
1.1.7 编写一个JDBC程序
前面的小节讲解了编写JDBC程序的具体步骤,接下来通过一个实例演示JDBC程序的具体实现。
(1)在MySQL中创建数据库chapter01和数据表student,SQL语句如下所示。
DROP DATABASE IF EXISTS chapter01;
CREATE DATABASE chapter01;
USE chapter01;
CREATE TABLE student(
sid INT PRIMARY KEY AUTO_INCREMENT, #ID
sname VARCHAR(20), #学生姓名
age VARCHAR(20), #学生年龄
course VARCHAR(20) #专业
);
(2)向数据表student添加数据,SQL语句如下所示。
INSERT INTO student(sname,age,course) VALUES ('zhangsan','20','Java');
INSERT INTO student(sname,age,course) VALUES ('lisi','21','Java');
INSERT INTO student(sname,age,course) VALUES ('wangwu','22','Java');
INSERT INTO student(sname,age,course) VALUES ('zhaoliu','22','Python');
INSERT INTO student(sname,age,course) VALUES ('sunqi','22','PHP');
INSERT INTO student(sname,age,course) VALUES ('zhangsansan','22','PHP');
(3)通过SQL语句测试数据是否添加成功,执行结果如下所示。
mysql> SELECT * FROM STUDENT;
±----±------------±-----±-------+
| sid | sname | age | course |
±----±------------±-----±-------+
| 1 | zhangsan | 20 | Java |
| 2 | lisi | 21 | Java |
| 3 | wangwu | 22 | Java |
| 4 | zhaoliu | 22 | Python |
| 5 | sunqi | 22 | PHP |
| 6 | zhangsansan | 22 | PHP |
±----±------------±-----±-------+
6 rows in set (0.00 sec)
从以上执行结果可以看出,数据添加成功。
(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包,在该包下新建类TestJDBC01,具体代码如例1-1所示。
【例1-1】 TestJDBC01.java
1 package com.qfedu.jdbc;
2 import java.sql.Connection;
3 import java.sql.DriverManager;
4 import java.sql.ResultSet;
5 import java.sql.Statement;
6 public class TestJDBC01 {
7 public static void main(String[] args) throws Exception {
8 //加载并注册数据库驱动
9 Class.forName(“com.mysql.jdbc.Driver”);
10 String url =“jdbc:mysql://localhost:3306/chapter01”;
11 String username=“root”;
12 String password =“root”;
13 //获取数据库连接
14 Connection conn
15 =DriverManager.getConnection(url,username,password);
16 Statement statement = conn.createStatement();
17 //获取执行者对象
18 String sql = "select * from student where sname =‘zhangsan’ ";
19 //执行SQL语句
20 ResultSet resultSet = statement.executeQuery(sql);
21 System.out.println(“sid|sname|age|course”);
22 //处理结果集
23 while (resultSet.next()) {
24 int sid = resultSet.getInt(“sid”);
25 String sname = resultSet.getString(“sname”);
26 String age = resultSet.getString(“age”);
27 String course = resultSet.getString(“course”);
28 System.out.println(sid+"|"+sname+"|"+age+"|"+course);
29 }
30 //关闭资源
31 resultSet.close();
32 statement.close();
33 conn.close();
34 }
35 }
执行TestJDBC01类,具体执行结果如图1.5所示。
图1.1 执行结果
从以上执行结果可以看出,程序查询出数据表student中的数据并输出到控制台。