课件12第12章java数据库操作_第1页
课件12第12章java数据库操作_第2页
课件12第12章java数据库操作_第3页
课件12第12章java数据库操作_第4页
课件12第12章java数据库操作_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java语言程序设计天津理工大学计算机与通信工程学院主讲教师:李双喜

2023/9/21第10章基于Swing的图形用户界面设计第2

页第12章Java数据库操作9/21/20233第12章Java数据库操作JDBC简介MicrosoftAccess数据库JDBC-ODBC桥接器查询操作更新、插入与删除操作用结果集更新表CachedRowSetImpl类预处理语句与事务批处理SQLServer2000数据库使用纯Java数据库驱动程序9/21/2023412.1

JDBC简介JDBC(JavaDataBaseConnectivity)是Java运行平台的核心类库中的一部分,提供了访问数据库的API,它由一些Java类和接口组成。在Java中可以使用JDBC实现对数据库中表记录的查询、修改和删除等操作。JDBC技术在数据库开发中占有很重要的地位,JDBC操作不同的数据库仅仅是连接方式上的差异而已,使用JDBC的应用程序一旦和数据库建立连接,就可以使用JDBC提供的API操作数据库,如图12.1所示。我们经常使用JDBC进行如下的操作:√与一个数据库建立连接。

√向已连接的数据库发送SQL语句。

√处理SQL语句返回的结果。9/21/20235图12.19/21/2023612.2MicrosoftAccess数据库_1建立数据库

MicrosoftAccess是常用的一个数据库管理系统之一,具有速度快、使用方便等特点。表是关系型数据库的基本单位,本节简单介绍怎样使用MicrosoftAccess数据库管理系统创建数据库和在数据库中创建表。

1.建立数据库单击Window2000/XP系统桌面上的“开始”→“所有程序”→“MicrosoftAccess”启动数据库管理系统。然后选择新建数据库,如图12.2所示。将新建的数据库命名为student.mdb,并保存到D:\ch12目录中。9/21/2023712.2MicrosoftAccess数据库_2创建表创建好数据库后,就可以在该数据库下建立若干个表。我们准备在student.mdb数据库中创建名字为message的表。打开student.mdb数据库,在选择界面上选择“使用设计器创建表”后,单击“设计”,将出现创建表的界面,如图12.3所示。message表的字段(属性)为:number(文本),name(文本),birthday(日期/时间),height(数字,双精度)。其中,"number"字段为主键(在该字段上单击鼠标右键,将number设置为主键)。打开创建的message表,录入记录,如图12.4所示。9/21/2023812.3JDBC-ODBC桥接器

本节介绍JDBC─ODBC桥接器连接方式。使用JDBC─ODBC桥接器方式的机制是,应用程序只需建立JDBC和ODBC之间的连接,而和数据库的连接由ODBC去完成。JDBC─ODBC桥接器的优点是:JDBC有能力访问几乎所有类型的数据库。缺点是移植性较差,应用程序所驻留的计算机必须提供ODBC。应用程序负责使用JDBC提供的API建立JDBC─ODBC桥接器,然后应用程序就可以请求和数据库建立连接,连接工作由ODBC完成。需要强调是,ODBC使用“数据源”来管理数据库,所以必须事先将某个数据库设置成ODBC所管理的一个数据源,应用程序只能请求和ODBC管理的数据源建立连接。使用JDBC─ODBC桥接器方式和数据库建立连接如图12.5所示。以下详细讲解Java应用程序使用JDBC─ODBC桥接器访问数据库的3个步骤:

√建立JDBC-ODBC桥接器√创建ODBC数据源√和ODBC数据源建立连接

以下假设应用程序所在的计算机要访问本地数据库student.mdb,即我们在12.2中建立的数据库。9/21/20239图12.59/21/202310Java应用程序使用JDBC─ODBC桥接器访问数据库的步骤1

1.建立JDBC-ODBC桥接器JDBC使用java.lang包中的Class类建立JDBC-ODBC桥接器。Class类通过调用它的静态方法forName加载sun.jdbc.odbc包中的JdbcOdbcDriver类建立JDBC-ODBC桥接器。建立桥接器时可能发生异常,必须捕获这个异常,建立桥接器的代码是:try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");}catch(ClassNotFoundExceptione){System.out.println(e);}9/21/202311Java应用程序使用JDBC─ODBC桥接器访问数据库的步骤2

2.ODBC数据源

应用程序所在的计算机负责创建数据源,即将本地或远程计算机上的数据库设置成自己要访问的数据源。因此,必须保证应用程序所在计算机有ODBC系统(Widow2000和Window/XP都有ODBC系统)。(1)创建、修改或删除数据源

选择“控制面板”→“管理工具”→“ODBC数据源”,双击ODBC数据源图标,出现如图12.6所示界面。(2)选择驱动程序

