JDBC.docx

上传人:b****8 文档编号:10447388 上传时间:2023-02-11 格式:DOCX 页数:27 大小:24.30KB
下载 相关 举报
JDBC.docx_第1页
第1页 / 共27页
JDBC.docx_第2页
第2页 / 共27页
JDBC.docx_第3页
第3页 / 共27页
JDBC.docx_第4页
第4页 / 共27页
JDBC.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

JDBC.docx

《JDBC.docx》由会员分享,可在线阅读,更多相关《JDBC.docx(27页珍藏版)》请在冰豆网上搜索。

JDBC.docx

JDBC

 

一、JDBC原理概述

 

JDBC第一天

 

2007年6月4日

1,JDBC是一套协议,是JAVA开发人员和数据库厂商达成的协议,也就是由Sun定义一组

接口,由数据库厂商来实现,

并规定了JAVA开发人员访问数据库所使用的方法的掉用规范。

2,JDBC的实现是由数据库厂商提供,以驱动程序形式提供。

3,JDBC在使用前要先加载驱动。

JDBC对于使用者要有一致性,对不同的数据库其使用方法都是相同的。

4、driver开发必须要实现Driver接口。

JDBC驱动程序的类型

目前比较常见的JDBC驱动程序可分为以下四个种类:

(1)JDBC-ODBC桥加ODBC驱动程序

JavaSoft桥产品利用ODBC驱动程序提供JDBC访问。

注意,必须将ODBC二进制代码(许多情况下还包括数据库客户机代码)加载到使用

该驱动程序的每个客户机上。

因此,这种类型的驱动程序最适合于企业网(这种网络上客户机的安装不是主要问题),

或者是用Java编写的三层结构的应用程序服务器代码。

(2)本地API

这种类型的驱动程序把客户机API上的JDBC调用转换为Oracle、Sybase、Informix、

DB2或其它DBMS的调用。

注意,象桥驱动程序一样,这种类型的驱动程序要求将某些二进制代码加载到每台客户

机上。

(3)JDBC网络纯Java驱动程序

这种驱动程序将JDBC转换为与DBMS无关的网络协议,之后这种协议又被某个服务

器转换为一种DBMS协议。

这种网络服务器中间件能够将它的纯Java客户机连接到多种不同的数据库上。

所用的

具体协议取决于提供者。

通常,这是最为灵活的JDBC驱动程序。

有可能所有这种解决方案的提供者都提供适合

于Intranet用的产品。

为了使这些产品也支持Internet访问,它们必须处理Web所提出的安全性、通过防火墙

的访问等方面的额外要求。

 

几家提供者正将JDBC驱动程序加到他们现有的数据库中间件产品中。

(4)本地协议纯Java驱动程序

这种类型的驱动程序将JDBC调用直接转换为DBMS所使用的网络协议。

这将允许从客户机机器上直接调用DBMS服务器,是Intranet访问的一个很实用的解决

方法。

由于许多这样的协议都是专用的,因此数据库提供者自己将是主要来源,有几家提供者

已在着手做这件事了。

据专家预计第(3)、(4)类驱动程序将成为从JDBC访问数据库的首方法。

(1)、

(2)类驱动程序在直接的纯Java驱动程序还没有上市前会作为过渡方案来使

用。

对第

(1)、

(2)类驱动程序可能会有一些变种,这些变种要求有连接器,但通常这些是

更加不可取的解决方案。

第(3)、(4)类驱动程序提供了Java的所有优点,包括自动安装(例如,通过使用JDBC

驱动程序的appletapplet来下载该驱动程序)。

5、JDBC的API

java.sql包和javax.sql包

DriverManager类(驱动管理器),它可以创建连接,它本身就是一个创建Connection的工厂

(Factory)。

Driver接口入口

Connection接口,会根据不同的驱动产生不同的连接

Statement接口,发送sql语句

ResultSet接口(结果集),是用来接收select语句返回的查寻结果的。

其实质类似于集合。

以上的资源都需要释放,释放的是数据库的资源

JDBC应用步骤

1,注册加载一个driver驱动

2,创建数据库连接(Connection)

3,创建一个Statement(发送sql)

4,执行sql语句

5,处理sql结果(select语句)

6,关闭Statement

7,关闭连接Connection。

注意:

6,7两个步骤势必须要做的,因为这些资源是不会自动释放的,必须要自己关闭

访问Oracle的数据库的驱动名字叫o加到环境变量PATH中。

