- 浏览: 554847 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (162)
- 软件开发过程 (15)
- Java基础 (16)
- web开发 (20)
- Workflow应用 (0)
- 心情 (18)
- Oracle数据库 (26)
- MySQL数据库 (11)
- Struts应用 (9)
- Hibernate应用 (3)
- Spring应用 (1)
- C#开发 (0)
- iBatis应用 (0)
- Tomcat (10)
- PHP开发 (1)
- Linux (13)
- 设计原则总结 (1)
- 网站开发管理 (6)
- PowerDesigner (3)
- 系统架构 (3)
- 算法 (1)
- 国外接job (0)
- Lucene (1)
- Android (1)
- SEO技术 (1)
- Javascript (1)
最新评论
-
yu_meiguang:
真心感谢啊,找了半天才知道是这个以时间戳问题导致的问题
oracle分页查询数据重复问题 -
funnyone:
[u][b][i][flash=200,200][url][i ...
Oracle - Round函数 -
字母哥:
不错 今天用到了 时间戳排序的话有一样的就排序数据乱了
oracle分页查询数据重复问题 -
lelong:
xuhu_java 写道您好!我想问一下
select rou ...
Oracle - Round函数 -
xuhu_java:
您好!我想问一下select round(123456.788 ...
Oracle - Round函数
________________________________________
概要
JDBC接口允许外部对SQL数据库进行管理以及对内容进行修改操作。通过使用第三方驱动,它们允许使用SQL语句调用。而且,Java内建的JDBC具有丰富的指令集合,使用起来相当的简单和直观。
举个例子:您正着手写一个Java程序,需要用到与数据库交互的操作。您得使用标准库提供的指令(方法)。首先建立一个数据库的连接。然后,您使用JDBC向数据库传送SQL语句,再处理返回的结果。最后关闭数据库的连接。
________________________________________
建立连接
我要从什么地方下手呢?当然了,要先在您的机器上安装Java、JDBC和DBMS(数据库)。由于我想使用Oracle数据,所以我需要找到指定的驱动。先到Oracle官方网址看看,真的有,下载地址:http://www.oracle.com/technology/global/cn/software/tech/java/sqlj_jdbc/index.html 。
正如先前所说,在对数据库操作(access)之前,必须在程序(client)与数据库(server)之间建立一个连接。
• 加载指定的第三方驱动
为何要来这一手呢?为使操作更轻便、代码复用程度更高,API常被尽可能地设计成与版本及厂商无关。由于不同的关系型数据库具有不同的形为,我们得告诉所用的驱动,这样它们才能做出正确的行为。
下面是加载Oracle驱动的代码:
Class.forName("oracle.jdbc.driver.OracleDriver")
• 建立连接
一旦驱动被加载并处于准备连接状态,您就可以使用下面的代码建立一个连接实例:
Connection con = DriverManager.getConnection(
"jdbc:oracle:thin:@dbaprod1: 1521:orcl", username, passwd);
好,让我们一起来弄懂这里用到的术语吧。第一个字符串(string)是一个数据库的URL,包括协议(jdbc), 厂商(oracle), 驱动(thin), 服务器(dbaprod1), 端口号 (1521), 和服务器实例(orcl) 。数据库连接的用户名和密码分别为: username、 passwd。
完了。最后一步返回的是一个打开的连接,用来传送SQL语句与数据库进行交互操作。在上面的代码中,con就是这样的一个连接,稍后我们会用到。(注:上面代码所示范的,很可能会与您的环境不一致,请依照您的环境作必要的修改)
________________________________________
建立JDBC语句(Statement)
JDBC语句用于向数据库传送SQL语句。JDBC语句不同于SQL语句,它是与数据库连接密切相关的,不单是一个SQL语句。您可以把JDBC想象成一个道往数据库的通道,用来传送一个或多个SQL语句到数据库中。
一个活动连接需要建立一个 Statement 对象。示范如下(用到先前建立的Connection 对象con):
Statement stmt = con.createStatement() ;
到此,一个Statement 对象已经存在,还差一个传送到数据库的SQL语句,下面就学到。
________________________________________
建立JDBC填充语句(PreparedStatement)
有时候,使用PreparedStatement对象向数据库传送SQL语句更加方便而且更有效率。有别于它的父类Statement,它只在创建的时候被赋予一个SQL语句。该条SQL语句被传送到数据库时,立刻被编译。因此,PreparedStatement语句直接绑定于通道和被编译的SQL语句上。
优点显而易见:如果您需要使用多个相同或相似的SQL语句(仅其中的参数不同),使用PreparedStatement只需要被编译一次并被优化。使用普通的Statement就需要多次并且是逐个地被编译。
PreparedStatements 同样使用Connection 的方法建立。下面的代码示范如何建立一个填充语句,并且带有三个参数。
PreparedStatement prepareUpdatePrice = con.prepareStatement(
"UPDATE Sells SET price = ? WHERE bar = ? AND beer = ?");
在执行PreparedStatement之前,我们需要提供相应的值去填充这些参数。这需要用到PreparedStatement类中的setXXX方法。常用的方法有:setInt, setFloat, setDouble, setString等。
接着上面的示例:
prepareUpdatePrice.setInt(1, 3);
prepareUpdatePrice.setString(2, "Bar Of Foo");
prepareUpdatePrice.setString(3, "BudLite");
________________________________________
执行 CREATE/INSERT/UPDATE 语句
DDL (data definition language) 语句,如建表,修改表结构,更新表内容都可以使用executeUpdate方法。示范如下:
Statement stmt = con.createStatement();
stmt.executeUpdate("CREATE TABLE Sells " +
"(bar VARCHAR2(40), beer VARCHAR2(40), price REAL)" );
stmt.executeUpdate("INSERT INTO Sells " +
"VALUES ('Bar Of Foo', 'BudLite', 2.00)" );
String sqlString = "CREATE TABLE Bars " +
"(name VARCHAR2(40), address VARCHAR2(80), license INT)" ;
stmt.executeUpdate(sqlString);
由于SQL语句并非恰好为一个字符串(或适合写在一行),所以需要使用加号(+)连结。特别注意在字符串"INSERT INTO Sells"后面的空格,为的是与字符串"VALUES"分开。
当使用executeUpdate执行DDL语句,返回值总是零(zero),当执行数据修改语句时将返回大于等零的值,即被修改的记录数。
int n = prepareUpdatePrice.executeUpdate() ;
________________________________________
执行 SELECT 语句
相对于前面的执行语句(DDL),查询语句执行后返回一个结果集合,并且不改变数据库的状态。相应地使用另一个方法executeQuery,返回一个ResultSet对象:
String bar, beer ;
float price ;
ResultSet rs = stmt.executeQuery("SELECT * FROM Sells");
while ( rs.next() ) {
bar = rs.getString("bar");
beer = rs.getString("beer");
price = rs.getFloat("price");
System.out.println(bar + " sells " + beer + " for " + price + " Dollars.");
}
查询语句返回的结果集被放在一个ResultSet实例中。我们可以访问结果集中的每一行记录(record)及每一行记录的属性。ResultSet提供一个游标(cursor),用于访问它的每一行记录。游标开始时指示在第一条记录的前面。可以使用next方法使游标指向下一条记录,如果下一条记录存在,next方法返回真(true),否则返回假(false)。
我们可以使用相应类型的getXXX方法获取某一行记录。在前面的示例中,我们用的是getString和getFloat方法访问某一列的值。我们需要提供列的名称作为方法的参数,并且注意VARCHAR2类型的bar、beer被转换成Java的String、REAL被转换成Java的float。
我们还可以使用列的顺序号代替列的名称来访问结果集,示范如下:
bar = rs.getString(1);
price = rs.getFloat(3);
beer = rs.getString(2);
________________________________________
访问ResultSet
JDBC还提供一套方法,让您得到游标当前处于结果集的位置,如getRow, isFirst, isBeforeFirst, isLast, isAfterLast。
这意味着游标允许自由访问结果集。默认的,游标只能向前滚动并且是只读的。当连接(Connection)建立了语句(Statement)后,您可以灵活地改变结果集(ResultSet)的滚动及更新模式。
Statement stmt = con.createStatement(
ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
ResultSet rs = stmt.executeQuery("SELECT * FROM Sells");
不同的选项包括: TYPE_FORWARD_ONLY、TYPE_SCROLL_INSENSITIVE和TYPE_SCROLL_SENSITIVE。您可以在需要只读游标时选用CONCUR_READ_ONLY、需要更新时选用CONCUR_UPDATABLE。默认的游标可以使用rs.next()向前滚动。使用可滚动的游标,您有更多的操作,示范如下:
rs.absolute(3); // 滚动到结果集的第三行
rs.previous(); // 回滚一行(第二行)
rs.relative(2); // 向前滚动两行(第四行)
rs.relative(-3); // 回滚三行(第一行)
________________________________________
事务(Transactions)
JDBC允许多条SQL语句作为一个事务。因此使用JDBC事务,我们能确保ACID (Atomicity, Consistency, Isolation, Durability)属性。
连接建立后,默认的事务模式是自动提交(auto-commit)。这使每一条SQL语句都被当作一个事务来处理。
我们可以关闭自动提交事务模式,如下:
con.setAutoCommit(false) ;
再次打开自动提交事务模式:
con.setAutoCommit(true) ;
一旦自动提交模式被关闭,除非您明确地使用commit()方法提交,否则每一条SQL语句都不会被提交。
con.commit() ;
在执行commit()方法之前,我们可以随时使用rollback()方法来回滚事务,取消之前的操作。
举例如下:
con.setAutoCommit(false);
Statement stmt = con.createStatement();
stmt.executeUpdate("INSERT INTO Sells VALUES('Bar Of Foo', 'BudLite', 1.00)" );
con.rollback();
stmt.executeUpdate("INSERT INTO Sells VALUES('Bar Of Joe', 'Miller', 2.00)" );
con.commit();
con.setAutoCommit(true);
请读者逐句理解上面的例子吧。
通常,事务回滚结合Java异常机制,被用于处理(不)可预见的错误。下一节我们将介绍Java的异常机制。
________________________________________
Handling Errors with Exceptions
错误无处不在。为保证程序的可恢复性,让数据库不至于由于某个错误导致崩溃。事务回滚与Java的异常机制提供了很优雅的解决办法。
客户(program)访问服务器(database)需要获得服务器的任务错误反馈。JDBC提供了SQLException用于访问这些错误。
结束事务回滚,举一个异常的例子:
try {
con.setAutoCommit(false) ;
stmt.executeUpdate("CREATE TABLE Sells (bar VARCHAR2(40), " +
"beer VARHAR2(40), price REAL)") ;
stmt.executeUpdate("INSERT INTO Sells VALUES " +
"('Bar Of Foo', 'BudLite', 2.00)") ;
con.commit() ;
con.setAutoCommit(true) ;
}catch(SQLException ex) {
System.err.println("SQLException: " + ex.getMessage()) ;
con.rollback() ;
con.setAutoCommit(true) ;
}
在上例中,由于beer被定义为VARHAR2(拼写错误),导致一个异常被抛出。错误的输出如下:
Message: ORA-00902: invalid datatype
假如您纠正了数据类型的错误,也可能会发生空间不足的错误,使您不能够建立一个新表。
需要对照原文,请访问:http://www-db.stanford.edu/~ullman/fcdb/oracle/or-jdbc.html
发表评论
-
oracle分页查询数据重复问题
2013-08-26 17:46 4580在oracle分页查询中,我们采用类似以下所示的公认的比较高 ... -
Oracle index 索引提示解析
2012-12-10 12:28 1078使用 hints 时,在某些情况下,为了确保让优化器产生最优的 ... -
Oracle在update时,select速度很慢
2011-12-12 23:32 1854Oracle在update时,select速度很慢,why -
解决oracle死锁
2011-11-24 09:56 0--第一步:查看是否有死锁存在,查出有数据则代表有死锁 s ... -
linux下启动oracle 10g企业管理器进程
2011-11-07 16:31 01.启动sqlplus 登录成功后,在终端提示符下输入sql ... -
Oracle 10g 表转移表空间
2011-09-27 10:15 11941.单表转移表空间 场景:有表user存放在表空间oldsp ... -
oracle 10g 表空间参数
2011-09-25 09:24 1477环境:oracle 10g,表格处于自动段空间管理的表空间上. ... -
表复制语句,SELECT INTO 和 INSERT INTO SELECT
2011-09-25 09:16 980Insert是T-sql中常用语句,Insert INTO ... -
Oracle的SGA和PGA
2011-09-04 02:11 1294内存分配(SGA和PGA) SGA:是用于存储数据库信息的内存 ... -
更改Oracle10g服务端字符集
2011-04-09 10:31 3132因为数据库的字符使用的是WE8ISO8859P1,不支持中文显 ... -
Oracle:Ora-01791 不是Selected表达式
2010-08-10 13:47 4347在做一个查询时,出现”Ora-01791 不是Selected ... -
PL/SQL执行存储过程
2010-07-26 16:36 2449在PL/SQL中新建命令窗口 已连接到 Oracle9 ... -
Oracle Long型 ORA-01483
2010-07-24 14:20 2034问题:在oracle9i中,某表的字段IE_DESCRIPTI ... -
Oracle 增加 修改 删除 列
2010-04-12 13:54 8696语法结构如下: alter table tablename ... -
Oracle 更改表主键
2010-04-02 11:28 54711.先删除主键 alter table T_SF_SUPPL ... -
Oracle 表空间操作
2010-03-03 09:57 1056建立表空间 sqlplus system/ ... -
Oracle 通过SQL查看所有表
2010-03-03 09:23 2281查看所有表和表类型 select * from ... -
Oracle数据库TNS常见错误解决方法(转载)
2010-02-11 15:13 28881、ORA-12541:TNS:没有监听 ... -
Linux下重启Oracle
2009-11-12 10:08 6210一定要切换到Oracle用户下进行重启,su - oracle ... -
Oracle CHAR,VARCHAR,VARCHAR2 区别
2009-01-05 00:05 23241.CHAR的长度是固定的,而VARCHAR2的长度是可以变化 ...
相关推荐
在快速入门JDBC时,通常遵循以下步骤: 1. **导入驱动JAR包**:首先需要引入对应数据库的JDBC驱动包,例如MySQL数据库的驱动包`mysql-connector-java-5.1.37-bin.jar`。 2. **注册驱动**:使用`Class.forName()`...
JDBC快速入门 本篇文章将带您快速入门JDBC,掌握JDBC的CRUD操作,理解JDBC中各个对象的作用,并掌握Druid的使用。 JDBC概述: JDBC(Java DataBase Connectivity)是使用Java语言操作关系型数据库的一套API,全称...
JDBC 概念 java数据库连接,java语言操作数据库 使用统一的一套JAVA代码可以操作所有关系型数据库JDBC定义了一套所有关系型数据库的规则 每一种数据库 厂商都会提供自己的JDBC实现类 实现类:数据库驱动 本质 :由...
### JDBC PDF 入门讲解 #### 一、JDBC 概述 JDBC(Java Database Connectivity)是一种标准的 Java API,用于实现 Java 应用程序与各种关系型数据库的交互。从物理结构上看,JDBC 实质上是一系列用于访问数据库的 ...
**JDBC基础入门详解** Java Database Connectivity(JDBC)是Java平台中用于与数据库交互的一组接口和类,它是Java标准API的一部分,使得Java开发者能够访问各种类型的数据库系统。本篇将详细介绍JDBC的基础知识,...
**JDBC 入门知识详解** Java Database Connectivity (JDBC) 是Java编程语言中用于与各种类型数据库交互的标准API。它是Java平台的核心部分,由Java SE的Java SQL类库提供,使得开发者能够编写数据库独立的代码,...
【c-jdbc使用入门】 C-JDBC,全称为Common JDBC,是一个开源的Java数据库连接库,它提供了一种中间层数据库访问方式,可以用于数据同步、数据复制等场景。本教程将详细介绍如何从安装到使用C-JDBC,以MySQL为例进行...
标题中的“jdbc的入门小程序”意味着这是一个初级教程,适合初学者学习JDBC的基础知识。可能包含简单的数据库连接、数据查询和事务处理等内容。 描述中提到有一个“jdbc.avi”的视频文件,这可能是作者录制的一个...
我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动 jar 包中的实现类什么是实现类Person 接口 Worker 类 Person p = new
【jdbc入门至精通】 在Java开发中,JDBC(Java Database Connectivity)是连接Java应用程序与各种数据库的关键技术。本文将从基础概念出发,逐步深入,帮助读者从入门到精通JDBC。 **第二节 jdbc的概念** 2.1 **...
JDBC概述+快速入门+API详解+数据库连接池
**JDBC基础知识详解** Java Database Connectivity (JDBC) 是Java平台上的一个标准API,用于与关系型数据库进行交互。它是Java开发者访问数据库的唯一、统一的接口,由Sun Microsystems(现已被Oracle收购)定义,...
**JDBC(Java Database Connectivity)入门到精通教程** JDBC是Java编程语言中用于与数据库交互的一组接口和类,由Sun Microsystems(现为Oracle公司)开发,它为Java程序员提供了一种标准的方法来访问各种数据库...
JDBC(Java Database Connectivity)是Java编程语言中用于与各种关系型数据库进行交互的一组接口和类。这个标准API使得开发者能够用纯Java编写数据库应用程序,无需关心底层数据库的具体实现,实现了跨平台的数据...
**JDBC(Java Database Connectivity)入门中文文档** JDBC是Java语言中用来规范客户端程序如何访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。它是Java与各种数据库进行交互的一种标准方式,...
在这个“Java_JDBC.rar_JDBC入门”的资源包中,我们主要会探讨以下几个关键知识点: 1. **JDBC API概述**:JDBC是Java平台上的一个核心部分,由Java.sql包中的类和接口组成。主要接口包括Connection(数据库连接)...
在这个“JDBC_Java反射技术入门”资源中,初学者可以了解到如何使用Java进行数据库操作的基础知识,包括连接数据库、执行SQL语句、处理查询结果等。 1. **JDBC基础**: - **加载驱动**:在使用JDBC之前,我们需要...
本教程将引导你从JDBC的基础入门,深入理解如何通过配置文件来优化数据库连接,并避免使用`DriverManager`的繁琐操作。 1. **JDBC基础** - JDBC API的核心类和接口包括`Connection`、`Statement`、`...
一个简单的Spring JDBC入门Demo通常包括以下步骤: - 配置数据源 - 创建JdbcTemplate实例 - 编写SQL语句 - 使用JdbcTemplate的方法执行SQL - 实现RowMapper或ResultSetExtractor进行结果映射 通过这个入门...
这个名为“JDBC_2.rar”的压缩包文件包含了JDBC入门的例子,非常适合初学者学习和理解JDBC的基本概念和用法。 首先,我们来看一下JDBC的核心组件: 1. **驱动管理器(Driver Manager)**:它是JDBC的入口点,负责...