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

下载本文档

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

文档简介

1、java数据库操作1第第12章章 java 数据库操作数据库操作 本章导读本章导读njdbc简介简介nmicrosoft access 数据库njdbc-odbc桥接器n查询操作n更新、插入与删除操作n用结果集更新表ncachedrowsetimpl类n预处理语句与事务n批处理nsql server 2000数据库n使用纯java数据库驱动程序java数据库操作212.1 jdbc简介 jdbc(java database connectivity)是java运行平台的核心类库中的一部分,提供了访问数据库的api,它由一些java类和接口组成。 在java中可以使用jdbc实现对数据库中表记录

2、的查询、修改和删除等操作。jdbc技术在数据库开发中占有很重要的地位,jdbc操作不同的数据库仅仅是连接方式上的差异而已,使用jdbc的应用程序一旦和数据库建立连接,就可以使用jdbc提供的api操作数据库,如图12.1所示。 我们经常使用jdbc进行如下的操作: 与一个数据库建立连接。 向已连接的数据库发送sql语句。 处理sql语句返回的结果。java数据库操作3图12.1java数据库操作412.2 microsoft access数据库_1建立数据库 microsoft access是常用的一个数据库管理系统之一,具有速度快、使用方便等特点。 表是关系型数据库的基本单位,本节简单介绍怎

3、样使用microsoft access数据库管理系统创建数据库和在数据库中创建表。 1. 建立数据库 单击window 2000/xp系统桌面上的“开始” “所有程序” “microsoft access”启动数据库管理系统。然后选择新建数据库,如图12.2所示。将新建的数据库命名为student.mdb,并保存到d:ch12目录中。 java数据库操作512.2 microsoft access数据库_2 创建表 创建好数据库后,就可以在该数据库下建立若干个表。我们准备在student.mdb数据库数据库中创建名字为message的表的表。打开student.mdb数据库,在选择界面上选择“

4、使用设计器创建表”后,单击“设计”,将出现创建表的界面,如图12.3所示。 message表的字段(属性)为:number(文本),name(文本),birthday(日期/时间),height(数字,双精度)。其中,number字段为主键(在该字段上单击鼠标右键,将number设置为主键)。打开创建的message表,录入记录,如图12.4所示。java数据库操作612.3 jdbc-odbc桥接器 本节介绍jdbcodbcjdbcodbc桥接器连接方式桥接器连接方式。 使用jdbcodbc桥接器方式的机制是,应用程序只需建立jdbc和odbc之间的连接,而和数据库的连接由odbc去完成。

5、jdbcodbc桥接器的优点是优点是:jdbc有能力访问几乎所有类型的数据库。缺点是缺点是移植性较差,应用程序所驻留的计算机必须提供odbc。 应用程序负责使用jdbc提供的api建立jdbcodbc桥接器,然后应用程序就可以请求和数据库建立连接,连接工作由odbc完成。 需要强调是,odbc使用“数据源”来管理数据库,所以必须事先将某个数据库设置成odbc所管理的一个数据源,应用程序只能请求和odbc管理的数据源建立连接。使用jdbcodbc桥接器方式和数据库建立连接如图图12.512.5所示所示。 以下详细讲解java应用程序使用jdbcodbc桥接器访问数据库的3个步骤: 建立jdbc-

6、odbc桥接器 创建odbc数据源 和odbc数据源建立连接 以下假设应用程序所在的计算机要访问本地数据库student.mdb,即我们在12.2中建立的数据库。java数据库操作7图12.5java数据库操作8java应用程序使用应用程序使用jdbcodbc桥接器访问数据库的步骤桥接器访问数据库的步骤1 1 1 1建立建立jdbc-odbcjdbc-odbc桥接器桥接器 jdbc使用java.lang包中的classclass类类建立jdbc-odbc桥接器。class类通过调用它的静态方法forname加载sun.jdbc.odbc包中的jdbcodbcdriver类建立jdbc-odbc

7、桥接器。建立桥接器时可能发生异常,必须捕获这个异常,建立桥接器的代码是:try class.forname(sun.jdbc.odbc.jdbcodbcdriver);try class.forname(sun.jdbc.odbc.jdbcodbcdriver); catch(classnotfoundexception e)catch(classnotfoundexception e) system.out.println(e); system.out.println(e); java数据库操作9java应用程序使用应用程序使用jdbcodbc桥接器访问数据库的步骤桥接器访问数据库的步骤2

