




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第六章JDBC高级应用应用程序架构,DAO封装本章内容应用程序架构DAO封装JDBC及DAO综合运用本章内容应用程序架构层二层架构三层架构多层架构DAO封装JDBC及DAO综合运用层(1/4)层是对软件结构逻辑上的划分,提供功能完整的应用程序的某些部分一个学生成绩管理系统可以分为:登陆部分,查询部分,访问数据库部分,成绩显示部分,数据库部分登陆部分和成绩显示部分是学生可以直接看见的(显示层)查询部分,访问数据库部分(业务层)数据库(数据层)各个部分可以在一台电脑中,也可以位于不同的电脑中;可以是桌面程序,也可以是WEB程序层一般是独立的,可以独立更新逻辑意义上的独立:可以独立开发,可以独立更新,修改时相互不受影响,可以位于不同的电脑上层(2/4)可以使用层来协调多个客户端每个客户端可以看做是一个层层(3/4)所有软件系统都可以划分成三个主要部分显示层—接收数据处理请求并显示数据,通常在第一层用户直接使用的层,用户通过显示层提交请求,展示结果业务逻辑层—实现业务规则在两层结构中,处于第一层中在三层或n层结构中,处于第二层中业务逻辑处理(判断用户请求是否合理,编码转换等),数据访问数据层—存储并允许访问数据,通常是在第三层数据库发展过程两层结构三层结构n层结构层(4/4)为什么要分层?有利于分解问题:各个层次分工明确,将一个复杂问题简单化了。有利于开发过程中的分工合作:方便为不同技术特点的开发人员分配不同层的工作。解耦:各层间通过接口解耦,接口与实现分离,从而可以方便地替换掉实现,也便于系统维护与升级。代码复用:分层的根本在于代码的复用和劳动成本的减少。分层的最理想化的结果是实现层与层之间的互不依赖的内部实现,所谓的即插即用。例如我们现在用的是Oracle数据库,如果我们要变为
MySQL
数据库的话,只要数据访问层接口不变,可以轻松切换。两层架构(1/3)特点除数据库以外,其他所有部分作为一个单独的层(客户端)显示层与业务逻辑层合在一起作为一个单独的层客户端负责显示数据,业务逻辑,错误检查…服务器端只负责存储数据主要部分全部集中在客户端,导致客户端很庞大(也叫胖客户端)这种体系结构是一种客户端/服务器结构(C/S结构)C是指client—客户端S是指server—服务器端两层架构(2/3)体系架构两层架构(3/3)优点适用于小型应用程序,开发方便,开发周期短如果客户增加,增加一个新的客户端就可以了缺点客户端应用程序负责所有的错误检查,数据显示,业务逻辑等,过于庞大在网络上,数据被暴露,客户端可以直接访问数据,安全性不高数据库或表发生变化会导致客户端代码发生较大的改动每个客户端需要安装驱动程序三层架构(1/2)特点显示层—业务逻辑层—数据层请求由显示层(客户端)发送到中间层(业务逻辑层)中间层处理业务逻辑并将SQL语句发送到数据库数据库处理SQL语句,并将结果发送回中间层中间层将结果发送给用户(通过显示层显示)2)三层架构的重点是中间层(业务逻辑层)中间层可以缓存数据,并管理业务规则有专门处理业务规则的代码允许数据库连接池允许管理多个数据源连接可以数据同步简化了客户端开发三层架构(2/2)体系架构N层架构(1/3)特点N层体系架构扩展自三层架构,将需要单独处理的功能独立出来作为一个新的层一般是对业务逻辑层进行扩展将一个应用程序从水平或垂直方向划分为N层体系结构水平划分:软件系统有一个发送短信的功能模块,获得客户端请求后,先通过发送短信的模块,然后交给后续的模块处理其他业务逻辑垂直划分:软件系统中有一个打印报表的功能模块,可以不经过其他业务模块直接访问数据库获得数据打印报表,与其他业务功能是平行的N层架构(2/3)体系架构N层架构(3/3)三层和N层架构的优缺点一致优点适合大型软件系统,简化了大型软件系统的开发,降低了大型软件系统的开发难度结构清晰,各部分作用明确可以分模块更新,不会影响到其他模块缺点三层或多层中故障点的数量可能会增加整体应用程序复杂性增加二层与三层(N层)结构的比较比较项二层三层(多层)软件规模小大逻辑结构更清晰模块化程度低高分工容易部署客户端要装驱动(胖客户端)客户端可以更简单维护更新的成本高通常更低些整体复杂度低高故障点少多本章内容应用程序架构DAO封装JDBC及DAO综合运用DAO封装(1/3)DAOData
Access
Object—数据访问对象访问数据库,操作数据的代码建立数据库连接,操作数据库数据是访问数据的相关技术的综合运用JDBC,Connection,Statement
,ResultSet事务,并发控制,连接池,ThreadLocal对象关系映射,多层架构DAO封装(2/3)核心思想将数据访问代码封装为一个组件,与业务逻辑代码隔开使数据访问与业务逻辑分离,业务逻辑不需要关心数据操作好处应用程序结构清晰,更易于维护和扩展,更方便于数据库的改变及配置,代码重用度更高DAO封装(3/3)目标不涉及业务逻辑的判断和处理。代码可重用性高,能够完成所有的数据库访问操作。如果需要的话,能够支持多种数据库平台。具有相对独立性,当DAO层的实现发生变化,不会影响上层的实现。ThreadLocal(1/2)问题多线程访问数据时,每个线程在多个地方要用到连接,难以管理每个线程打开多个连接对象,浪费资源ThreadLocaljava.lang.ThreadLocal为解决多线程程序的并发问题提供了一种新的思路当使用ThreadLocal维护对象时,每个线程都可以维护一个线程范围的共享变量。使用ThreadLocal管理每个线程使用的连接对象唯一性:ThreadLocal存储的对象与线程一对一绑定,线程之间不受干扰持久性:只要没有删除,TreadLocal中存储的对象一直存在,线程可以随时访问ThreadLocal(2/2)ThreadLocal使用set(Object
obj); //将相关对象存入ThreadLocal中get();
//从ThreadLocal中取出与当前线程相关的对象remove(); //从ThreadLocal中删除与当前线程相关的对象与线程相关public
classTestJDBC1
implementsRunnable{//创建线程局部变量personLocal,用来保存Person对象privatefinal
static
ThreadLocal<Person>
personLocal
=
newThreadLocal<Person>();public
static
void
main(String[]
agrs)
{TestJDBC1
tj=newTestJDBC1();Thread
t1
=
new
Thread(tj,"a");Thread
t2
=
new
Thread(tj,"b");t1.start();t2.start();}public
void
run(){//获取当前线程的名字String
currentThreadName
=
Thread.currentThread().getName();ThreadLocal示例(1/4)System.out.println("线程'"+currentThreadName
+
"'正在运行!");Random
random
=
newRandom();
//产生一个随机数并打印int
age
=
random.nextInt(100);System.out.println("线程'"+currentThreadName+"'设置年龄:"+age);//从ThreadLocal对象中获取一个Person对象,并将随机数年龄插入到对象属性中
Person
person=personLocal.get();//线程首次执行此方法的时候,personLocal.get()肯定为nullif
(person==null){//创建一个Person对象,并保存到本地线程变量personLocal中person=new
Person();person.setAge(age);personLocal.set(person);}ThreadLocal示例(2/4)System.out.println("线程'"+currentThreadName+"'第一次读年龄:"+personLocal.get().getAge());try{Thread.sleep(500);}catch
(InterruptedException
ex)
{ex.printStackTrace();}System.out.println("线程'"+currentThreadName+"'第二次读年龄:"+
personLocal.get().getAge());}}ThreadLocal示例(4/4)public
class
Person
{private
intage
=0;public
int
getAge()
{return
age;}public
void
setAge(int
age)
{this.age
=
age;}}ThreadLocal示例(4/4)本章内容JDBC知识回顾DAO封装JDBC及DAO综合运用银行业务模拟系统需求说明银行业务模拟系统需求模拟银行日常业务开户、存款,取款,转账DAO封装将数据访问代码进行封装与业务代码实现隔离重点是DAO实现,模拟业务功能银行业务模拟系统(1/4)显示层BankTest.java业务逻辑层BankBiz.java,
BankBizImpl.javaBankAccount.java,
BankStatement.javaBankAccountDao.java,BankAccountDaoImpl.javaConnectionFactory.java,
perties数据层Oracle或MySQL数据库bankaccount表(账户表)bankstatement表(操作日志表)银行业务模拟系统(2/4)业务逻辑层BankBiz.java,
BankBizImpl.java进行各种验证,实现开户,存款,取款,转账功能BankBiz.java是接口,BankBizImpl.ava实现接口,便于扩展BankAccount.java,
BankStatement.java实体Bean,封装相关表中的数据,在数据库及业务处理代码之间传递数据(集合)BankAccountDao.java,BankAccountDaoImpl.java操作bankaccount和bankstatement表中的数据BankAccountDao.java是接口,BankAccountDaoImpl.java实现接口,便于扩展ConnectionFactory.java,
pertiesConnectionFactory.java读取配置文件,创建连接池并从连接池获得连接银行业务模拟系统(3/4)DAO相关代码BankAccount.java,
BankStatement.java实体Bean,封装相关表中的数据,在数据库及业务处理代码之间传递数据(集合)BankAccountDao.java,BankAccountDaoImpl.java操作bankaccount和bankstatement表中的数据BankAccountDao.java是接口,BankAccountDaoImpl.java实现接口,便于扩展ConnectionFactory.java,
pertiesConnectionFactory.java读取配置文件,创建连接池并从连接池获得连接连接池,ThreadLocal,事务…银行业务模拟系统(4/4)业务完成过程BankTest.javaBankBizImpl.javaBankAccountDaoImpl.javaConnectionFactory.java连接池(perties)数据库银行业务模拟代码分析(1/10)转账业务(BankTest.java)Scannerin
=
newScanner(System.in);print("请输入转出账号:");long
fromaccno=in.nextLong();print("请输入转入账号:");long
toaccno
=in.nextLong();print("请输入转账金额:");floatbalance=in.nextFloat();BankBizImpl
bankBiz
=newBankBizImpl();BankAccountDao
dao
=new
BankAccountDaoImpl();bankBiz.setDao(dao);BankAccount
bank
=bankBiz.transfer(fromaccno,
toaccno,balance);if(bank!=null){println("转账成功,账户信息:");println("账户编号:"+bank.getAccno());println("账户名称:
"+bank.getName());println(“账户余额:
"+bank.getBalance());}银行业务模拟代码分析(2/10)转账业务(BankBizImpl.java)public
BankAccount
transfer(longfrom,long
to,floatamt){BankAccount bankfrom
=dao.findAccountByAccno(from);if(bankfrom==null){System.out.println(“转出账户不存在,请重新输入!");returnnull;}//判断余额是否足够
if(bankfrom.getBalance()<amt){System.out.println("转出账户余额不足,请重新输入!");returnnull;}BankAccount
bankto
=dao.findAccountByAccno(to);if(bankto==null){System.out.println(“转入账户不存在,请重新输入!");returnnull;}return
dao.transfer(bankfrom,
bankto,amt);}银行业务模拟代码分析(3/10)转账业务(BankAccountDaoImpl.java)public
BankAccounttransfer(BankAccount
from,BankAccount
to,
float
amt)
{Connection
conn
=ConnectionFactory.getConnection();PreparedStatement
pstmt
=
null;ResultSet
rs
=
null;BankAccountbank
=
null;try
{conn.setAutoCommit(false);//源账户减少金额
pstmt=conn.prepareStatement("updatebankaccount
setbalance=balance-?
whereaccno=?");pstmt.setFloat(1,amt);pstmt.setLong(2,from.getAccno());pstmt.executeUpdate();//目标账户增加金额pstmt
=conn.prepareStatement("updatebankaccount
set
balance=balance+?
whereaccno=?");pstmt.setFloat(1,amt);pstmt.setLong(2,to.getAccno());pstmt.executeUpdate();//以下代码记录转账银行业务模拟代码分析(4/10)转账业务(BankAccountDaoImpl.java)//以下代码记录转账
pstmt=conn.prepareStatement("insert
intobankstatement(action,txdate,amt,fropstmt.setString(1,"转账");java.util.Date
date
=newjava.util.Date();pstmt.setDate(2,newDate(date.getTime()));pstmt.setFloat(3,amt);pstmt.setLong(4,from.getAccno());pstmt.setLong(5,to.getAccno());pstmt.executeUpdate();//返回账户信息pstmt
=
conn.prepareStatement("select
*from
bankaccount
where
accno=?");maccno,toaccno)
values(?,?,?,?,?)");
pstmt.setLong(1,from.getAccno());rs
=pstmt.executeQuery();
bankaccount
=
new
BankAccount();rs.next();bankaccount.setAccno(rs.getLong(1));bankaccount.setName(rs.getString(2));bankaccount.setBalance(rs.getFloat(3));银行业务模拟代码分析(5/10)转账业务(BankAccountDaoImpl.java)mit();}
catch
(SQLException
se)
{try{
conn.rollback();
}catch
(SQLException
e)
{thrownew
RuntimeException(e);}thrownew
RuntimeException(se);}finally{try
{if(rs!=null){
rs.close();
}if(pstmt!=null){
pstmt.close();
}}
catch
(SQLException
e)
{
thrownew
RuntimeException(e);}}return
bankaccount;}银行业务模拟代码分析(6/10)转账业务(ConnectionFactory.java)public
class
ConnectionFactory
{private
staticThreadLocal<Connection>
conn
=new
ThreadLocal<Connection>();private
static
Properties
pros
=System.getProperties();static
{try
{InputStream
is
=ConnectionFactory.class.getResourceAsStream("perties");pros.load(is);is.close();}
catch
(IOException
e)
{e.printStackTrace();thrownew
RuntimeException(e);}}银行业务模拟代码分析(7/10)转账业务(ConnectionFactory.java)public
static
Connection
getConnection(){Connection
con
=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年秋招:建筑工程技术人员笔试题目及答案
- 2025年拼多多答题新竞赛题库
- 2025年甲辰恩科会试试题及答案
- 2025年空气压力测试题及答案
- 2025年中俄物流知识竞赛题库
- 2025年明珞集团笔试题及答案
- 2025年物料泄露试题及答案解析
- 2025年小学音乐聆听测试题及答案
- 2025年c语言函数试题及答案
- 2025年公益社工面试题目及答案
- 机车能耗量的计算-电力机车耗电量计算
- 新视野大学英语(第四版)读写教程2(思政智慧版) 课件 Unit3 The young generation making a difference Section A
- 无人机组装调试与检修 第四章 固定翼无人机系统组装
- 中小学生牛奶配送项目投标方案
- 广东省法院通讯录
- 硝酸钾安全技术说明书MSDS
- 企业员工安全生产责任书模板
- 邦普SF305000A冷水机控制器
- GB/T 21449-2008水-乙二醇型难燃液压液
- GB/T 1819.2-2004锡精矿化学分析方法锡量的测定碘酸钾滴定法
- GB 29921-2021食品安全国家标准预包装食品中致病菌限量
评论
0/150
提交评论