JDBC:JAVA & Oracle

JDBC:JAVA & Oracle

本文中未加标注的资源均来自于PolyU数据库课程的实验材料。仅作为学习使用,如有侵权,请联系删除

JDBC是什么

我之前写过一篇关于数据库和JAVA的博文,这里直接贴上相关的内容:

Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。 JDBC也是Sun Microsystems的商标。 JDBC是面向关系型数据库的。

Java定义了一套操作所有关系型数据库的规则(接口),具体的实现由各自的数据库软件负责,从而实现用一套统一的Java代码操作所有的关系型数据库,即以接口类型调用方法,真正实现的是实现类中的方法

四类JDBC驱动程序

  1. JDBC bridge driver.
    This type uses bridge technology to connect a Java client to a third-party API such as Open Database Connectivity (ODBC).
  2. Native API (partly Java driver).
    This type of driver wraps a native API with Java classes.
  3. Network protocol (pure Java driver).
    This type of driver communicates using a network protocol to a middle-tier server.
  4. Native protocol (pure Java driver).
    This type of driver, written in Java, communicates directly with the database.

Oracle对JDBC的实现

  1. JDBC OCI driver
    This is a Type 2 driver that uses Oracle’s native OCI interface. It is commonly referred to as the OCI driver.
  2. JDBC Thin driver
    This is a Type 4, 100% pure Java driver for client-side use. (The driver we use in our lab )。

    It can be used in applications and applets. It is platform-independent and does not require any additional Oracle software on the client-side.

    The JDBC Thin driver communicates with the server using SQL*Net to access Oracle Database.

    个人感觉,这种驱动的主要目的是为应用程序服务、调库用的

  3. JDBC internal driver
    This is a Type 2, native code driver for server-side use with Java code that runs inside the Oracle database’s JServer JVM.
  4. JDBC server-side Thin driver
    This is a Type 4 100% pure Java driver for server-side used with Java code that runs inside the Oracle database’s JServer JVM.

    Once this Java class is compiled into the database you will need to publish a call specification for it‘s method. This involves writing a PL/SQL "Wrapper" to allow the method to be called from PL/SQL. The following code sample creates a function called Addition which publishes the Mathematics method Add.

    From:https://oracle-base.com/articles/8i/jserver-java-in-the-database

    个人感觉,这种驱动的主要目的是用来增强数据库的功能的,是为了数据库本身服务的

JDBC实践