8、2 2 2odbcodbc数据源数据源 应用程序所在的计算机负责创建数据源,即将本地或远程计算机上的数据库设置成自己要访问的数据源。因此,必须保证应用程序所在计算机有odbc系统(widow2000和window/xp都有odbc系统)。(1 1)创建、修改或删除数据源)创建、修改或删除数据源 选择“控制面板”“管理工具”“odbc数据源”,双击odbc数据源图标,出现如图12.6所示界面。(2 2) 选择驱动程序选择驱动程序 在图12.6所示的界面上选择单击“添加”按钮,如图12.7所示。选择“microsoft access driver(*.mdb)。(3 3)数据源名称)数据源名称 在

9、图12.7界面单击“完成”按钮将出现设置数据源具体项目的对话框,如图12.8所示。在名称栏里为数据源起一个你自己喜欢的名称,这里我们起的名称是hello。在“数据库选择”栏中选择一个数据库。java数据库操作10图12.6,图12.7,图12.8java数据库操作11java应用程序使用应用程序使用jdbcodbc桥接器访问数据库的步骤桥接器访问数据库的步骤3 3 3 3连接数据源连接数据源 现在我们有了一个数据源hello,这个数据源就是数据库student.mdb。编写连接数据库代码不会出现数据库的名称,只能出现数据源的名字。首先首先使用java.sql包中的connectionconne

10、ction类类声明一个对象,然后再使用类类drivermanagerdrivermanager调用它的静态方法静态方法getconnectiongetconnection创建这个连接对象: connection connection concon=drivermanager.getconnection(jdbc:odbc:=drivermanager.getconnection(jdbc:odbc:数据源名字数据源名字, login name, password ); login name, password ); 对于access数据库,不必为数据源设置login name 和passwor

11、d,那么连接形式是:connection connection concon=drivermanager. getconnection(jdbc:odbc:=drivermanager. getconnection(jdbc:odbc:数据源名字数据源名字, ,);, ,); 为了能和数据源hello交换数据,建立connectionconnection对象对象如下,建立连接时应捕获sqlexception异常:try connection try connection concon=drivermanager.getconnection(jdbc:odbc:hello, ,);=driver

12、manager.getconnection(jdbc:odbc:hello, ,); catch(sqlexception e)catch(sqlexception e) 这样就和数据源hello建立了连接。应用程序一旦和某个数据源建立连接,就可以通过sql语句和该数据源所指定的数据库中的表交互信息,比如查询、修改、更新表中的记录。java数据库操作1212.4 查询操作_1查询操作步骤1 1向数据库发送向数据库发送sqlsql查询语句查询语句 首先使用statement声明一个sql语句对象,然后让已创建的连接对象con调用方法createstatment()创建这个sql语句对象,代码如下

13、:try statement sql=con.createstatement();try statement sql=con.createstatement(); catch(sqlexception e )catch(sqlexception e )2 2处理查询结果处理查询结果 有了sql语句对象后,这个对象就可以调用相应的方法实现对数据库中表的查询和修改,并将查询结果存放在一个resultset类声明的对象中。也就是说sql查询语句对数据库的查询操作将返回一个resultset对象,resultset对象是以 统 一 形 式 的 列 组 织 的 数 据 行 组 成 。 例 如 , 对 于

14、r e s u l t s e t r e s u l t s e t rs=sql.executequery(select rs=sql.executequery(select * * from message); from message);内存的结果集对象rs的列数是4列,刚好和message的列数相同,第1列至第4列分别是“number”、“ n a m e ” “ b i r t h d y ” 和 “ h e i g h t ” 列 ; 而 对 于r e s u l t s e t r e s u l t s e t rs=sql.executequery(select name,

15、height from message);rs=sql.executequery(select name,height from message);内存的结果集对象rs列数只有两列,第一列是“name”列、第2列是“height”列。 resultset对象一次只能看到一个数据行,使用next()方法可以将游标依次移动到数据行,当游标移动到某数据行后,resultset对象使用getxxx方法,并将位置索引(第一列使用1,第二列使用2等等)或列名传递给该方法的参数,就可以获得改数据行中相应的列值。表表12.112.1给了出了resultset对象的若干方法。java数据库操作13表12.1ja

