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对象中各列的编号、类型和属性。

posted @ 2014-05-27 19:51  YouxiBug  阅读(317)  评论(0编辑  收藏  举报