这里我们选择Oracle数据库和对应与Oracle数据库的JDBC实现jar包:ojdbc7.jar

  1. 在IDEA下新建一个项目,将Jar包添加到IDEA项目的依赖中:File->Project Structure->Modules->Dependencies->点击那个加号->JARS or dictionaries
  2. 我们先运行一个简单的demo(代码中涉及到个人信息的都用<>代替了):
    import java.io.*;
    import java.sql.*;
    import oracle.jdbc.driver.*;
    import oracle.sql.*;
    public class JDBC {
        public static void main(String args[]) throws SQLException, IOException
        {
            String username, password;
            username = "<userName>";         // Your Oracle Account ID
            password = "<password>";         // Password of Oracle Account
    
            //-----------Connection--------------------------------
            //Register JDBC driver
            DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
            //JDBC Thin driver-This is a Type 4, 100% pure Java driver for client-side use.
            //DriverManager.getConnectioin(String url, String username, String password)
            //url = jdbc:oracle:driver:@database:port:sid
            OracleConnection conn =
                    (OracleConnection)DriverManager.getConnection(
                            "jdbc:oracle:thin:<database>:1521:dbms",
                            username, password);
            //A Statement object is a class which sends your SQL statement to the DBMS.
            Statement stmt = conn.createStatement();
            //Pass SQL statement on to the DBMS.
            //For SELECT statement, the method to use is executeQuery.
            // For statements that create or modify tables, the method to use is executeUpdate.
            //declare a reference of the class ResultSet to hold our results
            ResultSet rset = stmt.executeQuery("SELECT EMPNO, ENAME, JOB FROM EMP");
            while (rset.next())//when next is not null
            {
                System.out.println(rset.getInt(1)
                        + " " + rset.getString(2)
                        + " " + rset.getString(3));
            }
            System.out.println(
    
            );
            conn.close();
        }
    }
    

    接下来对这部分代码进行讲解:

    1. import jar包

      import java.io.*;
      import java.sql.*;
      import oracle.jdbc.driver.*;
      import oracle.sql.*;
    2. 注册JDBC驱动器:DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
    3. 建立连接:
      OracleConnection conn =(OracleConnection)DriverManager.getConnection("jdbc:oracle:thin:<database>:1521:dbms",username, password);

      建立连接有两种格式:

      DriverManager.getConnectioin(String url, String username, String password)
      url = jdbc:oracle:driver:@database:port:sid
            OR
      DriverManager.getConnection(String url)
      url = jdbc:oracle:driver:username/[email protected]:port:sid
      
    4. 获取执行SQL的对象:Statement stmt = conn.createStatement();
    5. 执行SQL:对于不同的SQL语句,执行的方法也不一样:
      //执行DQL,例如select,返回结果集合(ResultSet)
      stmt.executeQuery(“SELECT * FROM EMP”);
      //执行DML,例如insert\update\delete,返回一个int,表示受影响的行数
      stmt.executeUpdate(“CREATE TABLE COFFEES “ +
            “ (COF_NAME VARCHAR(32), SUP_ID INTEGER, PRICE FLOAT, “ +
            “ SALES INTEGER, TOTAL INTEGER)”);
      Boolean stmt.execute(String sql)//可以执行任意sql,返回是否执行成功

    这里要注意一点,就是Oracle数据库中进行了操作后一定要记得手动commit,否则是查询不到的。但查询不到不会报错,只是返回的ResultSet是一个空对象,调用它的next方法就可以看出返回是false。

    1. 提取ResultSet中的结果:
    while (rset.next())//when next is not null
            {
                System.out.println(rset.getInt(1)
                        + " " + rset.getString(2)
                        + " " + rset.getString(3));
            }
            System.out.println(
    
            );
    1. 关闭连接:conn.close();

    Prepared statement

    预编译语句PreparedStatement 是java.sql中的一个接口,它是Statement的子接口。通过Statement对象执行SQL语句时,需要将SQL语句发送给DBMS,由DBMS首先进行编译后再执行。预编译语句和Statement不同,在创建PreparedStatement 对象时就指定了SQL语句,该语句立即发送给DBMS进行编译。当该编译语句被执行时,DBMS直接运行编译后的SQL语句,而不需要像其他SQL语句那样首先将其编译。预编译的SQL语句处理性能稍微高于普通的传递变量的办法。
    ————————————————
    版权声明:本文为CSDN博主「yushuifirst」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/yushuifirst/article/details/45201623

    使用预编译:

    PreparedStatement prepareQuery = conn.prepareStatement(
             "SELECT ENO, ENAME, ZIP, HDATE FROM EMPLOYEES WHERE ENO = ?");
         System.out.println(
             "Enter -1 to quit program when prompted for employee number");
         System.out.println();
    
         snum = readEntry("employee number: ");
         enumber = Integer.valueOf(snum).intValue();
         while (enumber != -1)
         {
             prepareQuery.setInt(1, enumber);
             rset = prepareQuery.executeQuery();
             while (rset.next())
             {
                 System.out.println(rset.getInt(1) + " " +
                         rset.getString(2) + " " +
                         rset.getInt(3) + " " +
                         rset.getDate(4));
             }
             snum = readEntry("employee number: ");
             enumber = Integer.valueOf(snum).intValue();
         }

    这里的SQL使用了变量占位符?,这给了预编译SQL一些灵活性,因为虽然我们可能要对某一类查询重复很多次,但是不一定每次的Entity或者Attribute都一样,更不好说能不能直接指定这些数据,所以在预编译SQL语句中用占位符是很常见的。

    向预编译SQL语句中传参的格式是:<prepareQuery.setInt(<第几个参数>,<参数值>);。传参后,正常执行即可。

    JDBC Transactions

    JDBC中的命令是被自动commit的,如果不想这样,而想要手动commit,可以设置conn.setAutoCommit(false) 。之后想要提交的话,就要调用这个方法:conn.commit().想要恢复的话,也是这个方法:conn.setAutoCommit(true);

    关闭自动提交,也是为了我们如果程序出问题的话回滚的方便。在关闭自动提交后,我们可以把方法conn.rollback();放到异常处理的try-catch-finally中

    JDBC Callable statement

    A stored procedure is a group of SQL statements that form a logical unit and perform a particular task.

    在数据库中创建一个简单的储存过程:

    CREATE PROCEDURE SHOW_STAFF
    AS
    SELECT ENAME,JOB,MGR,HIREDATE
    FROM EMP ORDER BY ENAME;

    A CallableStatement object contains a call to a stored procedure, it does not contain the stored procedure itself.

    CallableStatement cs = conn.prepareCall(“{call SHOW_STAFF}”);
    ResultSet rset = cs.executeQuery();

    When the driver encounters “{call SHOW_STAFF}”, it will translate this escape syntax(转义语法) into the native SQL used by the database to call the stored procedure named SHOW_STAFF.

原文地址:https://www.cnblogs.com/jiading/p/11808903.html

