实现数据库
❶ 如何实现该数据库设计和实现
XP?sql2005, 64位2008,可以网上下载
❷ 如何实现数据库完整性
数据库中的数据是从外界输入的,而数据的输入由于种种原因,会发生输入无效或错误信息。保证输入的数据符合规定,成为了数据库系统,尤其是多用户的关系数据库系统首要关注的问题。数据完整性因此而提出。数据完整性是指数据的精确性和可靠性。它是应防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或错误信息而提出的。数据完整性分为四类:实体完整性、域完整性、参照完整性、用户定义的完整性。数据库采用多种方法来保证数据完整性,包括外键、约束、规则和触发器。系统很好地处理了这四者的关系,并针对不同的具体情况用不同的方法进行,相互交叉使用,相补缺点。
楼上说的主键外键只是一方面,还有约束、规则和触发器,通过设置,由DBMS来自动完成。
❸ 如何用EXCEL实现数据库管理
EXCEL数据库管理
任务 在熟悉建立EXCEL数据库和对记录进行基本操作的基础上,初步了解EXCEL的数据库管理功能,掌握如何对记录进行插入、删除、修改、排序、筛选等,体验EXCEL在数据管理功能上的方便与快捷。
试
1. 建立数据库,并对该数据库进行如下几个操作。
提示:选定一行,依次输入字段名,从字段名下一行起依次输入各条记录的值,如图7-1中A2:F12这个区域就是一个数据库,且数据库区域下方最好没有其他数据,否则会带来操作不便。
按如下要求对数据库进行操作:
2. 查找学号为20040106的记录,并删除。
提示:选定数据库区域中任意单元格,“记录单” “条件”,打开记录单的条件对话框,在学号栏输入“20040106”,按“下一条”或“上一条”找到记录后单击“删除”按钮删除记录。
3. 在最后一条记录后增加一条记录,对应字段值分别为“20040112”,“李利”,“女”,“5”,“3”,“2”。
提示:先单击“新建”按钮打开类似图7-2的新建对话框,输入所有字段值,再单击“新建”,否则不能将数据输入到工作表中。
4. 将性别为男的记录筛选出来。
提示:选定数据库区任意单元格后,“数据” “筛选” “自动筛选”,工作表将变成
做
1. 建立图7-4所示的名为“某公司在职人员情况表”的数据库,保存在d:/user目录下自己的文件夹下,文件名为“职工档案.xls”。
对上题中建立的数据库做如下操作:
2. 用“记录单”的查询功能查找所有姓李的职工。
提示:打开记录单的条件对话框,在姓名栏输入“李*”,单击“下一条”或“上一条”按钮。
3. 用“记录单”的功能查找工资大于1500的所有职工。
提示:在记录单条件对话框的工资栏中输入“>1500”,查找方法同上题。
4. 删除编号为“zg0008”的职工记录,并插入一条记录,该记录的字段值分别为:“zg0020”、“刘柳”,“男”,“31”,“已婚”,“销售部”,“1250”,“2000”。
提示:在记录单对话框中找到编号为“zg0008”的记录并删除;单击新建后先输入所有字段然后再单击新建进行添加。
5. 查询所有已婚的职工,要求在工作表中同时显示出来。
提示:可使用“数据”菜单的“筛选”功能,数据库区将只显示已婚的记录。
6. 对数据库按工资从低到高进行排序。
想
1. 打开d:/user下自己的文件夹中文件名为“职工档案.xls”的数据库,做如下操作。
(1) 查找性别为男且工资大于1500的职工记录。
(2) 利用记录单新建功能在第4条记录之前插入一条记录。
提示:先在第4条记录之前插入一行,然后选择第4条记录之前任意单元格后打开记录单对话框进行添加就可以了。
2. 试在一个工作表sheet1中给自己建立一个通讯录,字段名栏如图7-7,以“通讯录.xls”为文件名保存在d:\user下自己的文件夹下,并做下面几个操作。
提示:字段名 “关系”表示人与人的关系,一般有:亲戚、朋友、同事、同学等。
(1) 打印一张“关系”字段值为同学的通讯录。
提示:因为通过筛选后数据库区将只显示被筛选出来的记录,且在筛选状态进行打印,将只打印被显示的记录,所以可通过筛选功能实现打印要求。
(2) 若要打印的“关系”字段值为同学的通讯录要求按姓氏排序,该如何操作呢?
提示:先进行筛选,选择数据库区任意单元格后打开排序对话框,进行排序设置,单击“确定”后就可以连接打印机进行打印。
(3) 若要增加一条记录,该如何添加呢?
提示:添加方法一,在EXCEL工作表中直接添加,例如在数据库第二条记录前插入一行,然后输入相关字段值就可以了;方法二,利用“记录单”对话框中“新建”功能进行添加。
(4) 如何以最快的速度删除一条记录呢?
提示:若通讯录中记录很少,可在工作表中直接删除记录;若记录很多,就利用“记录单”对话框的功能进行删除。
议
1. 通过以上的操作,我们已熟悉了EXCEL的数据库功能,若要删除一条记录,我们有几种方法呢?这些方法有哪些优点呢?
2. 在数据库中插入一条记录的方法有几种,不同的方法插入记录时对数据库都有哪些要求呢?
3. 在排序过程中,为什么有时记录是随关键字(某个字段)整体排序,而有时只对某一列排序呢?我们应该如何操作才能正确排序呢?
4. 为什么我们建立EXCEL数据库时,中间不能有空的行与列呢?若数据库中有空行或空列,对记录的操作有无影响呢?如:用记录单的查询功能是否能正确查询到记录呢?
❹ 怎样实现数据库实时同步这种思路是否可行
建立远程数据库链接,然后在你需要同步的表上建触发器:每当表有修改时,自动修改远程数据库的相应表。
----------------------------------
抱歉,你的题目我没理解正确,其实你使用双机热备就行了,在网上找到一个教程,是这个网址:
http://blog.csdn.net/isoftk/archive/2007/12/03/1914175.aspx
你看一下吧。
----------------------------------
不是,我先前的理解不正确,后来的理解才正确,现在是你开始走弯路了,你就按照我给的网址学习双机热备吧,肯定能达到你的目的。
另:送你关于远程数据库映射的东西:
SqlServer数据库:
--这句是映射一个远程数据库
EXEC sp_addlinkedserver '远程数据库的IP或主机名',N'SQL Server'
--这句是登录远程数据库
EXEC sp_addlinkedsrvlogin '远程数据库的IP或主机名', 'false', NULL, '登录名', '密码'
--登录后,可以用以下格式操作远程数据库中的对象
select * from [远程数据库的IP或主机名].[数据库名].[dbo].[表名]
我仔细考虑了一下,用这种方式无法满足你的要求,所以请你用双机热备完成。
-------------------------------
原来是要在互联网环境下啊,你一直没有提,汗。。。
我水平有限,这个没什么好的思路,帮不上你,抱歉了。
我所能想到的,只有两种不成熟的思路:
1、用VPN架出局网环境,这个你可能条件所限,不能实现。
2、第二种思路是以我浅薄的知识想象出来的笨方法,拐弯抹角的而且不安全,大体思路就是,在B服务器上架构一个WEB服务器,用ASP或JSP什么的做一个页面,可以接收字串参数并作为sql语句执行(当然你要做好验证工作),然后修改A服务器的程序,使其每当对数据库有修改操作时,就同时向B机的WEB主页发送一个页面申请(比如 http://111.222.333.444/runsql.asp?sql=update AA set BB='cc'),这样B主机的WEB服务就会同步执行这个SQL语句了。(注意这种方法需要你的B机是以固定IP模式连网的,这需要向电信局申请)
说实话这第二种方法连我自己都觉得可笑,但水平实在有限,所以在这儿只是大胆说出我的想法,还请楼主或是其它高手看了不要见笑。
❺ 数据库得查询功能是怎么实现的
数据库的查询功能实现原理:
数据库查询是数据库的最主要功能之一。我们都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化。最基本的查询算法当然是顺序查找(linear search),这种复杂度为O(n)的算法在数据量很大时显然是糟糕的,好在计算机科学的发展提供了很多更优秀的查找算法,例如二分查找(binary search)、二叉树查找(binary tree search)等。如果稍微分析一下会发现,每种查找算法都只能应用于特定的数据结构之上,例如二分查找要求被检索数据有序,而二叉树查找只能应用于二叉查找树上,但是数据本身的组织结构不可能完全满足各种数据结构(例如,理论上不可能同时将两列都按顺序进行组织),所以,在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。
图1展示了一种可能的索引方式。左边是数据表,一共有两列七条记录,最左边的是数据记录的物理地址(注意逻辑上相邻的记录在磁盘上也并不是一定物理相邻的)。为了加快Col2的查找,可以维护一个右边所示的二叉查找树,每个节点分别包含索引键值和一个指向对应数据记录物理地址的指针,这样就可以运用二叉查找在O(log2n)O(log2n)的复杂度内获取到相应数据。
❻ 怎么实现网页和数据库(SQL)的连接
sql
server
2000无论是个人版、企业版还是标准版,只要细版本在8.00.1760以下,均不提供远程数据库连接,即使服务器端工具和客户端工具的设置均有tcp/ip设置和数据库连接属性也设置了rpc远程连接,仍然不能实现远程连接。该怎么解决呢?
解决方案如下:
首先,需要打sp4补丁,该补丁包含了以前sp1、2、3的补丁,安装此补丁后一般要重新启动计算机,再进行远程连接就可以了,如再企业管理器可远程注册服务器、查询分析可连接远程服务器、odbc可连接远程服务器。
要点:
1.确认服务器端sql服务端口号是否为:1433
2.如果不是1433,配置客户端
3.建立服务器端登录帐号,确保角色及管理数据库
一、查看服务器端情况
1.
看ping
服务器ip能否ping通。
这个实际上是看和远程sql
server
服务器的物理连接是否存在。如果不行,请检查网络,查看配置,当然得确保远程sql
server
服务器的ip拼写正确。
2.
在dos或命令行下输入telnet
服务器ip
端口,看能否连通。
如telnet
202.114.100.100
1433
通常端口值是1433,因为1433是sql
server
的对于tcp/ip的默认侦听端口。如果有问题,通常这一步会出问题。通常的提示是“……无法打开连接,连接失败"。
如果这一步有问题,应该检查以下选项。
1)
检查远程服务器是否启动了sql
server
服务。如果没有,则启动。
2)
检查sql
server服务器端有没启用tcp/ip协议,因为远程连接(通过因特网)需要靠这个协议。检查方法是,在服务器上打开
开始菜单->程序->microsoft
sql
server->服务器网络实用工具,看启用的协议里是否有tcp/ip协议,如果没有,则启用它。
3)
检查服务器的tcp/ip端口是否配置为1433端口。仍然在服务器网络实用工具里查看启用协议里面的tcp/ip的属性,确保默认端口为1433,并且隐藏服务器复选框没有勾上。
事实上,如果默认端口被修改,也是可以的,但是在客户端做telnet测试时,写服务器端口号时必须与服务器配置的端口号保持一致。如果隐藏sql
server服务器复选框被勾选,则意味着客户端无法通过枚举服务器来看到这台服务器,起到了保护的作用,但不影响连接,但是tcp/ip协议的默认端口将被隐式修改为2433,在客户端连接时必须作相应的改变(具体方式见
二:设置客户端网络实用工具)。
4)
如果服务器端操作系统打过sp2补丁,则要对windows防火墙作一定的配置,要对它开放1433端口,通常在测试时可以直接关掉windows防火墙(其他的防火墙也关掉最好)。(4、5步我没有做就成功了)
5)
检查服务器是否在1433端口侦听。如果sql
server服务器没有在tcp连接的1433端口侦听,则是连接不上的。检查方法是在服务器的dos或命令行下面输入
netstat
-a
-n
或者是netstat
-an,在结果列表里看是否有类似
tcp
127.0.0.1
1433
listening
的项。如果没有,则通常需要给sql
server
2000打上至少sp3的补丁。其实在服务器端启动查询分析器,输入select
@@version
执行后可以看到版本号,版本号在8.0.2039以下的都需要打补丁。
如果以上都没问题,这时你再做telnet
服务器ip
1433
测试,将会看到屏幕一闪之后光标在左上角不停闪动。恭喜你,你马上可以开始在企业管理器或查询分析器连接了。
❼ 用于实现数据库各种数据操作的软件是
用于实现对数据库进行各种数据操作的软件称为数据库管理系统。
数据库管理系统是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,简称DBMS。它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。用户通过DBMS访问数据库中的数据,数据库管理员也通过DBMS进行数据库的维护工作。
(7)实现数据库扩展阅读:
数据库管理系统主要包括:进行数据定义语言以及翻译的相关程序,在这个部分的帮助下,可以让数据库的用户自行进行选择,并且也能得到翻译由此形成一个内部形式。
进行数据运行控制的程序,因为这一程序的工作,让数据库中的资源可以充分得到管理,并且能实现关于数据的一种控制;数据库的实用程序则可以使得数据库在相对完整的基础上建立起来,并且在相对完整的数据库系统下让数据库得到维护。
❽ 怎么做一个完整的数据库
你要是建ORACLE数据库,还是MSSQL数据库呢?在建立数据库之前,需要对其进行设计分析。
需求分析调查和分析用户的业务活动和数据的使用情况,弄清所用数据的种类、范围、数量以及它们在业务活动中交流的情况,确定用户对数据库系统的使用要求和各种约束条件等,形成用户需求规约。概念设计对用户要求描述的现实世界(可能是一个工厂、一个商场或者一个学校等),通过对其中诸处的分类、聚集和概括,建立抽象的概念数据模型。这个概念模型应反映现实世界各部门的信息结构、信息流动情况、信息间的互相制约关系以及各部门对信息储存、查询和加工的要求等。所建立的模型应避开数据库在计算机上的具体实现细节,用一种抽象的形式表示出来。以扩充的实体—(E-R模型)联系模型方法为例,第一步先明确现实世界各部门所含的各种实体及其属性、实体间的联系以及对信息的制约条件等,从而给出各部门内所用信息的局部描述(在数据库中称为用户的局部视图)。第二步再将前面得到的多个用户的局部视图集成为一个全局视图,即用户要描述的现实世界的概念数据模型。逻辑设计主要工作是将现实世界的概念数据模型设计成数据库的一种逻辑模式,即适应于某种特定数据库管理系统所支持的逻辑数据模式。与此同时,可能还需为各种数据处理应用领域产生相应的逻辑子模式。这一步设计的结果就是所谓“逻辑数据库”。
物理设计根据特定数据库管理系统所提供的多种存储结构和存取方法等依赖于具体计算机结构的各项物理设计措施,对具体的应用任务选定最合适的物理存储结构(包括文件类型、索引结构和数据的存放次序与位逻辑等)、存取方法和存取路径等。这一步设计的结果就是所谓“物理数据库”。验证设计在上述设计的基础上,收集数据并具体建立一个数据库,运行一些典型的应用任务来验证数据库设计的正确性和合理性。一般,一个大型数据库的设计过程往往需要经过多次循环反复。当设计的某步发现问题时,可能就需要返回到前面去进行修改。因此,在做上述数据库设计时就应考虑到今后修改设计的可能性和方便性。运行与维护设计在数据库系统正式投入运行的过程中,必须不断地对其进行调整与修改。
数据库设计步骤 至今,数据库设计的很多工作仍需要人工来做,除了关系型数据库已有一套较完整的数据范式理论可用来部分地指导数据库设计之外,尚缺乏一套完善的数据库设计理论、方法和工具,以实现数据库设计的自动化或交互式的半自动化设计。所以数据库设计今后的研究发展方向是研究数据库设计理论,寻求能够更有效地表达语义关系的数据模型,为各阶段的设计提供自动或半自动的设计工具和集成化的开发环境,使数据库的设计更加工程化、更加规范化和更加方便易行,使得在数据库的设计中充分体现软件工程的先进思想和方法。
❾ 如何自己实现一个关系型数据库
对外数据模型为关系型数据库,内部的实现主要分成两大类,一类是disk-based,比如mysql,postgres,一类是memory based,后者包括MemSQL,SAP HAHA,OceanBase。看题目的意思指的是前者。这里说一个disk-based的关系型数据库涉及多少东西。
上世纪70/80年代内存不大,数据不能都放在内存里,大部分数据都存在磁盘上,读数据也需要从磁盘读,然而读写磁盘太慢了,所以就在内存里做了一个buffer pool,将已经读过的数据缓存到buffer pool中,写的时候也是写到buffer pool中就返回,buffer pool的功能就是管理数据在磁盘和内存的移动。在buffer pool中数据的管理单位是page。page大小一般几十KB。一般都可以配置。如果buffer pool中没有空闲的page,就需要将某一个page提出buffer pool,如果它是dirty page,就需要flush到磁盘,这里又需要一个LRU算法。一个page包含多条记录,page的格式需要设计用来支持变长字段。如果这时宕机了,buffer pool中的数据就丢了。这就需要REDO log,将对数据的修改先写到redo log中,然后写buffer pool,然后返回给客户端,随后,buffer pool中的dirty page会被刷到数据文件中(NO FORCE)。那么重启的时候,数据就能从redo log中恢复。REDO log还没刷完就刷数据到磁盘可以加快写入速度,缺点就是恢复的时候需要回放UNDO log,回滚一些还没有提交的事务的修改。写log又分为逻辑log和物理log,还有物理逻辑log。简单说逻辑log就是记录操作,比如将某个值从1改成2.而物理log记录具体到record的位置,例如某个page的某个record的某个field,原来的值是多少,新值是多少等。逻辑log的问题是并发情况下不太好恢复成一致。物理log对于某些操作比如create table又过于琐碎,所以一般数据库都采用混合的方式。为了跟踪系统中各种操作的顺序,这就需要为log分配id,记做LSN(log sequence number)。系统中记录各种LSN,比如pageLSN, flushedLSN等等。为了加快宕机恢复速度,需要定期写checkpoint,checkpoint就是一个LSN。
以上ACID里的C和D有关。下面说A和I,即原子性和隔离性。
这两个性质通过concurrency control来保证。隔离级别有很多种,最开始有4种,从低到高read uncommitted, read committed, repeatable read, serializable。serializable就是多个事务并发执行的结果和某种顺序执行事务的结果相同。除了serializable,其他都有各种问题。比如repeatable read有幻读问题(phantom),避免幻读需要gap lock。read committed有幻读和不可重复读问题。后来又多了一些隔离级别,比如snapshot isolation,snapshot isolation也有write skew问题。早期,并发控制协议大多是基于两阶段锁来做的(2PL),所以早期只有前面提到的四种隔离级别,后来,又出现一类并发控制协议,统称为Timestamp Ordering,所以又多了snapshot isolation等隔离级别。关于隔离级别,可以看看这篇论文 http://research.microsoft.com/pubs/69541/tr-95-51.pdf。2PL需要处理deadlock的问题。
Timestamp Ordering大体的思想就是认为事务之间冲突不大,不需要加锁,只在commit的时候check是否有冲突。属于一种乐观锁。
Timestamp Ordering具体来说包括多种,最常见的MVCC就是这类,还有一类叫做OCC(optimistic concurrency control)。MVCC就是对于事务的每次更新都产生新的版本,使用时间戳做版本号。读的时候可以读指定版本或者读最新的版本。几乎主流数据库都支持MVCC,因为MVCC读写互相不阻塞,读性能高。MySQL的回滚段就是用来保存老的版本。MVCC需要有后台线程来做不再需要的版本的回收工作。Postgres的vacuum就是做这事的。OCC和MVCC的区别是,OCC协议中,事务的修改保存在私有空间(比如客户端),commit的时候再去检测冲突,通常的做法是事务开始时看一下自己要修改的数据的最后一次修改的时间戳,提交的时候去check是否这个时间戳变大了,如果是,说明被别人改过了,冲突。冲突后可以回滚或者重试。
上面这些搞定了就实现了数据库的核心,然后为了性能,需要index,通常有两种,一种支持顺序扫描B+Tree,还有一种是Hash Index。单条读适合用Hash Index,O(1)时间复杂度,顺序扫描只适合用B+Tree,O(logN)复杂度。然后,有些查询只需要扫描索引就能得到结果,有些查询直接扫描数据表就能得到结果,有些查询可以走二级索引,通过二级索引找到数据表然后得到结果。。具体用哪种方式就是优化器的事了。
再外围一些,关系型数据库自然需要支持SQL了,由SQL变成最后可以执行的物理执行计划中间又有很多步,首先SQL通过词法语法分析生成抽象语法树,然后planner基于这棵树生成逻辑执行计划,逻辑执行计划的生成通常涉及到等价谓词重写,子查询消除等逻辑层面的优化技术,优化的目的当然是性能。比如等价谓词重写,用大于小于谓词消除like,between .. and..等不能利用索引的谓词。下一步是逻辑执行计划生成物理执行计划,物理执行计划树每个节点是一个operator,operator的执行就是实实在在的操作,比如扫表的operator,filter opertor。一个逻辑执行计划通常可以有多个物理执行对应,选择哪个就涉及到物理执行计划优化,这里涉及到经典的cost model,综合考虑内存,CPU, I/O,网络等。最典型的,三表join,从左到右还是右到左,使用hash join,还是sort merge join等。
❿ java 实现数据库增删改查的Dao和DaoImpl的写法
package org.;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.Date;
import org.dbc.DBManageer;
import org.dbc.DBUtil;
import org.vo.CardInfo;
public class CardInfoDao {
public void testResultSetMetaData() {
String sql = "select * from cardinfo";
Connection con = new DBUtil().getConnection();
PreparedStatement ps = null;
ResultSetMetaData rsmd = null;
ResultSet rs = null;
try {
ps = con.prepareStatement(sql);
rs = ps.executeQuery();
rsmd = rs.getMetaData();
for (int i = 1; i < rsmd.getColumnCount(); i++) {
System.out.print(" 数据类型名:" + rsmd.getColumnClassName(i));
System.out.print(" 别名:" + rsmd.getColumnLabel(i));
System.out.print(" 列名:" + rsmd.getColumnName(i));
System.out.print(" 数据类型:" + rsmd.getColumnTypeName(i));
System.out.println(" 数据类型:" + rsmd.getColumnType(i));
}
while (rs.next()) {
// 通过反射可以对VO对象(CardInfo)自动赋值
// for(...)
// CardInfo ci=new CardInfo();
// ci.setId(rs.getInt(columnIndex))
/*
* CardInfo ca = new CardInfo(); Class cc = ca.getClass();
*/
/*Class<?> c = Class.forName("org.vo.CardInfo");
CardInfo ca = (CardInfo) c.newInstance();
ca.setCardId(rs.getString("cardId"));
ca.setCustomerName(rs.getString("customerName"));
ca.setCurrentMoney(rs.getFloat("currentMoney"));
ca.setOpenDate(rs.getDate("openDate"));
System.out.println(ca);//ok */
//加载一个CardInfo类
Class c = Class.forName("org.vo.CardInfo");
Object o = c.newInstance(); //获得它的一个实例
//定义String类的对象数组
Class[] params = new Class[] { String.class};
//定义float类的对象数组
Class[] floatparams = new Class[] { float.class};
//定义Date(util)类的对象数组
Class[] dateparams = new Class[] { Date.class};
//获得setCardId方法
Method me = c.getMethod("setCardId", params);
//实例方法的参数
Object []ostr = new Object[]{rs.getString("cardId")};
//如果底层方法是静态的,那么可以忽略指定的 obj 参数。该参数可以为 null。
//如果底层方法所需的形参数为 0,则所提供的 args 数组长度可以为 0 或 null。
//o 调用方法的对象 ostr 方法调用的参数
me.invoke(o, ostr);
//获得setCustomerName方法
Method name = c.getMethod("setCustomerName", params);
Object []cusname = new Object[]{rs.getString("customerName")};
name.invoke(o,cusname);
//获得setCurrentMoney方法
Method money = c.getMethod("setCurrentMoney", floatparams);
Object []cusmoney = new Object[]{rs.getFloat("currentMoney")};
money.invoke(o,cusmoney);
//获得setOpenDate方法
Method date = c.getMethod("setOpenDate",dateparams);
Object []openDate = new Object[]{rs.getDate("openDate")};
date.invoke(o, openDate);
//打印
System.out.println(o);
}
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
}catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
public void showResultSet() {
String sql = "select * from cardinfo";
Connection con = new DBManageer().getConnection();
PreparedStatement ps = null;
try {
ps = con.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
ResultSet rs = ps.executeQuery();
System.out.println("---依次读取------");
while (rs.next()) {
CardInfo ca = new CardInfo();
ca.setCardId(rs.getString("cardId"));
ca.setCustomerName(rs.getString("customerName"));
ca.setCurrentMoney(rs.getFloat("currentMoney"));
ca.setOpenDate(rs.getDate("openDate"));
System.out.println(ca);
}
System.out.println("---倒读------");
while (rs.previous()) {
CardInfo ca = new CardInfo();
ca.setCardId(rs.getString("cardId"));
ca.setCustomerName(rs.getString("customerName"));
ca.setCurrentMoney(rs.getFloat("currentMoney"));
ca.setOpenDate(rs.getDate("openDate"));
System.out.println(ca);
}
rs.absolute(3);// 定位倒第几行
rs.updateString("customerName", "star");
// rs.updateRow();
rs.beforeFirst();
while (rs.next()) {
CardInfo ca = new CardInfo();
ca.setCardId(rs.getString("cardId"));
ca.setCustomerName(rs.getString("customerName"));
ca.setCurrentMoney(rs.getFloat("currentMoney"));
ca.setOpenDate(rs.getDate("openDate"));
System.out.println(ca);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}