16、va数据库操作1412.4 查询操作_2顺序查询 结果集resultset对象调用next()方法,可以顺序查询表中的记录。结果集对象将游标最初定位在第一行的前面,第一次调用next()方法使游标移动到第一行。next()方法返回一个boolean型数据,当游标移动到最后一行之后返回false。 例例12-112-1中中,查询数据库student.mdb中message表里的全部记录,每条记录包含全部的字段值,效果如图12.9所示。java数据库操作1512.4 查询操作_3模糊查询 可以用sql语句操作符like进行模式般配,使用“%”表示零个或多个字符,用一个下划线“_”表示任意一个字符,

17、使用“若干字符”表示“若干字符”中的任意一个。比如,下述语句查询字段name值以“张”为前缀的记录: rs=sql.executequery(select rs=sql.executequery(select * * from message where name like from message where name like 张张% );% );下述语句查询字段name值以“张”或“李”为前缀的记录: rs=sql.executequery(select rs=sql.executequery(select * * from message where name like from me

18、ssage where name like 张李张李% );% );将例12-1中的 rs=sql.executequery(select rs=sql.executequery(select * * from message); from message);修改为 sql.executequery(select sql.executequery(select * * from message where name like from message where name like 张李张李%);%);后,程序的输出结果如下:001,张三,1990-10-10,1.78002,李四,1989-

19、09-09,1.67java数据库操作1612.4 查询操作_4排序查询 可以在sql语句中使用order by子语句,对记录排序。例如,按height排序查询的sql语句:select select * * from message order by height from message order by height。 将例12-1中的 rs=sql.executequery(select rs=sql.executequery(select * * from message); from message);修改为 sql.executequery(select sql.executeq

20、uery(select * * from message order by height ); from message order by height );后,程序的输出结果如下(按身高排序):003,003,王小二王小二,1999-11-11,1.65,1999-11-11,1.65002,002,李四李四,1989-09-09,1.67,1989-09-09,1.67001,001,张三张三,1990-10-10,1.78,1990-10-10,1.78004,004,孙小三孙小三,1989-12-12,1.86,1989-12-12,1.86 将例12-1中的rs=sql.execut

21、equery(select rs=sql.executequery(select * * from message); from message);修改为sql.executequery(select sql.executequery(select * * from message order by birthday ); from message order by birthday );后,程序的输出结果如下(按出生日期排序):002,002,李四李四,1989-09-09,1.67,1989-09-09,1.67004,004,孙小三孙小三,1989-12-12,1.86,1989-12-

22、12,1.86001,001,张三张三,1990-10-10,1.78,1990-10-10,1.78003,003,王小二王小二,1999-11-11,1.65,1999-11-11,1.65java数据库操作1712.4 查询操作_5条件查询 可以在sql语句中使用where子语句,进行条件查询。例如,sql语句:select select * * from message where name = from message where name = 张三张三查询姓名是“张三”的记录; sql语句: select select * * from message where datepart

23、(yyyy,birthday)=1990 from message where datepart(yyyy,birthday)=1990查询1990年后出生的记录。 将例12-1中的rs=sql.executequery(select rs=sql.executequery(select * * from message); from message); 修改为rs=sql.executequery(select rs=sql.executequery(select * * from message where from message where datepart(yyyy,birthday

24、)1990 datepart(yyyy,birthday)1990 nd height=1.65); nd height=1.65);后,程序的输出结果如下:001,001,张三张三,1990-10-10,1.78,1990-10-10,1.78003,003,王小二王小二,1999-11-11,1.65,1999-11-11,1.65java数据库操作1812.4 查询操作_6随机查询 有时候我们需要在结果集中前后移动、或显示结果集指定的一条记录等等。这时,我们必须要返回一个可滚动的结果集。为了得到一个可滚动的结果集,我们必须使用下述方法返回一个statement对象:statement s

25、tmt=con.createstatement(int type ,int concurrency);statement stmt=con.createstatement(int type ,int concurrency);其中,参数type取值可确定stmt返回的rs是否为可滚动的结果集:resultset re=stmt.executequery(sqlresultset re=stmt.executequery(sql语句语句););参数参数typetype取值:取值:resultset.type_forword_only resultset.type_forword_only 结果集

26、的游标只能向下移动。resultset.type_scroll_insensitive resultset.type_scroll_insensitive 结果集的游标可以上下移动,当数据库变化时,当前结果集不变。 resultset.type_scroll_sensitive resultset.type_scroll_sensitive 返回可滚动的结果集,当数据库变化时,当前结果集同步改变。参数参数concurrencyconcurrency取值取值 resultset.concur_read_onlyresultset.concur_read_only 不能用结果集更新数据库中的表。