在图12.6所示的界面上选择单击“添加”按钮,如图12.7所示。选择“MicrosoftAccessDriver(*.mdb)。(3)数据源名称

在图12.7界面单击“完成”按钮将出现设置数据源具体项目的对话框,如图12.8所示。在名称栏里为数据源起一个你自己喜欢的名称,这里我们起的名称是hello。在“数据库选择”栏中选择一个数据库。9/21/202312图12.6,图12.7,图12.89/21/202313Java应用程序使用JDBC─ODBC桥接器访问数据库的步骤3

3.连接数据源现在我们有了一个数据源hello,这个数据源就是数据库student.mdb。编写连接数据库代码不会出现数据库的名称,只能出现数据源的名字。首先使用java.sql包中的Connection类声明一个对象,然后再使用类DriverManager调用它的静态方法getConnection创建这个连接对象:Connectioncon=DriverManager.getConnection("jdbc:odbc:数据源名字","loginname","password");

对于Access数据库,不必为数据源设置loginname和password,那么连接形式是:Connectioncon=DriverManager.getConnection("jdbc:odbc:数据源名字","","");

为了能和数据源hello交换数据,建立Connection对象如下,建立连接时应捕获SQLException异常:try{Connectioncon=DriverManager.getConnection("jdbc:odbc:hello","","");}catch(SQLExceptione){}这样就和数据源hello建立了连接。应用程序一旦和某个数据源建立连接,就可以通过SQL语句和该数据源所指定的数据库中的表交互信息,比如查询、修改、更新表中的记录。9/21/20231412.4查询操作_1.查询操作步骤1.向数据库发送SQL查询语句首先使用Statement声明一个SQL语句对象,然后让已创建的连接对象con调用方法createStatment()创建这个SQL语句对象,代码如下:try{Statementsql=con.createStatement();}catch(SQLExceptione){}2.处理查询结果有了SQL语句对象后,这个对象就可以调用相应的方法实现对数据库中表的查询和修改,并将查询结果存放在一个ResultSet类声明的对象中。也就是说SQL查询语句对数据库的查询操作将返回一个ResultSet对象,ResultSet对象是以统一形式的列组织的数据行组成。例如,对于ResultSetrs=sql.executeQuery("SELECT*FROMmessage");内存的结果集对象rs的列数是4列,刚好和message的列数相同,第1列至第4列分别是“number”、“name”“birthdy”和“height”列;而对于ResultSetrs=sql.executeQuery("SELECTname,heightFROMmessage");内存的结果集对象rs列数只有两列,第一列是“name”列、第2列是“height”列。ResultSet对象一次只能看到一个数据行,使用next()方法可以将游标依次移动到数据行,当游标移动到某数据行后,ResultSet对象使用getXxx方法,并将位置索引(第一列使用1,第二列使用2等等)或列名传递给该方法的参数,就可以获得改数据行中相应的列值。表12.1给了出了ResultSet对象的若干方法。9/21/202315表12.19/21/20231612.4查询操作_2.顺序查询

结果集ResultSet对象调用next()方法,可以顺序查询表中的记录。结果集对象将游标最初定位在第一行的前面,第一次调用next()方法使游标移动到第一行。next()方法返回一个boolean型数据,当游标移动到最后一行之后返回false。

