DAO设计模式

DAO的设计模式 在我们做J2EE应用,或者其他的Java web 项目,基于SSH的MVC设计,我们都会提到DAO这个概念,那么DAO到底是什么?他能做什么?他是怎么实现的?下面我们就围绕这三个方面来了解一下DAO。1.什么是DAO DAO:数据访问接口(Data Access Object)。顾名思义就是与数据库打交道。夹在业务逻辑与数据库资源中间。(百度百科) 他是一个面向对象的数据库 阅读详情

1. DAO简介

DAO的全称是:Data Access Object,数据访问对象。使用DAO设计模式来封装数据库持久层所有操作(CRUD) ,使低级的数据逻辑和高级的业务分离,达到解耦合的目的。

一个典型的DAO实现有如下的组件:

1)一个DAO接口

2)一个实现了DAO的具体实现类

3)一个DAO工厂类

4)数据传输对象(有时称为值对象)


以维护一个客户信息为例,具体的组件如下:

CustomerDao接口

CustomerDaoImpl(接口的具体实现类)

CustomerFactory(工厂类,实例化用)

Customer值对象(VO)

2. DAO实例

2.1 用户登录、注册

功能:用户登录、用户注册、检查用户唯一性。

UserDao.java

package com.amaker.dao;

import com.amaker.bean.User;

public interface UserDao {

	// login
	public User login(String username, String password);

	// register
	public void register(User u);

	// check
	public boolean check(String username);
}


UserDaoImpl.java

package com.amaker.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import com.amaker.bean.User;
import com.amaker.dao.UserDao;
import com.amaker.util.DBUtil;

public class UserDaoImpl implements UserDao {