27、resultset.concur_updatableresultset.concur_updatable 能用结果集更新数据库中的表。滚动查询时经常用到滚动查询时经常用到resultsetresultset的方法见教材的方法见教材page 288page 288: 例12-2中,我们随机从结果集中取出3条记录,并计算3条记录的height的平均值,效果如图12.10所示。java数据库操作19例12-2 运行效果 图12.10java数据库操作2012.5 更新、插入与删除操作更新记录的sql语法: update set = 新值新值 where 插入记录的sql语法: insert into

28、 表表(字段列表字段列表) values (对应的具体的记录)(对应的具体的记录)或 insert into 表表(values (对应的具体的记录)(对应的具体的记录)删除记录的sql语法: delete from where 例例12-3对message表进行了更新和插入操作 java数据库操作2112.6 用结果集更新数据库中的表用结果集更新数据库中的表 可以使用内存中resultset对象对底层数据库表进行更新和插入操作(这些操作由系统自动转化为相应的sql语句),优点是不必熟悉有关更新、插入的sql语句,而且方便编写代码,缺点是,必须要事先返回结果集。首先,必须得到一个可滚动的res

29、ultset对象:rs,例如:connnection con=drivermanager.getconnection(jdbc:odbc:hello,);connnection con=drivermanager.getconnection(jdbc:odbc:hello,);statement sql=con.createstatement(resultset.type_scroll_sensitive,statement sql=con.createstatement(resultset.type_scroll_sensitive, resultset.concur_updatable);

30、 resultset.concur_updatable); resultset rs=sql.executequery(select resultset rs=sql.executequery(select * * from message); from message); java数据库操作2212.6 用结果集更新数据库中的表用结果集更新数据库中的表_1更新记录中的列值更新记录中的列值 使用结果集更新数据库表中第n行记录中某列的值的步骤是:(1 1)结果集)结果集rsrs的游标移动到第的游标移动到第n n行行 rs.absolute(n);(2 2)结果集将第)结果集将第n n行的行的p

31、p列的列值更新列的列值更新 结果集可以使用下列方法更新列值updateint(string columnname, int x)updateint(string columnname, int x),updateint(int columnindex int x)updateint(int columnindex int x)updatelong(string columnname, long x)updatelong(string columnname, long x),updatelong(int columnindex, long x)updatelong(int columnindex

32、, long x) 更多方法见教材page 291.(3 3)更新数据库中的表)更新数据库中的表 最后,结果集调用updaterow()方法,用结果集中的第n行更新数据库表中的第n行记录。 以下代码片段更新message表中的第3行记录的name列(字段)的值。rs.absolute(3);rs.absolute(3);rs.updatestring(2, rs.updatestring(2, 王晓二王晓二);/ );/ 也可以写成也可以写成rs.updatestring(name, rs.updatestring(name, 王晓二王晓二););rs.updaterow();rs.updat

33、erow();java数据库操作2312.6 用结果集更新数据库中的表用结果集更新数据库中的表_2 插入记录插入记录 使用结果集向数据库表中插入(添加)一行记录步骤是:(1 1)结果集)结果集rsrs的游标移动到插入行的游标移动到插入行 结果集中有一个特殊区域,用作构建要插入的行的暂存区域 (staging area),习惯上将该区域位置称做结果集的插入行。为了向数据库表中插入一行新的记录,必须首先将结果集的游标移动到插入行,代码如下:rs.movetoinsertrow();rs.movetoinsertrow();(2 2)更新插入行的列值)更新插入行的列值 结果集可以用updatexxx

34、方法更新插入行的列值,例如rs.updatestring(1, 006);rs.updatestring(1, 006);rs.updatestring(2, rs.updatestring(2, 陈大林陈大林););rs.updatedate(3,daters.updatedate(3,date对象对象););rs.updatedouble(4, 1.79);rs.updatedouble(4, 1.79);(3 3)插入记录)插入记录 最后,结果集调用insertrow()方法,用结果集中的插入行向数据库表中插入一行新记录。 例例12-412-4使用结果集对数据库中的message表进行了

35、更新和插入操作(效果如图12.11所示)。java数据库操作24例12-4 运行效果 图12.11java数据库操作25 cachedrowsetimpl对象可以保存resultset对象中的数据,而且cachedrowsetimpl对象不依赖connnection对象,这意味着一旦把resultset对象中的数据保存到cachedrowsetimpl对象中后,就可以关闭和数据库的连接。 例12-5使用cachedrowsetimpl对象保存数据库表的记录 12.7 cachedrowsetimpl类java数据库操作2612.8 预处理语句_1预处理语句优点 connection连接对象co

