java系统学习(十六) --------JDBC及其应用
2015-10-20 18:28
381 查看
现在很多框架都有了封装好的对数据库访问的组件,比如hibernate等,但是基本的jdbc知识还是有必要了解的。
数据库在应用程序中占有相当重要的地位,几乎所有的系统都需要用到数据库。
数据库发展到现在已经相当成熟了,由原来的Sybase数据库,发展到现在的MySQL, SQL Server和Oracle、mongodb等高级数据库。
口尽可能不重复。
口以最优方式为某个特定组织提供多种应用服务。
口其数据结构独立于使用它的应用程序。
口对数据的增删改和检索由统一软件进行管理和控制。
从发展的历史看,数据库是数据管理的高级阶段,它是由文件管理系统发展起来的。数据库的基本结构分3个层次,反映了观察数据库的3种不同角度。
口物理数据层。它是数据库的最内层,是物理存储设备上实际存储的数据的集合,这些 数据是原始数据,同时也是用户加工的对象,由内部模式描述的指令操作处理的位串、 字符和字组成。
口概念数据层。它是数据库的中间一层,是数据库的整体逻辑表示,指出了每个数据的 逻辑定义及数据间的逻辑联系,是存储记录的集合。它所涉及的是数据库所有对象的逻辑关系,不是它们的物理情况而是数据库管理员概念下的数据库。
口逻辑数据层。它是用户所看到和使用的数据库,表示了一个或一些特定用户使用的数据集合,即逻辑记录的集合。
数据库不同层次之间的联系是通过映射进行转换的。数据库主要有以下特点:
口实现数据共享。
口数据的独立性。
口数据一致性和可维护性,以确保数据的安全性和可靠性。
(1)层次型数据库:是一组通过链接而互相联系在一起的记录。树结构图是层次数据库的模式。层次模型的特点是记录之间的联系是通过指针实现,表示的是对象的联系。
其缺点是无法反映多对象的联系,并且由于层次顺序的严格和复杂,导致数据的查询和更新操作复杂,因此应用程序也比较复杂。
(2)网状数据库:是基于网络模型建立的数据库。网络模型,是使用网格结构表示实体类型、实体间联系的数据模型。网状模型的特点是记录之间的联系通过指针实现,使多对多的联系容易实现。缺点是编写应用程序比较复杂,程序员必须熟悉数据库的逻辑结构。
(3)关系数据库:是基于关系模型建立的数据库。关系模型由一系列表格组成,用表格来表达数据集.用外键(关系)来表达数据集之间的联系。
(4)对象型数据库:是建立在面向对象模型基础之上。面向对象模型中最基本的概念是对象和类。对象是现实世界中实体的模型化,共享同一属性集和方法集的所有对象构成一个类。类可以有嵌套结构。系统中的所有类组成一个有根、有向无环图,称为类层次。
数据库设计中需求分析阶段综合各个用户的应用需求(现实世界的需求)。
在概念设计阶段形成独立于机器特点和独立于各个DBMS产品的概念模式(信息世界模型)。
在逻辑设计阶段可以将需求关系转换成具体的数据库产品支持的数据模型如关系模型,从而形成数据库逻辑模式.然后根据用户处理的要求、安全性的考虑,在基本表的基础上再建立必要的视图(VIEW)形成数据的外模式。
在物理设计阶段根据DBMS特点和处理的需要,进行物理存储安排、没计索引、形成数据库内模式。
口需求分析的重点是调查、收集与分析用户在数据管理中的信息要求、处理要求、安全性与完整性要求。
口需求分析的方法:调查组织机构情况,调查各部门的业务活动情况,协助用户明确对新系统的各种要求,确定新系统的边界。
口了解企业业务,从而可以在以后的开发阶段节约大量的时间。
口定义标准的对象命名规范。
口数据库各种对象的命名必须规范。
口某个表只包括其本身基本的属性。
口当不是它们本身所具有的属性时需进行分解。
口表之间的关系通过外键相连接。
口它有一组专门存放通过键连接起来的关联数据。
键设计4原则:
口为关联字段创建外键。
口所有的键都必须唯一。
口避免使用复合键。
口外键总是关联唯一的键字段。
口索引是从数据库中获取数据的最高效方式之一,95%的数据库性能问题都可以采用索引技术得到解决。
口逻辑主键使用唯一的成组索弓},对系统键(作为存储过程)采用唯一的非成组索引, 对任何外键采用非成组索引。考虑数据库的空间有多大,表如何进行访问,还有一这些访问是否主要用作读写。
口大多数数据库都索引自动创建的主键字段,但是可别忘了索引外键,它们也是经常使用的键,例如运行查询显示主表和所有关联表的某条记录,就用得上它。
口不要索引memo/note宇段,不要索引大型字段(有很多字符),这样会让索引占用太多的存储空间
口不要索引常用的小型表。
口不要为小型数据表设置任何键,假如它们经常有插人和删除操作就更不能这样做,对这些插入和删除操作的索引维护,可能比扫描表空间消耗更多的时间。
口与数据库建立一个连接。
口向数据库发送SQL语句。
口处理数据库返回的结果。
口使用Java程序语言和JDBC工具包开发程序,是独立于平台和厂商的。
即开放数据库互连,它建立了一组规范,并且提供了一组对数据库访问的标谁API(应用程序编程接口),这些API利用SQL来完成其大部分任务。ODBC也提供了对SQL的支持。
JDBC是Java与数据库的接口规范,由Java语言编写的类和接口组成。如果要通过JDBC驱动连接数据库,大致分为4种方式:Java到数据库协议、Java到本地API, JDBC-ODBC桥和Java到网络协议。
关于JDBC程序的工作原理如图所示。
JDBC的引入有其非常重要的作用:
口程序员可以使用java开发基于数据库的应用程序,在遵守Java语言规则的同时,可以使
用标准的SQL语句访问任何数据库。
口如果数据库厂商提供较底层的驱动程序,程序员可以在自己的软件中,使用比转优化的驱动程序。
其实JDBC和ODBC是统一模型,那为什么不采用ODBC呢?因为ODBC过于复杂难以掌握,也比较难部署。
数据库连接对动态网站来说是最为重要的部分。Java中连接数据库的技术是JDBC。很多数据库系统带有JDBC驱动程序,Java程序就通过JDBC驱动程序与数据库相连,执行查询、提取数据等操作。Sun公司还开发了JOBC-ODBC bridge,用此技术,Java程序就可以访问带有ODBC驱动程序的数据库。目前,大多数数据库系统都带有ODBC驱动程序,所以. Java程序能访问诸如Oracle, Sybase, MS SQL Server和MS Access等数据库。
本小节将演示如何利用oracle:thin子协议来操作Oracle数据库,具体步骤如下:
(1)配置开发环境,引入与Oracle数据库相对应的JDBC。首先复制对应的驱动程序,然后在Package Explorer视图中右击jdbc项目,在出现选项中选中“Paste",就完成了环境的配置。
(2)实例实现连接和操作Oracle数据库,即通过oracle:thin子协议显示出oracle数据库中的employee表格中的数据。
代码说明:当程序通过DriverManager.getConnection()方法连接Oracle数据库时,其参数"jdbc:oracle:thin@localhost:1521:orcl"中使用的子协议名为"oracle:thin",子名称中"localhost"为主机名、"1521"为Oracle服务器端口号和“orcl”为数据库名。
对于开发人员来说,图中最后三步是由Windows系统自动封装成为ODBC数据源,不需要进行相应的编程。
例子:连接和操作ODBC数据源,其通过JDBC-ODBC桥驱动程来显示Excel表格中的数据。
sun.jdbc.odbc.JdbcOdbcDriver,即JDBC-ODBC桥驱动程序。
口当程序通过DriverManager.getConnection()方法连接ODBC数据源时,其第一个参数中
协议与子协议名必须为jdbc和odbc,而子名称是确定的,必须为ExcelTest数据源名。第二个和第三个参数用来设置用户名和密码,当它们为空时可以设置为空字符串。
与其他语言(如Java, Visual Basic这样的程序设计语言)不一样,SQL由很少的词构成这是有意而为的。SQL能够很好地完成一项任务—提供一种从数据库中读写数据的简单有效的方法。
SQL有如下的优点:
口SQL不是某个特定数据库供应商专有的语言.几乎所有重要的DBMS都支持SQL,所以, 此语言几乎能与所有数据库打交道。
口SQL简单易学。它的语句全都是由具有很强描述性的英语单词组成,而且这些单词的数目不多,这个就是它简单易学的主要原因。
口SQL看上去尽管很简单,但实际上是一种强有力的语言,灵活使用其语言元素,可以进行非常复杂和高级的数据库操作。
数据查询 select
数据定义 create,drop,delete
数据操纵 insert,update,delete
数据控制 grant,revoke
口数据查询语句用于查询数据结构。
口数据定义语句用于数据结构。
口数据操纵语句用于检索和修改数据结构。
口数据控制语句用于规定DB用户的各种权限。
据,在进行检索之前,必须知道需要的数据存储在哪里。select语句可由多个查询句子组成。
select的结构如下:
select [all|distinct] [into new_table_name] from [表名|视图名]
(where搜索条件)
group by 把查到的按什么标准分组
(having搜索条件)
(order by 按什么顺序排序)〔升序|降序〕
说明如下。
口all:指明查询结果中可以显示值相同的列,all是系统默认值。
口distinct:指明查询结果中如有值相同的列,只显示其中的一列,对distinct来说,NULL
被认为相同的值。
口into子句:用于把查询结果存放到一个新建表中。新表一般由select子句指定的列构成。
口from子句:指定需要进行数据查询的表。
口where子句:指定数据检索的条件,以限制返回的数据。
口group by子句:指定查询结果的分组条件。
口having子句:指定分组搜索条件,它通常与group by子句一起使用。
口order by子句:指定查询结果的排序方式。
insert into <表名>〔列名〕value〔对应列的值〕
数据修改语句:
update<表名>set<列名>=<表达式>〔where<条件>〕
数据删除语句:
delete [from]{表名|视图名}〔where子句〕
创建DB表的索引:create index
删除DB中的表:drop table
删除DB表中的索引:drop index
删除表中所有的行:truncate
增加表列:alter table
这些是SQL中经常使用到的一些语句。
一个事务逻辑上作单元必须具有以下4种属性:
口原子性:一个事务必须作为一个原子单位,它所作的数据修改操作要不全部执行,要不全部取消。
口一致性:当事务完成后,数据必须保证处于一致性的状态。
口隔离性:一个事务所做的修改必须能够跟其他事务所作的修改分离开来,以免在并发处理时,发生数据错误。
口永久性:事务完成后,它对数据库所做的修改应该被永久保持。
在实际工作中,有可能会出现一种情祝:要向一个数据库中插入若干条记录,如果当插入一半数据时,突然系统出错了,那么数据库中已经有了一半的数据。如果再重新插入,很有可能会引起数据库出错,此时,就需要使用事务的概念。在一个事务中允许数据库进行回滚操作,即让前面的插入工作全部作废,这样重新插入的时候就不会出错了。
若要管理一个事务,可以在进行数据库操作动作之前,将数据库自动提交设为false,即con.setAutoCommit(false)。
在数据库操作没有任何异常现象出现的前提下,再将事务提交:con.commit()。 在提交完毕后,要记住将事务管理的控制权还给数据库:
con.setAutoCommit(true)。
下面通过一个实例,演示事务处理中的回滚功能,实例代码如下:
经过回滚后原先插入的最后一条数据已经没有了。这是为了保证数据的完整性和一致性而进行的数据库的回滚操作。
可以先建立一个查询条件:
string sql="select name,code,sexy,age from teacherinfo where name=?",
接下来,要介绍一个接口"PreparedStatement".而这里的预查询通过这个接口实现,可以通过下列方式来获得这个接口的对象。
PreparedStatement pre=con.PreparedStatement(sql)
此时就建立好一个预查询对象了,如果要查询,可以利用下面的方法实现:
Pre.setString(字段的列序号,此列中的一个要查询的值);
例如,要查询一个名叫“王鹏”的人的信息就可以使用下列代码实现:
Pre.setString(1,"王鹏");
再如,要查询一个学号是"23001"的人的信息,就可以使用下列代码实现:
string sql="select name,code,sexy,age from teacherinfo where code=?"
PreparedStatement pre=con.PreparedStatement(sql);
Pre .setString(2,"23001");
(1)创建Statement对象。
建立了到特定数据库的连接之后,就可用该连接发送SQL语句,Statement对象用Connection的方法createStatement创建,如下所示:
Connection con=DriverManager.getConnection(url,"sunny","");
Statement stmt=con.createStatement();
为了执行Statement对象,发送到数据库的SQL语句将被作为参数提供给Statement的方法。
ResultSet rs=stmt.executeQuery("select a,b,c from Table2");
使用Statement对象执行语句,Statement接口提供了3种执行SQL语句的方法:
executeQuery(), executeUpdate()和execute()。使用哪一个方法由SQL语句所产生的内容决定。
(2)方法 executeQuery()用于产生单个结果集的语句,例如select语句。
(3)方法executeUpdate()用于执行insert、update或delete语句以及SQL DDL(数据定义语言)语句,例如create table和drop table。 insert、update或delete语句的效果是修改表中零行或多行中的一列或多列. executeUpdate()的返回值是一个整数,指示受影响的行数(即更新计数)。
对于create table或drop table等不操作行的语句,executeUpdate()的返回值总为零。
(4)方法execute()用于执行返回多个结果集、多个更新计数或二者组合的语句,多数程序员不需要该高级功能。
执行语句的所有方法都会关闭所调用的Statement对象的当前结果集,这意味着在重新执行Statement对象之前,需要完成对当前ResuItSet对象的处理。
(5)语句完成。
当连接处于自动提交模式时,其中所执行的语句在完成时将自动提交或还原。语句在已执行且所有结果返回时,即认为已完成。对于返回一个结果集的executeQuery( )方法,在检索完ResultSet对象的所有行后该语句完成。对于方法executeUpdate(),当它执行时语句即完成,但在少数调用方法execute()的情况中,在检索所有结果集或它生成的更新计数之后语句才完成。
有些DBMS将存储过程中的每条语句都视为独立的语句,而另外一些则将整个过程视为一个复合语句。在启用自动提交时,这种差别就变得非常重要,囚为它影响调用commit()方法的时机。在前一种情况中,每条语句单独提交,在后一种情况中,所有语句同时提交。
(6)关闭Statement对象。
Statement对象由Java垃圾收集程序自动关闭。而一种好的编程风格,应在不需要Statement
对象时显式地关闭它们.这将立即释放DBMS资源,有助于避免潜在的内存问题。
口视图看上去跟表一模一样。具有一组命名的字段和数据项,但实际上,它是一个虑拟表,在库中并不存在。它是由查询DB产生的,限制了用户能看到和修改的数据。由
此可见,视图可以用来控制用户对数据的访问,并能简化数据的显示,即通过视图只需要显示那些需要的数据信息。
口图表就是数据库表之间的关系示意图,利用它可以编辑表与表之间的关系。
口规则就是对DB表中的数据信息进行限制,有一点需要强调的是它限定的只能是表中的列字段。
口缺省值就是当在表中创建列或插入数据时,对没有指定具体值的列,赋予其没定好的默认值。
口触发器是一个用户自定义的SQL事务命令的集合,当对一个表进行插入、更改、删除时. 这组命令会自动执行。
口存储过程是为完成特定的功能而汇集在一起的一组SQL程序语句,经编译后存储在DB中的SQL程序。
数据库的基础知识
JDBC是连接数据库和Java应用程序的一个纽带,下面先介绍有关数据库的知识。数据库在应用程序中占有相当重要的地位,几乎所有的系统都需要用到数据库。
数据库发展到现在已经相当成熟了,由原来的Sybase数据库,发展到现在的MySQL, SQL Server和Oracle、mongodb等高级数据库。
什么是数据库
数据库是依照某种数据模型组织起来,并存放二级存储器中的数据集合。这种数据集合具有如下特点:口尽可能不重复。
口以最优方式为某个特定组织提供多种应用服务。
口其数据结构独立于使用它的应用程序。
口对数据的增删改和检索由统一软件进行管理和控制。
从发展的历史看,数据库是数据管理的高级阶段,它是由文件管理系统发展起来的。数据库的基本结构分3个层次,反映了观察数据库的3种不同角度。
口物理数据层。它是数据库的最内层,是物理存储设备上实际存储的数据的集合,这些 数据是原始数据,同时也是用户加工的对象,由内部模式描述的指令操作处理的位串、 字符和字组成。
口概念数据层。它是数据库的中间一层,是数据库的整体逻辑表示,指出了每个数据的 逻辑定义及数据间的逻辑联系,是存储记录的集合。它所涉及的是数据库所有对象的逻辑关系,不是它们的物理情况而是数据库管理员概念下的数据库。
口逻辑数据层。它是用户所看到和使用的数据库,表示了一个或一些特定用户使用的数据集合,即逻辑记录的集合。
数据库不同层次之间的联系是通过映射进行转换的。数据库主要有以下特点:
口实现数据共享。
口数据的独立性。
口数据一致性和可维护性,以确保数据的安全性和可靠性。
数据库的分类及功能
数据库系统一般基于某种数据模型,可以分为层次型、网状型、关系型、面向对象型等。(1)层次型数据库:是一组通过链接而互相联系在一起的记录。树结构图是层次数据库的模式。层次模型的特点是记录之间的联系是通过指针实现,表示的是对象的联系。
其缺点是无法反映多对象的联系,并且由于层次顺序的严格和复杂,导致数据的查询和更新操作复杂,因此应用程序也比较复杂。
(2)网状数据库:是基于网络模型建立的数据库。网络模型,是使用网格结构表示实体类型、实体间联系的数据模型。网状模型的特点是记录之间的联系通过指针实现,使多对多的联系容易实现。缺点是编写应用程序比较复杂,程序员必须熟悉数据库的逻辑结构。
(3)关系数据库:是基于关系模型建立的数据库。关系模型由一系列表格组成,用表格来表达数据集.用外键(关系)来表达数据集之间的联系。
(4)对象型数据库:是建立在面向对象模型基础之上。面向对象模型中最基本的概念是对象和类。对象是现实世界中实体的模型化,共享同一属性集和方法集的所有对象构成一个类。类可以有嵌套结构。系统中的所有类组成一个有根、有向无环图,称为类层次。
关系数据库的设计
数据库设计过程
数据库技术是信息资源管理最有效的手段。数据库设计对于一个给定的应用环境,通过构造最优的数据库模式,建立数据库及其应用系统,通过在数据库中有效存储、操作数据,从而满足用户信息要求和处理要求。数据库设计中需求分析阶段综合各个用户的应用需求(现实世界的需求)。
在概念设计阶段形成独立于机器特点和独立于各个DBMS产品的概念模式(信息世界模型)。
在逻辑设计阶段可以将需求关系转换成具体的数据库产品支持的数据模型如关系模型,从而形成数据库逻辑模式.然后根据用户处理的要求、安全性的考虑,在基本表的基础上再建立必要的视图(VIEW)形成数据的外模式。
在物理设计阶段根据DBMS特点和处理的需要,进行物理存储安排、没计索引、形成数据库内模式。
需求分析阶段
口需求收集和分析,结果得到数据字典描述的数据需求(和数据流图描述的处理需求)。口需求分析的重点是调查、收集与分析用户在数据管理中的信息要求、处理要求、安全性与完整性要求。
口需求分析的方法:调查组织机构情况,调查各部门的业务活动情况,协助用户明确对新系统的各种要求,确定新系统的边界。
数据库的设计技巧
一些数据库设计方面的技巧,主要包括4点,如下所示。设计数据库之前(需求分析阶段)
口理解客户需求,询问用户如何看待未来需求变化,让客户解释其需求,而且随着开发的继续,还要经常询问客户,从而保证其需求仍然在开发的目的之中。口了解企业业务,从而可以在以后的开发阶段节约大量的时间。
口定义标准的对象命名规范。
口数据库各种对象的命名必须规范。
表设计原则
表由行和列组成,每一行称为一条记录,列称为一个字段。数据的标准化有助于消除数据库中的数据冗余。标准化有好几种形式.但Third Normal Form (3NF)通常被认为在性能、扩展性和数据完整性方面达到了最好平衡,简单来说,遵守3NF标谁的数据库的表设计原则如下:口某个表只包括其本身基本的属性。
口当不是它们本身所具有的属性时需进行分解。
口表之间的关系通过外键相连接。
口它有一组专门存放通过键连接起来的关联数据。
键选择原则
键就是表中的字段。什么是主键呢?主键被挑选出来作为表的唯一标识。那什么是外键呢?外键就是两张表通过一个键产生联系,而这个键又在两张表中,其中在一张表中是主键,那么这个键在另一张表中,就被称为外键。键设计4原则:
口为关联字段创建外键。
口所有的键都必须唯一。
口避免使用复合键。
口外键总是关联唯一的键字段。
索引使用原则
索引与书籍中的索引类似,在一本书中,可以通过索引快速查找所需内容,而无需阅读整本书。在数据库中,索引使DB (DataBase )程序无需对整个表进行扫描,就可以找到所需数据。口索引是从数据库中获取数据的最高效方式之一,95%的数据库性能问题都可以采用索引技术得到解决。
口逻辑主键使用唯一的成组索弓},对系统键(作为存储过程)采用唯一的非成组索引, 对任何外键采用非成组索引。考虑数据库的空间有多大,表如何进行访问,还有一这些访问是否主要用作读写。
口大多数数据库都索引自动创建的主键字段,但是可别忘了索引外键,它们也是经常使用的键,例如运行查询显示主表和所有关联表的某条记录,就用得上它。
口不要索引memo/note宇段,不要索引大型字段(有很多字符),这样会让索引占用太多的存储空间
口不要索引常用的小型表。
口不要为小型数据表设置任何键,假如它们经常有插人和删除操作就更不能这样做,对这些插入和删除操作的索引维护,可能比扫描表空间消耗更多的时间。
JDBC的基础概念
JDBC是一个有关数据库连接的工具。这次记录JDBC的概念和如何使用JDBC将Java程序与数据库进行连接。所谓JDBC就是Java DataBase Connectivity, Java数据库连接。主要完成下面几个任务:口与数据库建立一个连接。
口向数据库发送SQL语句。
口处理数据库返回的结果。
口使用Java程序语言和JDBC工具包开发程序,是独立于平台和厂商的。
JDBC驱动程序的分类
JDBC被称为数据源驱动,其具备什么特点,又与ODBC有什么关系或区别呢?在讲述JDBC的驱动程序分类之前,首先介绍什么是ODBC。ODBC是指Open DataBase Connectivity,即开放数据库互连,它建立了一组规范,并且提供了一组对数据库访问的标谁API(应用程序编程接口),这些API利用SQL来完成其大部分任务。ODBC也提供了对SQL的支持。
JDBC是Java与数据库的接口规范,由Java语言编写的类和接口组成。如果要通过JDBC驱动连接数据库,大致分为4种方式:Java到数据库协议、Java到本地API, JDBC-ODBC桥和Java到网络协议。
关于JDBC程序的工作原理如图所示。
JDBC的引入有其非常重要的作用:
口程序员可以使用java开发基于数据库的应用程序,在遵守Java语言规则的同时,可以使
用标准的SQL语句访问任何数据库。
口如果数据库厂商提供较底层的驱动程序,程序员可以在自己的软件中,使用比转优化的驱动程序。
其实JDBC和ODBC是统一模型,那为什么不采用ODBC呢?因为ODBC过于复杂难以掌握,也比较难部署。
数据库连接对动态网站来说是最为重要的部分。Java中连接数据库的技术是JDBC。很多数据库系统带有JDBC驱动程序,Java程序就通过JDBC驱动程序与数据库相连,执行查询、提取数据等操作。Sun公司还开发了JOBC-ODBC bridge,用此技术,Java程序就可以访问带有ODBC驱动程序的数据库。目前,大多数数据库系统都带有ODBC驱动程序,所以. Java程序能访问诸如Oracle, Sybase, MS SQL Server和MS Access等数据库。
利用java到数据库协议方式连接数据库
当利用Java到数据库协议方式来操作数据库时,会利用数据库相关的协议把对驱动程序的请求直接发送给数据库,该协议实际上就是包含在驱动程序中纯Java类。本小节将演示如何利用oracle:thin子协议来操作Oracle数据库,具体步骤如下:
(1)配置开发环境,引入与Oracle数据库相对应的JDBC。首先复制对应的驱动程序,然后在Package Explorer视图中右击jdbc项目,在出现选项中选中“Paste",就完成了环境的配置。
(2)实例实现连接和操作Oracle数据库,即通过oracle:thin子协议显示出oracle数据库中的employee表格中的数据。
public static void main(String[]args){ try{ Class.forName("oracle.jdbc.driver.OracleDriver");//加载JDBC驱动 //连接数据库 Connection conn= DriverManager.getConaection("jdbc:oracle:thin:@localhost:1521:orc1","scott","root"); Statement stmt=conn.createStatement();//获取陈述对象 //获取结果集 ResultSet rs=stmt.eaecuteQuery("select * from employee"); System.out.println(”记录内容:”); System.out.println("\tID号\t姓名\t电话号码”); //遍历结果集 while(rs.next()){ System.out.print("\t"+rs.getInt(1)); System.out.print("\t"+rs.getString(2)); System.out.println("\t"+rs.getInt(3)); System.out.println(); } rs.close(); stmt.close(); conn.close(); }catch(Exception e){ e.printStackTrace(); }
代码说明:当程序通过DriverManager.getConnection()方法连接Oracle数据库时,其参数"jdbc:oracle:thin@localhost:1521:orcl"中使用的子协议名为"oracle:thin",子名称中"localhost"为主机名、"1521"为Oracle服务器端口号和“orcl”为数据库名。
利用java到本地API方式连接数据库
当利用Java到本地API方式来操作数据库时,首先会通过调用本地的API(数据库客户端提供的API)连接到相应数据库客户端,然后再通过该客户端连接到相对应的数据库。在具体编写代码时,只需把调用驱动程序的代码转换成调用本地API的代码就可以了。PS:使用oci前应该先对orcle客户端进行设置,这里省略。public class OCITest{ public static void main(String args[]){ try{ Class.forName("oracle.jdbc.driver.OracleDriver");//加载驱动 //连接数据库 Connection conn=DriverManager.getConnection("jdbc:oracle:oci:@orcl","scott","root"); Statement stmt=conn.createStatement();//获取陈述对象 //获取运行结果 ResultSet rs=stmt.executeQuery("select * from guestbook"); System.out.println("记录内容:"); System.out.println("\tID号、\t姓名、\t电话号码"); while(rs.next()){ System.out.print("\t"+rs.getInt(1)); System.out.print("\t"+rs.getString(2)); System.out.println("\t"+rs.getInt(3)); System.out.println(); } rs.close(); stmt.close(); conn.close(); }catch(Exception e){ e .printStackTrace(); } } }代码说明 当程序通过DriverManager.getConnection()方法连接Oracle数据库时,其参数" jdbc:oracle:oci: @orcl"中使用的子协议名为“oracle:oci" ,子名称中@后面必须为配置好的本地Net服务名。
利用JDBC-ODBC方式连接数据库
当利用JDBC-ODBC桥驱动程序来操作数据库时,该驱动程序并不是直接操作数据库驱动程序,而是调用JDBC-ODBC桥驱动程序操作ODBC驱动程序,进而连接各种数据库。其详细过程如下:应用程序中调用JDBC-ODBC桥驱动程序的指令在“驱动管理器”的中转下交由JDBC-ODBC桥驱动程序处理,经过处理后这些指令格式就会转成ODBC的指令格式。这些指令会自动通过ODBC的驱动程序利用底层相应的数据库驱动程序访问对应数据库,具体过程如图所示:对于开发人员来说,图中最后三步是由Windows系统自动封装成为ODBC数据源,不需要进行相应的编程。
例子:连接和操作ODBC数据源,其通过JDBC-ODBC桥驱动程来显示Excel表格中的数据。
import java.sql.*; public class JDBC_ODBCTest{ public static void main(String args[]){ String drv="sun.jdbc.odbc.JdbcOdbcDriver";//创建驱动连接字符串 try{ Class .forName(drv);//加载驱动 //获取连接 Connection con=DriverManager.getConnection("jdbc:odbc:ExcelTest","",""); Statement stmt=con.createStatement();//获取陈述对象 ResultSet rs=stmt.executeQuery("select * from [Sheetl$]"); System.out.println("记录内容:"); System.out.println("\tID号\t姓名\t电话号码"); while(rs.next()){ System.out.print("\t"+rs.getInt(1)); System.out.print("\t"+rs.getString(2)); System.out.print("\t"+rs.getInt(3)); System.out.println(); } rs.close(); stmt.close(); con .close(); }catch(Exception e){ e.printStackTrace(); } } }口当程序通过C1ass.forName( )方法加载驱动程序类时,其参数必项为
sun.jdbc.odbc.JdbcOdbcDriver,即JDBC-ODBC桥驱动程序。
口当程序通过DriverManager.getConnection()方法连接ODBC数据源时,其第一个参数中
协议与子协议名必须为jdbc和odbc,而子名称是确定的,必须为ExcelTest数据源名。第二个和第三个参数用来设置用户名和密码,当它们为空时可以设置为空字符串。
关于SQLServer数据库基础操作
在很多情况下,遇到的数据库大部分都支持SQL语言。什么是SQL语言
SQL(发音为字母S-Q-L或sequel)是结构化查询语言(Structured Query Language)的缩写。SQL是一种专门用来与数据库通信的语言。与其他语言(如Java, Visual Basic这样的程序设计语言)不一样,SQL由很少的词构成这是有意而为的。SQL能够很好地完成一项任务—提供一种从数据库中读写数据的简单有效的方法。
SQL有如下的优点:
口SQL不是某个特定数据库供应商专有的语言.几乎所有重要的DBMS都支持SQL,所以, 此语言几乎能与所有数据库打交道。
口SQL简单易学。它的语句全都是由具有很强描述性的英语单词组成,而且这些单词的数目不多,这个就是它简单易学的主要原因。
口SQL看上去尽管很简单,但实际上是一种强有力的语言,灵活使用其语言元素,可以进行非常复杂和高级的数据库操作。
通过SQL语言如何操作数据库
标淮SQL只包含9个语句:数据查询 select
数据定义 create,drop,delete
数据操纵 insert,update,delete
数据控制 grant,revoke
口数据查询语句用于查询数据结构。
口数据定义语句用于数据结构。
口数据操纵语句用于检索和修改数据结构。
口数据控制语句用于规定DB用户的各种权限。
数据查询
查询语句是DB中最频繁执行的活动。在SQL中,使用select语句可在需要的表单中检索数据,在进行检索之前,必须知道需要的数据存储在哪里。select语句可由多个查询句子组成。
select的结构如下:
select [all|distinct] [into new_table_name] from [表名|视图名]
(where搜索条件)
group by 把查到的按什么标准分组
(having搜索条件)
(order by 按什么顺序排序)〔升序|降序〕
说明如下。
口all:指明查询结果中可以显示值相同的列,all是系统默认值。
口distinct:指明查询结果中如有值相同的列,只显示其中的一列,对distinct来说,NULL
被认为相同的值。
口into子句:用于把查询结果存放到一个新建表中。新表一般由select子句指定的列构成。
口from子句:指定需要进行数据查询的表。
口where子句:指定数据检索的条件,以限制返回的数据。
口group by子句:指定查询结果的分组条件。
口having子句:指定分组搜索条件,它通常与group by子句一起使用。
口order by子句:指定查询结果的排序方式。
数据操纵
数据插入语句:insert into <表名>〔列名〕value〔对应列的值〕
数据修改语句:
update<表名>set<列名>=<表达式>〔where<条件>〕
数据删除语句:
delete [from]{表名|视图名}〔where子句〕
数据定义语言
创建DB表:create table创建DB表的索引:create index
删除DB中的表:drop table
删除DB表中的索引:drop index
删除表中所有的行:truncate
增加表列:alter table
这些是SQL中经常使用到的一些语句。
关于JDBC的高级操作
在实际工作中,对数据库的操作并不能保证完全不出错,一旦出错了,如何能保证数据的完整性和统一性呢?本节将为大家引入一个新的概念:事务。事务跟数据库中数据完整性和统一性有什么联系?如何进行事务处理?本节通过详细的实例,来解决这方面的困扰。什么是事务处理
事务是SQL中的单个逻辑工作单位,一个事务内的所有语句被作为整体执行,遇到错误时,可以回滚事务,取消事务所做的所有改变,从而可以保证数据库的一致性和可恢复性。一个事务逻辑上作单元必须具有以下4种属性:
口原子性:一个事务必须作为一个原子单位,它所作的数据修改操作要不全部执行,要不全部取消。
口一致性:当事务完成后,数据必须保证处于一致性的状态。
口隔离性:一个事务所做的修改必须能够跟其他事务所作的修改分离开来,以免在并发处理时,发生数据错误。
口永久性:事务完成后,它对数据库所做的修改应该被永久保持。
在实际工作中,有可能会出现一种情祝:要向一个数据库中插入若干条记录,如果当插入一半数据时,突然系统出错了,那么数据库中已经有了一半的数据。如果再重新插入,很有可能会引起数据库出错,此时,就需要使用事务的概念。在一个事务中允许数据库进行回滚操作,即让前面的插入工作全部作废,这样重新插入的时候就不会出错了。
事务处理的过程演练
数据库的所有操作都是建立在"Connection"连接类基础上的,事务管理也是在其上进行的。若要管理一个事务,可以在进行数据库操作动作之前,将数据库自动提交设为false,即con.setAutoCommit(false)。
在数据库操作没有任何异常现象出现的前提下,再将事务提交:con.commit()。 在提交完毕后,要记住将事务管理的控制权还给数据库:
con.setAutoCommit(true)。
下面通过一个实例,演示事务处理中的回滚功能,实例代码如下:
import java.sql.*;//导入包 public class sqltest1{//关于数据库测试类 private Connection con;//创建数据库连接对象 public static void main(String[] args){//主方法 try{ sqltest1 test=new sqltest1();//创建sqltest1类对象 Connection con=test.getConnection();//获取数据库连接对象con con.setAutoCommit(false);//设置事务对象 //创建关于SQL语句字符串 String sql="select * from teacherinfo"; String sql1="insert into teacherinfo values('朱雪莲’,'674322’,'女','24','1981-1-6','上海币','5000’)”; //输出相应信息 System.out.println("插入数据后的数据是:"); //获取相关学生信息 test.getStudent1(sql1); test.getStudent(con, sql); con.rollback();//事务回滚 System.out.println("回滚数据后的数据是:"); test .getStudent(con, sql); //获取学生 }catch (Exception e){ } } public void getStudent1(String sql){ //获取学生方法 try{ Statement st=con .createStatement();//创建会话对象st st.executeUpdate(sql);//执行SQL语句 //关闭陈述对象和数据库连接 st.close(); con .close(); }catch(Exception e){ } } public void getStudent(Connection con,String sql){//获取学生方法 try{ //创建陈述对象和运行结果对象 Statement st=con.createStatement(); ResultSet rs=st.executeQuery(sql); while (rs.next()){//通过循环遍历运行结果 //获取学生信息 String name1=rs.getString(1); String code1=rs.getString(2); String sexy1=rs.getString(3); String age1=rs.getString(4); //输出相应信息 System.out.println("\n姓名:"+namel+"\t学号:"+code1+"\t性别:" +sexy1+"\t年龄"+age1); } //关闭陈述对象和数据库连接对象 st.close(); con.close(); }catch (Exception e){ e.printStackTrace(); } } public Connection getConnection(){//获取数据库连接对象 //创建关于数据库连接属性 String url1="jdbc:odbc:schoolmanage";//关于数据库连接的URL String username="";//关于数据库连接的用户名 String password="";//关于数据库连接的密码 try{ //加载数据库 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //连接数据库 con =DriverManager.getConnection(url1,username, password); }catch(SQLException e){ e.printStackTrace(); }catch(C1assNotFOUndException ex){ ex.printStackTrace(); } return con; //返回数据库连接 } }
经过回滚后原先插入的最后一条数据已经没有了。这是为了保证数据的完整性和一致性而进行的数据库的回滚操作。
预查询
预查询顾名思义就是预先查询。在有的软件中.当输入一个人的姓名后,关于它的全部数据就会出现,这就是本节所要讲述的预查询。可以先建立一个查询条件:
string sql="select name,code,sexy,age from teacherinfo where name=?",
接下来,要介绍一个接口"PreparedStatement".而这里的预查询通过这个接口实现,可以通过下列方式来获得这个接口的对象。
PreparedStatement pre=con.PreparedStatement(sql)
此时就建立好一个预查询对象了,如果要查询,可以利用下面的方法实现:
Pre.setString(字段的列序号,此列中的一个要查询的值);
例如,要查询一个名叫“王鹏”的人的信息就可以使用下列代码实现:
Pre.setString(1,"王鹏");
再如,要查询一个学号是"23001"的人的信息,就可以使用下列代码实现:
string sql="select name,code,sexy,age from teacherinfo where code=?"
PreparedStatement pre=con.PreparedStatement(sql);
Pre .setString(2,"23001");
常见问题
操作数据库的具体步骤是什么
答:具体步骤如下。(1)创建Statement对象。
建立了到特定数据库的连接之后,就可用该连接发送SQL语句,Statement对象用Connection的方法createStatement创建,如下所示:
Connection con=DriverManager.getConnection(url,"sunny","");
Statement stmt=con.createStatement();
为了执行Statement对象,发送到数据库的SQL语句将被作为参数提供给Statement的方法。
ResultSet rs=stmt.executeQuery("select a,b,c from Table2");
使用Statement对象执行语句,Statement接口提供了3种执行SQL语句的方法:
executeQuery(), executeUpdate()和execute()。使用哪一个方法由SQL语句所产生的内容决定。
(2)方法 executeQuery()用于产生单个结果集的语句,例如select语句。
(3)方法executeUpdate()用于执行insert、update或delete语句以及SQL DDL(数据定义语言)语句,例如create table和drop table。 insert、update或delete语句的效果是修改表中零行或多行中的一列或多列. executeUpdate()的返回值是一个整数,指示受影响的行数(即更新计数)。
对于create table或drop table等不操作行的语句,executeUpdate()的返回值总为零。
(4)方法execute()用于执行返回多个结果集、多个更新计数或二者组合的语句,多数程序员不需要该高级功能。
执行语句的所有方法都会关闭所调用的Statement对象的当前结果集,这意味着在重新执行Statement对象之前,需要完成对当前ResuItSet对象的处理。
(5)语句完成。
当连接处于自动提交模式时,其中所执行的语句在完成时将自动提交或还原。语句在已执行且所有结果返回时,即认为已完成。对于返回一个结果集的executeQuery( )方法,在检索完ResultSet对象的所有行后该语句完成。对于方法executeUpdate(),当它执行时语句即完成,但在少数调用方法execute()的情况中,在检索所有结果集或它生成的更新计数之后语句才完成。
有些DBMS将存储过程中的每条语句都视为独立的语句,而另外一些则将整个过程视为一个复合语句。在启用自动提交时,这种差别就变得非常重要,囚为它影响调用commit()方法的时机。在前一种情况中,每条语句单独提交,在后一种情况中,所有语句同时提交。
(6)关闭Statement对象。
Statement对象由Java垃圾收集程序自动关闭。而一种好的编程风格,应在不需要Statement
对象时显式地关闭它们.这将立即释放DBMS资源,有助于避免潜在的内存问题。
数据库中的视图、图表、缺省值、规则、触发器、存储过程的意义
答:其意义如下。口视图看上去跟表一模一样。具有一组命名的字段和数据项,但实际上,它是一个虑拟表,在库中并不存在。它是由查询DB产生的,限制了用户能看到和修改的数据。由
此可见,视图可以用来控制用户对数据的访问,并能简化数据的显示,即通过视图只需要显示那些需要的数据信息。
口图表就是数据库表之间的关系示意图,利用它可以编辑表与表之间的关系。
口规则就是对DB表中的数据信息进行限制,有一点需要强调的是它限定的只能是表中的列字段。
口缺省值就是当在表中创建列或插入数据时,对没有指定具体值的列,赋予其没定好的默认值。
口触发器是一个用户自定义的SQL事务命令的集合,当对一个表进行插入、更改、删除时. 这组命令会自动执行。
口存储过程是为完成特定的功能而汇集在一起的一组SQL程序语句,经编译后存储在DB中的SQL程序。
相关文章推荐
- java系统学习(十六) --------JDBC及其应用
- java 线程创建时间
- java中的BigInteger(很好很强大)(转)
- JAVA开发--游戏24点
- 第三章 DispatcherServlet详解 ——跟开涛学SpringMVC
- JAVA开发--U盘EXE恢复工具
- 修改Spring-task 定时时间
- MyEclipse使用JAX-WS 2.0生成WebService报错,无法生成WSDL文件
- Spring配置事务切面
- javaweb之Java基础加强
- 【dubbo源码解读系列】之一 使用eclipse调试dubbo源代码
- JS以及Java防止数据重复提交
- Java读取Properties文件的六种方法
- Java设计模式---原型模式(Prototype)
- Java设计模式---原型模式(Prototype)
- gradle --refresh-dependencies cleanEclipse eclipse
- eclipse项目导入的问题
- 在Ubuntu中安装Eclipse与Helloworld
- java中static作用详解
- Java: 复制文件最快方法