1 加载JDBC驱动程序
在连接数据库之前,先要加载相关数据库厂商提供的JDBC驱动类到JVM(Java虚拟机)。在Java Web开发中将厂商驱动包复制到Web项目的WEB-INF/lib下。
在代码模板中通过java.lang.Class类的静态方法forName(String className)实现加载JDBC驱动。如果系统中不存在给定的驱动类,则会引发ClassNotFoundException类型的异常。
MySQL 驱动包下载(5.7版本):
SqlServer驱动包下载(适用2008版本):
加载JDBC驱动程序的代码为:
| try { Class.forName("JDBC驱动类的名称"); } catch (ClassNotFoundException e) { System.out.println("JDBC驱动类未找到!"); e.printStackTrace(); } |
2 创建数据库的连接
java.sql.DriverManager(驱动程序管理器)类是JDBC的管理层,负责建立和管理数据库连接。使用DriverManager类的getConnection(String url,String user,Stringpassword)方法建立与数据库的连接,此方法有3个入口参数,依次为要连接数据库的URL、用户名和密码,该方法的返回值类型为java.sql.Connection。
【例3.26】使用JDBC API建立与本地MySQL中messageboard数据库的连接。
| String url="jdbc:mysql://localhost:3306/messageboard"; String username="sa"; String password="123456"; try{ Connection con=DriverManager.getConnection(url, username , password); }catch(SQLException e){ System.out.println("数据库连接失败!"); e.printStackTrace(); } |
3 创建Statement实例
建立数据库连接的目的是与数据库进行通信,主要通过执行SQL语句方式进行通信。要执行SQL语句,先要通过上面步骤生成的Connection实例创建java.sql.Statement实例。常用的Statement实例有以下类型:
Statement实例:该类型的实例只能用来执行静态的SQL语句,具体实现代码为:
| Statement stmt=con.createStatement(); |
PreparedStatement实例:该类型的实例增加了执行动态SQL语句的功能。动态SQL语句就是可以在SQL语句中提供参数,这样可以大大提高程序的灵活性和执行效率。
| PreparedStatement pstmt=con.prepareStatement("select * from persons where City=?"); |
CallableStatement实例:该类型的实例增加了执行数据库存储过程的功能。
| CallableStatement cstmt=con.prepareCall("{CALL demoSp(?,?)}"); |
以上三种类型中Statement是最基本的,PreparedStatement继承了Statement,并做了相应的扩展,而CallableStatement又继承PreparedStatement,继续进行了扩展,从而实现各自不同的功能。
4 执行SQL语句
Statement接口中包含很多基本的数据库操作方法,下面是执行SQL语句的三个方法:
int executeUpdate(String sql):可以执行插入、删除、更新等操作,返回值是执行该操作所影响的行数。
boolean execute(String sql):这是一个最为一般的执行方法,可以执行任意SQL语句,然后获得一个布尔值,表示是否返回ResultSet。
ResultSet executeQuery(String sql):可以执行SQL查询并获取到ResultSet对象。
说明:在实际开发过程中,如果涉及到向SQL语句传递参数,最好使用PreparedStatement接口进行实现。PreparedStatement接口直接继承并重载了Statement接口的方法,该接口用于执行动态的SQL语句。PreparedStatement提供了3个执行方法:int executeUpdate()、boolean execute()和ResultSetexecuteQuery(),这3个方法的功能与对应的Statement接口相同,它们的区别是PreparedStatement的这3个方法中均不带任何参数。
5 处理结果
执行SQL语句的结果可能会出现如下两种情况:
执行executeUpdate方法,返回的是本次操作影响到的记录数。
执行executeQuery方法,返回的结果是一个ResultSet对象。
比较复杂的是第二种情况,返回的ResultSet对象包含符合SQL语句中条件的所有行,一般通过ResultSet对象的next()方法获取当前数据行,并通过一套getXxx方法提供了对这些行中数据的访问。
常用的getXxx()方法有:getString()、getInt()、getShort()、getLong()、getByte()、getFloat()、getDouble()、getBoolean()、getDate()、getTime()和getTimestamp()。
ResultSet对象具有指向其当前数据行的游标(cursor,也称为记录指针),最初它被置于第一行之前。next()方法将游标移动到下一行,使其成为当前行,当ResultSet对象中没有下一行时返回false,因而可以在while循环中使用它来迭代结果集。
【例3.27】处理查询messageboard数据库中message表的结果。
| List list = new ArrayList(); while(rs.next()) { Message message = new Message(); message.setId(rs.getInt("id")); //将列数据设置为message对象的属性 message.setMessage(rs.getString("message")); message.setAuthor(rs.getString("author")); message.setPostTime(rs.getString(4)); //参数4代表数据行的第4列 list.add(message); //将具有初始值的message对象添加到list集合对象中 } |
6 释放资源
在建立Connection、Statement(或PreparedStatement)和ResultSet实例时,均需占用一定的数据库和JDBC资源,所以每次访问数据库结束后,应该及时销毁这些实例,释放它们占用的所有资源,这个可以通过各实例的close()方法完成,关闭的顺序是声明顺序的反序:
(1)关闭ResultSet实例。
(2)关闭Statement(或PreparedStatement)实例。
(3)关闭Connection实例。
具体实现代码如下:
| /* 如果rs不空,关闭rs */ if(rs != null){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } /* 如果pstmt不空,关闭pstmt */ if(pstmt != null){ try { pstmt.close(); } catch (SQLException e) { e.printStackTrace(); } } /* 如果conn不空,关闭conn */ if(conn != null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } |
MySQL 驱动包下载(MySQL5版本):
MySQL 驱动包下载(MySQL8版本):
SqlServer驱动包下载(适用2008版本):
网络留言板数据库下载:
| 实训任务单 |
| 任务名称 | 读代码写连接数据库步骤 |
| 训练要点 | 掌握使用JDBC的方式连接数据库的步骤 |
| 需求说明 | 请在下列给定的代码上标示出连接数据库的六个步骤。 <% Connection con = null; Statement stmt = null; ResultSet rs = null; try { Class.forName("com.mysql.jdbc.Driver"); con = DriverManager.getConnection("jdbc:mysql://localhost:3306/messageboard", "root", "123456"); stmt = con.createStatement(); rs = stmt.executeQuery("select * from message"); while (rs.next()) { %> 作者:<%=rs.getString("author")%><br> <%=rs.getString("message")%><br> 发表时间:<%=rs.getString("posttime")%><hr> <% } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } finally { if (rs != null) rs.close(); if (stmt != null) stmt.close(); if (con != null) con.close(); } %> |
| 完成人 |
| 完成时间 |
|
| 实训步骤 |
|