	@Override
	public User login(String username, String password) {
		String sql = "select id,username,password from UserTable where username=? and password=?";
		DBUtil util = new DBUtil();
		Connection conn = util.openConnection();
		try {
			PreparedStatement pstmt = conn.prepareStatement(sql);

			pstmt.setString(1, username);
			pstmt.setString(2, password);

			ResultSet rs = pstmt.executeQuery();
			if (rs.next()) {
				int id = rs.getInt(1);

				User user = new User();
				user.setId(id);
				user.setUsername(username);
				user.setPassword(password);
				return user;
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}

	@Override
	public void register(User u) {
		String sql = "insert into UserTable (id,username,password) values (?,?,?)";
		DBUtil util = new DBUtil();
		Connection conn = util.openConnection();
		try {
			PreparedStatement pstmt = conn.prepareStatement(sql);

			pstmt.setInt(1, u.getId());
			pstmt.setString(2, u.getUsername());
			pstmt.setString(3, u.getPassword());

			pstmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			util.closeConnection(conn);
		}
	}

	@Override
	public boolean check(String username) {
		String sql = "select id,username,password from UserTable where username=?";
		DBUtil util = new DBUtil();
		Connection conn = util.openConnection();
		try {
			PreparedStatement pstmt = conn.prepareStatement(sql);

			pstmt.setString(1, username);

			ResultSet rs = pstmt.executeQuery();
			if (rs.next()) {
				return true;
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return false;
	}

}


User.java

package com.amaker.bean;

public class User {

	private int id;
	private String username;
	private String password;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

}

测试类:

package com.amaker.test;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.amaker.bean.User;
import com.amaker.dao.UserDao;
import com.amaker.dao.impl.UserDaoImpl;

public class UserDaoImplTest {
	UserDao dao = null;

	@Before
	public void setUp() throws Exception {
		dao = new UserDaoImpl();
	}

	@After
	public void tearDown() throws Exception {

	}

	@Test
	public void testRegister() {
		User u = new User();
		u.setId(1);
		u.setUsername("tom");
		u.setPassword("123");

		dao.register(u);
	}

	@Test
	public void testCheck() {
		boolean b = dao.check("tom");
		System.out.println(b);
	}

	@Test
	public void testLogin() {
		User u = dao.login("tom", "123");
		System.out.println(u.getUsername());
	}

}

测试结果:


2.2 订餐系统后台

功能:添加订餐信息、查询订餐信息。

创建MealTypeTbl表:

mysql> create table MealTypeTbl(id int,name varchar(20),price int);
Query OK, 0 rows affected (0.01 sec)

mysql> insert into MealTypeTbl (id,name,price) values (1,"big",10);
Query OK, 1 row affected (0.00 sec)

mysql> insert into MealTypeTbl (id,name,price) values (2,"small",8);
Query OK, 1 row affected (0.00 sec)

mysql> select * from MealTypeTbl;
+------+-------+-------+
| id   | name  | price |
+------+-------+-------+
|    1 | big   |    10 |
|    2 | small |     8 |
+------+-------+-------+
2 rows in set (0.00 sec)

创建MealTbl表:


mysql> desc MealTbl;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| id         | int(11)     | YES  |     | NULL    |       |
| createTime | varchar(20) | YES  |     | NULL    |       |
| UserID     | int(11)     | YES  |     | NULL    |       |
| MealTypeID | int(11)     | YES  |     | NULL    |       |
| num        | int(11)     | YES  |     | NULL    |       |
| comment    | varchar(20) | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)

mysql> select * from MealTbl;
+------+------------+--------+------------+------+---------+
| id   | createTime | UserID | MealTypeID | num  | comment |
+------+------------+--------+------------+------+---------+
|    1 | 2016-2-18  |      2 |          1 |    2 | 0k      |
+------+------------+--------+------------+------+---------+
1 row in set (0.00 sec)

MealDao.java

package com.amaker.dao;

import java.util.List;

import com.amaker.bean.Meal;
import com.amaker.bean.MealBean;

public interface MealDao {

	// add
	public void add(Meal meal);
	
	// query
	public List<MealBean> list();

}

MealDaoImpl.java

package com.amaker.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import com.amaker.bean.Meal;
import com.amaker.bean.MealBean;
import com.amaker.dao.MealDao;
import com.amaker.util.DBUtil;

public class MealDaoImpl implements MealDao {

	@Override
	public void add(Meal meal) {
		DBUtil util = new DBUtil();
		Connection conn = util.openConnection();
		String sql = "insert into MealTbl (id,createTime,UserID,MealTypeID,num,comment) values (?,?,?,?,?,?) ";

		try {
			PreparedStatement pstmt = conn.prepareStatement(sql);

			pstmt.setInt(1, meal.getId());
			pstmt.setString(2, meal.getCreateTime());
			pstmt.setInt(3, meal.getUserID());
			pstmt.setInt(4, meal.getMealType());
			pstmt.setInt(5, meal.getNum());
			pstmt.setString(6, meal.getComment());

			pstmt.executeUpdate();

		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			util.closeConnection(conn);
		}

	}

	@Override
	public List<MealBean> list() {
		DBUtil util = new DBUtil();
		Connection conn = util.openConnection();
		String sql = "select mt.id, mt.createTime, ut.username, mtt.name, mtt.price, mt.num, mtt.price*mt.num as total, mt.comment from MealTbl as mt left join UserTable as ut on mt.UserID=ut.id left join MealTypeTbl as mtt on mt.MealTypeID=mtt.id";

		try {
			Statement stmt = conn.createStatement();
			ResultSet rs = stmt.executeQuery(sql);

			List<MealBean> list = new ArrayList<MealBean>();

			while (rs.next()) {
				int id = rs.getInt(1);
				String createTime = rs.getString(2);
				String username = rs.getString(3);
				String name = rs.getString(4);
				int price = rs.getInt(5);
				int num = rs.getInt(6);
				int total = rs.getInt(7);
				String comment = rs.getString(8);

				MealBean mb = new MealBean();
				mb.setId(id);
				mb.setCreateTime(createTime);
				mb.setUsername(username);
				mb.setName(name);
				mb.setPrice(price);
				mb.setNum(num);
				mb.setTotal(total);
				mb.setComment(comment);

				list.add(mb);
			}

			return list;
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			util.closeConnection(conn);
		}

		return null;
	}
}

Meal.java

package com.amaker.bean;

public class Meal {

	private int id;
	private String createTime;
	private int userID;
	private int mealType;
	private int num;
	private String comment;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getCreateTime() {
		return createTime;
	}

	public void setCreateTime(String createTime) {
		this.createTime = createTime;
	}

	public int getUserID() {
		return userID;
	}

	public void setUserID(int userID) {
		this.userID = userID;
	}

	public int getMealType() {
		return mealType;
	}

	public void setMealType(int mealType) {
		this.mealType = mealType;
	}

	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}

	public String getComment() {
		return comment;
	}

	public void setComment(String comment) {
		this.comment = comment;
	}

}


MealTpye.java

package com.amaker.bean;

public class MealType {

	private int id;
	private String name;
	private int price;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getPrice() {
		return price;
	}

	public void setPrice(int price) {
		this.price = price;
	}

}

MealBean.java

package com.amaker.bean;

public class MealBean {
	private int id;
	private String createTime;
	private String username;
	private String name;
	private int price;
	private int num;
	private int total;
	private String comment;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getCreateTime() {
		return createTime;
	}

	public void setCreateTime(String createTime) {
		this.createTime = createTime;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getPrice() {
		return price;
	}

	public void setPrice(int price) {
		this.price = price;
	}

	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}

	public int getTotal() {
		return total;
	}

	public void setTotal(int total) {
		this.total = total;
	}

	public String getComment() {
		return comment;
	}

	public void setComment(String comment) {
		this.comment = comment;
	}

	@Override
	public String toString() {
		return "MealBean [id=" + id + ", createTime=" + createTime
				+ ", username=" + username + ", name=" + name + ", price="
				+ price + ", num=" + num + ", total=" + total + ", comment="
				+ comment + "]";
	}

}


手把手教你用STM32CubeMX和HAL库驱动DW3000:从SPI配置到第一个测距Demo 本文详细介绍了如何使用STM32CubeMX和HAL库驱动DW3000 UWB定位通信模块,从SPI配置到实现厘米级测距Demo的全过程。涵盖硬件连接、SPI通信调试、驱动移植及双向测距(TWR)算法实现,帮助开发者快速掌握UWB高精度定位技术,适用于仓储物流、智能家居等场景。 阅读详情

相关推荐

华为[ENSP]—— 实验二、三层交换和ARP的工作原理

华为[ENSP]三层交换和ARP的工作原理

weixin_62594100的博客 6409

什么是Dao层、Entity层、Service层、Servlet层、Utils层?

基础知识整理......

Restarting2019的博客 14万+

SWAT模型非点源模拟原理

目录引言模型概述非点源污染模拟原理物质迁移内容过程营养物农药病原菌运移河道水质模型营养元素的地表水体循环河道水质模拟藻类模拟氮元素磷元素生化需氧量及溶解氧重金属的运移蓄水体水质模拟 引言 今天无意接触到这一块,就记录下来了。 模型概述 1、流域中非点源污染的来源主要是农业化肥和农药的施用。 2、氮、磷等营养物和农药的迁移和转化取决于化合物在土壤环境中经历的转化过程。 3、SWAT模型可以模拟水文相应单元内氮、磷完整的营养物循环过程和任何一种农药的降解过程。 4、SWAT模拟流域内泥沙、藻类、溶解氧、有机污染

DoWayChan的博客 4877

DAO设计模式详解

之前所学习的内容到昨天已经彻底告一段落(基本知识讲解完了),之后的内容将以代码的开发为主,如果在之前所学习的内容不是很透彻,你只要把今天所讲解的代码搞明白了,彻底会写了,写的很熟练了,那么一切就都不是问题。 4.1、关于设计分层的初步概念          在软件开发过程之中一定要存在有一个程序的层次概念,每一个程序层次都要完成某些具体的操作,而在一般情况下,分层的原则:不超过三层的原

zhangsunxiaobai的博客 8327

《点云处理算法》——GROR配准

GROR点云配准

阁楼 1315

LCD、LED、OLED、Mini LED、Micro LED、全阵列LED、QLED、QD-OLED、QNED、AMOLED是什么意思?

LCD(液晶显示器,Liquid Crystal Display)定义:LCD 是一种利用液晶材料控制光线通过的显示技术,需依靠背光源(如冷阴极荧光灯 CCFL 或 LED)照亮液晶层以形成图像。技术原理:液晶分子在电场作用下改变排列,控制背光通过的强度和颜色。液晶本身不发光,需外部光源。特点:结构包括背光层、液晶层、彩色滤光片和偏光片。响应时间较慢,黑色表现因背光漏光而偏灰。LED(发光二极管显示,Light Emitting Diode)定义。

中国最威武的城市!武功军威-武威,铁骨铮铮! 3423

DAO设计模式简介

DAO(Data Access Object,数据访问对象),主要的功能是用于进行数据操作的,在程序的标准开发框架中属于数据层的操作。 数据开发结构: 资源层是数据库的操作层,里面可以进行各种数据库的存储,但是这些数据存储的时候肯定是依靠SQL语句,数据层通过一个专门的数据库组件完成对数据库的操作 业务层是整个项目的核心 DAO组成 DatabaseConnection:

thystar的专栏 7547

跟着Synopsys报告,一步步拆解车规芯片FMEDA计算(含公式与避坑点)

本文详细解析了车规芯片FMEDA计算的全流程,基于Synopsys报告拆解实战指南,涵盖基础失效率建模、安全机制效能评估及安全指标合成等关键步骤。通过公式解析、数据准备清单和避坑点分享,帮助工程师掌握ISO26262标准下的硬件量化分析技术,提升车载系统设计可靠性。

weixin_30460489的博客 193

Java 分层设计(DAO设计模式)

此文章是本人学习mldn魔乐科技DAO设计模式教学视频后,总结下来,用于复习使用,在这里感谢mldn的学习视频。 DAO设计模式? DAO全称是(Data Access Object,数据库访问对象),主要功能就是用于进行数据操作的,在程序的标准开发架构中属于数据层的操作。 简要介绍一下企业分层架构: 显示层:主要使用JSP/Servlet进行页面效果的显示 业务层:(Busin

你要悄悄的拔尖,然后惊艳所有人 2万+

ESP32 VSCode开发环境配置

ESP32 VSCode开发环境配置

qq_53529450的博客 507

【问题解决】Python 异步 asyncio 卡死、协程不执行、任务泄漏,保姆级排错

本文详细分析了Python异步编程中常见的卡死、协程不执行和任务泄漏问题。文章首先列举了这些问题的典型表现,如程序卡住、死锁、任务未启动等。然后深入剖析了各类问题的根源,包括同步阻塞操作、未正确await、资源未清理等。针对这些问题,文章提供了两套解决方案:一是异步编程最佳实践,包括安全协程执行、带超时的执行、任务清理等实用方法;二是死锁检测和预防机制,通过锁管理和等待图分析来避免死锁。文章还包含可直接使用的代码示例,帮助开发者快速定位和解决异步编程中的常见问题。

博客 448

JavaWeb-DAO设计模式

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

Alphamilk的博客 2189

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

DAO设计模式的介绍与实现

前言:哈哈,第一篇关于Java的博客了,暑假看了一些Java的设计模式,本来想着总结一下的,但是一耽误就到现在了,后面慢慢补上。今天我们来聊聊DAO 1、DAO是个什么东西呢? 看一下官方的介绍,DAO(Data Access Object,数据访问对象)的主要功能是数据操作,在程序的标准开发架构中属于数据层的操作。额,好像有点糊涂啊,用人类的语言解释一下也就是DAO是一种操作数据库的设计

wd 1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

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

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

J2EE:DAO设计模式

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

kingmicrosoft的专栏 1342

DAO 设计模式

关于dao模式的介绍

万维网 489

JavaBean中DAO设计模式介绍

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

xiazdong 6万+

DAO和MVC设计模式

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

George__P的博客 2626

dao设计模式对mysql的crud_简单的Dao设计模式

简单的DAO设计模式这两天学习到了DAO(Data Access Object 数据存取对象)设计模式。想谈谈自己的感受,刚开始接触是感觉有点难,觉得自己逻辑理不清,主要是以前学的知识比较零散没有很好的把它们结合起来运用。我个人比较喜欢有挑战的东西,比如项目,在学iOS阶段做了个项目感觉那段时间自己的思维和逻辑提升很快。我个人认为遇到困难不要怕,而应该感到高兴,因为只有遇到了困难才知道自己的不足,...

weixin_33803878的博客 161

android dao设计模式,Dao设计模式

DAO设计模式1.domain/pojo对象domain(指的是实例类)2.dao接口//新建Dao接口package com.ful.dao;import com.ful.domain.Users;public interface UsersDao {Users findByUserName(String parUserName);}3.接口实现(单例设计模式)public class User...

weixin_39574246的博客 223
上一篇: JDBC—MeteData、PreparedStatement、CallableStatement
下一篇: Servlet—TomCat、HTTP协议
Wang_AI
博客等级 码龄12年 988粉丝 162原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值