DAO设计模式简介

数据库实体类对应daoimpl,基础的增删改查。 数据库表名student,daoimpl类实现增删改查。 public class StudentDaoImpl extends BaseDao implements StudentDao { /** * 查询全部学生信息 */ @Override public List<Student> selectAll() { List<Student> list = new ArrayList<>(); // 获取basedao里面通用的返回结果集 阅读详情

DAO(Data Access Object,数据访问对象),主要的功能是用于进行数据操作的,在程序的标准开发框架中属于数据层的操作。

数据开发结构:


资源层是数据库的操作层,里面可以进行各种数据库的存储,但是这些数据存储的时候肯定是依靠SQL语句,数据层通过一个专门的数据库组件完成对数据库的操作

业务层是整个项目的核心


DAO组成

DatabaseConnection:专门负责数据库打开与关闭操作的类

VO:主要由属性,setter, getter方法组成,VO类中的属性与表中的字段相对应,每一个VO类的对象都表示表中的每一条记录;

DAO:主要定义操作的接口,定义一系列数据库的原子性操作,例如增删改查等;

Impl: DAO接口的真实实现类,主要完成具体数据库操作,但不负责数据库的打开和关闭;

Proxy:代理实现类,主要完成数据库的打开和关闭并且调用真实实现类对象的操作;

Factory: 工厂类,通过工厂类取得一个DAO的实例化对象。


对于包的命名:

在使用DAO时对包有严格的命名

  • 数据库连接: xxx.dbc.DatabaseConnection
  • DAO接口: xxx.dao.IXxxDAO
  • DAO接口真实实现类:xxx.dao.impl.XxxDAOImpl
  • DAO接口代理实现类:xxx.dao.proxy.XxxDAOProxy
  • VO类: xxx.vo.Xxx, VO命名要与表的命名一致
  • 工厂类:xxx.factory.DAOFactory.

用DAO重新写登陆页面:

所需要的文件:这里直接使用MVC模式开发,使用myeclipse 10。



数据库脚本:

/*=============删除数据库=============*/
DROP DATABASE IF EXISTS usr;
/*=============创建数据库=============*/
CREATE DATABASE usr;
/*=============使用数据库=============*/
USE usr;
/*=============删除数据库表===========*/
DROP TABLE IF EXISTS login;
/*=============创建数据库表===========*/
CREATE TABLE login(
	userid			VARCHAR(30)			PRIMARY KEY,
	name			VARCHAR(30)			NOT NULL,
	password		VARCHAR(32)			NOT NULL
);

INSERT INTO login(userid, name, password)VALUES('admin', 'admin', 'admin');

1.定义vo类,vo类定义了数据的属性,及相应的setter,getter方法。

定义User类 :User.java -------- package org.thystar.mvcdemo.vo.User.

/**
 * vo层
 */
package org.thystar.mvcdemo.vo;

/**
 * 
 * 定义用户类
 */
public class User {
	private String userid;       //用户ID
	private String name;		 //用户名
	private String password;	 //密码
	public String getUserid() {
		return userid;
	}
	public void setUserid(String userid) {
		this.userid = userid;
	}
	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;
	}
	
}

2. 定义数据库连接类,这个类只负责连接数据库:

定义DataBaseConnection类 DatabaseConnection.java ------------package org.thystar.mvcdemo.dbc.DatabaseConnection;

package org.thystar.mvcdemo.dbc;

import java.sql.*;
/**
 * 
 * 连接数据库
 *
 */
public class DatabaseConnection {
	// 定义数据库驱动程序
	private static final String DBDRIVER = "org.gjt.mm.mysql.Driver";  
	// 数据库连接地址
	private static final String DBURL = "jdbc:mysql://localhost:3306/usr";
	private static final String DBUSER = "root";            // 数据库连接用户名
	private static final String DBPASSWORD = "mysqladmin";  // 数据库连接密码
	
	private Connection conn = null;      //声明数据库连接对象
	public DatabaseConnection() throws Exception{     //构造函数
		try{
			Class.forName(DBDRIVER);   // 加载驱动程序
			this.conn = DriverManager.getConnection(DBURL, DBUSER, DBPASSWORD);  // 取得数据库连接
		}catch(Exception e){
			throw e;
		}
	}
	public Connection getConnection() { //取得数据库连接
		return this.conn;
	}
	public void close() throws Exception { // 关闭数据库操作
		if(this.conn != null){          // 避免NullPointerException
			try{
				this.conn.close();       // 关闭数据库
			}catch(Exception e){
				throw e;               // 抛出异常
			}
		}
	}	
}

3 . 定义数据库操作接口,定义数据库操作的方法:

定义IUserDAO接口,IUserDAO.java --------- package org.thystar.mvcdemo.dao.IUserDAO

package org.thystar.mvcdemo.dao;
// 在这个操作中要导入vo包。
import org.thystar.mvcdemo.vo.*;
/**
 * 
 * 数据库操作接口
 *
 */
public interface IUserDAO {
	/**
	 * 用户登录验证
	 * @param user 传入vo对象
	 * @return 验证操作结果
	 * @throws Exception
	 */
	public boolean findLogin(User user) throws Exception;
}

4. 定义DAO实现类,实现接口中定义的方法

定义UserDAOImpl类, UserDAOImpl.java ---------package org.thystar.mvcdemo.dao.impl.UserDAOImpl

package org.thystar.mvcdemo.dao.impl;

import java.sql.*;
import org.thystar.mvcdemo.dao.IUserDAO;
import org.thystar.mvcdemo.vo.User;
/**
 * 
 * DAO实现类,实现方法,但不负责数据库的具体连接
 *
 */
public class UserDAOImpl implements IUserDAO{
	private Connection conn = null;			//定义数据库的连接对象
	private PreparedStatement pstmt = null; //定义数据库操作对象
	public UserDAOImpl(Connection conn){    // 构造方法,设置数据库连接
		this.conn = conn;
	}
	/**
	 * 具体操作方法:查询
	 */
	public boolean findLogin(User user) throws Exception{
		boolean flag = false;                //定义标志位
		try{
			String sql = "SELECT name FROM login WHERE userid = ? AND password = ?";
			this.pstmt = this.conn.prepareStatement(sql);     // 实例化操作
			this.pstmt.setString(1, user.getUserid());        // 设置用户id
			this.pstmt.setString(2, user.getPassword());	  // 设置password
			ResultSet rs = this.pstmt.executeQuery();         // 取得查询结果
			if(rs.next()){
				user.setName(rs.getString(1));                //取得姓名
				flag = true;
			}
		}catch(Exception e){
			throw e;
		}
		return flag;
	}
}
可以看出,在真实的数据库的实现类中,没有处理数据库打开和关闭的操作,只是通过构造方法取得了数据库的连接,真正的负责打开和关闭的操作由代理类实现

5.代理(proxy)类实现:负责数据库的打开和关闭及调用真实实现类对象操作:

定义UserDAOProxy implements IUserDAO,UserDAOProxy.java ------------package org.thystar.mvcdemo.dao.proxy.UserDAOProxy

package org.thystar.mvcdemo.dao.proxy;
/**
 * 代理类,要找到真实主题
 */
import org.thystar.mvcdemo.dao.IUserDAO;
import org.thystar.mvcdemo.dbc.DatabaseConnection;
import org.thystar.mvcdemo.dao.impl.UserDAOImpl;
import org.thystar.mvcdemo.vo.User;

public class UserDAOProxy implements IUserDAO {
	private DatabaseConnection dbc = null;
	private IUserDAO dao = null;
	public UserDAOProxy() {       //构造方法,实例化连接,同时实例化dao对象
		try {
			this.dbc = new DatabaseConnection();    // 连接数据库
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		this.dao = new UserDAOImpl(this.dbc.getConnection());  //实例化真实主题类
	}
	public boolean findLogin(User user) throws Exception{  // 实现接口中的方法。
		boolean flag = false; //定义标志位
		try{
			flag = this.dao.findLogin(user);  // 调用真实主题
		}catch(Exception e){                  
			throw e;                           //向上抛出异常
		}finally{
			this.dbc.close();
		}
		return flag; //返回标记
	}
	
}

6. 工厂类的实现: 取得DAO实例

定义DAOFactory类, DAOFactory.java --------------package org.thystar.mvcdemo.factory.DAOFactory

package org.thystar.mvcdemo.factory;

import org.thystar.mvcdemo.dao.IUserDAO;
import org.thystar.mvcdemo.dao.proxy.UserDAOProxy;
/**
 * 
 * 工长类
 *
 */
public class DAOFactory {
	public static IUserDAO getIUserDAOInstance(){      // 取得DAO实例
		return new UserDAOProxy();       // 返回代理实例
	}
}
工厂类的功能就是直接返回DAO接口的实例化对象,以后客户端直接通过工厂类就可以取得DAO接口的实例化对象

到这里,数据层的部分就完成了,下面开始定义Servlet/jsp部分,也就是显示层,进行页面的显示

7 .定义Servlet:

LoginServlet.java

/**
 * 定义Servlet
 */
package org.thystar.mvcdemo.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.thystar.mvcdemo.factory.DAOFactory;
import org.thystar.mvcdemo.vo.User;

public class LoginServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

	/**
	 * The doGet method of the servlet. <br>
	 *
	 * This method is called when a form has its tag value method equals to get.
	 * 
	 * @param request the request send by the client to the server
	 * @param response the response send by the server to the client
	 * @throws ServletException if an error occurred
	 * @throws IOException if an error occurred
	 */
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		String path = "login.jsp";           
		String userid = request.getParameter("userid"); //接收userid的内容
		String userpass = request.getParameter("userpass"); //接收userpass的内容
		List<String> info = new ArrayList<String>();   // 保存返回信息
		//判断输入为空的情况
		if(userid == null || "".equals(userid)){    
			info.add("用户id不能为空");
		}
		if(userpass == null || "".equals(userpass)){
			info.add("密码不能为空");
		}
		//用户名密码验证通过
		if(info.size() == 0){
			User user = new User();      //实例化vo
			user.setUserid(userid);      //设置userid
			user.setPassword(userpass);  //设置userpass
			try {
				if(DAOFactory.getIUserDAOInstance().findLogin(user)){ //验证通过
					info.add("通过验证" + user.getName() + "已登录");
				}else{
					info.add("登录失败");
				}
			} catch (Exception e) {
				// TODO: handle exception
				e.printStackTrace();
			}	
		}
		request.setAttribute("info", info);   
		request.getRequestDispatcher(path).forward(request, response); //跳转
	}

	/**
	 * The doPost method of the servlet. <br>
	 *
	 * This method is called when a form has its tag value method equals to post.
	 * 
	 * @param request the request send by the client to the server
	 * @param response the response send by the server to the client
	 * @throws ServletException if an error occurred
	 * @throws IOException if an error occurred
	 */
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		this.doGet(request, response);  // 调用doGet操作
	}

}

