• 三层架构学习笔记


    三层架构

    与MVC设计模式的目标一致,都是为了 解耦合、提高代码的复用

    • 区别:二者对项目的理解角度不同
      耦合:
      描述类之间的依赖,或方法之间的依赖
      解耦:
      降低他们之间的依赖程度

    三层

    • 表示层(USL)
    • 业务逻辑层(BLL)
    • 数据访问层(DAL)

    但平时习惯称为 视图层、Service层、Dao层

    三层与MVC的区别

    • 表示层
      • 前台:对应MVC中的V层,主要是html、js、css、jsp、jq,界面显示
      • 后台:对应MVC中的C层,主要是Servlet、SpringMVC、Struts2,调用业务逻辑层
        • 一般位于servlet包
    • 业务逻辑层:对应MVC中的M层,接受表示层请求,组装数据访问层,逻辑性的操作(删==查+删)
      • 一般位于service包(manager包、bll包)
    • 数据访问层:对应MVC中的M层,直接访问数据库,原子操作(增删改查)
      • 一般位于dao包

    MVC设计模式中的M层对应三层中的 业务逻辑层 、 数据访问层 和 实体类 。实体类不属于三层,但贯穿三层,从 表示层 到 数据访问层 都是以 实体类对象 作为参数传递

    案例

    一个简单的学生信息增删改查功能项目

    链接:https://pan.baidu.com/s/1ECmpg0bw-_6TKMXURKRV9g
    提取码:1hrd

    优化三层

    优化三层架构主要体现在两个方面

    1. 加入接口
      • 建议面向接口开发,先写接口,再写实现类
      • Service、dao加入接口
      • 接口与实现类的命名规范
        • 接口Interface:IXxxService、IXxxDao
        • 实现类Implements:XxxServiceImpl、XxxDaoImpl
      • 新建实现类对象时,推荐使用接口 对象名 = new 实现类()
    2. DBUtil
      • 通用的数据库帮助类,可以简化Dao层的代码量
      • 写在util包中
      • 方法重构:将多个方法的共同代码提炼出来,单独写在一个方法中

    视频链接

    项目链接:https://gitee.com/fxqos/StudentManagement.git

    package pers.gs.util;
    /**
     * DBUtil.java
     */
    
    import java.sql.*;
    
    public class DBUtil {
        private static final String URL = "jdbc:mysql://localhost:3306/stu_test?serverTimezone=GMT%2B8";
        private static final String USERNAME = "root";
        private static final String PWD = "123";
        public static Connection conn = null;
        public static PreparedStatement pstmt = null;
        public static ResultSet rs = null;
    
        /*
         *获取链接MySQL对象
         */
        public static Connection getConn() throws ClassNotFoundException, SQLException {
            //1.导入驱动程序,加载具体的驱动类
            Class.forName("com.mysql.cj.jdbc.Driver");
            //2.与数据库建立连接
            conn = DriverManager.getConnection(URL,USERNAME,PWD);
            return conn;
        }
    
        /*
         *操作PreparedStatement
         */
        public static PreparedStatement createPreparedStatement(String sql, Object[] objects) throws SQLException {
            pstmt = conn.prepareStatement(sql);
            if (objects != null){
                for (int i = 0; i < objects.length; i++){
                    pstmt.setObject(i+1,objects[i]);
                }
            }
            return pstmt;
        }
    
        /*
         *关闭连接
         * ResultSet、Statement、Connection
         */
        public static void closeAll(ResultSet rs, Statement statement,Connection conn) throws SQLException {
            if (rs != null) {
                rs.close();
            }
            if (statement != null) {
                statement.close();
            }
            if (conn != null) {
                conn.close();
            }
        }
        /*
         * 通用增删改
         */
        public static boolean executeUpdate(String sql, Object[] objects){
            try{
                //1~2.获取连接对象
                conn = getConn();
    
                //3.发送SQL语句,执行
                pstmt = createPreparedStatement(sql,objects);
    
                int count = pstmt.executeUpdate();//执行,返回受影响行数
    
                //4.处理结果
                if(count > 0) {
                    return true;
                }
                else{
                    return false;
                }
            }catch (ClassNotFoundException e) {
                e.printStackTrace();
                return false;
            }catch (SQLException e) {
                e.printStackTrace();
                return false;
            }catch (Exception e) {
                e.printStackTrace();
                return false;
            }finally {
                try {
                    closeAll(null,pstmt,conn);
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    
        /*
         * 通用查询
         */
        public static ResultSet executeQuery(String sql,Object[] objects){
            Connection conn = null;
            PreparedStatement pstmt = null;
            ResultSet rs = null;
            int result = -1;//记录返回几条数据
            try{
                //1~2.获取连接对象
                conn = getConn();
    
                //3.发送SQL语句,执行
                pstmt = createPreparedStatement(sql,objects);
    
                rs = pstmt.executeQuery();//执行
    
                return rs;
            }catch (ClassNotFoundException e) {
                e.printStackTrace();
                return null;
            }catch (SQLException e) {
                e.printStackTrace();
                return null;
            }catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }
    }
    
  • 相关阅读:
    bzoj1202 狡猾的商人
    bzoj1059 矩阵游戏
    bzoj1003 物流运输
    bzoj1601 灌水
    2017-10-25模拟赛
    洛谷—— P1051 谁拿了最多奖学金
    BZOJ——1611: [Usaco2008 Feb]Meteor Shower流星雨
    2017-10-23学大伟业Day1
    BZOJ——1610: [Usaco2008 Feb]Line连线游戏
    Vijos 包裹快递(二分)
  • 原文地址:https://www.cnblogs.com/fengxiaoqi/p/12846949.html
Copyright © 2020-2023  润新知