Chinaunix首页 | 论坛 | 博客
  • 博客访问: 338817
  • 博文数量: 329
  • 博客积分: 2633
  • 博客等级: 少校
  • 技术积分: 3633
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-22 15:43
文章分类

全部博文(329)

文章存档

2013年(244)

2012年(46)

2011年(39)

我的朋友

分类: 系统运维

2012-03-08 14:35:31

6 JDBC数据库访问技术

6.1 SQLServer2000的安装

6.1.1 SQLServer2000概述

SQL Server 2000 Microsoft 公司于 2000 10 月推出的一个关系型数据库管理系统

6.1.2 SQLServer2000个人版的安装

见网上教程,不赘述。

6.2 JDBC概述

6.2.1 ODBC概述

ODBCMicrosoft公司推出的开放式数据库接口。应用系统通过SQL结构化查询语言访问数据管理系统(DBMS)ODBC接口对不同的DBMS提供半透明的存取,这样开发人员便能在虚拟数据库上展开工作,通过加载的驱动程序将逻辑结构映射到具体的DBMS

6.2.2 JDBC概述

JDBC(Java Database Connectivity)Java环境中访问SQL数据库的一组API。它包括一些用Java语言编写的类和接口,能更方便地向任何关系型数据库发送SQL命令。

JDBC提供给程序员的编程接口由两部分组成:

1).是面向应用程序的编程接口JDBC API,它是供应用程序员用;

2).是支持底层开发的驱动程序接口JDBC Driver API,它是供商业数据库厂商或专门的驱动程序生产厂商开发JDBC驱动程序用。

当前流行的大多数数据库系统都推出了自己的JDBC驱动程序。

6.2.3 JDBC驱动程序的类型

JDBC驱动程序大致分为四种类型:

1).JDBC Type-1 :类型1JDBC驱动程序是将JDBC API映射到另一种数据库的API上。JDBC-ODBC桥属于类型1JDBC驱动程序。

2).JDBC Type-2 :这类JDBC驱动程序有一部分是用Java语言编写,另外一部分是用本地代码编写,一般也称之为JDBC Native API

3).JDBC Type-3 :类型3JDBC驱动程序也叫JDBC Network Bridge驱动程序,驱动程序是使用Java语言编写,具有跨平台特性。

4).JDBC Type-4 :类型4JDBC驱动程序也是用纯Java语言编写,也具有跨平台特性,一般称之为Pure Java JDBC Driver

6.2.4 JDBCType-4 驱动程序的安装方法

我们用的一般是这个。在Tomcat下安装其它数据库的JDBC Type-4驱动程序的基本方法也是将*.jar驱动程序文件复制到C:\tomcat\common\lib文件夹中。

6.3 JDBC API中关键的类和接口

6.3.1 java.sql

JDBC API的核心部分在java.sql包中,这个包提供使用 Java 编程语言访问并处理存储在数据源中数据的 API

6.3.2 javax.sql

javax.sql包提供了通过数据源访问数据库的API,这个包是java.sql 包的补充,它从 1.4 版本开始包含在 JDK 中,支持连接池和数据源技术,支持分布式事务处理。

6.3.3 常用的JDBCAPI类和接口

1).java.sql.Driver接口

这个接口的实现类是某种数据库的一个驱动程序类,用于初始化驱动程序。

2).java.sql.DriverManager

DriverManager类的主要作用是管理注册到DriverManager中的JDBC驱动程序,并根据需要使用JDBC驱动程序建立与数据库服务器的网络连接。类中常用的方法有:

public static Connection getConnection(String url, String user,String password) throws SQLException

public static Connection getConnection(String url) throws SQLException

3).java.sql.Connection接口

一个Connection对象表示一个数据库连接,接口中常用的方法有:

Statement createStatement(int resultSetType,int resultSetConcurrency)throws SQLException

作用:创建一个 Statement 对象发送SQL 语句给数据库服务器,两个形参指定ResultSet 对象的类型和并发性,含义如下:第一个形参指明结果集游标的类型,通过游标来读取结果集中的记录。SQL Server 支持四种游标类型:静态游标、动态游标、只进游标和键集驱动游标。 第二个形参指明结果集的并发性,并发控制是指多名用户同时更新行时,用于保护数据库完整性的技术。不正确的并发可能导致脏读、幻读和不可重复读等问题。ResultSet中并发控制常用的取值主要有两个:一个是ResultSet.CONCUR_READ_ONLY,它是只读的,不允许通过游标进行更新,并且不对组成结果集的行锁定。第二个取值是ResultSet.CONCUR_UPDATABLE,它是乐观读写,不锁定行。

