240 likes | 433 Views
《 Java 面向对象程序设计 》 第14章. JDBC 数据库操作. 配合< Java 面向对象程序设计 > 例子源代码一起使用. Power point 制作:耿祥义 张跃平. 导读. 主要内容 JDBC 连接数据库 查询操作 更新、添加与删除操作 查询 Excel 电子表格 使用预处理语句 事务 难点 使用预处理语句 事务. 本章将学习怎样使用 Java 提供的 JDBC 技术操作数据库 。. 建立一个名字为 factory 的数据库。操作步骤如下:
E N D
《Java面向对象程序设计》第14章 JDBC 数据库操作 配合< Java面向对象程序设计>例子源代码一起使用 Power point 制作:耿祥义 张跃平 1
导读 • 主要内容 • JDBC • 连接数据库 • 查询操作 • 更新、添加与删除操作 • 查询Excel电子表格 • 使用预处理语句 • 事务 • 难点 • 使用预处理语句 • 事务 本章将学习怎样使用Java提供的JDBC技术操作数据库 。 2
建立一个名字为factory的数据库。操作步骤如下: 单击“开始”→“所有程序”→“Microsoft Access”,在新建数据库界面选择“空Access数据库”,然后命名、保存新建的数据库,在这里我们命名的数据库是factory,保存在C:\chapter14中。 §14.1 Microsoft Access 数据库管理系统 §14.1.1 建立数据库 3
在factory管理的“表”的界面上选择“使用设计器创建表”,然后单击界面上的“设计”菜单,将出现相应的建表界面,我们建立的表是employee,该表的字段(属性)为:number(文本) name(文本) birthday(日期) salary(数字,双精度)。 其中,“number”字段为主键 。 在factory管理的“表”的界面上,用鼠标双击已创建的表可以为该表添加记录。 §14.1.2 创建表 4
JDBC(Java DataBase Connection)是Java数据库连接API。简单地说,JDBC能完成3件事: 与一个数据库建立连接。 向数据库发送SQL语句。 处理数据库返回的结果。 §14.2 JDBC 5
和数据库建立连接的常用两种方式是:建立JDBC─ODBC桥接器和加载纯Java数据库驱动程序。使用JDBC─ODBC桥接器方式的机制是,应用程序只需建立JDBC和ODBC之间的连接,即所谓的建立JDBC─ODBC桥接器,而和数据库的连接由ODBC去完成。 使用JDBC─ODBC桥接器连接数据库的3个步骤 建立JDBC-ODBC桥接器 建ODBC数据源 和ODBC数据源建立连接 §14.3 连接数据库 §14.3.1连接方式的选择 6
JDBC使用java.lang包中的Class类建立JDBC-ODBC桥接器。建立桥接器时可能发生异常,必须捕获这个异常,建立桥接器的代码是:JDBC使用java.lang包中的Class类建立JDBC-ODBC桥接器。建立桥接器时可能发生异常,必须捕获这个异常,建立桥接器的代码是: try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); } catch(ClassNotFoundException e) { System.out.println(e); } §14.3.2 建立JDBC-ODBC桥接器 7
1.创建、修改或删除数据源 选择“控制面板”→“管理工具”→“ODBC数据源”(某些window/xp系统,需选择“控制面板”→“性能和维护”→“管理工具”→“ODBC数据源”)。 双击ODBC数据源图标,出现的界面显示了用户已有的数据源的名称。选择“系统DSN”或“用户DSN”,单击“添加”按钮,可以创建新的数据源;单击“配置”按钮,可以重新配置已有的数据源;单击“删除”按钮,可以删除已有的数据源。 2.为数据源选择驱动程序 因为要访问Access数据库,选择Microsoft Acess Driver(*.mdb)。 3.数据源名称及对应数据库的所在位置 在名称栏里为数据源起一个自己喜欢的名字,这里我们起的名字是star。这个数据源就是指某个数据库。在“数据库选择”栏中选择一个数据库,这里我们选择的是C:\chapter14下的factory.mdb数据库。 §14.3.3 ODBC数据源 8
编写连接数据库代码不会出现数据库的名称,只能出现数据源的名字。 首先使用java.sql包中的Connection类声明一个对象,然后再使用类DriverManager调用它的静态方法getConnection创建这个连接对象,建立连接时应捕获SQLException异常 : try{ Connection con=DriverManager.getConnection(“jdbc:odbc:数据源名字”, "login name", " password "); } catch(SQLException e){} 例题14-1 §14.3.4 建立连接 9
对一个数据库中表进行查询操作的具体步骤如下。对一个数据库中表进行查询操作的具体步骤如下。 1.向数据库发送SQL查询语句 try{ Statement sql=con.createStatement(); } catch(SQLException e ){} 2.处理查询结果 ResultSet rs=sql.executeQuery("SELECT * FROM employee"); 表14.1给了出了ResultSet对象的若干方法。 §14.4 查询操作 10
通过使用JDBC提供的API,可以在查询之前知道表中的字段的个数和名字,步骤如下:通过使用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.1 顺序查询 11
需要在结果集中前后移动、显示结果集指定的一条记录或随机显示若干条记录等。这时,必须要返回一个可滚动的结果集。为了得到一个可滚动的结果集,需使用下述方法先获得一个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():得到当前游标所指行的行号.0 public boolean absolute(int row):将游标移到参数row指定的行号。例题14-3 §14.4.2 随机查询 12
在下面的例子4中QueryByNumber和QueryBySalary是例子2中Query类的子类,二者分别能按雇员号和薪水查询记录。主类将查询条件传递QueryByNumber和QueryBySalary类的实例。 例题14-3 §14.4.3 条件查询 13
可以在SQL语句中使用ORDER BY子语句,对记录排序 。 按薪水排序查询的SQL语句: SELECT * FROM employee ORDER BY salary 例题14-5 §14.4.4 排序查询 14
可以用SQL语句操作符LIKE进行模式般配,使用“%”代替0个或多个字符,用一个下划线“_”代替1个字符。下述语句查询姓氏是“张”或“李”的记录: rs=sql.executeQuery(“SELECT * FROM students WHERE 姓名LIKE ‘[张李]%’”); 例题14-6 §14.4.5 模糊查询 15
Statement对象调用方法: public int executeUpdate(String sqlStatement); 通过参数sqlStatement指定的方式实现对数据库表中记录的更新、添加和删除操作。 更新、添加和删除记录的SQL语法分别是: ◆ UPDATE <表名> SET <字段名> = 新值 WHERE <条件子句> ◆INSERT INTO 表(字段列表) VALUES (对应的具体的记录)或INSERT INTO 表(VALUES (对应的具体的记录) ◆ DELETE FROM <表名> WHERE <条件子句> 例题14-7 §14.5 更新、添加与删除操作 16
访问Exel电子表格和访问其它的数据库有所不同,假设有电子表格Goods.xls,见图14.17。 连接Excel电子表格的步骤如下。 1.设置表 必须在电子表格中选出一工作区作为连接时使用的表。 2.设置数据源 为数据源选择的驱动程序必须是:Microsoft Excel Driver。 例题14-8 §14.6 查询Excel电子表格 17
Java提供了更高效率的数据库操作机制,就是PreparedStatement对象,该对象被习惯地称作预处理语句对象。 §14.7 使用预处理语句 18
预处理不仅减轻了数据库的负担,而且也提高了访问数据库的速度。预处理不仅减轻了数据库的负担,而且也提高了访问数据库的速度。 对于JDBC,如果使用Connection和某个数据库建立了连接对象con,那么con就可以调用prepareStatement(String sql)方法对参数sql指定的SQL语句进行预编译处理,生成该数据库地层的内部命令,并将该命令封装在PreparedStatement对象中,那么该对象调用下列方法都可以使得该地层内部命令被数据库执行 ResultSet executeQuery() ; boolean execute(); int executeUpdate(); 只要编译好了PreparedStatement对象,那么该对象可以随时地执行上述方法,显然提高了访问数据库的速度。 例题14-9 §14.7.1 预处理语句优点 19
在对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.7.2 使用统配符 20
事务由一组SQL语句组成,所谓事务处理是指:应用程序保证事务中的SQL语句要么全部都执行,要么一个都不执行。 事务处理是保证数据库中数据完整性与一致性的重要机制。 §14.8 事务 §14.8.1 事务及处理 21
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.8.2 JDBC事务处理步骤 22
com.sun.rowset包提供了CachedRowSetImpl类,该类实现了CachedRowSet接口。CachedRowSetImpl对象可以保存ResultSet对象中的数据,而且CachedRowSetImpl对象不依赖Connnection对象,这意味着一旦把ResultSet对象中的数据保存到CachedRowSetImpl对象中后,就可以关闭和数据库的连接。com.sun.rowset包提供了CachedRowSetImpl类,该类实现了CachedRowSet接口。CachedRowSetImpl对象可以保存ResultSet对象中的数据,而且CachedRowSetImpl对象不依赖Connnection对象,这意味着一旦把ResultSet对象中的数据保存到CachedRowSetImpl对象中后,就可以关闭和数据库的连接。 将ResultSet对象rs中的数据保存到CachedRowSetImpl对象rowSet中的代码如下: rowSet.populate(rs); 例题14-12 §14.9 CachedRowSetImpl类 23
1.JDBC技术在数据库开发中占有很重要的地位,JDBC操作不同的数据库仅仅是连接方式上的差异而已,使用JDBC的应用程序一旦和数据库建立连接,就可以使用JDBC提供的API操作数据库。1.JDBC技术在数据库开发中占有很重要的地位,JDBC操作不同的数据库仅仅是连接方式上的差异而已,使用JDBC的应用程序一旦和数据库建立连接,就可以使用JDBC提供的API操作数据库。 2. JDBC和数据库建立连接有两种常用方式:建立JDBC─ODBC桥接器和加载纯Java数据库驱动程序,无论使用哪种方式连接数据库,都不会影响操作数据库的逻辑代码。 3.当查询ResultSet对象中的数据时,不可以关闭和数据库的连接,除非使用CachedRowSetImpl类,使用CachedRowSetImpl类可以节约数据库的连接数目。 4.使用PreparedStatement对象可以提高操作数据库的效率。 §14. 10 小结 24