三层架构
与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
优化三层
优化三层架构主要体现在两个方面
- 加入接口
- 建议面向接口开发,先写接口,再写实现类
- Service、dao加入接口
- 接口与实现类的命名规范
- 接口Interface:IXxxService、IXxxDao
- 实现类Implements:XxxServiceImpl、XxxDaoImpl
- 新建实现类对象时,推荐使用
接口 对象名 = new 实现类()
- DBUtil
- 通用的数据库帮助类,可以简化Dao层的代码量
- 写在util包中
- 方法重构:将多个方法的共同代码提炼出来,单独写在一个方法中
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;
}
}
}