Statement createStatement() throws SQLException

作用:创建一个Statement对象来发送SQL语句给数据库服务器,默认参数:结果集的类型是ResultSet. TYPE_FORWARD_ONLY,结果集的并发模式是ResultSet.CONCUR_READ_ONLY

PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException

作用:给一条带参数的SQL语句生成PreparedStatement对象(SQL语句预编译对象),中的第一个形参是带“?”号参数的预编译SQL语句

PreparedStatement prepareStatement(String sql) throws SQLException

作用:为一条带参数的SQL语句生成PreparedStatement对象(SQL语句预编译对象),第一个形参是带“?”号参数的SQL语句,默认参数:结果集的类型是ResultSet. TYPE_FORWARD_ONLY,结果集的并发模式是ResultSet.CONCUR_READ_ONLY

CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException

作用:为一条带有“?”号参数的存储过程调用命令创建预编译语句对象,第一个参数为待编译的SQL语句,第2~4个形参的含义同上。

CallableStatement prepareCall(String sql)  throws SQLException

作用:为一条带参数的存储过程调用语句生成预编译对象,第一个形参是带“?”号参数的SQL语句,默认参数:结果集的类型是ResultSet. TYPE_FORWARD_ONLY,结果集的并发模式是ResultSet.CONCUR_READ_ONLY

void setAutoCommit(boolean autoCommit) throws SQLException

作用:定义连接的JDBC事务提交模式,形参取值为true,表示连接处于自动事务提交模式,则连接将接收到的一条SQL语句当作一个独立的事务提交。形参取值为false,则表示连接处于JDBC手动事务提交模式,通过调用commit()手动提交事务或调用rollback

void commit() throws SQLException

作用:提交事务,这个方法只有在手动事务提交模式下才有效。

Savepoint setSavepoint() throws SQLException

作用:在当前语句处创建一个回滚点,并返回一个Savepoit对象表示此回滚点。

void rollback(Savepoint savepoint) throws SQLException

作用:回滚事务到指定的回滚点处。

void rollback() throws SQLException

作用:回滚所有的事务。

void close() throws SQLException

作用:释放数据库连接。

4).java.sql.Statement接口

通过Statement对象向数据库服务器发送SQL语句,接口中常用的方法有:

public ResultSet executeQuery(String sql) throws SQLException

这个方法将一条select查询语句发送给数据库服务器,查询结果封装在ResultSet对象中,形参是以字符串表示的SQL语句。这个方法不执行updatedeleteinsert等更新操作语句。

public int executeUpdate(String sql) throws SQLException

这个方法主要执行deleteupdateinsert语句,也可以执行一些建库、建表语句,返回值是整数,表示语句影响的记录数。

public void setMaxRows(int max) throws SQLException

对于一条select语句的查询结果,此方法定义ResultSet对象最多存储max条记录,超过部分被丢弃。

public void addBatch(String sql) throws SQLException

将多条insertupdate语句添加到Statement对象中,形成一个批处理,最后调用executeBatch()执行这个批处理。

public int[] executeBatch() throws SQLException

执行批处理中的各条insertupdate语句,返回一个整型数组,一个数组分量表示一条SQL语句的影响行数。

5).java.sql.ResultSet接口

Connection对象生成Statement对象时,可定义ResultSet对象中的指针能够前后移动,并且也可以定义ResultSet对象中的数据可以被更改。ResultSet中和记录指针移动相关的方法有:

public int getRow() throws SQLException

获得当前记录的记录号。

public boolean next() throws SQLException

ResultSet对象中的记录指针移到下一条记录处,如果成功移动返回true,移动失败返回false。一般利用此方法来构造一个遍历结果集的循环

boolean previous() throws SQLException

ResultSet对象中的记录指针移到当前记录的上一条记录处,如果成功移动返回true,移动失败返回false。注意此时记录指针应该是可滚动的。

public boolean first() throws SQLException

ResultSet对象中的记录指针移到第一条记录处,如果成功移动返回true,移动失败返回false。注意此时记录指针应该是可滚动的。

public boolean last() throws SQLException

