zoukankan      html  css  js  c++  java
  • Mysql——JDBC编程 理论介绍

    一、JDBC简介(来自俞琰——数据库老师)

        Java数据库编程主要使用JDBC技术。JDBC是一种用于执行SQL语句的Java API。它由一组用Java编写的类和接口组成。JDBC为开发人员提供了一个标准的API, 使他们能够用纯Java API来编写数据库应用程序。

    利用JDBC, 向各种关系数据库发送的SQL语句就变成了一件很容易的事。换言之,利用JDBC API, 就不必专门为访问SQL Server数据库写一个程序,又专门为访问Oracle写一个程序,为访问Informix数据库又写一个程序。开发人员只需用JDBC API写一个程序就够了,它可向相应的数据库发送SQL语句。而且由于是使用Java编写的应用程序,就无需为不同的平台编写不同的应用程序。将JavaJDBC结合起来将使程序员只需写一遍程序就可让它在任何平台上运行。

    JDBC在应用程序中的体系结构图如下所示:

    JDBC 应用程序体系架构图

    简单地说,JDBC可以做三件事情。 

    (1) 与数据库建立连接。

    (2) 发送并执行SQL语句。

    (3) 处理结果。

    这些工作都是通过JDBC以下几个核心类来完成的。

    1 DriverManager

        DriverManager类是JDBC的管理层,用于注册并跟踪可用的驱动程序,同时在数据库和相应的驱动程序之间建立连接。DriverManager类的所有成员都是静态成员,开发者在程序中无需对其进行实例化,可以直接通过类名来调用其方法。

    (1) 加载可用驱动程序。

        在JDBC中可以自动在DriverManager类中注册驱动程序,在程序中利用Class.forName( )方法加载指定的驱动程序,这将显式地加载驱动程序类。由于这与外部设置无关,因此推荐使用这种加载驱动程序的方法。其示例代码如下:

    Class.forName(“com.microsoft.jdbc.sqlserver.SQLServerDriver”);

    (2) 建立连接

    加载驱动程序类并在DriverManager类中注册后,即可与数据库建立连接了。对于简单的应用程序,开发者只需直接使用DriverManager.getConnection( )方法,准备建立与数据库的连接。当调用DriverManager.getConnection( )方法发出连接请求时,DriverManager类将检查加载的驱动程序,查看它是否可以建立连接。

    以下代码是通常情况下用驱动程序建立连接时所需的示例代码。

    Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);//加载驱动程序

    String url=”jdbc:odbc:MyDatSource”;//MyDataSource是用户建立的ODBC数据源

    DriverManager.getConnection(url, “username”,”password”;

    其中,DriverManager.getConnection( )方法将返回代表数据库连接的Connection对象。

    2 Connection

        Connection对象代表与数据库的连接。调用DriverManager类的getConnection()方法将返回一个Connection对象。

    Connection con=DriverManager.getConnection(String url, String username, String password);

    其中,第一个参数是数据库的URL,它是一种标识数据库的方法,用来指定一个驱动程序连接的数据库。

    JDBCURL的标准语法由三部分组成,各部分间用冒号分隔,如下所示。

    jdbc:<子协议>:<子名称>

    其中,jdbc表示协议,并且JDBCURL的协议总是jdbc<子协议>表示驱动程序名或数据库连接机制的名称。子协议的典型示例是”odbc”,该名称是指定ODBC的数据资源名称的URL专门保留的。例如,为了通过JDBC-ODBC桥来访问某个数据库,可以使用如下的URL

    jdbc:odbc:MyDataSource

    其中,子协议为”odbc”,子名称”MyDataSource“是本地ODBC数据源。

    Connection类是JDBC中主要的类之一,从事务处理到创建语句,从管理连接到向数据库发送查询,它提供了许多功能。Connection中的方法按照功能划分主要有以下几类:

    (1) 向数据库发送SQL语句

    createStatement( ) 方法:创建Statement对象,此对象用于发送简单的SQL语句。

    prepareStatement( )方法:创建PrepareStatement对象,此对象用于发送带有一个或多个输入参数(IN参数)SQL语句,执行语句时,这些IN参数将被送到数据库中。

    prepareCall( )方法:创建CallableStatement对象,此对象用于执行SQL存储过程,它从PreparedStatement中继承了用于处理IN参数的方法,而且还增加了用于处理OUT参数和INOUT参数的方法

    2)事务处理

    void setAutoCommit( ) 方法:设置此连接是否为自动提交方式。

    void commit( )方法:使本次数据库操作有效,它只能在非自动提交的情况下使用。

    void rollback( )方法:使本次数据库操作无效,它也只能在非自动提交的情况下使用。

    (3) 管理连接

    void close( )方法:关闭数据库的连接并且释放所占用的JDBC资源。

    void setReadOnly( )方法:将连接设置为只读。

    3 Statement

    Statement对象是由Connection类的createStatement( )方法创建的,用于将SQL语句发送到数据库中,作为在给定连接上执行SQL语句的包容器,Statement对象用于执行不带参数的简单的SQL语句。

    (1) 创建Statement对象

    Statement对象可由Connection类的两种不同的createStatement( )方法创建,示例如下:

    Statement stmt=con.createStatement();

    Statement stmt=con.createStatement(int type, int concurrency);

    其中,type的值决定滚动方式,取值可以是:

    ResultSet.TYPE_FORWARD_ONLY,结果集的游标只能向下滚动。

    ResultSet.TYPE_SCROLL_INSENSITIVE, 结果集的游标可以上下滚动,并且当结果集变化时,当前数据库不变。

    ResultSet.TYPE_SCROLL_SENSITIVE,结果集的游标可以上下滚动,并且当结果集变化时,当前数据库同步变化。

    Concurrency的值决定数据库是否可更新。

    ResultSet.CONCUR_READ_ONLY,结果集为只读。

    ResultSet.CONCUR_UPDATETABLE,结果集为可更新的。

    (2) 使用Statementt对象执行SQL语句。

    Statement提供三种执行SQL语句:executeQuery(), executeeUpdate()execte(),具体使用哪个方法由SQL语句所产生的内容决定。

    executeQuery()方法用于执行产生单个结果集的SQL语句,例如SELECT语句。

    executeUpdate()方法用于执行那些不返回结果集的SQL语句。例如INSERT, UPDATE, DELETE语句,其返回值是一个整数,表示受影响的行数。

    execute()方法用于执行返回多个结果集的SQL语句。

    (3) 关闭Statement对象

    Statement对象将由Java垃圾回收程序自动关闭。而为了养成一种好的编程习惯,应在不需要Statement对象时显式地调用close()方法关闭它们。这将立即释放DBMS资源,有助于避免潜在的内存问题。

    4 ResultSet

    ResultSet类提供对数据结果集的访问机制。结果集是一个二维表结构,其中包含查询所返回的列标题及相应的值。根据创建ResultSet对象的Statement及其子类的类型不同,ResultSet也分为单向ResultSet和可滚动的ResultSet

    (1) 行和光标

    ResultSet类始终有一个游标指向其当前数据行。生成ResultSet对象时,游标总是定位在第一行的前面。每调用一次next()方法,光标将向下移动一行。因此第一次调用next()方法时,将把光标于第一行上,使它成为当前行。这样通过调用next()方法可以按照从上至下的次序获取ResultSet的行。

      对于可滚动ResultSetJDBC2.0提供了更多的支持光标移动的方法。

    ResultSet.previous();将光标上移一行。 

    ResultSet.first() 将光标移到结果集的第一行

    ResultSet.last() 将光标移到结果集的最后一行

    ResultSet.beforeFirst() 将光标移到结果集的第一行之前

    ResultSet.afterLast() 将光标移到结果集的最后一行之后

    ResultSet.absolute(int row):将光标移到参数row指定的行,若row为负值,就是倒数的行数

    ResultSet.relative(int rows)以当前光标位置为基准,将光标向下或向上移动rows

    (2) 列

    getXXX()方法提供了获得当前行中某列值的途径。在每一行内,可按任意次序获取列值。但为了保证可移植性,应该从左至右获取列值。列名或列好可用于标识要从中获取数据的列。例如,如果ResultSet对象rs的第二列名为title,并将值存储为字符串,则下列任意代码都将获取存储在该列中的值。

    String s=rs.getString(“title”);

    String s=rs.getString(2);

    ResultSet中列的信息,被称作结果集的元数据,它被存储在ResultSetMetaData对象。可通过调用ResultSet.getMetaData()方法得到。返回的ResultSetMetaData对象将给出其对应的ResultSet对象中各列的编号、类型和属性。

  • 相关阅读:
    《java.util.concurrent 包源码阅读》10 线程池系列之AbstractExecutorService
    《java.util.concurrent 包源码阅读》09 线程池系列之介绍篇
    《java.util.concurrent 包源码阅读》08 CopyOnWriteArrayList和CopyOnWriteArraySet
    《java.util.concurrent 包源码阅读》07 LinkedBlockingQueue
    《java.util.concurrent 包源码阅读》06 ArrayBlockingQueue
    《java.util.concurrent 包源码阅读》05 BlockingQueue
    NewBluePill源码学习 <一>
    深入理解Windows X64调试
    x64 结构体系下的内存寻址
    Windows PAE 寻址
  • 原文地址:https://www.cnblogs.com/xiangyangzhu/p/4239787.html
Copyright © 2011-2022 走看看