jdbc14.jar,这个jar文件中出访的驱动程序的.class文件

要使用这个驱动程序,要先将他

 

一,注册加载驱动driver,也就是强制类加载

1、Class.forName(driver);

driver="oracle.jdbc.driver.OracleDriver";

2、Driverd=newDriver类();

Driverd=neworacle.jdbc.driver.OracleDriver();

DriverManager.registerDriver(d);

3、编译时利用虚拟机的系统属性

java-Djdbc.drivers=oracle.jdbc.driver.OracleDriver类名(文件)

Oracle的Driver的全名oracle.jdbc.driver.OracleDriver

mysql的Driver的全名com.mysql.jdbc.Driver

SQLServer的Driver的全名com.microsoft.jdbc.sqlserver.SQLServerDriver

二,创建连接

DriverManager.getConnection(Stringurl,Stringusername,Stringpassword);

Connection连接是通过DriverManager的静态方法getConnection(.....)来得到的,这个方

法的实质是把参数传到实际的Driver中的connect()方法中来获得数据库连接的。

Oracle的URL值是由连接数据库的协议和数据库的IP地址及端口号还有要连接的库名

(DatebaseName)

OracleURL的格式

jdbc:

oracle:

thin:

(协议)@XXX.XXX.X.XXX:

XXXX(IP地址及端口号):

XXXXXXX

(所使用的库名)

例:

jdbc:

oracle:

thin:

@192.168.0.39:

1521:

TARENADB

MySqlURL的写法

例:

jdbc:

mysql:

//192.168.8.21:

3306/test

SQLServerURL的写法

例:

jdbc:

microsoft:

sqlserver:

//192.168.8.21:

1433

java-Djdbc.drivers=驱动全名类名

使用系统属性名,加载驱动-D表示为系统属性赋值

使用Connection对象获得一个Statement,Statement中的executeQuery(Stringsql)方法

可以使用select语句查询,并且返回一个结果集ResultSet通过遍历这个结果集,

可以获得select语句的查寻结果,ResultSet的next()方法会操作一个游标从第一条记录

的前边开始读取,直到最后一条记录。

executeUpdate(Stringsql)方法用于执行DDL和DML语句,可以update,delete操作。

注意:

要按先ResultSet结果集,后Statement,最后Connection的顺序关闭资源,因为Statement

和ResultSet是需要连接是才可以使用的,

所以在使用结束之后有可能起他的

Connection。

Statement还需要连接,所以不能现关闭

 

作业:

修改StudentDao的设计以及实现和测试程序,来完成从命令行传递学生的信息。

 

一、提问

如何进行代码复用

 

JDBC第二天

 

2007年6月5日

继承复用、组合复用

私有复用:

一个方法在一个类的内部使用

工具方法:

使用静态方法,使用类名直接调用

 

二、Statement

execute(sql);当不知道执行的SQL语句是什么类型的时候执行,返回值是boolean

executeQuery(sql);执行查询语句

executeUpdate(sql);执行更新语句

三、PreparedStatement

可以使用参数替代sql语句中的某些参数使用"?

"代替,他先将带参数的sql语句发送到数

据库,进行编译,然后PreparedStatement会将参数发送给数据库。

在使用PreparedStatement时,在设置相应参数时,要指明参数的位置和类型,以及给出参数

根据不同的参数类型使用不同的setXXX(参数的位置,参数值)来设置参数

例:

publicvoidinsert(Students){

Connectioncon=ConnectionFactory.getConnection();//建立连接

Stringsql="insertintostudent(id,name)values(?

?

)";

PreparedStatementps=null;

try{

ps=con.prepareStatement(sql);//创建一个PreparedStatement

intindex=1;

ps.setInt(index++,s.getStuId());//为参数赋值

ps.setString(index++,s.getName());

ps.executeUpdate();

}catch(SQLExceptione){

e.printStackTrace();

}finally{

if(ps!

=null)

try{

ps.close();

}catch(SQLExceptione){

e.printStackTrace();

}

 

}

 

}

 

if(con!

=null)

try{

con.close();

}catch(SQLExceptione){

e.printStackTrace();

}

CallableStatement是可以用非sql语句来访问数据库,他是通过调用存储过程(PL/SQL)来

访问数据库的。

可以直接使用连接来调用prepareCall(...)方法,来执行这个存储过程,"..."

是存储过程的名字。

对于系统时间要去数据库时间

TimeStamp和Date都可以保存时间

TimeStamp可以保存时、分、秒的数据,Date只保存日期年月的信息。