ResultSet对象中的记录指针移到最后一条记录处,如果成功移动返回true,移动失败返回false。注意此时记录指针应该是可滚动的。

public boolean absolute(int row) throws SQLException

ResultSet对象中的记录指针移到第n条记录处,如果成功移动返回true,移动失败返回false。注意此时记录指针应该是可滚动的。

6).ResultSet对象中,读取当前记录各字段值的方法是getXXX()方法,常用的如下:getString()getByte()getShort()getInt()getLong()getFloat()getDouble()getBoolean()getDate()getTime()getObjectgetBlobgetClob

Blob是一个大二进制对象,Clob是一个大字符对象

7).要对ReusltSet对象中的数据进行更新操作,可用如下的方法:deleteRow()updateRow()updateDoubleupdateShort()updateInt()updateLong()updateByte()updateDate()updateTime()updateFloat()updateBoolean()updateClob()updateBlob()updateString()

com.microsoft.sqlserver.jdbc. SQLServerDataSource

这个类是sqljdbc.jar驱动程序提供的、以数据源方式获得SQL Server 2000连接的一种方案,类中常用的方法有:

8).public SQLServerDataSource()

构造函数,取得一个实例。

public void setUser(java.lang.String user)

给出登录数据库服务器所用的用户名。

public void setPassword(java.lang.String password)

给出登录数据库服务器所用的口令。

public void setServerName(java.lang.String serverName)

给出数据库服务器的名字或IP地址。

public void setPortNumber(int portNumber)

给出数据库服务器的端口号,用整数表示,SQL Server默认的端口号为1433

public void setDatabaseName(java.lang.String databaseName)

给出待连接数据库的名字。

public java.sql.Connection getConnection()

试图取得一个数据库的网络连接。

6.4 JDBC应用样例

连接sql2000的例子:

package javabean;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

public class DBConnection {

       private static final String driverName="com.microsoft.sqlserver.jdbc.SQLServerDriver";

       private static final String url="jdbc:sqlserver://localhost:1433;DataBaseName=jdbc_test";

       private static final String user="sa";

       private static final String password="sa";

       //加载驱动需要静态代码块

       static {

              try{

                     Class.forName(driverName);

              }catch(ClassNotFoundException e){

                     e.printStackTrace();

              }

       }

       //获得连接对象的方法

       public static Connection getConnection(){

              Connection connection=null;

              try{

                     connection=DriverManager.getConnection(url,user,password);

              }catch(SQLException e){

                     e.printStackTrace();

              }

              return connection;

       }

       //关闭资源对象的方法

       public static void close(ResultSet rs,Statement st,Connection conn){

              try{

                     if(rs!=null){

                            rs.close();

                     }

              }catch(SQLException e){

                     e.printStackTrace();

              }finally{

                     try{

                            if(st!=null){

                                   st.close();

                            }

                     }catch(SQLException e){

                            e.printStackTrace();

                     }finally{

                            try{

                                   if(conn!=null){

                                          conn.close();

                                   }

                            }catch(SQLException e){

                                   e.printStackTrace();

                            }

                     }

              }

       }

}

6.4.1 查询与分页样例

6.4.2 预编译SQL语句

对于要多次执行的SQL语句,SQL Server 2000支持将其写成预编译SQL语句形式,而后直接多次调用。预编译SQL语句分为准备和执行两个过程,准备语句过程是通知SQL Server 2000服务器将预编译语句编译成执行计划,SQL语句只需编译一次,后续执行是直接调用编译得到的机器代码段,执行效率较高。 在预编译语句中,具体数据值用“?代替。在执行预编译语句前,要将具体数据值写入处。

JDBC中,使用Connection类的prepareStatement()方法为一条预编译语句建立一个PreparedStatement预编译对象,此方法的传入参数为等待编译的SQL语句。SQL语句中可变动的数据值用“?表示,一般用法形如:

Connection con=…….;

String sql=insert  into  xxxTable  values(?,?)  ;

PreparedStatement  st=con.prepareStatement(sql);

6.4.3 存储过程的调用

存储过程是用SQL语句和控制流语句等编写的一段程序代码,在创建时已被编译成机器代码并存储在数据库中供客户端调用。存储过程有以下优点:

所生成的机器代码被永久存储在数据库中,客户端调用时不需要重新编译,执行起来效率要高一些。 存储过程的网络使用效率比等效的SQL 语句要高。

