2018/11/23 面向对象与多线程综合实验-数据库操作 教师:段鹏飞
实验5-实验目的 理解 JDBC的特点,结构,应用模型; 了解JDBC驱动程序的类型; 掌握通过JDBC访问数据库执行SQL 语句的方法
实验内容 编写程序,实现原来程序中关于用户、文档信息的数据库操作。 要求:编写程序,将前面课程所编写的档案管理系统的数据管理方式改写为数据库存储。(建议将所有数据库操作封装在DataProcessing类中,并保留原来接口,这样可保持原有程序不做大的变化)。
数据库操作示例 import java.sql.*; //导入java.sql包 public class JDBCDemo { public static void main(String[] args) { String strCon = "jdbc:mysql://59.69.101.2:3306/javadb"; //连接字符串 String strUser = "root"; //数据库用户名 String strPwd = "root"; //口令 System.out.println("正在连接数据库..."); try { //监控异常 Class.forName("com.mysql.jdbc.Driver"); //加载驱动程序 Connection con; //获得连接对象 con = DriverManager.getConnection(strCon, strUser, strPwd); System.out.println("成功连接到数据库。"); Statement sta = con.createStatement(); //创建语句对象 //执行SQL语句 String strSql = "DELETE FROM Friends WHERE [Name] = '郑六'"; int count = sta.executeUpdate(strSql); System.out.println("成功删除" + count + "行数据。"); sta.close(); con.close(); //关闭所有已经打开的资源 } catch (ClassNotFoundException cnfe) { cnfe.printStackTrace(); } catch (SQLException sqle) { sqle.printStackTrace(); } } }
操作结果集 使用Statement对象的executeQuery方法成功执行SELECT语句后,将返回一个包含有结果数据的ResultSet对象,要从该对象中获取数据,将使用到如下方法: 方 法 原 型 说 明 boolean next() throws SQLException 将结果集游标往下移动一行,如果已经到达结果集最后,将会返回false,有可能抛异常,必须捕捉 X getX(String columnName) 获得某个字段的值,X是指具体的数据类型,视数据库表中字段的具体情况而定,该方法有一组,并且每个都有两种重载方法,一种是以字段名称为参数,另一种是以字段索引为参数(字段索引从1开始),有可能抛异常,必须捕捉 X getX(int columnIndex)
操作结果集示例 try { String strCon = "jdbc:odbc:MyODBC"; System.out.println("正在连接数据库..."); Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection con; con = DriverManager.getConnection(strCon, "sa", ""); System.out.println("成功连接到数据库。"); Statement sta = con.createStatement(); ResultSet rs = sta.executeQuery("SELECT * FROM Friends"); System.out.println("查询到数据如下:"); while (rs.next()) { //循环将结果集游标往下移动,到达末尾返回false //根据字段名称获得各个字段的值 System.out.print(rs.getString("Name") + "\t"); //获得字符串 System.out.print(rs.getString("Address") + "\t"); //获得字符串 System.out.print(rs.getInt("Telephone") + "\t"); //获得整数 System.out.print(rs.getDate("HireDate") + "\t"); //获得日期型数据 System.out.println(rs.getFloat("Salary")); //获得浮点型数据 } rs.close(); sta.close(); con.close(); } catch (ClassNotFoundException cnfe) { cnfe.printStackTrace(); } catch (SQLException sqle) { sqle.printStackTrace(); }
Sql语句 “select * from [table] where uname=‘”+name+”’ and psw=‘”+psw+”’”; insert into [table] (id, uname, psw) values (1, ‘abc’, ‘123’); update [table] set uname=‘abc’ where id=3; delete from [table] where id=3;
如果要多次执行相似的SQL语句,可以使用PreparedStatemend(预编译语句对象)对象来执行; PreparedStatement接口1 如果要多次执行相似的SQL语句,可以使用PreparedStatemend(预编译语句对象)对象来执行; 通过Connection对象的prepareStatement方法来创建预编译语句对象; PreparedStatement对象会将SQL语句预先编译,这样将会获得比Statement对象更高的执行效率。 方 法 原 型 说 明 PreparedStatement prepareStatement(String sql) throws SQLException 参数sql是要执行的SQL语句,根据指定的SQL语句创建PrepareStatement对象,有可能抛异常,必须捕捉
包含在PreparedStatement对象中的SQL语句可以带有一个或多个参数,使用“?”作为占位符,如: PreparedStatement ps = con.prepareStatement("UPDATE Friends SET Address = ? WHERE Name = ?"); 在执行SQL语句之前,必须使用PreparedStatement对象中的setX方法设置每个“?”位置的参数值; 如: ps.setString(1, "长沙"); ps.setString(2, "王五"); 方 法 原 型 说 明 void setX(int parameterIndex, X x) throws SQLException 将parameterIndex指定的“?”位置指定为x的值,这里X可以指代任意数据类型, “?”的索引从1开始。
PreparedStatement接口3 设置好每个参数的值之后,就可以使用PreparedStatement对象的executeUpdate和executeQuery方法来执行SQL语句,这一点和Statement对象很相似: 方 法 原 型 说 明 int executeUpdate() throws SQLException 用于执行INSERT、DELETE和UPDATE语句,执行成功返回受影响的行数,否则抛出SQLException异常,必须捕捉 ResultSet executQuery() 用于执行SELECT语句,执行成功返回包含有结果数据的ResultSet对象,否则抛出SQLException异常,必须捕捉
PreparedStatement对象示例 String strCon = "jdbc:odbc:MyODBC"; System.out.println("正在连接数据库..."); Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection con; con = DriverManager.getConnection(strCon, "sa", ""); System.out.println("成功连接到数据库。"); PreparedStatement ps; //使用带参数的SQL语句创建PreparedStatement对象 ps = con.prepareStatement("UPDATE Friends SET Address = ? WHERE Name = ?"); //设置SQL语句中的参数值 ps.setString(1, "长沙"); ps.setString(2, "王五"); int count = ps.executeUpdate(); //执行命令 System.out.println("成功更新了" + count + "行数据。"); ps.close(); //关闭资源 con.close();
总结 JDBC是使用Java程序操作数据库的技术; 使用 Class类的forName 方法可以将驱动程序加载到 Java 解释器中; 使用DriverManager类的getConnection方法获得Connection对象,从而建立与数据库的连接; 使用Connection对象的createStatement方法创建语句对象,以便执行SQL语句; 使用Statement对象的executeQuery或executeUpdate方法执行SQL语句,并使用ResultSet对象来操作结果数据; PreparedStatement接口允许创建预编译的SQL语句,并使得在后续阶段可以指定语句的参数。
2018/11/23 谢谢