java面向对象程序设计第2版第14章-jdbc数据库操作.ppt
Java面向对象程序设计第2版第14章,配合第2版 例子源代码一起使用,Power point 制作:耿祥义 张跃平,JDBC 数据库操作,主要内容JDBC连接数据库查询操作更新、添加与删除操作查询Excel电子表格使用预处理语句事务难点使用预处理语句事务,导读,本章将学习怎样使用Java提供的JDBC技术操作数据库。,14.1 Microsoft Access 数据库管理系统 14.1.1 建立数据库,建立一个名字为factory的数据库。操作步骤如下:单击“开始”“所有程序”“Microsoft Access”,在新建数据库界面选择“空Access数据库”,然后命名、保存新建的数据库,在这里我们命名的数据库是factory,保存在C:chapter14中。,14.1.2 创建表,在factory管理的“表”的界面上选择“使用设计器创建表”,然后单击界面上的“设计”菜单,将出现相应的建表界面,我们建立的表是employee,该表的字段(属性)为:number(文本)name(文本)birthday(日期)salary(数字,双精度)。其中,“number”字段为主键。在factory管理的“表”的界面上,用鼠标双击已创建的表可以为该表添加记录。,14.2 JDBC,JDBC(Java DataBase Connection)是Java数据库连接API。简单地说,JDBC能完成3件事:与一个数据库建立连接。向数据库发送SQL语句。处理数据库返回的结果。,14.3 连接数据库 连接方式的选择,和数据库建立连接的常用两种方式是:建立JDBCODBC桥接器和加载纯Java数据库驱动程序。使用JDBCODBC桥接器方式的机制是,应用程序只需建立JDBC和ODBC之间的连接,即所谓的建立JDBCODBC桥接器,而和数据库的连接由ODBC去完成。,使用JDBCODBC桥接器连接数据库的3个步骤建立JDBC-ODBC桥接器建ODBC数据源和ODBC数据源建立连接,14.3.2 建立JDBC-ODBC桥接器,JDBC使用java.lang包中的Class类建立JDBC-ODBC桥接器。建立桥接器时可能发生异常,必须捕获这个异常,建立桥接器的代码是:try Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);catch(ClassNotFoundException e)System.out.println(e);,14.3.3 ODBC数据源,1创建、修改或删除数据源 选择“控制面板”“管理工具”“ODBC数据源”(某些window/xp系统,需选择“控制面板”“性能和维护”“管理工具”“ODBC数据源”)。双击ODBC数据源图标,出现的界面显示了用户已有的数据源的名称。选择“系统DSN”或“用户DSN”,单击“添加”按钮,可以创建新的数据源;单击“配置”按钮,可以重新配置已有的数据源;单击“删除”按钮,可以删除已有的数据源。2为数据源选择驱动程序 因为要访问Access数据库,选择Microsoft Acess Driver(*.mdb)。3数据源名称及对应数据库的所在位置 在名称栏里为数据源起一个自己喜欢的名字,这里我们起的名字是star。这个数据源就是指某个数据库。在“数据库选择”栏中选择一个数据库,这里我们选择的是C:chapter14下的factory.mdb数据库。,14.3.4 建立连接,编写连接数据库代码不会出现数据库的名称,只能出现数据源的名字。首先使用java.sql包中的Connection类声明一个对象,然后再使用类DriverManager调用它的静态方法getConnection创建这个连接对象,建立连接时应捕获SQLException异常:try Connection con=DriverManager.getConnection(“jdbc:odbc:数据源名字”,login name,password);catch(SQLException e)例题14-1,14.4 查询操作,对一个数据库中表进行查询操作的具体步骤如下。1向数据库发送SQL查询语句 try Statement sql=con.createStatement();catch(SQLException e)2处理查询结果 ResultSet rs=sql.executeQuery(SELECT*FROM employee);表14.1给了出了ResultSet对象的若干方法。,14.4.1 顺序查询,通过使用JDBC提供的API,可以在查询之前知道表中的字段的个数和名字,步骤如下:1.连接对象con调用getMetaData()方法可以返回一个DatabaseMetaData对象,例如:DatabaseMetaData metadata=con.getMetaData();2.Metadata对象再调用getColumns可以将表的字段信息以行列的形式存储在一个ResultSet对象中,例如:ResultSet tableMessage=metadata.getColumns(null,null,employee,null);3.tableMessage对象调用next方法使游标向下移动一行(游标的初始位置在第1行之前),然后tableMessage调用getXXX方法可以查看该行中列的信息,其中最重要的信息是第4列,该列上的信息为字段的名字。例题14-2,14.4.2 随机查询,需要在结果集中前后移动、显示结果集指定的一条记录或随机显示若干条记录等。这时,必须要返回一个可滚动的结果集。为了得到一个可滚动的结果集,需使用下述方法先获得一个Statement对象:Statement stmt=con.createStatement(int type,int concurrency);然后,根据参数的type、concurrency的取值情况,stmt返回相应类型的结果集:ResultSet re=stmt.executeQuery(SQL语句);滚动查询经常用到ResultSet的下述方法:public boolean previous():将游标向上移动public void beforeFirst():将游标移动到结果集的初始位置。public void afterLast():将游标移到结果集最后一行之后。public void first():将游标移到结果集的第一行。public void last():将游标移到结果集的最后一行。public boolean isAfterLast():判断游标是否在最后一行之后。public boolean isBeforeFirst():判断游标是否在第一行之前public boolean ifFirst():判断游标是否指向结果集的第一行。public boolean isLast():判断游标是否指向结果集的最后一行。public int getRow():得到当前游标所指行的行号.0public boolean absolute(int row):将游标移到参数row指定的行号。例题14-3,14.4.3 条件查询,在下面的例子4中QueryByNumber和QueryBySalary是例子2中Query类的子类,二者分别能按雇员号和薪水查询记录。主类将查询条件传递QueryByNumber和QueryBySalary类的实例。例题14-3,14.4.4 排序查询,可以在SQL语句中使用ORDER BY子语句,对记录排序。按薪水排序查询的SQL语句:SELECT*FROM employee ORDER BY salary 例题14-5,14.4.5 模糊查询,可以用SQL语句操作符LIKE进行模式般配,使用“%”代替0个或多个字符,用一个下划线“_”代替1个字符。下述语句查询姓氏是“张”或“李”的记录:rs=sql.executeQuery(“SELECT*FROM students WHERE 姓名 LIKE 张李%”);例题14-6,14.5 更新、添加与删除操作,Statement对象调用方法:public int executeUpdate(String sqlStatement);通过参数sqlStatement指定的方式实现对数据库表中记录的更新、添加和删除操作。更新、添加和删除记录的SQL语法分别是:UPDATE SET=新值 WHERE INSERT INTO 表(字段列表)VALUES(对应的具体的记录)或INSERT INTO 表(VALUES(对应的具体的记录)DELETE FROM WHERE 例题14-7,14.6 查询Excel电子表格,访问Exel电子表格和访问其它的数据库有所不同,假设有电子表格Goods.xls,见图14.17。连接Excel电子表格的步骤如下。1设置表 必须在电子表格中选出一工作区作为连接时使用的表。2设置数据源 为数据源选择的驱动程序必须是:Microsoft Excel Driver。例题14-8,14.7 使用预处理语句,Java提供了更高效率的数据库操作机制,就是PreparedStatement对象,该对象被习惯地称作预处理语句对象。,14.7.1 预处理语句优点,预处理不仅减轻了数据库的负担,而且也提高了访问数据库的速度。对于JDBC,如果使用Connection和某个数据库建立了连接对象con,那么con就可以调用prepareStatement(String sql)方法对参数sql指定的SQL语句进行预编译处理,生成该数据库地层的内部命令,并将该命令封装在PreparedStatement对象中,那么该对象调用下列方法都可以使得该地层内部命令被数据库执行 ResultSet executeQuery();boolean execute();int executeUpdate();只要编译好了PreparedStatement对象,那么该对象可以随时地执行上述方法,显然提高了访问数据库的速度。例题14-9,14.7.2 使用统配符,在对SQL进行预处理时可以使用统配符“?”来代替字段的值,只要在预处理语句执行之前再设置统配符所表示的具体值即可。例如:sql=con.prepareStatement(SELECT*FROM employee WHERE salary?);那么在sql对象执行之前,必须调用相应的方法设置统配符“?”代表的具体值,比如:sql.setFloat(1,2389);指定上述预处理SQL语句中统配符“?”代表的值是2389 预处理语句设置统配符“?”的值的常用方法有:void setDate(int parameterIndex,Date x)void setDouble(int parameterIndex,double x)void setFloat(int parameterIndex,float x)void setInt(int parameterIndex,int x)void setLong(int parameterIndex,long x)void setString(int parameterIndex,String x)例题14-10,14.8 事务 14.8.1 事务及处理,事务由一组SQL语句组成,所谓事务处理是指:应用程序保证事务中的SQL语句要么全部都执行,要么一个都不执行。事务处理是保证数据库中数据完整性与一致性的重要机制。,14.8.2 JDBC事务处理步骤,1使用setAutoCommit(boolean autoCommit)方法 和数据库建立一个连接对象后,比如con。那么con的提交模式是自动提交模式,为了能进行事务处理,必须关闭con的这个默认设置。con.setAutoCommit(false);2使用commit()方法 连接对象con调用commit()方法就是让事务中的SQL语句全部生效。3使用rollback()方法 con调用rollback()方法的作用是撤消事务中成功执行过的SQL语句对数据库数据所做的更新、插入或删除操作,即撤消引起数据发生变化的SQL语句操作,将数据库中的数据恢复到commi()方法执行之前的状态。例题14-11,14.9 CachedRowSetImpl类,包提供了CachedRowSetImpl类,该类实现了CachedRowSet接口。CachedRowSetImpl对象可以保存ResultSet对象中的数据,而且CachedRowSetImpl对象不依赖Connnection对象,这意味着一旦把ResultSet对象中的数据保存到CachedRowSetImpl对象中后,就可以关闭和数据库的连接。将ResultSet对象rs中的数据保存到CachedRowSetImpl对象rowSet中的代码如下:rowSet.populate(rs);例题14-12,14.10 Java的Derby内置数据库,JDK 1.6版本及之后的版本为Java平台提供了一个内置的数据库管理系统,简称Derby数据库。应用程序内嵌数据库的特点是应用程序在其自身的代码中创建所需要的数据库,并使用该数据库。应用程序连接Derby数据库的步骤如下:1将Java安装目录dblib下的derby.jar复制到Java运行环境的扩展中,即将该jar文件存放在JDK安装目录的jrelibext文件夹中。2加载Derby数据库驱动程序:加载Derby数据库驱动程序的代码是:Class.forName(org.apache.derby.jdbc.EmbeddedDriver).newInstance();其中的包是derby.jar提供的,该包中的EmbeddedDriver类负责创建驱动数据的实例.加载Derby数据库驱动程序需要捕获ClassNotFoundException、InstantiationException、IllegalAccessException和SQLException异常。3创建并连接数据库或连接已有的数据库:创建名字是student的数据库,并与其建立连接(create取值是true)的代码是:Connection con=DriverManager.getConnection(jdbc:derby:helloDB;create=true);和连接已有的名字是hello数据库建立连接(create取值是false)的代码是:Connection con=DriverManager.getConnection(jdbc:derby:hello;create=false);当应用程序创建数据库库之后,比如名字是student的数据库,运行环境会在当前应用程序所在目录下建立名字是student的子目录,该子目录下存放着和该数据库相关的配置文件。,例题14-13,例13使用了Derby数据库管理系统创建了名字是student的数据库,并在数据库中建立了名字是chengji表,向该表插入了三条记录,并查询了chengji表中的记录。,14.11 小结,1JDBC技术在数据库开发中占有很重要的地位,JDBC操作不同的数据库仅仅是连接方式上的差异而已,使用JDBC的应用程序一旦和数据库建立连接,就可以使用JDBC提供的API操作数据库。2 JDBC和数据库建立连接有两种常用方式:建立JDBCODBC桥接器和加载纯Java数据库驱动程序,无论使用哪种方式连接数据库,都不会影响操作数据库的逻辑代码。3当查询ResultSet对象中的数据时,不可以关闭和数据库的连接,除非使用CachedRowSetImpl类,使用CachedRowSetImpl类可以节约数据库的连接数目。4使用PreparedStatement对象可以提高操作数据库的效率。,