例12-1中,查询数据库student.mdb中message表里的全部记录,每条记录包含全部的字段值,效果如图12.9所示。9/21/20231712.4查询操作_3.模糊查询可以用SQL语句操作符LIKE进行模式般配,使用“%”表示零个或多个字符,用一个下划线“_”表示任意一个字符,使用“[若干字符]”表示“若干字符”中的任意一个。比如,下述语句查询字段name值以“张”为前缀的记录:rs=sql.executeQuery("SELECT*FROMmessageWHEREnameLIKE'张%'");下述语句查询字段name值以“张”或“李”为前缀的记录:rs=sql.executeQuery("SELECT*FROMmessageWHEREnameLIKE'[张李]%'");将例12-1中的rs=sql.executeQuery("SELECT*FROMmessage");修改为sql.executeQuery("SELECT*FROMmessageWHEREnameLike'[张李]%'");后,程序的输出结果如下:001,张三,1990-10-10,1.78002,李四,1989-09-09,1.679/21/20231812.4查询操作_4.排序查询可以在SQL语句中使用ORDERBY子语句,对记录排序。例如,按height排序查询的SQL语句:SELECT*FROMmessageORDERBYheight。将例12-1中的rs=sql.executeQuery("SELECT*FROMmessage");修改为sql.executeQuery("SELECT*FROMmessageORDERBYheight");后,程序的输出结果如下(按身高排序):003,王小二,1999-11-11,1.65002,李四,1989-09-09,1.67001,张三,1990-10-10,1.78004,孙小三,1989-12-12,1.86将例12-1中的rs=sql.executeQuery("SELECT*FROMmessage");修改为sql.executeQuery("SELECT*FROMmessageORDERBYbirthday");后,程序的输出结果如下(按出生日期排序):002,李四,1989-09-09,1.67004,孙小三,1989-12-12,1.86001,张三,1990-10-10,1.78003,王小二,1999-11-11,1.659/21/20231912.4查询操作_5.条件查询可以在SQL语句中使用WHERE子语句,进行条件查询。例如,SQL语句:SELECT*FROMmessageWHEREname=‘张三’查询姓名是“张三”的记录;SQL语句:SELECT*FROMmessageWHEREDATEPART('yyyy',birthday)>=1990查询1990年后出生的记录。将例12-1中的rs=sql.executeQuery("SELECT*FROMmessage");修改为rs=sql.executeQuery("SELECT*FROMmessageWHEREDATEPART('yyyy',birthday)>1990NDheight>=1.65");后,程序的输出结果如下:001,张三,1990-10-10,1.78003,王小二,1999-11-11,1.659/21/20232012.4查询操作_6.随机查询有时候我们需要在结果集中前后移动、或显示结果集指定的一条记录等等。这时,我们必须要返回一个可滚动的结果集。为了得到一个可滚动的结果集,我们必须使用下述方法返回一个Statement对象:Statementstmt=con.createStatement(inttype,intconcurrency);其中,参数type取值可确定stmt返回的rs是否为可滚动的结果集:ResultSetre=stmt.executeQuery(SQL语句);参数type取值:ResultSet.TYPE_FORWORD_ONLY结果集的游标只能向下移动。ResultSet.TYPE_SCROLL_INSENSITIVE结果集的游标可以上下移动,当数据库变化时,当前结果集不变。ResultSet.TYPE_SCROLL_SENSITIVE返回可滚动的结果集,当数据库变化时,当前结果集同步改变。参数Concurrency取值ResultSet.CONCUR_READ_ONLY

不能用结果集更新数据库中的表。

ResultSet.CONCUR_UPDATABLE

能用结果集更新数据库中的表。滚动查询时经常用到ResultSet的方法见教材page288:

例12-2中,我们随机从结果集中取出3条记录,并计算3条记录的height的平均值,效果如图12.10所示。9/21/202321例12-2运行效果图12.109/21/20232212.5更新、插入与删除操作更新记录的SQL语法:UPDATE<表名>SET<字段名>=新值WHERE<条件子句>插入记录的SQL语法:INSERTINTO表(字段列表)VALUES(对应的具体的记录)或INSERTINTO表(VALUES(对应的具体的记录)删除记录的SQL语法:DELETEFROM<表名>WHERE<条件子句>例12-3对message表进行了更新和插入操作9/21/20232312.6用结果集更新数据库中的表

可以使用内存中ResultSet对象对底层数据库表进行更新和插入操作(这些操作由系统自动转化为相应的SQL语句),优点是不必熟悉有关更新、插入的SQL语句,而且方便编写代码,缺点是,必须要事先返回结果集。首先,必须得到一个可滚动的ResultSet对象:rs,例如:Connnectioncon=DriverManager.getConnection("jdbc:odbc:hello","","");Statementsql=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);ResultSetrs=sql.executeQuery("SELECT*FROMmessage");

9/21/20232412.6用结果集更新数据库中的表_1更新记录中的列值

使用结果集更新数据库表中第n行记录中某列的值的步骤是:(1)结果集rs的游标移动到第n行rs.absolute(n);(2)结果集将第n行的p列的列值更新结果集可以使用下列方法更新列值updateInt(StringcolumnName,intx),updateInt(intcolumnIndexintx)updateLong(StringcolumnName,longx),updateLong(intcolumnIndex,longx)更多方法见教材page291.(3)更新数据库中的表最后,结果集调用updateRow()方法,用结果集中的第n行更新数据库表中的第n行记录。以下代码片段更新message表中的第3行记录的name列(字段)的值。rs.absolute(3);rs.updateString(2,"王晓二");//也可以写成rs.updateString("name","王晓二");rs.updateRow();9/21/20232512.6用结果集更新数据库中的表_2插入记录使用结果集向数据库表中插入(添加)一行记录步骤是:(1)结果集rs的游标移动到插入行结果集中有一个特殊区域,用作构建要插入的行的暂存区域(stagingarea),习惯上将该区域位置称做结果集的插入行。为了向数据库表中插入一行新的记录,必须首先将结果集的游标移动到插入行,代码如下:rs.moveToInsertRow();(2)更新插入行的列值结果集可以用updateXXX方法更新插入行的列值,例如rs.updateString(1,"006");rs.updateString(2,"陈大林");rs.updateDate(3,Date对象);rs.updateDouble(4,1.79);(3)插入记录最后,结果集调用insertRow()方法,用结果集中的插入行向数据库表中插入一行新记录。