8. 登陆页 

login.jsp

<%@ page contentType = "text/html" pageEncoding="GBK" import = "java.util.*"%>

<html>
  <head>
    
    <title>www.thystar.com</title>
    <script language = "JavaScript">
    
    	function validate(f){
    		if(!(/^\w{1,15}$/.test(f.userid.value))){
    			alert("用户ID必须是1~15位");
    			f.userid.focus();
    			return false;
    		}
    		if(!(/^\w{1,15}$/.test(f.userpass.value))){
    			alert("密码必须是1~15位");
    			f.userpass.focus();
    			return false;
    		}
    		return true;
    	}
    </script>

  </head>
  
  <body>
    <h2>用户登录</h2>
     <%
    	request.setCharacterEncoding("GBK");
     %>
     <%
     	List<String> info=(List<String>)request.getAttribute("info");
     	if(info != null){
     		Iterator<String> iter = info.iterator();
     		while(iter.hasNext()){
     %>
     			<h4><%= iter.next() %></h4>
     <%
     		}
     	}
     %>
     <form action="LoginServlet" method="post" onSubmit = "validate(this)">
     
     	用户ID: <input type = "text" name = "userid"><br>
     	密  码:<input type = "password" name="userpass"><br>
     	<input type = "submit" value = "登录">
     	<input type = "reset" value = "重置">
     </form>
  </body>
