JDBC.docx
- 文档编号:10447388
- 上传时间:2023-02-11
- 格式:DOCX
- 页数:27
- 大小:24.30KB
JDBC.docx
《JDBC.docx》由会员分享,可在线阅读,更多相关《JDBC.docx(27页珍藏版)》请在冰豆网上搜索。
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JDBC