36、n调用preparestatement(string sql)方法 preparedstatement pre=con.preparestatement(string sql);对参数sql指定的sql语句进行预编译处理,生成该数据库地层的内部命令,并将该命令封装在preparedstatement对象pre中,那么该对象调用下列方法都可以使得该地层内部命令被数据库执行,resultset executequery()boolean execute()int executeupdate() 只要编译好了preparedstatement对象pre,那么pre可以随时地执行上述方法,显然提高了访

37、问数据库的速度。 例12-6使用预处理语句来查询数据库中表的全部记录。java数据库操作2712.8 预处理语句_2使用统配符 在对sql进行预处理时可以使用统配符“?”来代替字段的值,只要在预处理语句执行之前再设置统配符所表示的具体值即可。例如:preparestatement pre=con.preparestatement(select * from message where height ? );那么在sql对象执行之前,必须调用相应的方法设置统配符“?”代表的具体值,比如:pre.setdouble(1,1.72);指定上述预处理语句pre中统配符“?”代表的值是1.72。下列方法

38、:void setdouble(int parameterindex,int x)用来设置通配符的值,其中参数parameterindex用来表示sql语句中从左到右的第parameterindex个统配符号,x是该统配符所代表的具体值。 预处理语句设置统配符“?”的值的常用方法有(page 295):void setdate(int parameterindex,date x)void setdouble(int parameterindex,double x) 例子例子12-712-7使用预处理语句向student.mdb数据库中的message表插入记录。java数据库操作2812.9

39、事务 事务由一组sql语句组成,所谓事务处理是指:应用程序保证事务中的sql语句要么全部都执行,要么一个都不执行。 jdbc事务处理步骤 (1)使用setautocommit(boolean autocommit)方法 (2)使用commit()方法 (3)使用rollback()方法 例子12-8使用了事务处理,将user表中number字段是“0001”的usermoney的值减少n,并将减少的n增加到字段是“0002”的usermoney属性值上。 java数据库操作2912.10 批处理 jdbc为statement对象提供了批处理功能,即statement对象调用executebat

40、ch()方法可以一次执行多条sql语句,只要事先让statement对象调用addbatch(string sql)方法将要执行的sql语句添加到该对象中即可。 在对若干个sql进行批处理时,如果不允许批处理中的任何sql语句执行失败,那么和前面讲解处理事务的情况相同,要事先关闭连接对象的自动提交模式,即将批处理作为一个事务来对待,否则批处理中成功执行的sql语句将立刻生效。 例12-9中的statement对象调用executebatch()方法对多个sql语句进行了批处理,并将批处理作为一个事务。 java数据库操作3012.11 使用jtable组件操作表 本节给出怎样使用jtable组

41、件操作数据库中的表中。 下面的例12-10使用jtable组件显示message表的记录、更新message表的记录、向message表插入记录(效果如图12.12(a)、(b)、(c)和(d)所示)。例12-10共有4个java源文件,需分别保存编译,其中example12_10.java是主类。 java数据库操作31例12-10 运行效果java数据库操作3212.12 sql server 2000数据库 1起动sql server 2000 启动后的sql server 2000服务器效果如图12.13所示。2建立数据库 使用sql server 2000可以建立多个不同的数据库。本

42、节我们将建立一个名字为factory的数据库。打开“企业管理器”后将出现如图12.13所示界面,我们新建立的数据库名称是“factory”,如图12.14中右侧所示。3创建表 打开“企业管理器”,用鼠标单击 “数据库”下的factory数据库,在factory管理的“表”的选项上单击右键,选择“新建表”,将出现相应的建表界面,我们建立的表是employee,该表的字段(属性)为:number(char) name(char) birthday(smalldatetime) salary(float)。其中,“number”字段为主键,如图12.15所示。 java数据库操作33图12.13,图12.14,图12.15java数据库操作3412.13 使用纯java数据库驱动程序 用java语言编写的数据库驱动程序称做纯java数据库驱动程序。jdbc提供的api通过 将纯java数据库驱动程序转换为dbms(数据库管理系统)所使用的专用协议来实现和特定的dbms交互信息,简单

温馨提示

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

评论

0/150

提交评论