前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >浅谈DAO设计模式(示例)

浅谈DAO设计模式(示例)

作者头像
唔仄lo咚锵
发布2020-09-15 14:29:21
1K0
发布2020-09-15 14:29:21
举报

目录

  • 什么是DAO?
  • DAO模式组成
    • DatabaseConnection
    • VO
    • DAO
    • Impl
    • Factory
  • 示例
    • cn.wzl.dao.ConnectionManager:连接数据库(MySql)
    • cn.wzl.vo.Person:Person值类
    • cn.wzl.dao.IPersonDAO:实现对Person表的操作接口
    • cn.wzl.dao.impl.PersonDAOImpl:Person表操作实例化
    • cn.wzl.factory.DAOFactory:工厂类
    • 前端调用代码片段
  • 小结

什么是DAO?


DAO(Data Access Object)数据访问接口。废话不多说(官方定义什么的写了也没人看?),其实就是一种数据设计范化模式,打个比方,我们写的第一个java程序可能把主函数,方法,变量定义等全部写在一个.java文件中,在后续的规范学习中才拆分成不同的包,类等,测试类主函数相应调用即可。同样的,所有JDBC代码都写在JSP页面之中,维护困难,JSP应该只关注于数据的显示,而不关心数据从哪里来,或向哪里存储。 JavaEE的组件层次: 客户端–>表示层–>业务层–>数据层–>数据库 DAO属于JavaEE数据层的操作。即:在DAO中封装了一个数据库中的表在一个项目中所应具有的全部操作。

DAO模式组成


  • DatabaseConnection 数据库连接:专门负责数据库的打开与关闭操作的类 命名规范:xxx.dbc.ConnectionManager
  • VO 值类:主要由属性、setter、getter方法组成,VO类中的属性与表中的字段相对应,每一个VO类的对象都表示表中的每一条记录 命名规范:xxx.vo.Xxx(与数据库的表名一致)
  • DAO DAO接口:主要定义操作的接口,定义一系列数据库的原子操作,如增加、修改、删除、按ID查询等 命名规范:xxx.dao.XxxDAO
  • Impl DAO接口真实实现类:DAO接口的真实实现类,完成具体的数据库操作,但是不负责数据库的打开和关闭 命名规范:xxx.dao.impl.XxxDAOImpl
  • Factory 工厂类:通过工厂类取得一个DAO的实例化对象,有了工厂类,前端代码不必知道具体的子类名字,只需要统一使用实例的各个操作 命名规范:xxx.factory.XxxDAOFactory

示例


在这里插入图片描述
在这里插入图片描述

cn.wzl.dao.ConnectionManager:连接数据库(MySql)

