
2.4 持久层(JDBC)技术
实现持久层的技术是JDBC技术。在Java Web应用程序中,数据库访问是通过Java数据库连接(JDBC)实现的。JDBC为开发人员提供了一个标准的API。
JDBC是一种用于执行SQL语句的Java API,由一组类与接口组成,通过调用这些类和接口所提供的方法,可以使用标准的SQL语言来存取数据库中的数据。
JDBC重要的类和接口如表2-20所示。
表2-20 与数据库有关的几个重要类和接口

在Java Web应用程序开发中,如果要访问数据库,必须先加载数据库厂商提供的数据库驱动程序。这里假设采用MySQL数据库。
需要首先下载MySQL数据库的驱动程序,然后在应用程序中加载该驱动程序。下载地址为:http://dev.mysql.com/downloads/connector。
下载文件为压缩文件mysql-connector-java-5.1.6.zip,双击解压该文件。解压后就可以得到MySQL数据库的驱动程序文件mysql-connector-java-5.1.6-bin。
使用JDBC访问数据库,其访问流程如下。
1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
其中,com.mysql.jdbc.Driver为MySQL数据库驱动程序类名。
2.建立连接(Connection)
1)首先,形成数据库连接的URL。
对于MySQL数据库的连接符号字,可采用如下方式创建。
String url1="jdbc:mysql://数据库服务器IP:3306/数据库名"; String url2="? user=root&password=密码"; String url3="&useUnicode=true&characterEncoding=UTF-8"; String url=url1+url2+ url3;
2)利用连接符号字实现连接,获取连接对象。
Connection conn=DriverManager.getConnection(url);
3.创建数据库操作对象用于执行SQL的语句
有两种不同的数据库操作对象:Statement对象和PrepareStatement对象。两种对象的创建方法和执行SQL是不同的。一般使用PrepareStatement对象。
1)创建Statement对象(createStatement()方法是无参方法)。
Statement stmt=conn.createStatement(); //conn为连接数据库对象
2)创建PrepareStatement对象。
String sql=" "; //SQL语句形成的字符串 PreparedStatement pstmt=conn.preparedStatement(sql); //conn为连接数据库对象
注意:在SQL语句串中,可以使用参数定位符(“? ”),在创建PrepareStatement对象后,利用setXxxx()方法设置实际参数值。
如下面的代码所示。
String ss="select * from stu_info where age>=? and sex=? "; //注意,占位符的序号从1开始的 PreparedStatement pstmt= conn.preparedStatement(ss); pstmt.setInt(1,20); //给第1个占位符设置值,注意类型 pstmt.setSting(2, "男"); //给第2个占位符设置值,注意类型
4.执行语句
有两种执行SQL语句的方法。
● 执行查询语句:执行select语句,返回一个结果集。
其语句为:ResultSet executeQuery(String sql)或ResultSet executeQuery()。
● 执行update、insert、delete,返回一个整数,表示执行SQL影响的数据行数。
其语句为:int executeUpdate(String sql)或int executeUpdate()。
5.处理执行结果(ResultSet)
ResultSet实例具有指向其当前数据行的指针。最初,指针指向第一行记录的前方,通过next()方法可以将指针移动到下一行,当没有下一行时将返回false。
移到指定的数据行后,再使用一组getXxx()方法读取各字段的数据。其中Xxx指的是Java的数据类型。
这些getXxx()方法的参数有两种格式,一是用整数指定字段的索引(索引从1开始),二是用字段名来指定字段。
例如,假设数据表为stu,其中的字段是xh(学号,字符串)、name(姓名,字符串)和cj(成绩,整型),并且查询结果集为rs,则获取当前记录的各字段的值代码如下。
String sql="select xh, name, cj from stu"; ResultSet rs=stmt.executeQuery(sql); //这里假设采用Statement对象执行SQL语句 String student_xh=rs.getString(1); //或String student_xh=rs.getString("xh"); int student_cj=rs.getInt(3); //或int student_cj=rs.getInt("cj"); String student_name=rs. getString(2); //或String student_name=rs. getString("name");
6.释放资源
假设建立的对象依次为:连接对象为conn(Connection conn),操作对象为pstmt(PreparedStatement pstmt),得到的查询结果集对象为rs(RrsultSet rs),则需要依次关闭的对象是:rs.close(); stmt.close(); con.close();
具体应用将在2.5节的应用案例中给出。