JDBC.docx
- 文档编号:25964466
- 上传时间:2023-06-16
- 格式:DOCX
- 页数:20
- 大小:201.13KB
JDBC.docx
《JDBC.docx》由会员分享,可在线阅读,更多相关《JDBC.docx(20页珍藏版)》请在冰豆网上搜索。
JDBC
JDBC
JDBC的定位
java程序中JDBC的定位
EJB:
用于企业计算,数据持久化。
开发中,JDBC的定位
Introduction
1WhatIstheJDBCAPI?
ThevalueoftheJDBCAPIisthatanapplicationcanaccessvirtuallyanydatasourceandrunonanyplatformwithaJavaVirtualMachine.
跨平台,跨数据库
WhatDoestheJDBCAPIDo?
1-Establishaconnectionwithadatasource
2-Sendqueriesandupdatestatementstothedatasource
3-Processtheresults
实例程序:
Connectioncon=DriverManager.getConnection("jdbc:
myDriver:
wombat",
"myLogin","myPassword");
Statementstmt=con.createStatement();
ResultSetrs=stmt.executeQuery("SELECTa,b,cFROMTable1");
while(rs.next()){
intx=rs.getInt("a");
Strings=rs.getString("b");
floatf=rs.getFloat("c");
}
DriverManager
加载驱动程序
Class.forName(驱动程序);
Connection
创建连接
Connectioncon=DriverManager.getConnection("jdbc:
myDriver:
wombat",
"myLogin","myPassword");
4类JDBC驱动程序
(1)JDBC-ODBCbridge
Java提供的技术示范,性能差、安全差,实际项目中不使用
(2)Native-APIpartlyJavadriver
部分本地代码APIdriver:
本地代码+Java代码
安全差
(3)JDBC-netpureJavadriver
性能差
(4)NativeprotocolpureJavadriver
数据库也提供VM,来实现Java程序
JDBC的驱动程序,是一个逐步完善的过程。
数据库在程序设计中的定位
面向对象程序设计
面向过程程序设计
JDBC访问数据库
(1)要有Driver
oracle的driver
oracle.jdbc.driver.OracleDriver
MySQL的driver
com.mysql.jdbc.Driver
(2)使用JDBC接口访问数据库
java.sql包:
主要的、基本的JDBC包
Driver
DriverManager
Connection
Statement
PreparedStatement
CallableStatement
ResultSet
DatabaseMetadata
ResultSetMetadata
javax.sql包:
扩展的JDBC包
(3)要符合JDBC协议
oracle的JDBC协议
jdbc:
oracle:
thin:
@IP地址+端口号:
数据库名[username][password]
MySQL的JDBC协议
jdbc:
mysql:
//主机地址+端口号/数据库名[username][password]
JDBC访问数据库的6个步骤
(1)注册驱动程序
(2)建立数据库连接
(3)创建Statement
(4)执行SQL语句
(5)处理结果集
(6)关闭JDBC对象
注册驱动程序
常用方法:
Class.forName(驱动程序名);
Class.forName的作用:
1-加载驱动程序
2-隐含的向DriverManager注册driver
提示:
驱动程序,可注册多个。
建立数据库连接
Connectionconn=DriverManager.getConnection(URL);
Connectionconn=DriverManager.getConnection(URL,username,password);
提示:
数据库已在特定端口进行监听,因此建立数据库连接时,不需要提供登录远端主机的信息,只需提供登录数据库的username和password.
创建Statement
Statementstmt=conn.createStatement();
Statement是操纵数据库的工具。
Statement还有两种:
PreparedStatement:
Statement的子类
CallableStatement:
PreparedStatement的子类
PreparedStatement:
用来处理“同构SQL”
同构SQL:
SQL结构、关键部分相同的SQL语句。
Java程序中的SQL语句,传到DB后,DB分两步执行SQL:
1-编译SQL
2-执行编译后的可执行程序
使用PreparedStatement,可大大减少SQL语句的编译次数,节省时间。
PreparedStatement适合于对数据库的更新。
CallableStatement
调用“存储过程”
执行SQL语句
SQL语句是作为参数,传给DB,交由它编译、执行。
提示:
java中的SQL,不能带分号“;”结束。
Java无法识别“;”的作用。
处理结果集
元数据Metadata:
保存用户数据的数据结构的信息。
DatabaseMetadata
ResultSetMetadata
类比:
去吃牛肉粉,用户关心的是牛肉粉,但是牛肉粉要用碗来装。
牛肉粉是用户数据;
碗:
是元数据。
元数据有一定的作用,有助于表达数据信息。
常用的元数据信息
1-结果集字段个数
2-字段名
3-字段类型
提示:
结果集中,字段的下标是从1开始的。
关闭JDBC对象
原因:
数据库的连接个数是有限制的。
提示:
关闭JDBC对象,也是有顺序的。
若直接关闭Connection对象,则同时关闭Connection对象创建的Statement对象,以及Statement对象创建的ResultSet对象。
事务
原子操作
每一条SQL语句,都是一个原子操作。
原子操作要么成功,要么失败。
事务
对于若干个原子操作来说,它们的状态可有三种:
1-全部成功
2-全部失败
3-有的成功,有的失败
为了避免出现第3种情况。
将若干个原子操作,封装(捆绑)成一个事务,这个事务被看成是一个原子操作。
因此,事务要么成功执行,要么失败。
将若干个原子操作,封装成一个事务,是由数据库来完成的。
程序的工作就是通知数据库,要将那些原子操作封装成一个事务。
步骤:
(事务的开始)1-通知数据库,将以下的若干个原子操作,封装成一个事务:
关闭自动提交:
conn.setAutoCommit(false);
2-执行一系列原子操作(SQL语句)
事务开始后,原子操作的结果,以及原始数据都被保存起来,知道事务的提交。
3-rollback或commit
(事务的结束)4-恢复自动提交
conn.setAutoCommit(true);
一个Connection对象,可有多个Statement。
因此,事务是设置在Connection对象上的。
事务的并发控制
事务并发的负面后果
1-DirtyRead
2-Non-repeatedRead
3-PhantomRead
DirtyRead(脏读)
一个事务读到另一个事务还没提交的数据。
产生不正确的数据。
不可重复读(Non-repeatedRead)
读两次数据:
第1次读原始数据;
第2次读数据时,数据可能被另一个事务修改了。
幻读(PhantomRead)
读两次数据:
第1次读原始数据;
第2次读数据时,数据可能被另一个事务删除了或进行插入操作后,读取的是另一条记录的数据。
DataSource和ConnectionPool
DataSource
用来屏蔽特定的数据库。
把数据库的连接信息放入一个DataSource对象中,连接数据库时,通过该DataSource对象来连接。
优点:
增强程序的可移植性;
DataSource是一种方便的手段。
ConnectionPool
1-存放Connection对象的容器;
2-减少连接数据库的开销;
3-程序请求连接时,在ConnectionPool中取连接;
4-连接使用完后,放回ConnectionPool,不释放;
5-ConnectionPool对连接进行管理:
计数、监控连接状态;
提示:
DataSource,使用的是ConnectionPool中的连接。
JNDI、DataSource、ConnectionPool的关系
DataSource是为了给使用者共享的,而JNDI是用来存放共享资源的。
因此,DataSource被放到JNDI服务器上。
JDBC和JNDI的比较
JDBC
JNDI
加载
驱动程序
服务提供者
物理存储
数据库
IDAP,文件,注册表…各种设备
API
JDBCAPI
JNDIAPI
存储内容
二维表
对象
密度
集中
零散,杂乱
访问方式
SQL
bind,lookup
提示:
文件系统filesystem也是一种服务器,它自带在操作系统中。
创建一个数据源
1-创建一个DataSource对象;
2-将DataSource对象放入JNDI中,并指定数据源名:
Context对象.bind(数据源名,DataSource对象)
访问一个数据源
1-数据源名;
2-JNDI的位置;
3-访问一个数据源:
Context对象.lookup(数据源名)
应用程序访问数据库的过程:
1-连接JNDI服务器;
2-从JNDI中取数据源;
3-使用ConnectionPool的连接;
4-连接数据库;
5-操作数据库;
6-关闭连接。
3层架构(Three-TierArchitecture)
RowSet(行集)
RowSet的特点:
1-RowSet,能将记录缓存在本地机的内存中;
2-适应分布式计算;
3-可在网络中传递;
4-RowSet可是无连接的、也可是有连接的;
5-默认是可更新、可滚动的结果集。
RowSet的实现
1-安装开发包;
2-开发RowSet应用程序。
RowSet的类型
CachedRowSet
…
WebRowSet
注意:
有些数据库还没有提供RowSet,现在用的是sun公司的RowSet开发包。
Rowset填补了MySQL不支持可更新结果集的限制。
Oracle不支持RowSet的可更新功能。
RowSet对象.acceptChanges();
OOADandDatabaseDesign
DatabaseDesign:
数据库设计模式
E-R图模式
OOAD:
面向对象的分析与设计
E-O
entityobject
实体的关系对象的关系
ObjectID对象标识
在数据库中,用OID来标识一个对象。
一个对象,是class表的一条记录。
ObjectID的限制条件:
1-新建一个字段来作为OID;
2-不能使用有业务含义的字段来做OID;
3-OID有“有效范围”;
4-OID的唯一性比primarykey更严格;
5-计算OID的算法:
single-rowtable,hign/low。
OID算法
single-rowtable:
一行一列表
在single-rowtable中,每个字段存放的是一个sequence,这样就保证OID的唯一性。
high/low算法
high/low算法是对single-rowtable算法的改进。
high/low的思想:
批发零售
high/low的高级用法
(1)设一个最高级的OID分配服务器;
(2)所有的下级OID分配服务器都到它那获取OID的高位部分;
(3)再自己造底位部分
(4)高位部分、底位部分还可细分。
例如:
IP地址的分配,全世界都从美国获取IP地址的高位部分,
再自己造地位部分,
这就保证了IP地址在全世界的唯一性。
Mappingclassestotables
onetableforeachclass:
为每个类建一个表
onetableforeachconcrete(实体)class:
为每个实体类建一个表
onetableforanentireclasshierarchy:
为类的继承关系建一个表
前提:
必须先有类的继承关系,才能建表
为每个类建一个表
优点:
(1)更接近OO的概念
(2)支持多态
(3)易维护、无冗余
缺点:
(1)表的数量多;
(2)读写表花费的时间长;
(3)生成报表比较困难。
为每个实体类建一个表
优点:
(1)更接近OO的概念
(2)支持多态
(3)易维护、无冗余
(4)生成报表较容易
缺点:
(1)修改抽象类,会影响实现该抽象类的所有实体类的表;
(2)数据定义有冗余。
为类的继承关系建一个表
优点:
(1)设计模式易理解
(2)支持多态
(3)容易生成报表
缺点:
(1)任何一个类的修改,都会影响表;
(2)表的结构极大;
(3)很难应用数据库的规则,来提高表的读写性能;
(4)维护困难
end
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JDBC