代码语言:javascript
复制
package cn.wzl.dbc;
import java.sql.*;
public class ConnectionManager {
	private static final String DRIVER_CLASS = "com.mysql.cj.jdbc.Driver";
	private static final String DATABASE_URL = "jdbc:mysql://localhost:3306/test? useUnicode=true & characterEncoding=utf-8 & rewriteBatchedStatements=true & useSSL=false & serverTimezone=UTC & allowPublicKeyRetrieval=true";
	private static final String DATABASE_USRE = "root";
	private static final String DATABASE_PASSWORD = "******";//密码
	/** 返回连接 */
	public static Connection getConnection() {
		Connection dbConnection = null;
		try {
			Class.forName(DRIVER_CLASS);
			dbConnection = DriverManager.getConnection(DATABASE_URL,
					DATABASE_USRE, DATABASE_PASSWORD);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return dbConnection;
	}
	/** 关闭连接*/
	public static void closeConnection(Connection dbConnection) {
		try {
			if (dbConnection != null && (!dbConnection.isClosed())) {
				dbConnection.close();
			}
		} catch (SQLException sqlEx) {
			sqlEx.printStackTrace();
		}
	}
	/**关闭结果集*/
	public static void closeResultSet(ResultSet res) {
		try {
			if (res != null) {
				res.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	/** 关闭语句*/
	public static void closeStatement(PreparedStatement pStatement) {
		try {
			if (pStatement != null) {
				pStatement.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	public static void closeStatement(Statement statement) {
		try {
			if (statement != null) {
				statement.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

cn.wzl.vo.Person:Person值类

代码语言:javascript
复制
package cn.wzl.vo;
public class Person {
     private String id;
     private String name;
     private String password;
	public Person(String id, String name, String password) {
		super();
		this.id = id;
		this.name = name;
		this.password = password;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	@Override
	public String toString() {
		return "Person [id=" + id + ", name=" + name + ", password=" + password + "]";
	}
}

cn.wzl.dao.IPersonDAO:实现对Person表的操作接口

代码语言:javascript
复制
package cn.wzl.dao;
import java.util.List;
import cn.wzl.vo.Person;
public interface IPersonDAO {
	//插入
	public boolean doInsert(Person per) throws Exception;
	//修改
	public boolean doUpdate(Person per)throws Exception;
	//获取所有用户
	public List<Person> doQuery() throws Exception;
    //通过id查找
	public Person doQueryById(String id) throws Exception;
}

cn.wzl.dao.impl.PersonDAOImpl:Person表操作实例化

代码语言:javascript
复制
package cn.wzl.dao.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import cn.wzl.dao.IPersonDAO;
import cn.wzl.dbc.ConnectionManager;
import cn.wzl.vo.Person;
public class PersonDAOImpl implements IPersonDAO {
	//插入用户记录
	@Override
	public boolean doInsert(Person per) throws Exception {
		   boolean flag=false;
		   String sql="insert into person(id,name,password) values(?,?,?)";
	       Connection conn=null;
		   PreparedStatement pstmt=null;
		   try{
			   conn=ConnectionManager.getConnection();
		       pstmt=conn.prepareStatement(sql);
		       pstmt.setString(1,per.getId());
		       pstmt.setString(2,per.getName());
		       pstmt.setString(3,per.getPassword());
		       if(pstmt.executeUpdate()>0){
			   flag=true;
		       }
		   }catch(Exception e){
			   System.out.println(e);
		   }finally{
				ConnectionManager.closeStatement(pstmt);
				ConnectionManager.closeConnection(conn);
		   }
		  return flag;
	}
	//修改用户记录
	@Override
	public boolean doUpdate(Person per) throws Exception {
		   boolean flag=false;
		   String sql="update person set name=?,password=? where id=?";
		   Connection conn=null;
		   PreparedStatement pstmt=null;
		   try{
			conn=ConnectionManager.getConnection();
		    pstmt=conn.prepareStatement(sql);
		    pstmt.setString(1,per.getName());
		    pstmt.setString(2,per.getPassword());
		    pstmt.setString(3,per.getId());
		   if(pstmt.executeUpdate()>0){
			   flag=true;
		   }
		   }catch(Exception e){
			   System.out.println(e);
		   }finally{
		   ConnectionManager.closeStatement(pstmt);
		   ConnectionManager.closeConnection(conn);
		   }
		  return flag;
	}
	//查询所有用户
	@Override
	public List<Person> doQuery() throws Exception{
		  List<Person> person = new ArrayList<Person>();
		    Connection con = null;
			PreparedStatement pstms = null;
			ResultSet res = null;
			try {
				con = ConnectionManager.getConnection();// 创建连接
				String sql = "select * from person";
				pstms = con.prepareStatement(sql);// 创建预处理语句总管
				res = pstms.executeQuery();// 语句总管执行查询
				while (res.next()) {
					String id = res.getString(1);
					String name = res.getString(2);
					String password = res.getString(3);
	                Person per = new Person(id,name,password);
					person.add(per);
				}
			} catch (SQLException e) {
				e.printStackTrace();
			} finally {
				ConnectionManager.closeResultSet(res);// 5.关闭结果集 对象、语句总管、连接
				ConnectionManager.closeStatement(pstms);
				ConnectionManager.closeConnection(con);
			}
		  return person;
	}
	@Override
	public Person doQueryById(String id) throws Exception{
		Person person = null;
		Connection con = null;
		PreparedStatement pstms = null;
		ResultSet res = null;
		try {
			con = ConnectionManager.getConnection(); // 创建连接
			String sql = "select * from person where id=?";
			pstms = con.prepareStatement(sql); // 创建预处理语句总管
			pstms.setString(1, id);
			res = pstms.executeQuery(); // 语句总管执行SQL语句
			if (res.next()) {
				String name = res.getString(2);
				String password = res.getString(3);
				person = new Person(id,name,password);
			}
		} catch (SQLException sqlE) {
			sqlE.printStackTrace();
		} finally {
			ConnectionManager.closeResultSet(res);// 关闭结果集 对象、语句总管、连接
			ConnectionManager.closeStatement(pstms);
			ConnectionManager.closeConnection(con);
		}
		return person;
	}
}

cn.wzl.factory.DAOFactory:工厂类

代码语言:javascript
复制
package cn.wzl.factory;
import cn.wzl.dao.IMessageDAO;
import cn.wzl.dao.IPersonDAO;
import cn.wzl.dao.IRevertDAO;
import cn.wzl.dao.impl.MessageDAOImpl;
import cn.wzl.dao.impl.PersonDAOImpl;
import cn.wzl.dao.impl.RevertDAOImpl;
public class DAOFactory {
     public static IPersonDAO getPersonDAOInstance(){
    	  return new PersonDAOImpl();
     }
     public static IMessageDAO getMessageDAOInstance(){	 
    	 return new MessageDAOImpl();
     }
     public static IRevertDAO getRevertDAOInstance(){
    	 return new RevertDAOImpl();
     }
}

前端调用代码片段

代码语言:javascript
复制
<%
		request.setCharacterEncoding("utf-8");
		String id =request.getParameter("id");
		String password =request.getParameter("password");
		Person person =DAOFactory.getPersonDAOInstance().doQueryById(id);
%>

小结


优点:前台显示与后台逻辑操作分离 ,JSP页面的功能就是将DAO返回的结果进行输出。

原创不易,请勿转载本不富裕的访问量雪上加霜 ) 博主首页:https://blog.csdn.net/qq_45034708

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-04-23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 目录
  • 什么是DAO?
  • DAO模式组成
  • 示例
    • cn.wzl.dao.ConnectionManager:连接数据库(MySql)
      • cn.wzl.vo.Person:Person值类
        • cn.wzl.dao.IPersonDAO:实现对Person表的操作接口
          • cn.wzl.dao.impl.PersonDAOImpl:Person表操作实例化
            • cn.wzl.factory.DAOFactory:工厂类
              • 前端调用代码片段
              • 小结
              相关产品与服务
              数据库
              云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档