例12-4使用结果集对数据库中的message表进行了更新和插入操作(效果如图12.11所示)。9/21/202326例12-4运行效果图12.119/21/202327

CachedRowSetImpl对象可以保存ResultSet对象中的数据,而且CachedRowSetImpl对象不依赖Connnection对象,这意味着一旦把ResultSet对象中的数据保存到CachedRowSetImpl对象中后,就可以关闭和数据库的连接。

例12-5使用CachedRowSetImpl对象保存数据库表的记录

12.7CachedRowSetImpl类9/21/20232812.8预处理语句_1.预处理语句优点

Connection连接对象con调用prepareStatement(Stringsql)方法PreparedStatementpre=con.prepareStatement(Stringsql);对参数sql指定的SQL语句进行预编译处理,生成该数据库地层的内部命令,并将该命令封装在PreparedStatement对象pre中,那么该对象调用下列方法都可以使得该地层内部命令被数据库执行,ResultSetexecuteQuery()booleanexecute()intexecuteUpdate()只要编译好了PreparedStatement对象pre,那么pre可以随时地执行上述方法,显然提高了访问数据库的速度。

例12-6使用预处理语句来查询数据库中表的全部记录。9/21/20232912.8预处理语句_2.使用统配符

在对SQL进行预处理时可以使用统配符“?”来代替字段的值,只要在预处理语句执行之前再设置统配符所表示的具体值即可。例如:prepareStatementpre=con.prepareStatement("SELECT*FROMmessageWHEREheight<?");那么在sql对象执行之前,必须调用相应的方法设置统配符“?”代表的具体值,比如:pre.setDouble(1,1.72);指定上述预处理语句pre中统配符“?”代表的值是1.72。下列方法:voidsetDouble(intparameterIndex,intx)用来设置通配符的值,其中参数parameterIndex用来表示SQL语句中从左到右的第parameterIndex个统配符号,x是该统配符所代表的具体值。预处理语句设置统配符“?”的值的常用方法有(page295):voidsetDate(intparameterIndex,Datex)voidsetDouble(intparameterIndex,doublex)

例子12-7使用预处理语句向student.mdb数据库中的message表插入记录。9/21/20233012.9事务事务由一组SQL语句组成,所谓事务处理是指:应用程序保证事务中的SQL语句要么全部都执行,要么一个都不执行。JDBC事务处理步骤

(1)使用setAutoCommit(booleanautoCommit)方法

(2)使用commit()方法

(3)使用rollback()方法

例子12-8使用了事务处理,将user表中number字段是“0001”的userMoney的值减少n,并将减少的n增加到字段是“0002”的userMoney属性值上。9/21/20233112.10批处理

JDBC为Statement对象提供了批处理功能,即Statement对象调用executeBatch()方法可以一次执行多条SQL语句,只要事先让Statement对象调用addBatch(Stringsql)方法将要执行的SQL语句添加到该对象中即可。在对若干个SQL进行批处理时,如果不允许批处理中的任何SQL语句执行失败,那么和前面讲解处理事务的情况相同,要事先关闭连接对象的自动提交模式,即将批处理作为一个事务来对待,否则批处理中成功执行的SQL语句将立刻生效。

例12-9中的Statement对象调用executeBatch()方法对多个SQL语句进行了批处理,并将批处理作为一个事务。

9/21/20233212.11使用JTable组件操作表本节给出怎样使用JTable组件操作数据库中的表中。

下面的例12-10使用JTable组件显示message表的记录、更新message表的记录、向message表插入记录(效果如图12.12(a)、(b)、(c)和(d)所示)。例12-10共有4个Java源文件,需分别保存编译,其中Example12_10.java是主类。

9/21/202333例12-10运行效果9/21/20233412.12SQLServer2000数据库

1.起动SQLServer2000启动后的SQLServer2000服务器效果如图12.13所示。2.建立数据库使用SQLServer2000可以建立多个不同的数据库。本节我们将建立一个名字为factory的数据库。打开“企业管理器”后将出现如图12.13所示界面,我们新建立的数据库名称是“factory”,如图12.14中右侧所示。3.创建表打开“企业管理器”,用鼠标单击

“数据库”下的factory数据库,在factory管理的“表”的选项上单击右键,选择“新建表”,将出现相应的建表界面,我们建立的表是employee,该表的字段(属性)为:number(char)name(char)birthday(smalldatetime)salary(float)。其中,“number”字段为主键,如图12.15所示。9/21/202335图12.13,图12.14,图12.159/21/20233612.13使用纯Java数据库驱动程序

用Java语言编写的数据库驱动程序称做纯Java数据库驱动程序。JDBC提供的API通过将纯Java数据库驱

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论