时间: 2024-11-08 21:40:58

JDBC:JAVA & Oracle的相关文章

java连接oracle数据库,关闭连接出现异常:java.sql.SQLRecoverableException: IO Error: Connection reset

java.sql.SQLRecoverableException: IO Error: Connection reset at oracle.jdbc.driver.T4CConnection.logoff(T4CConnection.java:612) at oracle.jdbc.driver.PhysicalConnection.close(PhysicalConnection.java:5094) at com.sms.send.StartTaskNew.run(SmsSend.java

java通过jdbc方式连接oracle数据库

最基本的Oracle数据库连接代码(只针对Oracle11g): 1.右键项目->构建路径->配置构建路径,选择第三项“库”,然后点击“添加外部Jar”,选择“D:\Oracle\app\oracle\product\11.2.0\server \jdbc\lib\ojdbc6_g.jar”(注:D:\Oracle为数据库的安装路径). 2.以下代码为非常标准的Oracle数据库连接代码示例: /** * 一个非常标准的连接Oracle数据库的示例代码 */ public void testO

Java基础知识强化25:JDBC(Java Data Base Connectivity,java数据库连接)

JDBC  1.    JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成.JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序,同时,JDBC也是个商标名. 2.     有了JDBC,向各种关系数据发送SQL语句就是一件很容易的事.换言之,有了JDBC API,就不必为访问Sybase数据库专门写一

JDBC连接mysql,查大数据集报:java.lang.OutOfMemoryError: Java heap space

问题描述: 在项目中需要连接mysql,查询上千上万的记录,每个字段都挺大.结果在Eclipse中报如下错误: java.lang.OutOfMemoryError: Java heap space 原因分析: mysql会将查询到的记录全部发送到java端保存,而JVM中如果98%的时间是用于GC,且可用的Heap size 不足2%的时候将抛出此异常信息.JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.JVM在启动的时候会自动设置Heap size的值,其初始空间

mybatis配置,idea报错:java.sql.SQLException: No suitable driver found for jdbc://localhost:3306/mybatis_test

报错信息: "C:\Program Files\Java\jdk1.8.0_211\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.4\lib\idea_rt.jar=54826:C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.4\bin" -Dfile.encoding=UTF-8 -classpath "C

Java的第20年:Java和我的故事

??Java技术诞生于1995年的5月23日,这样一个在程序设计领域长时间占据统治地位并且拥有最好的生态系统的语言起初只是太阳微系统公司(Sun Microsystems)一个失败的机顶盒项目的附产品.Java的第一个正式版本发布于1996年1月23日,在这个最原始的Java版本中,类和接口加起来总共只有211个,那时候的Java并不完美也不强大,但是由于它紧紧的抓住了当时最时髦的两样东西--互联网和浏览器,并拥有完美的平台可移植性,再加上计算机领域的全能奇才James Gosling(Java

转:Java学习路线图

作者: nuanyangyang 标  题: Java学习路线图(整理中,欢迎纠正) 发信站: 北邮人论坛 (Mon Aug 11 19:28:16 2014), 站内   [以下肯定是不完整的列表,欢迎补充]   Java是一个通用的编程语言,其实可以干很多事,怎么学Java就看怎么用了.   但有一些一般的步骤:   1. 熟悉一种文本编辑器,比如Vim, Emacs, Notepad++, TextMate等.知道哪些是开源的,哪些是闭源的,哪些要收费.养成不用盗版软件的习惯. 2. 安装

WEB开发:Java与Php对比

比较PHP和JSP这两个Web开发技术,在目前的情况是其实是比较PHP和Java的Web开发.以下是我就几个主要方面进行比较: 一. 语言比较 PHP是解释执行的服务器脚本语言,首先php有简单容易上手的特点.语法和c语言比较象,所以学过c语言的程序员可以很快的熟悉php的开发.而java需要先学好java的语法和熟悉一些核心的类库,懂得面向对象的程序设计方法.所以java不如php好学. Java首先要编译成字节码.class文件,然后在java虚拟机上解释执行.Java的Web开发首先最容易

Tomcat:Java Web服务器配置详解

一.Tomcat概述 1.tomcat简介 tomcat是基于JDK的web服务器,其能运行Servlet和JSP规范总.Tomcat 5支持最新的Servlet 2.4 和JSP 2.0规范.实际上Tomcat 部分是Apache服务器的扩展,但它是独立运行的.运行tomcat时,它实际上作为一个与Apache 独立的进程单独运行的.Apache 为HTML页面服务,而Tomcat实际上运行JSP页面和Servlet.tomcat具有处理HTML页面的功能,另外它还是一个Servlet和JSP