</html>

结果:


《Java Web开发实战经典--基础篇》学习笔记

什么是 DAO 简介 DAO(Decentralized Autonomous Organization,去中心化自治组织) 是与全世界志同道合的人合作的一种有效且安全的方式[1]。 把它们想像成一个其成员共同拥有和管理的本地互联网企业。它们有自己的金库,没有组织的允许没有任何人有权限访问金库。每个决策都由提案和投票来决定,确保组织中的每个人都有发言权。 没有随意支配开销的 CEO,也没有随意篡改账本的 CFO。所有都是公开的,开销的规则都通过其代码记录在 DAO 中。 使用 DAO,无需信任组织中的任何人,只需信任 DA 阅读详情

相关推荐

scratch航天梦主题课程作品分享,包含ppt、素材包

而今年多国都将发射探测器尝试登陆月球,2023年或将称为“登月年”,请大家发挥创新思维,以“星辰大海”为创作主题,搜集相关信息 、展开联想,为实现升空 、探测 、取样贡献创意!即使去淘宝买的素材,也要从百度网盘,但素材太多大了或者太多文件,也要充值百度网盘超级会员才能保存,提高下载速度。同学们大家好,今天我们就要开始航天主题-嫦娥五号探月工程系列的编程课程了,不仅可以学习到很多航天知识,了解本次嫦娥五号的发射历程,还能让我们用编程遨游太空呢。即使下载了,也要上传,不是特别方便,尤其是不好查找。

