三层架构,JDBC的事物结合和ThreadLocal
第一节 三层架构
1.1 引言
三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为:界面层(User Interface layer)、业务逻辑层(Business Logic Layer)、数据访问层(Data access layer)。区分层次的目的即为了“高内聚低耦合”的思想。
1.2各层作用
数据访问层(DAL)的作用:
从数据源加载数据(select)
向数据源写入数据(Insert/Update)
从数据源删除数据(Delete)
业务逻辑层(BLL)的作用:
从DAL中获取数据,以供UI显示用
从UI中获取用户指令和数据,执行业务逻辑
从UI获取用户指令和数据,通过DAL写入数据源显示层(UI)的作用:
向用户展现特定业务数据
采集用户的输入信息和操作
1.3引用关系
UI----->BLL------>DAL
1.4 分层优缺点
优点
1、开发人员可以只关注整个结构中的其中某一层;
2、可以很容易的用新的实现来替换原有层次的实现;
3、可以降低层与层之间的依赖;
4、有利于标准化;
5、利于各层逻辑的复用。
6、结构更加的明确
7、在后期维护的时候,极大地降低了维护成本和维护时间缺点
1、降低了系统的性能。这是不言而喻的。如果不采用分层式结构,很多业务可以直接造访数据库,以此获取相应的数据,如今却必须通过中间层来完成。
2、有时会导致级联的修改。这种修改尤其体现在自上而下的方向。如果在表示层中需要增加一个功能,为保证其设计符合分层式结构,可能需要在相应的业务逻辑层和数据访问层中都增加相应的代码。
3、增加了开发成本。
1.5 业务层(service)
什么是业务?
代表用户完成的一个业务功能,可以由一个或多个DAO的调用组成。(软件所提供的一个功能都叫业务)
转账:一次转账。两个DAO操作:扣钱,加钱
1.5.1定义业务层
包名:service
实现类包名:impl
接口名:xxxService
实现类:xxxServiceImpl
业务层Service接口代码:
package com.qf.www.service;
/*
service层是业务层,是个接口
*/
public interface EmpService {
//1查询
List<Emp> findAll();
//2更新
void update(Emp e);
//3删除
void delete(int empno);
//4添加
void add(Emp e);
}
业务层service实现类代码
package com.qf.www.service.impl;
import com.qf.www.service.EmpService;
/*
业务层实现类主要是创建DAO层的数据访问对象,然后调用方法完成业务功能
*/
public class EmpServiceImpl implements EmpService {
private EmpDao empDao = new EmpDaoImpl();
@Override
public List<Emp> findAll() {
List<Emp> list = empDao.findAll();
return list;
}
@Override
public void update(Emp e) {
empDao.update(e);
}
@Override
public void delete(int empno) {
empDao.delete(empno);
}
@Override
public void add(Emp e) {
empDao.add(e);
}
}
第二节 三层结合事务
通过三层结合事务,完成转账练习
2.1项目准备
创建Java项目
导入需要的jar包 mysql驱动、 druid.jar
添加数据库配置文件
- db.properties
#连接设置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/account
username=root
password=1234
#<!-- 初始化连接 -->
initialSize=10
#最大连接数量
maxActive=50
#<!-- 最小空闲连接 -->
minIdle=5
#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
maxWait=5000
2.2编写Java代码
应用三层架构,其中dao层,我们已经搭建过,只需要添加service业务层和view视图层
2.2.1分包
com.qf.dao
com.qf.dao.impl
com.qf.service
com.qf.service.impl
com.qf.view
com.qf.utils
com.qf.domain
2.2.2编写DataSourceUtils工具类
DatasourceUtils工具类,优化获取连接,优化事务操作
package com.itqf.utils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.sql.DataSource;
import com.qf.utils.DruidUtils;
public class DataSourceUtils {
private static DruidDataSource ds=null;
//静态代码块
static {
InputStream is = DruidUtils.class.getClassLoader().getResourceAsStream("db.properties");
Properties properties=new Properties();
try {
properties.load(is);
dataSource= (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取数据源
* @return 连接池
*/
public static DataSource getDataSource(){
return ds;
}
/**
* 从当前线程上获取连接
* @return 连接
* @throws SQLException
*/
public static Connection getConnection() throws SQLException{
//--从
try {
Connection connection = ds.getConnection();
return connection;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
//关闭
public static void close(){
Connection connection = getConnection();
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
*---- 开启事务
* @throws SQLException
*/
public static void startTransaction