【Oracle】6.JDBC

简述

JDBC的全称是Java DataBaseConnectivity,即Java数据库连接。它是一套行业标准的API,可以在Java应用程序中与关系型数据库建立连接,并执行相关操作,例如Oracle,DB2等主流数据库产品。

控制台,图形界面客户端与数据库交互的途径是执行SQL语句,Java程序也不例外。Java中访问数据库主要使用JDBC。JDBC是Java规定的访问数据库的标准API,目前主流的数据库都支持JDBC。

JDBC(Java数据基础连接,JavaDatabase Connectivity)是标准的Java访问数据库的API。JDBC定义了数据库的连接,SQL语句的执行以及查询结果集的遍历等。JDBC把这些操作定义为接口,位于包java.sql下面。 

应用

通过JDBC技术与数据库建立连接、了解数据库的信息、查询数据库、获取并显示结果集、更新数据库(数据的增删改)及调用存储过程和批处理。

下图为JDBC技术应用过程:


1.驱动管理器

加载驱动程序

使用Class.forName()显式加载驱动程序。

例如:

Class.forName(“oracle.jdbc.driver.OracleDriver”);

加载了oracle提供的jar包内的OracleDriver类

2.连接数据库

建立连接

指定数据库连接的url,数据源的位置

使用DriverManager.getConnection(url);

例如:

String url=“jdbc:oracle:thin:@127.0.0.1:1521:orcl”;
Connection conn=DriverManager.getConnection(url);

或者:

Connection conn=DriverManager.getConnection(Stringurl , String   user , String  password)

3.SQL语句

创建Statement

用户执行sql语句,

Statement stmt=conn.createStatement();

执行查询语句

String sql=“select * from emp”
ResultSet rs=stmt.executeQuery(sql);

executeQuery()一般用于执行一个sql语句,返回一个结果集,execute()方法返回多个结果集,

一个Statement对象在同一时间只能打开一个结果集,对第二个结果集的打开隐含着对第一个结果集的关闭。

关闭Statement  

stmt.close()

4.结果集

前面讲了如何执行sql语句,返回了ResultSet类的对象,这里讲如何对ResultSet对象进行处理

ResultSet的基本处理方法

ResultSet对象包括一个由查询语句返回的一个表,这个表中包含所有的查询结果,按照行和列进行处理。

ResultSet对象维持一个指向当前行的指针。最初,这个指针指向第一行之前。ResultSet类的next()方法使这个指针移向下一行。第一次,使用next()方法,将指针指向结果集的第一行。next方法的返回值是一个boolean值,若为true,则成功移向下一行。若返回false则没有下一行。

getXXX方法可以从某一列中获得结果。其中XXX是jdbc中的java数据类型。如getInt();需要制定检索的列或名称。

Demo

Statement stmt=conn.createStatement();
String sql=“select a,b,c frommytable”;
ResultSet rs=stmt.executeQuery(sql);
While (rs.next())
{
         inti=rs.getInt(1);
  String s=rs.getString(“a”);
}

Statement对象在每次执行sql语句时都将语句传给数据库,在多次执行同一个语句时,效率比较低。

Statement对象Sql注入引起安全问题,可以使用PreparedStatement,使用数据库的预编译功能,速度可以提高很多。避免sql注入引起的安全问题。

PreparedStatement对象的sql语句可以接受参数,每次执行时可以传递不同的参数。

创建

String sql=“select * from emp  where ename=?”
PreparedStatement ps=conn.prepareStatement(sql);

执行

ps.setInt(1,”SMITH”);
ResultSet rs=pstmt.executeQuery();

关闭

ps.close();

更新数据库

包括修改,更新和删除记录,创建和删除表,以及增加和删除列,对应于数据库insert,update ,delete等;

对数据库的更新操作也是通过PreparedStatement对象完成的;

不使用executeQuery()方法,使用executeUpdate()方法;

executeUpdate的返回值是它影响的记录的行数。

Demo

String sql=“update  Customer set address =‘Peking’ wherelastname=‘Li’”
int i=Stmt.executeUpdate(sql)
返回更新的行数。

调用存储过程

用于执行 SQL 存储过程的接口。

JDBC API 专门提供了调用存储过程的语法,语法如下:

         {call  <过程名>    [(<arg1>,<arg2>, 。。。)]}

存储过程中IN 参数值是使用继承自PreparedStatement的 set 方法设置的。

在执行存储过程之前,必须注册所有 OUT 参数的类型;它们的值是在执行后通过此类提供的get()方法获取的。

5.批处理

多次执行数据更新操作时,可以使用批处理减少连接数据库次数,提高效率。

