JavaWeb06(三层架构连接数据库)

news2024/9/30 7:30:50

目录

三层架构

1.什么是三层架构

三层架构 就是将整个业务划分为三层:表示层、业务逻辑层、数据访问层。

 2. 层与层之间的关系 

 3.怎么理解三层架构

4.为什么需要三层架构

区分层次的目的是为了“高内聚,低耦合”的思想;

简单来说,就是解耦:只做自己功能内的事。

5.两层与三层的区别 

 6.现状分析

我们目前是直接在表示层(servlet)调用了数据访问层dao(相当于服务员直接找到了采购员),不合适!因此,我们应该增加业务逻辑层biz,在servlet中调用biz,biz中调用dao !

7.面向接口编程.

8.使用三层架构实现登录功能

   //将设计和实现完全分离    //接口:只做设计

9.一剂强心针

                 注意:以上两种任选其一,不要混合使用


三层架构


1.什么是三层架构

  • 三层架构 就是将整个业务划分为三层:表示层、业务逻辑层、数据访问层。

  • 表示层主要是指与用户交互的界面,用于接收用户输入的数据和显示处理后用户所需要的数据;

  • 业务逻辑层 表示层和数据访问层之间的桥梁,实现业务逻辑,具体包含:验证、计算、业务规则等等;

  • 数据访问层 与数据库打交道,主要实现对数据的增、删、改、查。

  • 注意: entity(实体类) 它不属于三层中的任何一层, 但是它贯穿于三层,能在三层之间传递数据。

2. 层与层之间的关系 

 3.怎么理解三层架构

 

服务员:只管接待客人;

厨师:只管做客人点的菜;

采购员:只管按要求采购食材。

4.为什么需要三层架构

  • 区分层次的目的是为了“高内聚,低耦合”的思想;

  • 高内聚 :尽可能类的每个成员方法只完成一件事

  • 低耦合 :减少类内部,一个成员方法调用另一个成员方法

  • 从类角度来看, 高内聚低耦合:减少类内部,对其他类的调用

  • 从功能块来看, 高内聚低耦合:减少模块之间的交互复杂度

  • 简单来说,就是解耦:只做自己功能内的事。

  • 他们各司其职,服务员不用了解厨师如何做菜,不用了解采购员如何采购食材;厨师不用知道服务员接待了哪位客人,不用知道采购员如何采购食材;同样,采购员不用知道服务员接待了哪位客人,不用知道厨师如何做菜。

  • 任何一层发生变化都不会影响其他层:

    • 服务员(表示层)请假——另找服务员;

    • 厨师(业务逻辑层)辞职——招聘另一个厨师;

    • 采购员(数据访问层)辞职——招聘另一个采购员。

5.两层与三层的区别

两层: 当任何一个地方发生变化时,都需要重新开发整个系统。“多层”放在一层,分工不明确耦合度高,难以适应需求变化,可维护性低、可扩展性低;

 

三层:发生在哪一层的变化,只需更改该层,不需要更改整个系统。层次清晰,分工明确,每层之间耦合度低——提高了效率,适应需求变化,可维护性高,可扩展性高。

 

6.现状分析

我们目前是直接在表示层(servlet)调用了数据访问层dao(相当于服务员直接找到了采购员),不合适!因此,我们应该增加业务逻辑层biz,在servlet中调用biz,biz中调用dao !

7.面向接口编程.

旨在将设计与实现完全分离.

在一个面向对象的系统中,系统的各种功能是由许许多多的不同对象协作完成的。在这种情况下,各 对象内部是如何实现自己的,对系统设计人员来讲就不那么重要了;而各个对象之间的协作关系则成为系统设计的关键。小到不同类之间的通信,大到各模块之间的交互,在系统设计之初都是要着重考虑的, 这也是系统设计的主要工作内容。面向接口编程就是指按照这种思想来编程。

8.使用三层架构实现登录功能

   //将设计和实现完全分离
    //接口:只做设计

public interface IUserDao {
    /**
     * 登录
     * @param uname 用户名
     * @param upwd  密码
     * @return  用户对象
     */
    public User login(String uname,String upwd);

  }

/**
 * 数据访问层:增删改查
 * @author PC
 *
 */
public class UserDao implements IUserDao {

    //以前这个类怎么写  现在仍然怎么写
    
    private Connection con = null;
    private PreparedStatement ps =null;
    private ResultSet rs = null;
    