1).java代码中有CallableStatement接口。它继承了PreparedStatementPreparedStatement中常用的方法也适用于CallableStatement接口,接口中常用的方法有:

public void setString(int n,String x)  throws SQLException

将一个字符串类型的数据值x写入存储过程调用命令的第n个“?”号处,代替“?”,n为预编译语句中“?”的序号,第一个“?”的序号为1

public ResultSet executeQuery() throws SQLException

执行一个会返回ResultSet结果集的存储过程。

public boolean execute() throws SQLException

通用的存储过程执行方法。

public void registerOutParameter(int n,int sqlType)throws SQLException

将存储过程调用命令{call }中第n个位置处的“?参数注册声明为输出(OUT)参数,并定义返回数据的类型。返回数据类型SqlType可以用java.sql.Types类中的符号常量表达。

public int getInt(int n) throws SQLException

读取存储过程调用命令中“?”位置处的一个整数返回值,n为“?”号在存储过程调用命令中的序号。

2)call调用存储过程

3).sql2005中写入一个存储过程,例如:

use pubs

go

create proc  newRecord @title_id varchar(50),

                       @title varchar(100),

                       @type varchar(30),

                       @price money,

                       @pubdate datetime

as

begin

   insert into titles(title_id,title,type,price,pubdate)

      values(@title_id,@title,@type,@price,@pubdate)

end

6.4.4 添加新记录

通过JSP向数据库中添加记录的基本方法是:提供一个表单页供用户输入记录数据,提交表单后,后台JSP程序从表单中读取数据,构作SQL语句,或调用预编译语句,将数据添加到数据库中。

6.4.5 删除记录

通过JSP页面删除一条记录的基本方法是:获得待删除记录的主键值,根据主键值构作一条delete语句或调用存储过程等删除表中指定主键值的记录。

6.4.6 修改记录

通过JSP修改记录值的基本思想是:设计一个查询应用,供用户查询并列表显示待修改的记录,单击选中一条待修改的记录后,超链接将记录的主键值传入修改应用,修改应用从数据库中读取指定主键值的记录显示在表单中供用户修改,表单提交后程序从表单中读出数据构SQL语句,将新的记录值更新至数据库中。

6.4.7 JDBC事务处理

1).事务

事务是作为单个逻辑工作单元执行的一系列操作。事务维护了数据的完整性、正确语义、持久性。事务中的所有SQL语句必须被成功执行,则事务才会对数据库产生持久性的影响,如果事务中的第n条语句执行出错,表示事务运行失败,则前面的n-1条语句对数据库产生的影响可以撤销(回滚)到事务执行前的初始状态或出错点之前的某个正确状态。

2).JDBC事务处理的程序结构

JDBC在默认情况下,使用事务自动提交模式,它将接收到的每一条SQL操作当作一个事务提交给数据库服务器处理。如果要启动手动事务模式

3).JDBC事务回滚方式

JDBC事务回滚主要有两种方式:一种是回滚所有事务,恢复到事务的初始状态,直接调用Connection中的rollback()方法实现。另一种是回滚部分事务,要事先要定义保存点,发生异常时回滚到指定的保存点处。定义保存点的方法如下:Savepoint save3 = con.setSavepoint();

6.4.8 数据库与Excel报表的动态生成

读取数据库的数据动态生成Excel报表,这是JSP应用中常遇到的问题,本节采用的基本方法是:在Excel工作薄中,将报表模板制作在第一张工作表中,从数据库中读取数据,利用POI组件复制模板工作表而得到一张新的工作表,将查询数据填写到新的工作表中。

6.5 连接池技术

Java语言通过JDBC技术访问数据库的基本过程是:

1).加载数据库驱动程序;

2).通过JDBC建立数据库连接;

3).访问数据库,执行SQL语句;

4).断开数据库连接。

Web应用程序开发中,使用这种模式访问数据库时,存在很多问题,为了解决这些问题,可以采用数据库连接池技术。连接池实际上是在一个集合对象中存储一定数量的数据库连接对象。当程序需要使用数据库连接时,请求从池中获取一个空闲的连接,程序使用完毕后再把连接放回池中重用。连接池通过重用连接的方法,减少了创建连接的系统开销,能够明显提高系统的数据库访问效率。

具体操作可以在网上搜索,例如

阅读(1097) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~