Statement批处理方式:

           

  Statement st = conn.createStatement();
                       st.addBatch(更新语句1);
                      st.addBatch(更新语句2);
                      ……
                   st.executeBatch();
                   st.close();

建议采用PreparedStatement

PreparedStatement批处理方式:    

PreparedStatement ps = conn。preparedStatement(sql);
                   ps.setXXX(索引,参数值);
                   ……
                   ps.addbatch();         
                   ps.executeBatch();
                   ps.close();

statement 和 preparestatement区别和联系:

Statement用于执行静态sql语句,在执行时,必须指定一个事先准备好的sql语句。

PrepareStatement是预编译的sql语句对象,sql语句被预编译并保存在对象中。被封装的sql语句代表某一类操作,语句中可以包含动态参数“?”,在执行时可以为“?”动态设置参数值。

使用PrepareStatement对象执行sql时,sql被数据库进行解析和编译,然后被放到命令缓冲区,每当执行同一个PrepareStatement对象时,它就会被解析一次,但不会被再次编译。在缓冲区可以发现预编译的命令,并且可以重用。

PrepareStatement可以减少编译次数提高数据库性能。

模型支持

JDBC支持两层模型,也支持三层模型访问数据库。 两层模型中,一个javaAppple或者一个JAVA应用直接同数据库连接。这就需要能直接被访问的数据库进行连接的JDBC驱动器。用户的SQL语句被传送给数据库,而这些语句执行的结果将被传回给用户。数据库可以在同一机器上,也可以另一机器上通过网络进行连接。这被称为“C/S”结构,用户的计算机作为Client,运行数据库的计算机作为Server。这个网络可是intranet(内网),比如连接全体雇员的企业内部网,当然也可以是internet(外网)。

在三层模型中,命令将被发送到服务的“中间层”,而“中间层”将SQL语句发送到数据库。数据库处理SQL语句并将结果返回“中间层”,然后“中间层”将它们返回用户。MIS管理员将发现三层模型很有吸引力,因为“中间层”可以进行对访问的控制并协同数据库的更新,另一个优势就是如果有一个“中间层”用户就可以使用一个易用的高层的API,这个API可以由“中间层”进行转换,转换成底层的调用。而且,在许多情况下,三层模型可以提供更好的性能。

到目前为止,“中间层”通常还是用C或C++实现,以保证其高性能。但随着优化编译器的引入,将java的字节码转换成高效的机器码,用java来实现“中间层”将越来越实际。而JDBC是允许从一个java“中间层”访问数据库的关键。

业务思想

JDBC技术的出现,是数据库的一条锁链,掌握好它等于你已经开启了通往无限数据的大门,很是方便我们的业务,努力ing!



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Oracle官方11g 最新版jdbc驱动。 新特性:   1、支持JDK6,支持JDBC 4.0,新的java.sql.SQLXML类型没有被支持,是使用ojdbc6.jar来支持。J2SE 5.0 和 JDBC 3.0 全面支持使用ojdbc5.jar。   2.不再支持oracle.jdbc.driver。从9.0.1开始的每个release都推荐使用oracle.jdbc。这一天终于到来,在11g中,引用oracle.jdbc.driver不再通过编译。   3.j2se 1.2,1.3,1.4不再支持。11R1不再包括这些版本的jar和zip,如果仍然使用这些版本,可以继续使用10gR2的jdbc。   4.11gR1 Thin driver支持AES加密算法,SHA1 hash算法,RADIUS, KERBEROS,SSL认证机制.   5.支持ANYDATE和ANYTYPE类型。这两种类型自9i引入,11R1前,程序员只能通过PL/SQL操作。   6.高级队列支持。11R1提供了访问AQ的高性能接口。   7.支持数据库变更通知。   8.Thin和OCI的数据库启动和关闭。11R1提供了这样的方法来启动和关闭数据库。   9.新的工厂方法。Oracle JDBC 11R1 oracle.jdbc.OracleConnection提供了创建Oracle对象的工厂方法。   包括ARRAY, BFILE, DATE, INTERVALDS, NUMBER, STRUCT, TIME,TIMESTAMP,TIMESTAMP等。   ojdbc5.jar: 适用于jdk5   ojdbc6.jar: 适用于jdk6   ***_g.jar 只是用javac -g编译,生成所有调试信息,其它全一样   ---------------------------------------------------   总体讲新版本的JDBC驱动 性能强、很多bug被发现并已解决。   我遇到的,之前使用ojdbc14.jar(不记得哪个版本了)批量插入10万条,实际只插入了3万多条,其它的丢失了,换ojdbc6.jar后,一次commit批量插入100万条也OK了。   尽量使用和数据库版本一致的驱动,有bug时,换高版本的JDBC驱动试试 。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值