    @Override
    public User login(String uname, String upwd) {
        User u = null;
        try {
            con=DBHelper.getCon();
            String sql="select * from tb_user where uname=? and upwd=?";
            ps=con.prepareStatement(sql);
            ps.setString(1, uname);
            ps.setString(2, upwd);
            rs=ps.executeQuery();
            if(rs.next()) {
                u=new User(rs.getInt(1), rs.getString(2), rs.getString(3), rs.getString(4));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            DBHelper.myClose(con, ps, rs);
        }
        return u;
    }

/**
 * 业务逻辑层
 * @author PC
 *
 */
public class UserBiz implements IUserBiz {
    //业务逻辑层biz  调用  数据访问层dao(里氏替换原则)
    IUserDao iud =new UserDao();
 

/**

*表示层

*/

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //表示层  调用 业务逻辑层里氏替换原则()
         IUserBiz iub = new UserBiz();

}

9.一剂强心针

 

                 注意:以上两种任选其一,不要混合使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/485698.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从零开始学习Linux运维,成为IT领域翘楚(五)

文章目录 🔥Linux打包压缩与搜索命令🔥Linux常用系统工作命令🔥Linux管道符、重定向与环境变量🔥管道命令符 🔥Linux打包压缩与搜索命令 tar 命令 语法: tar [选项] [文件]选项: 🐟 -c 产生.t…

牛客网---CM11 链表分割 代码详解+哨兵位的比较

文章目录 前言CM11 链表分割链接:方法一:尾插(带哨兵位)1.1 思路:1.2 代码:1.3 流程图1.4 注意点 方法二:尾插(不带哨兵位)2.1代码: 对比: 总结 前言 独处未必孤独喜欢就是自由 本章的内容是牛…

Chapter4:频率响应法(上)

第四章:频率响应法 Exercise4.1 已知微分网络和积分网络电路图如下图所示,求网络的频率特性。 解: 【图 ( a ) ({\rm a}) (a)微分网络】 由微分网络电路图可得:

c# 运算符重载

1.概要 1.1可重载运算符 可重载运算符说明 x, -x, !x, ~x, , --, true, falsetrue和 false 运算符必须一起重载。 x y, x - y, x * y, x / y, x % y, x & y, x | y, x ^ y, x << y, x >> y, x >>> y x y, x ! y, x < y, x > y, x < y,…

使用NNI对BERT模型进行粗剪枝、蒸馏与微调

前言 模型剪枝&#xff08;Model Pruning&#xff09;是一种用于减少神经网络模型尺寸和计算复杂度的技术。通过剪枝&#xff0c;可以去除模型中冗余的参数和连接&#xff0c;从而减小模型的存储需求和推理时间&#xff0c;同时保持模型的性能。模型剪枝的一般步骤&#xff1a…

OpenAI文本生成器-怎么解决openai只写一半

openai写文案写一半没了怎么解决 如果您正在使用 OpenAI 写文案的服务&#xff0c;在撰写文案的过程中遇到了意外中断或者其他问题导致文案未保存&#xff0c;以下是一些有用的解决方法&#xff1a; 重新调用 API 去生成文案。您可以调用 OpenAI 的 API 重新获取您所需的文案…

Three.js--》几何体顶点知识讲解

目录 几何体顶点位置数据 点线定义几何体顶点数据 网格模型定义几何体顶点数据 顶点法线数据 实现阵列立方体与相机适配 常见几何体简介 几何体的旋转、缩放、平移方法 几何体顶点位置数据 本篇文章主要讲解几何体的顶点概念&#xff0c;相对偏底层一些&#xff0c;不过…

魔兽世界商业服务端定制商人自定义NPC教程

魔兽世界自定义NPC教程 大家好&#xff0c;我是艾西今天跟大家聊一下自定义NPC&#xff0c;自定义NPC可以添加自己想要售卖的物品以及定价等可以更好的将一个游戏设定以及游戏的拓展性有质的提升 creature表是游戏所有生物人物等表格 Creature_template是所有生物模板&#xf…

kafka快的原因(四)

四、kafka快的原因 4.1 顺序读写page cache 见上一节文件系统 使用6个7200rpm、SATA接口、RAID-5的磁盘阵列在JBOD配置下的顺序写入的性能约为600MB/秒&#xff0c;但随机写入的性能仅约为100k/秒&#xff0c;相差6000倍以上。 4.2 网络模型 4.2.1 reactor模型 4.2.2 epo…

kubernetes项目部署

目录 ​一、容器交付流程 二、k8s平台部署项目流程 三、在K8s平台部署项目 一、容器交付流程 容器交付流程通常分为四个阶&#xff1a;开发阶段、持续集成阶段、应用部署阶段和运维阶段。 开发阶段&#xff1a;开发应用程序&#xff0c;编写Dockerfile; 持续集成阶段&#…

gradle 模块

目录 ​settings.gradle文件的作用 SourceSet类的作用 Plugin 插件 Java 对 Plugin 的扩展 settings.gradle文件的作用 settings用于配置哪些工程是要被gradle集成的&#xff0c;gradle 通过 Settings.java 类来处理 settings.gradle 文件。 gradle的初始化阶段&#xff0c…

【音视频处理】RTMP、HLS、HTTP-FLV、WebRTC、RTSP的区别?直播协议详解

大家好&#xff0c;欢迎来到停止重构的频道。 本期我们详细讨论直播的相关协议&#xff0c;包括&#xff1a;HTTP-FLV、HLS、RTMP、Web-RTC、RTSP等等。 我们将会详细介绍这些协议的工作原理、应用场景、及延迟的原因。 我们按这样的顺序讨论​ 1、 RTMP、HTTP-FLV 2、 …

【五一创作】红黑树数据结构

现在JAVASE中HashMap中底层源码是由数组链表红黑树进行设计的&#xff0c;然后很多地方也是用到红黑树&#xff0c;这里单独对红黑树数据结构进行简单的介绍。 目录 红黑树概念 红黑树的性质 自平衡规则 代码 红黑树概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;…

flink-on-yarn两种提交模式及其区别

一、session模式 在yarn上启动一个flink集群&#xff0c;并重复使用该集群&#xff0c;后续提交的任务都是提交给该集群&#xff0c;资源会一直被占用&#xff0c;除非手动关闭。 特点&#xff1a;需要事先申请资源&#xff0c;启动JobManager和TaskManager。 优点&#xff1a…

网卡丢失导致集群异常

假期晚上有个电话&#xff0c;说集群故障&#xff0c;应用无法连接&#xff0c;节点一可以ssh登录&#xff0c;节点二已无法正常登录了&#xff0c;在节点一上需要ssh 私网ip地址才可以登录节点二&#xff0c;虽不是重点客户&#xff0c;有问题还是需要积极处理。 首先看集群状…

LeetCode - 239 滑动窗口最大值

目录 题目来源 题目描述 示例 提示 题目解析 算法源码 题目来源 239. 滑动窗口最大值 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k…

AutoCAD介绍——带你了解最强的CAD软件

AutoCAD介绍——带你了解最强的CAD软件 什么是AutoCAD应用领域功能特点版本发展总结 什么是AutoCAD Autodesk的AutoCAD是一款世界著名的CAD软件&#xff0c;其全称为“Auto Computer-Aided Design”&#xff0c;是一种计算机辅助设计工具&#xff0c;用于帮助用户创建和编辑二…

k8s之审计日志

一、为什么要有审计 Kube-Apiserver 的负载突然变高&#xff0c;大量访问失败&#xff0c;集群中到底发生了什么&#xff1f; 当集群发生问题时&#xff0c;这是Metric一般会失效&#xff0c;为了排查以上问题&#xff0c;k8s 提供了两种原生的日志形式——审计&#xff08;A…

PID整定二:基于Ziegler-Nichols的频域响应

PID整定二&#xff1a;基于Ziegler-Nichols的频域响应 1参考2连续Ziegler-Nichols方法的PID整定2.1整定方法2.2仿真示例 1参考 1.1根轨迹图的绘制及分析 1.2计算机控制技术01-3.4离散系统的根轨迹分析法 1.3PID控制算法学习笔记 2连续Ziegler-Nichols方法的PID整定 2.1整定…

2023软考中级《软件设计师》(备考冲刺版) | 知识产权与标准化

1.知识产权 1.1 保护对象和范围 1.2 保护期限 注意&#xff1a;注册商标续注可延长 1.3 知识产权人确定 1.3.1 职务作品&#xff08;区分个人和公司单位&#xff1a;大部分都是公司单位&#xff09; 1.3.2 委托开发、合作开发与同时申请 1.4 侵权判定 1.第二十五条对下列各…