三层架构,JDBC的事物结合和ThreadLocal使用

三层架构,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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值