少儿编程吕口口 2481

java包名有impl啥意思_java 包 dao 和 dao.impl 问题

dao中存在是接口(interface)dao.impl中存在的是接口的具体实现(class)至于好处,去查查接口的定义。更新。。。。举个例子dao中有public interface UserDAO {public List getUser();}dao.imple中public class JdbcUserDao implements UserDAO{@Overridepublic List ...

weixin_39777543的博客 2290

微信小游戏CE修改实战:从入门到精通(附防作弊思路)

本文深入探讨微信小游戏的安全攻防实战,重点分析CE修改、反编译和重打包等安全风险。通过详细的内存修改案例和代码保护方案对比,提供从客户端到服务端的全方位防护策略,帮助开发者构建有效的防作弊体系。

m2n3b4v5c6的博客 1138

JavaWeb课程复习资料(六)——DAO与DAOImpl层封装

承接上文:JavaWeb课程复习资料(五)——配置Tomcat 1、DAO层 DAO层是接口层,故而需要使用【interface】修饰 源码如下: package com.item.dao; import com.item.pojo.UserInfo; import java.util.List; public interface UserInfoDAO { /** * 查询所有用户信息 * @return */ public List&lt

红目香薰 3769

零基础玩转NILM:用nilmtk提取UKDALE电器数据的保姆级教程

本文为零基础用户提供了一份详细的NILM入门指南,重点讲解如何使用nilmtk工具包从UKDALE数据集中提取电器级用电数据。教程涵盖环境搭建、核心概念解析、数据提取实战及常见问题排查,帮助读者快速掌握非侵入式负荷监测的数据预处理关键步骤。

rgv234567的博客 498

Blender.粒子效果

Blender.粒子效果 ✦ shift+A新建一个棱角球,细分(之后要分解成许多小颗粒) ✦ 给球添加粒子系统,这时播放粒子会向下掉,力场权重☛重力☛0后,粒子会在球体周围运动 ✦ shift+A添加一个力场,调整力场强度 ✦如果粒子运动太快,我们可以在输出属性中调整时间重映射的原始值 ✦想让粒子在球周围运动而不是发散出去,在物理属性找到力场设置,调整流的大小 ✦S键将球形缩小到看不见 ✦给粒子变添加立方体的形状,在粒子属性里找到渲染选项,将“光晕”改为“物体”,在实例物体中选择新建的立方

weixin_46385629的博客 6668

Dao层Impl

Dao层Impl详细说明

weixin_55245556的博客 932

centos7下安装gcc-10.3.0

生成多个系统版本的代码,如果你的操作系统是32位,默认就已经设置为 disable,这时gcc仅能生成32位的可执行程序;这里只开启了c,c++ 和fortran,因为支持的语言越多,就需要安装越多的相应静态与动态库,还有五花八门的依赖库,这会让管理变得困难,体积也会变得庞大。启用posix标准的线程支持,这个设置取决于宿主或目标操作系统的类型,其它可用值有:aix,dec,solaris,win32等,如果你是其它的类UNIX系统,就需要设置相应的值。指定安装路径,这里没有指定,就直接放到文件夹里就好。

lxystar2003的博客 1189

JavaBean----DAO设计模式简介

DAO设计模式 DAO(数据库操作对象)设计模式是JavaEE数据层的操作。 之前使用JDBC操作数据库,都是直接在JSP页面中写JDBC代码。这样导致JSP页面中包含大量的HTML代码和Java代码,显示和功能代码混在一起,难以维护。这样的设计是非常不合理的,JSP只应关注数据的显示,而不需要去关注数据是从哪里来的。 使用Data Access Object(DAO)设计模式可以很

Joywy的专栏 3084

蓝牙学习笔记之HCI协议(一)

目录 协议浅述 HCI简介 HCI协议数据格式 HCI Command Packet HCI ACL Data Packet HCI Synchronous(SCO) Data Packet HCI Event Packet HCI命令和事件介绍 Inquiry command Write Local Name Command Read BD_ADDR Command H...

在云巅的博客 2万+

【Mode】多模干涉仪的设计 Multi-mode interferometer(MMI)

与 Splitter 器件一样,MMI 器件也是一种常见的分光器件,可以根据用户的需求将光束分成不同的比例。本文,我们将介绍如何仿真 MMI 器件。这里我们使用的是 1x2 MMI,其本质上是由四个部分组成的,中间的矩形多模式干涉区域以及左右两侧的三个 taper 模式转换区域。之前的教程中我们也提及了,为了获取稳定的模式场分布,通常,我们需要进行模式收敛性扫描。这里以官网给出的案例为例。如何提取 S 参数我们先暂时不做介绍,后续有时间了我们再做介绍。

u011699626的博客 1212

J2EE之DAO设计模式简介与实例

在JAVA编程的时候, 有时候看起来非常直接的实现却非要用设计模式转若干个弯去实现他, 这似乎显的很多余,但是采用一些成熟的设计模式,会使程序更加的健壮,松耦合以及好维护和扩展.  DAO 设计模式 背景: 根据数据源的不同,访问数据的方法也会有所不同,访问持久化的数据源,比如数据库,也会由于其存储类型的不同(关系数据库,面向对象的数据库,简单文件储存,其他方式)和提供商自定义数据类型的不同

Dancen的专栏 2814

译码器Multisim电路仿真汇总——硬件工程师笔记

本文详细介绍了74LS139D和74LS138D两种TTL译码器的功能特点及应用。74LS139D是2线-4线译码器,具有低电平有效输出和使能控制功能,常用于地址译码和数据分配。74LS138D是3线-8线译码器,通过3位输入实现8路输出控制,广泛应用于微处理器系统。文中提供了两种芯片的引脚说明、真值表和典型应用电路,并附有硬件工程师笔试面试相关资源链接。这些基础知识对数字电路设计和硬件工程师面试准备具有重要参考价值。

XU157303764的博客 1260

JavaBean在DAO设计模式简介

一、信息系统开发框架 客户层-------显示层-------业务层---------数据层---------数据库 1.客户层:客户层是client,简单的来说就是浏览器。 2.显示层:JSP/Servlet,用于给浏览器显示。 3.业务层:对于数据层的原子操作进行整合。 4.数据层:对于数据库进行的原子操作,添加、删除等; 二、DAO(Data Ac...

weixin_34055787的博客 74

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

JavaBean中DAO设计模式简介

一、信息系统的开发架构 客户层-------显示层-------业务层---------数据层---------数据库 1.客户层:客户层就是客户端,简单的来说就是浏览器。 2.显示层:JSP/Servlet,用于给浏览器显示。 3.业务层:对于数据层的原子操作进行整合。 4.数据层:对于数据库进行的原子操作,增加、删除等; 二、DAO(Data Access Obje...

weixin_30653097的博客 77

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

18:JavaBean简介及其在表单处理与DAO设计模式中的应用-Java Web

18:JavaBean简介及其在表单处理与DAO设计模式中的应用-Java Web

Yeats_Liao的博客 1811

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Java Web开发中MVC设计模式简介以及DAO层、Service层和Controller层的区别

一、有关Java Web与MVC设计模式 学习过基本Java Web开发的人都已经了解了如何编写基本的Servlet,如何编写jsp及如何更新浏览器中显示的内容。但是我们之前自己编写的应用一般存在无条理性,对于一个小型的网站这样的编写没有任何问题,但是一但我们需要编写大型的web工程的话,我们现有的编写模式会造成web应用的可扩展性较差,而且一但出现问题不能准确的定位出问题出在哪里。 Java是...

codemaster1024的博客 3986

DAO设计模式

DAO设计模式: 1、DAO简介:       DAO设计模式是属于J2EE数据层的操作,使用DAO设计模式可以简化大量代码,增强程序的可移植性。   2、DAO各部分详解: DAO设计模式包括以下5个主要部分: (1)、数据库连接类;       数据库连接类的主要功能是连接数据库并获得连接对象,以及关闭数据库。通过数据库连接类可以大大的简化开发,在需要进行数据库连接时,只需常见该

lzm18064126848的专栏 555

JavaWeb-DAO设计模式

DAO设计模式、1.认识DAO、2.DAO各部分的详解、3.DAO设计模式流程、4.具体案例

Alphamilk的博客 2189

dao设计模式_DAO设计模式

dao设计模式DAO stands for Data Access Object. DAO Design Pattern is used to separate the data persistence logic in a separate layer. This way, the service remains completely in dark about how the low-leve...

从零开始的教程世界 989

DAO和MVC设计模式

DAO设计模式 DAO设计模式是属于J2EE数据层的操作,使用DAO设计模式可以简化大量代码,增强程序的可移植性。 主要包括五方面: 数据库连接类 大体连接类是相似的,可移植,仅需改变mysql版本号,数据库名及用户信息。 public interface DatabaseConnection { //获取数据库的连接 public Connection getConnection() throws Exception; //断开连接 public void close

George__P的博客 2626

J2EE:DAO设计模式

DAO设计模式 DAO设计模式: 1、DAO简介:       DAO设计模式是属于J2EE数据层的操作,使用DAO设计模式可以简化大量代码,增强程序的可移植性。   2、DAO各部分详解: DAO设计模式包括以下5个主要部分: (1)、数据库连接类;       数据库连接类的主要功能是连接数据库并获得连接对象,以及关闭数据库。通过数据库连接类可以大大的简化开发,

kingmicrosoft的专栏 1342
上一篇: 简单易学的机器学习算法——lasso
下一篇: ch8.文件上传
thystar
博客等级 码龄17年 407粉丝 151原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值