SQLException是检查异常必须处理要么throws,要么try{}catch(){}

getErrorCode()可以获得错误码,可以对错误进行查询。

 

四、源数据

JDBC中有两种源数据,一种是数据库源数据,另一种是ResultSet源数据。

源数据就是描述存储用户数据的容器的数据结构。

 

ResultSetrs=ps.executeQuery(sql);

ResultSetMetaDatam=rs.getMetaData();

getColumnCount(),获得实际列数

getColumnName(intcolnum),获得指定列的列名

getColumnType(intcolnum),获得指定列的数据类型

getColumnTypeName(intcolnum),获得指定列的数据类型名

//打印结果集

publicstaticvoidprintRS(ResultSetrs)throwsSQLException{

ResultSetMetaDatarsmd=rs.getMetaData();

while(rs.next()){

for(inti=1;i<=rsmd.getColumnCount();i++){

StringcolName=rsmd.getColumnName(i);

StringcolValue=rs.getString(i);

if(i>1){

System.out.print(",");

}

 

}

 

System.out.print(name+"="+value);

 

}

}

System.out.println();

 

五、数据库源数据

 

DatabaseMetaData

getURL(),获得连接数据库的URL

getDatabaseProductName()获得数据库产品的名称

getDriverVersion()获得JDBC驱动程序的String形式的版本号

getTables()获得数据库中该用户的所有表

getUserName()获得数据库用户名。

六、事务(Transaction)

事务是针对原子操作的,要求原子操作不可再分,要求原子操作必须同时成功同时失败。

事务是捆绑的原子操作的边界。

JDBC中使用事务,先要使用连接调用setAutoCommite(false)方法,把自动提交(commit)

置为false。

打开事务就要关闭自动提交。

不用事务是要把setAutoCommite(true)

在处理事务时,在发送sql语句后执行成功并确认时,就在try块中使用连接调用commit()

方法来发送提交信息,

在发送sql语句后执行失败时,会在catch语句块中使用连接调用rollback()方法来发送回滚

信息,也可以在需要时做回滚操作(主观原因)。

七、JDBC事务并发产生的问题和事务隔离级别

1,脏读(dirtyread),读取到了没有提交的数据。

2,不可重复读(UnPrpeatableRead),两次读取到了不同的数据,就是要保持在同一时间点

上两次读取到的数据相同,

不能够使查询数据时进行改变。

3,幻读(phantom),在两次查询同一时间点数据时,数据数量发生改变,要保持在同一时

间点上两次读取到的数据相同。

 

事务隔离级别

TRANSACTION_NONE不使用事务。

TRANSACTION_READ_UNCOMMITTED可以读取为提交数据。

TRANSACTION_READ_COMMITTED可以避免脏读,不能够读取没提交的数据,最常用

的隔离级别大部分数据库的默认隔离级别

TRANSACTION_REPEATABLE_READ可以避免脏读,重复读取,

 

TRANSACTION_SERIALIZABLE可以避免脏读,重复读取和幻读,(事务串行化)会降低

数据库效率

以上的五个事务隔离级别都是在

Connection类中定义的静态常量,使用

setTransactionIsolation(intlevel)方法可以设置事务隔离级别。

八,异常的处理

try{}

catch(SQLException){}

try{}

catch(Exception){}

作业:

自己写一个Sqlplus应用

 

JDBC第三天

 

一、JDBC2.0的新特性

可滚动结果集(可双向滚动)

批处理更新***

可更新结果集

1、批处理更新

Statement

 

2007年6月6日

addBatch(Stringsql),方法会在批处理缓存中加入一条sql语句

executeBatch(),执行批处理缓存中的所有sql语句。

 

PreparedStatement

addBatch()将一组参数添加到此PreparedStatement对象的批处理命令中。

executeBatch()将一批命令提交给数据库来执行,如果全部命令执行成功,则返回更新计数

组成的数组。

PreparedStatement中使用批量更新时,要先设置好参数后使用addBatch()方法加入缓存。

注意:

批量更新中只能使用更新或插入语句

execute(Stringsql),这个方法的返回值是boolean类型,如果返回true就表示sql是一个select

语句,可以通过getResultSet()获得结果集,如果是false,sql就是DML语句或者是DDL语

句。

 

2、可滚动结果集(可双向滚动),这种结果集不但可以双向滚动,相对定位,绝对定位,并

且可以修改数据信息。

 

滚动特性

next(),此方法是使游标向下一条记录移动。

