三层架构学习笔记及数据库帮助类通用代码

本文介绍了三层架构的概念,包括视觉层、业务逻辑层和数据库访问层,并讨论了三层架构与MVC设计模式的区别。同时,文章提到了通过加入接口来优化三层架构的方法以及命名规范。此外,还分享了一个在实现查询所有学生时遇到的空指针错误的案例,问题出在遍历结果集的条件写错上。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、三层架构与MVC设计模式的目标一致:都只为了解耦合,提高代码复用; 区别:二者对项目的的理解不同
2、三层组成:a、视觉层:前台:对应MVC中的View,用于和用户交互、界面的显示;后台:对应MVC中的Controller,用于控制跳转,业务逻辑层Servlet);
b、业务逻辑层:接收表示层的请求,调用,组装数据访问层逻辑性的操作(增删改查:增加(先查询+再增加))
c、数据库访问层:直接访问数据库的操作,原子性的增删改查

三层优化1、加入接口:面向接口,先接口再实现类 主要针对service、dao
*命名规范
接口: I xxxService XXX为实体类名 例如我做的学生信息三层架构中为IStudentService
IxxxDao 如:IStudentDao
service接口一般存放在xxx.service包中 dao接口一般存放在xxx.dao接口中
实现类:xxxServiceImpl 如:StudentServiceImpl xxxDaoImpl 如:StudentDaoImpl
实现类也放在特定的包中: xxx.service.impl xxx.dao.impl

使用方法:接口 X=new 实现类()

2、DBUtil:数据库帮助类,可以简化Dao层代码 一般建议写下xxx.util包里

public class DBUtil {
	
	//所要连接的数据库的信息
	private final static String URL="jdbc:mysql://localhost:3306/userinfo?serverTimezone=GMT%2B8";
	private final static String USERNAME="root";
	private final static String PWD="843878";
	
	//图稿代码复用
	 public static Connection connection=null;
	 public static PreparedStatement pstmt=null;
	 public static ResultSet rs=null; 
	
	 //获取连接对象  增删改查都需要建立与数据库的连接 所以把这一部分封装成一个方法
	 public static Connection  getconnection(){
			try {
				 //1.加载具体的驱动类
				Class.forName("com.mysql.cj.jdbc.Driver");
				//2.与数据库建立连接
				return DriverManager.getConnection(URL,USERNAME,PWD);
			} catch (ClassNotFoundException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
				return null;
			}catch (SQLException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
				return null;
			}
			 
	 }
	 //获取PreparedStatement
	 public static PreparedStatement createPreparedStatement(String sql,Object[] params) {
		 
		  try {
			pstmt=getconnection().prepareStatement(sql);
			//避免空指针
			if(params!=null) {
				//参数设置 ?的个数 ?的实际赋值
				for(int i=0;i<params.length;i++) {
					pstmt.setObject(i+1,params[i]);
				}
			}
			return pstmt;
		} catch (SQLException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
			return null;
		}
		     
		
		 
	 }
	 
	 //关闭数据流
	 public static void CloseAll(ResultSet rs,Statement stmt,Connection connection) {
		 try {
			 if(rs!=null) rs.close();
			 if(stmt!=null) stmt.close();
			 if(connection!=null) connection.close(); 
		 }catch (SQLException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}
	 }
	 //增、删、改操作
   public static boolean executeUpdate(String sql,Object[] params) {
	    
	   pstmt=createPreparedStatement(sql,params);
	   int count;
	try {
		count = pstmt.executeUpdate();
		if(count>0) 
	    	  return true;
	      else
	    	  return false;
	} catch (SQLException e) {
		// TODO 自动生成的 catch 块
		e.printStackTrace();
		return false;
	}finally {
		//关闭数据流
       CloseAll(null,pstmt,connection);
       
      }
     }
      //通用的查询操作
      public static ResultSet executeQuery(String sql,Object[] params) {
	     //这就是上面createPreparedStatement方法封装的部分
    	 /* try {
			 //1.加载具体的驱动类
			Class.forName("com.mysql.cj.jdbc.Driver");
			 //2.与数据库建立连接
			connection=DriverManager.getConnection(URL,USERNAME,PWD);
			
		    pstmt=connection.prepareStatement(sql);
		     //参数设置
		if(params!=null) {
		
			for(int i=0;i<params.length;i++) {
				pstmt.setObject(i+1,params[i]);
			}
		}
		*/
    	  
    pstmt=createPreparedStatement(sql,params);
	try {
	//通用的查询 只返回一个结果、
		return	rs=pstmt.executeQuery();
	} catch (SQLException e) {
		// TODO 自动生成的 catch 块
		e.printStackTrace();
		return null;
		//后面具体的查询方法还需要用到rs 所以此处最后不能关闭数据流
	}
   }    
}

``三层架构中遇到的BUG
查询全部学生的过程中,一直报空指针
最后竟然是我把遍历结果集的条件写错 while(rs.next())写成while(rs!=null)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值