1、注意:开始用功了注意:开始用功了!Java 基础教程(第基础教程(第3版)版)第第10章章配合例子源代码一起使用例子源代码一起使用Power point 制作:耿祥义 张跃平JDBC数据库操作数据库操作 主要内容主要内容10.1 Microsoft Access Microsoft Access 数据库管理系统数据库管理系统 10.1.1 建立数据库建立数据库 建立一个名字为建立一个名字为shopshop的数据库。的数据库。操作步骤如下:操作步骤如下:单击单击“开始开始”“”“所有程所有程序序”“”“Microsoft Access”Microsoft Access”,在 新 建 数 据 库
2、界 面 选 择在 新 建 数 据 库 界 面 选 择“空空AccessAccess数据库数据库”,然后命名、保,然后命名、保存新建的数据库,在这里我们命存新建的数据库,在这里我们命名 的 数 据 库 是名 的 数 据 库 是 s h o ps h o p,保 存 在保 存 在C:ch10C:ch10中。中。10.1.2 创建表创建表 在在shopshop数据库中创建名字为数据库中创建名字为goodsgoods的表。在的表。在shopshop管管理的理的“表表”的界面上选择的界面上选择“使用设计器创建表使用设计器创建表”,然后,然后单击界面上的单击界面上的“设计设计”菜单,将出现相应的建表界面,
3、菜单,将出现相应的建表界面,我们建立的表是我们建立的表是goodsgoods,该表的字段该表的字段(属性属性)为:为:number(文本文本)name(文本文本)madeTime(日期日期)price(数字,双精度数字,双精度)。在在shop管理的管理的“表表”的界面上,用鼠标双击已创建的界面上,用鼠标双击已创建的表可以为该表添加记录的表可以为该表添加记录。10.2 JDBCJDBC Java提供了专门用于操作数据库的API,即JDBC(Java DataBase Connection)。JDBC操作不同的数据库仅仅是连接方式上的差异而已,使用JDBC的应用程序一旦和数据库建立连接,就可以使用
4、JDBC提供的API操作数据库.程序经常使JDBC进行如下的操作:(1)与一个数据库建立连接。与一个数据库建立连接。(2)向数据库发送向数据库发送SQL语句。语句。(3)处理数据库返回的结果。处理数据库返回的结果。10.3 连接数据库连接数据库 10.3.1 连接方式的选择连接方式的选择 和数据库建立连接的常用两种方式是:建立和数据库建立连接的常用两种方式是:建立JDBCODBCJDBCODBC桥接桥接器和加载纯器和加载纯JavaJava数据库驱动程序:数据库驱动程序:使用使用JDBCODBCJDBCODBC桥接器方式的机制是,应用程序只需建立桥接器方式的机制是,应用程序只需建立JDBCJDB
5、C和和ODBCODBC之间的连接,即所谓的建立之间的连接,即所谓的建立JDBCODBCJDBCODBC桥接器,而和数据库桥接器,而和数据库的连接由的连接由ODBCODBC去完成。去完成。如果使用纯如果使用纯JavaJava数据库驱动程序连接数据库需要得到数据库厂商数据库驱动程序连接数据库需要得到数据库厂商提供的纯提供的纯JavaJava数据库驱动程序。数据库驱动程序。使用使用JDBCODBC桥接器连接数据库的优点:桥接器连接数据库的优点:使得所编写的程序可以处理几乎所有类型的数据库。使用使用JDBCODBCJDBCODBC桥接器连接数据库的缺点:桥接器连接数据库的缺点:使得所编写的程序依赖于O
6、DBC,移植性差。使用纯使用纯Java数据库驱动程序连接数据库的优点:数据库驱动程序连接数据库的优点:移植性好,不依赖平台。缺点是不同的数据库需要不同的驱动程序。10.3 连接数据库连接数据库 使用使用JDBCODBCJDBCODBC桥接器连接数据库桥接器连接数据库 使用使用JDBCODBC桥接器连接数据库的桥接器连接数据库的3个步骤个步骤(1)建ODBC数据源(2)建立JDBC-ODBC桥接器(3)和ODBC数据源建立连接10.3.2 ODBCODBC数据源数据源 1 1创建、修改或删除数据源创建、修改或删除数据源 选择选择“控制面板控制面板”“”“管理工具管理工具”“”“ODBCODBC数
7、据源数据源”(某些(某些windows xpwindows xp系统,需选择系统,需选择“控制面板控制面板”“”“性能和维护性能和维护”“”“管管理工具理工具”“”“ODBCODBC数据源数据源”)。)。双击双击ODBCODBC数据源图标,出现的界面显示了用户已有的数据源的数据源图标,出现的界面显示了用户已有的数据源的名称。选择名称。选择“系统系统DSN”DSN”或或“用户用户DSN”DSN”,单击单击“添加添加”按钮,可按钮,可以创建新的数据源;单击以创建新的数据源;单击“配置配置”按钮,可以重新配置已有的数按钮,可以重新配置已有的数据源;单击据源;单击“删除删除”按钮,可以删除已有的数据源
8、。按钮,可以删除已有的数据源。2 2为数据源选择驱动程序为数据源选择驱动程序 因为要访问因为要访问AccessAccess数据库数据库,选择选择Microsoft Acess DriverMicrosoft Acess Driver(*.mdb.mdb)。3 3数据源名称及对应数据库的所在位置数据源名称及对应数据库的所在位置 在在名称栏名称栏里为数据源起一个自己喜欢的名字,这里我们起的里为数据源起一个自己喜欢的名字,这里我们起的名字是名字是myData。这个数据源就是指某个数据库。在这个数据源就是指某个数据库。在“数据库选数据库选择择”栏中选择一个数据库,这里我们选择的是栏中选择一个数据库,这
9、里我们选择的是C:ch10下的下的shop.mdb数据库。数据库。10.3.2 ODBCODBC数据源数据源_ _图示图示 10.3.3 建立建立JDBC-ODBCJDBC-ODBC桥接器桥接器 JDBC使用使用java.lang包中的包中的Class类建立类建立JDBC-ODBC桥接器。建立桥接器时可能发生异常,必须捕获桥接器。建立桥接器时可能发生异常,必须捕获这个异常,建立桥接器的代码是:这个异常,建立桥接器的代码是:try);catch(ClassNotFoundException e)System.out.println(e);10.3.4 建立连接建立连接 编写连接数据库代码不会出现
10、数据库的名称,只能出现数编写连接数据库代码不会出现数据库的名称,只能出现数据源的名字。据源的名字。首先使用首先使用java.sqljava.sql包中的包中的ConnectionConnection类类声明一个对象,然后声明一个对象,然后再使用类再使用类DriverManagerDriverManager调用它的静态方法调用它的静态方法getConnectiongetConnection创建这创建这个连接对象,个连接对象,建立连接时应捕获建立连接时应捕获SQLException异常异常:try Connection con=DriverManager.getConnection(“jdbc:o
11、dbc:数据源名字数据源名字”,login name,password);catch(SQLException e)Connection con=DriverManager.getConnection(jdbc:odbc:数据源名字数据源名字,);为了能和数据源为了能和数据源myDatamyData交换数据,建立连接时应捕获交换数据,建立连接时应捕获SQLExceptionSQLException异常:异常:try Connection con=DriverManager.getConnection(jdbc:odbc:myData,);catch(SQLException e)10.4 查询
12、操作查询操作 JDBCJDBC和数据库表进行交互的主要方式是使用和数据库表进行交互的主要方式是使用SQLSQL语句,语句,JDBCJDBC提供的提供的APIAPI可以将标准的可以将标准的SQLSQL语句发送给数据库,实现和数据库的语句发送给数据库,实现和数据库的交互。交互。10.4.1 顺序查询顺序查询 对一个数据库中表进行查询操作的具体步骤如下。对一个数据库中表进行查询操作的具体步骤如下。1 1向数据库发送向数据库发送SQLSQL查询语句查询语句 try Statement sql=con.createStatement();catch(SQLException e)2处理查询结果处理查询结
13、果 ResultSet rs=sql.executeQuery(SELECT*FROM goods);ResultSet rs=sql.executeQuery(SELECT name,price FROM goods);3.3.查询结果放在实现了查询结果放在实现了ResultSetResultSet接口的结果集类中。接口的结果集类中。15ResultSet接口 ResultSet对象包含符合指定SQL语句中条件的所有行,即结果集 并且它通过一套get方法(这些get方法可以访问当前行中的不同列)提供了对这些行中数据的访问。ResultSet对象使用对象使用next()方法移到下一数据行方法移
14、到下一数据行 ResultSet对象使用对象使用getXxx方法获得字段值方法获得字段值 表表10.1给了出了给了出了ResultSet对象的若干方法。对象的若干方法。注:无论字段是何种属性,总可以使用注:无论字段是何种属性,总可以使用getString(int columnIndex)或或getString(String columnName)方法返回字段值的串表示。方法返回字段值的串表示。例子例子1是一个简单的是一个简单的Java应用程序,该程应用程序,该程序连接到数据源序连接到数据源myData,查询查询goods表表中中price字段值大于字段值大于300000的全部记录。的全部记录。
15、程序运行效果如图程序运行效果如图10.8。10.4.2 控制游标控制游标 需要在结果集中前后移动、显示结果集指定的一条记录或随机显示若干条需要在结果集中前后移动、显示结果集指定的一条记录或随机显示若干条记录等。这时,必须要返回一个可滚动的结果集。为了得到一个可滚动的结果记录等。这时,必须要返回一个可滚动的结果集。为了得到一个可滚动的结果集,需使用下述方法先获得一个集,需使用下述方法先获得一个Statement对象:对象:Statement stmt=con.createStatement(int type,int concurrency);然后根据参数的然后根据参数的type、concurre
16、ncy的取值情况的取值情况,stmt返回相应类型的结果集:返回相应类型的结果集:ResultSet re=stmt.executeQuery(SQL语句语句);type的取值、的取值、concurrency的取值见的取值见page 176 滚动查询经常用到滚动查询经常用到ResultSet的下述方法:的下述方法:public boolean previous()public boolean previous():将游标向上移动 public void beforeFirst()public void beforeFirst():将游标移动到结果集的初始位置。更多方法见更多方法见page 176
17、 例子例子2中中,在查询,在查询goods表表时,首先将游标移动到最后一时,首先将游标移动到最后一行,然后再获取最后一行的行行,然后再获取最后一行的行号,以便获得表中的记录数目。号,以便获得表中的记录数目。程序倒序输出程序倒序输出goods表中的记表中的记录,录,效果如图效果如图10.910.9。Statement stmt=con.createStatement(int type,int concurrency);type的取值决定滚动的方式:ResultSet.TYPE_FORWORD_ONLY:结果集的游标只能向下移动。ResultSet.TYPE_SCROLL_INSENSITIVE:
18、结果集的游标可以上下移动,且当数据库变化时,当前结果集不变。ResultSet.TYPE_SCROLL_SENSITIVE:结果集的游标可以上下移动,且当数据库变化时,当前结果集同步改变。Statement stmt=con.createStatement(int type,int concurrency);Concurrency取值决定是否可以用结果集去更新数据库。ResultSet.CONCUR_READ_ONLY 不能用结果集去更新数据库。ResultSet.CONCUR_UPDATABLE 能用结果集去更新数据库。ResultSet re=stmt.executeQuery(SQL语句
19、语句);滚动查询经常用到的ResultSet类的方法:public boolean previous()将游标向上移动,当移到结果集第一行之前时返回false。public boolean next()将游标向下移动,当移到结果集第后一行之后时返回false。public void beforeFirst()将游标移动到结果集第一行之前。public void first()将游标移动到结果集第一行。public void last()将游标移动到结果集第后一行。public boolean absolute(int row)将游标移动到参数指定的行,row可以是负数,表示倒数第row行pub
20、lic boolean isFirst()判断游标是否指向结果集的第一行。public boolean isLast()判断游标是否指向结果集的第后一行。10.4.3 条件查询条件查询 例子例子3 3,分别按商品号和价格查询记录。主类将查,分别按商品号和价格查询记录。主类将查询条件传递询条件传递QueryQuery类类的实例。的实例。程序运行效果如图程序运行效果如图10.1010.10。10.4.4 排序查询排序查询 可以在可以在SQLSQL语句中使用语句中使用ORDER BYORDER BY子语句对记录排序,子语句对记录排序,例如,按例如,按priceprice排序查询的排序查询的SQLSQ
21、L语句:语句:SELECT*FROM goods ORDER BY price 例子例子4 4中使用例子中使用例子3 3中的中的QueryQuery类类的实例分别按商品的实例分别按商品名称和价格排序名称和价格排序goodsgoods表中的全部记录。表中的全部记录。程序运行效果程序运行效果如图如图10.1110.11。10.4.5 模糊查询模糊查询 可以用可以用SQL语句操作符语句操作符LIKE进行模式般配,使用进行模式般配,使用“%”代替代替零个或多个字符,用一个下划线零个或多个字符,用一个下划线“_”代替一个字符,用代替一个字符,用abc代代替替a、b、c中的任何一个。比如,下述语句查询商品
22、名称中含有中的任何一个。比如,下述语句查询商品名称中含有“T”或或“宝宝”的记录:的记录:rs=sql.executeQuery(SELECT*FROM goods WHERE name LIKE T宝宝%);例子例子5中使用例子中使用例子3中中Query类类的实例模糊查询表中的记录。的实例模糊查询表中的记录。程序运行效果如图程序运行效果如图10.1210.12。10.5 更新、添加与删除操作更新、添加与删除操作 StatementStatement对象对象调用方法:调用方法:public int executeUpdate(String sqlStatement);通过参数通过参数sqlSt
23、atementsqlStatement指定的方式实现对数据库表中记录的指定的方式实现对数据库表中记录的更新、添加和删除操作。更新、添加和删除操作。更新、添加和删除记录的更新、添加和删除记录的SQLSQL语法分别是:语法分别是:UPDATE SET =新值新值 WHERE 例:UPDATE goods SET price=3009 WHERE name=海尔电视机。INSERT INTO 表表(字段列表字段列表)VALUES(对应的具体的记录)或对应的具体的记录)或INSERT INTO 表表(VALUES(对应的具体的记录)对应的具体的记录)例:例:INSERT INTO goods(numb
24、er,name,madeTime,price)VALUES(A009,手机,2010-12-20,3976)DELETE FROM WHERE 例例 DELETE FROM goods WHERE number=B002 例子例子6中,中,Example10_6.javaExample10_6.java,ModifyTable类能更新、插入类能更新、插入和删除表中的记录和删除表中的记录.10.6 事务事务 10.6.1 事务及处理事务及处理 事务由一组事务由一组SQLSQL语句组成,所谓事务处理是指:语句组成,所谓事务处理是指:应用程序保证事务中的应用程序保证事务中的SQLSQL语句要么全部都
25、执行,语句要么全部都执行,要么一个都不执行。要么一个都不执行。事务处理是保证数据库中数据完整性与一致事务处理是保证数据库中数据完整性与一致性的重要机制。例如银行系统的转账业务至少需性的重要机制。例如银行系统的转账业务至少需要两条要两条SQLSQL语句去修改语句去修改A A、B B帐户的余额,应用程帐户的余额,应用程序必须保证这两条序必须保证这两条SQLSQL语句要么全部执行,要么语句要么全部执行,要么全部都不执行。全部都不执行。10.6.2 JDBCJDBC事务处理步骤事务处理步骤 1 1使用setAutoCommit(boolean autoCommit)方法 和数据库建立一个连接对象后,比
26、如con。那么con的提交模式默认是自动提交模式(执行的SQL语句立刻生效),为了能进行事 务 处 理,必 须 关 闭 c o n 的 这 个 默 认 设 置。con.setAutoCommit(false);2 2使用commit()方法 连接对象con调用commit()方法就是让事务中的SQL语句全部生效。3 3使用rollback()方法 con调用rollback()方法的作用是撤消事务中成功执行过的SQL语句对数据库数据所做的更新、插入或删除操作,即撤消引起数据发生变化的SQL语句操作,将数据库中的数据恢复到commit()方法执行之前的状态。例子例子7 7使用了事务处理将使用了事
27、务处理将goodsgoods表中表中numbernumber字段是字段是“A001”A001”的的priceprice的值减少的值减少n n,并将减少的并将减少的n n增加到字段是增加到字段是“B002”B002”的的priceprice上上.10.7 批处理批处理 程序在和数据库交互时,可能需要执行多个对表进行更新操程序在和数据库交互时,可能需要执行多个对表进行更新操作的作的SQLSQL语句,这就需要语句,这就需要StatementStatement对象反复执行对象反复执行execute()execute()方法。方法。JDBC JDBC为为StatementStatement对象提供了批处
28、理功能,即对象提供了批处理功能,即StatementStatement对象对象调用调用executeBatch()方法可以一次执行多个方法可以一次执行多个SQLSQL语句,只要事先语句,只要事先让让StatementStatement对象调用对象调用addBatch(String sql)方法将要执行的方法将要执行的SQLSQL语句添加到该对象中即可。语句添加到该对象中即可。例子例子8中的中的Statement对象调用对象调用executeBatch()方法对多个方法对多个SQL语句进行了批处理,并将批处理作为一个事务。语句进行了批处理,并将批处理作为一个事务。10.8 标准化考试标准化考试
29、(1)需要建立一个数据库,在该库中创建名字为testForm的表,表的每条记录是试题、选择和答案,如图10.14所示。(2)将数据库设置为名字为test的数据源。(3)例子例子9中 ReadExaminationPaperReadExaminationPaper类类负责查询数据库,获得题目的个数以及试题内容。程序运行效果如图10.13。10.9 小结小结1 JDBC技术在数据库开发中占有很重要的地位,JDBC操作不同的数据库仅仅是连接方式上的差异而已,使用JDBC的应用程序一旦和数据库建立连接,就可以使用JDBC提供的API操作数据库。2 JDBC和数据库建立连接有两种常用方式:建立JDBCODBC桥接器和加载纯Java数据库驱动程序,无论使用哪种方式连接数据库,都不会影响操作数据库的逻辑代码。