previous(),此方法可以使游标上一条记录移动,前提前面还有记录。

absolute(introw),可以使用此方法跳到指定的记录位置。

定位成功返回true,不成功返回false,

返回值为false,则游标不会移动。

afterLast(),游标跳到最后一条记录之后。

beforeFirst(),游标跳到第一条记录之前。

(跳到游标初始位)

first(),游标指向第一条记录。

last(),有彪指向最后一条记录。

relative(introws),相对定位方法,参数值可正可负,参数为正,游标从当前位置向下移动

指定值,参数为负,游标从当前位置向上移动指定值。

 

TYPE_FORWARD_ONLY,该常量指示指针只能向前移动的ResultSet对象的类型。

TYPE_SCROLL_INSENSITIVE,该常量指示可滚动但通常不受其他的更改影响的

ResultSet对象的类型。

TYPE_SCROLL_SENSITIVE,该常量指示可滚动并且通常受其他的更改影响的ResultSet

对象的类型。

要使用可滚动结果集时,要在Statement创建时指定参数,才可以使用

Statementst=null;

st=con.createStatement(ReusltSet.TYPE_SCROLL_INSENSITIVE,ResuleSet.CONCUR_UPDAT

ABLE)

ResultSet结果集中,先使用moveToInsertRow(),将游标移到和结果集结构类似的缓冲区中

然后可以使用updateXxx(intcolumn,columnTypevalue)方法来更新指定列数据,

再使用insertRow()方法插入记录,

最后将游标指回原位,moveToCurrentRow()。

能否使用可更新结果集,要看使用的数据库驱动是否支持,

还有只能用于单表且表中有主键字段(可能会是联合主键),不能够有表连接,会取所有非

空字段且没有默认值。

能否使用JDBC2.0ResultSet的新特性要看数据库驱动程序是否支持。

 

3、SQL3.0中的行类型

Array,数组

Sturct,结构

Blob,大的二进制数据文件。

Clob,大文本文件对象。

在使用上述大对象的时候,在使用JDBC插入记录时要先插入一个空的占位对象,然后使用

selectblobdatafromt_blobwhereid="+id+"forupdate这样的语法来对获得的大对象,进

 

行实际的写入操作

 

Blod通过getBinaryOutputStream()方法获取流进行写入。

getBinaryStream()方法获得流来获取blob中存储的数据。

clob的操作也和

blob相同。

getAsciiStream()方法用于读取存储的文本对象,

getAsciiOutputStream()方法之获得流用来向文件对象写入的。

 

JDBC第四天

 

一、ID的High/Low算法

 

2007年6月7日

高位数字分别与低位数字相匹配,得到的数字是唯一的

减少与数据库的交互

二、ORM

1、类映射成表

类名与表名对应

2、属性定义映射成列,类型之间必须是兼容的

3、类关系映射成表关系

一对一双向关系

内存中都保存对方的一个引用

数据库中,表b的id是主键,也是外键,引用a表的id主键--sharepk

表b中有一个字段aid是外键,引用a表的主键,并且有唯一约束--pk+fk

共享主键:

createtablecar_pk(

idnumber(10,0)notnull,

namevarchar2(15),

serialvarchar2(30),

manufacturervarchar2(50),

producedatedate,

primarykey(id)

);

 

createtableengine_pk(

idnumber(10,0)notnull,

modelvarchar2(20),

manufacturervarchar2(50),

producedatedate,

primarykey(id)

);

 

altertableengine_pk

addconstraintfk_engine_car_pk

 

foreignkey(id)

referencescar_pk(id);

外键+唯一约束

createtablecar_fk(

idnumber(10,0)notnull,

namevarchar2(15)notnull,

serialvarchar2(30)notnull,

manufacturervarchar2(50)notnull,

producedatedate,

primarykey(id)

);

 

createtableengine_fk(

idnumber(10,0)notnull,

modelvarchar2(20)notnull,

manufacturervarchar2(50)notnull,

producedatedate,

caridnumber(10,0)unique,

primarykey(id)

);

 

altertableengine_fk

addconstraintfk_engine_car_fk

foreignkey(carid)

referencescar_fk(id);

实体对象:

在内存中有id属性的

值对象:

没有id的,依赖其他对象存在

 

一对多关系

一的一方保存多一方的一个集合,最好使用set,保证无重复元素

多的一方保存一一方的一个对象的引用

publicclassOrderimplementsSerializable{

privateintid;

privateStringowner;

privateStringphone;

private

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 管理学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1