DAO设计模式总结
1.DAO(Data Access Object,数据访问对象),主要的功能是用于进行数据操作的,在程序的标准开发框架中属于数据层的操作。
数据开发结构流程:
资源层是数据库的操作层,里面可以进行各种数据库的存储,但是这些数据存储的时候肯定是依靠SQL语句,数据层通过一个专门的数据库组件完成对数据库的操作
业务层是整个项目的核心
2.DAO组成结构:
- DatabaseConnection:专门负责数据库打开与关闭操作的类。
- VO:主要由属性,setter, getter方法组成,VO类中的属性与表中的字段相对应,每一个VO类的对象都表示表中的每一条记录。
- DAO:主要定义操作的接口,定义一系列数据库的原子性操作,例如增删改查等。
- Impl: DAO接口的真实实现类,主要完成具体数据库操作,但不负责数据库的打开和关闭。
- Proxy:代理实现类,主要完成数据库的打开和关闭并且调用真实实现类对象的操作。
- Factory: 工厂类,通过工厂类取得一个DAO的实例化对象。
3.对于包的命名:
- 数据库连接: 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.
4.DAO开发:
4.1数据库脚本如下:
create database DAO create table Login(
UserID varchar(30) primary key,
name varchar(30),
password varchar(15)
); INSERT INTO login(UserID, name, password)VALUES('admin', 'admin', 'admin'); select * from login
4.2定义VO类,VO类有数据的属性以及setter,getter方法,代码如下:
package org.lxh.VO;
public class voDemo {
private String userid;
private String name;
private String password;
public void setUserid(String userid){
this.userid=userid;
}
public void setName(String name){
this.name=name;
}
public void setPassword(String password){
this.password=password;
}
public String getUserid(){
return this.userid;
}
public String getName(){
return this.name;
}
public String getPassword(){
return this.password;
}
}
4.3实现DateBaseConnection类,代码如下:
package org.lxh.dbc; import java.sql.Connection;
import java.sql.DriverManager;
public class DateBaseConnection {
private static final String DBDRIVER=
"com.microsoft.sqlserver.jdbc.SQLServerDriver";//SQLserver数据库引擎
private static final String DBURL=
"jdbc:sqlserver://127.0.0.1:1433;DatabaseName=DAO";//数据源
private static final String DBUER="sa";//SQLserver数据库用户名
private static final String DBPASSWORD="123";//SQLserver登录密码
private Connection conn=null; //声明数据库连接对象
public DateBaseConnection() throws Exception{//在构造方法中连接数据库
Class.forName(DBDRIVER); //加载驱动程序
this.conn=DriverManager.getConnection(DBURL,DBUER,DBPASSWORD);//连接数据库
}
public Connection getConnection(){//取得数据库的连接
return this.conn;
}
public void close() throws Exception{//数据库的关闭操作
if(this.conn!=null){
try{
this.conn.close();//数据库关闭
System.out.println("数据库连接成功");
}catch(Exception e){
throw e;
}
System.out.println("数据库连接失败");
}
}
}
4.4定义DAO操作接口,代码如下:
package org.lxh.dao;
import org.lxh.VO.voDemo;
public interface IvoDemo {
//验证登录,有异常交给被调处处理
public boolean findLogin(voDemo vodemo) throws Exception;
}
4.5定义实现DAO接口类操作,代码如下:
package org.lxh.dao.impl; import java.sql.*; import org.lxh.VO.voDemo;
import org.lxh.dao.IvoDemo;
/**
*
* DAO实现类,实现方法,但不负责数据库的具体连接 ,真实主题实现类
*
*/
public class voDemoDAOImpl implements IvoDemo{
private Connection conn = null; //定义数据库的连接对象
private PreparedStatement pstmt = null; //定义数据库操作对象
public voDemoDAOImpl(Connection conn){ // 构造方法,设置数据库连接
this.conn = conn;
}
/**
* 具体操作方法:查询 ,覆写DAO接口类
*/
public boolean findLogin(voDemo vodemo) 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, vodemo.getUserid()); // 设置用户id
this.pstmt.setString(2, vodemo.getPassword()); // 设置password
ResultSet rs = this.pstmt.executeQuery(); // 取得查询结果
if(rs.next()){
vodemo.setName(rs.getString(1)); //取得姓名
flag = true;
}
}catch(Exception e){
throw e;
}
return flag;
}
}
4.6定义代理主题实现类,代码如下;
package org.lxh.dao.Proxy; import org.lxh.VO.voDemo;
import org.lxh.dao.IvoDemo;
import org.lxh.dao.impl.voDemoDAOImpl;
import org.lxh.dbc.DateBaseConnection; public class voDemoDAOProxy implements IvoDemo {
private DateBaseConnection dbc = null;
private IvoDemo dao = null;
public voDemoDAOProxy() { //构造方法,实例化连接,同时实例化dao对象
try {
this.dbc = new DateBaseConnection(); // 连接数据库
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.dao = new voDemoDAOImpl(this.dbc.getConnection()); //实例化真实主题类
}
public boolean findLogin(voDemo vodemo) throws Exception{ // 实现接口中的方法。
boolean flag = false; //定义标志位
try{
flag = this.dao.findLogin(vodemo); // 调用真实主题
}catch(Exception e){
throw e; //向上抛出异常
}finally{
this.dbc.close();
}
return flag; //返回标记
} }
4.7DAO工厂实现类操作,代码如下:
package org.lxh.factory; import org.lxh.dao.IvoDemo;
import org.lxh.dao.Proxy.voDemoDAOProxy; public class DAOFactory {
public static IvoDemo getIvoDemoDAOInstance() throws Exception{
return new voDemoDAOProxy();
}
}
4.8定义servlet类操作,代码如下:
package org.lxh.servlet; import java.io.IOException;
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.lxh.VO.voDemo;
import org.lxh.factory.DAOFactory; public class LoginServlet extends HttpServlet { private static final long serialVersionUID = 1L;
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){
voDemo vodemo = new voDemo(); //实例化vo
vodemo.setUserid(userid); //设置userid
vodemo.setPassword(userpass); //设置userpass
try {
if(DAOFactory.getIvoDemoDAOInstance().findLogin(vodemo)){ //验证通过
info.add("通过验证" + vodemo.getName() + "已登录");
}else{
info.add("登录失败");
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
request.setAttribute("info", info);
request.getRequestDispatcher(path).forward(request, response); //跳转
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { this.doGet(request, response); // 调用doGet操作
} }
4.9定义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>
实现代码图:

DAO设计模式总结的更多相关文章
- DAO设计模式
DAO设计模式 DAO设计模式简介: DAO设计模式可以减少代码量,增强程序的可移植性,提高代码的可读性. DAO(数据库操作对象)设计模式是 JavaEE 数据层的操作.主要由五部分组成: 1.数据 ...
- JavaWeb技术(二):DAO设计模式
1. DAO全称:Data Access Object , 数据访问对象.使用DAO设计模式来封装数据持久化层的所有操作(CRUD),使得数据访问逻辑和业务逻辑分离,实现解耦的目的. 2. 典型的DA ...
- Java Dao设计模式
一.信息系统的开发架构 客户层-------显示层-------业务层---------数据层---------数据库 1.客户层:客户层就是客户端,简单的来说就是浏览器. 2.显示层:JSP/S ...
- MySQL数据库学习笔记(十一)----DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- DAO设计模式 -- 使用数据库连接类连接MySql数据库并实现添加用户
1. DAO简介 DAO设计模式是属于J2EE数据库层的操作,使用DAO设计模式可以简化大量代码,增强程序的可移植性. 2. DAO各部分详解 DAO设计模式包括5个重要的部分,分别为数据 ...
- JavaBean中DAO设计模式介绍(转)
一.信息系统的开发架构 客户层-------显示层-------业务层---------数据层---------数据库 1.客户层:客户层就是客户端,简单的来说就是浏览器. 2.显示层:JSP/Ser ...
- jsp DAO设计模式
DAO(Data Access Objects)设计模式是属于J2EE体系架构中的数据层的操作. 一.为什么要用DAO? 比较在JSP页面中使用JDBC来连接数据库,这样导致了JSP页面中包含了大量的 ...
- 简单的Dao设计模式
简单的DAO设计模式 这两天学习到了DAO(Data Access Object 数据存取对象)设计模式.想谈谈自己的感受,刚开始接触是感觉有点难,觉得自己逻辑理不清,主要是以前学的知识比较零散没有很 ...
- Java学习之DAO设计模式
DAO设计模式是一个javaEE里的设计模式,DAO是Data Access Object 数据访问接口. 一个典型的DAO实现有三个组件: 1.一个DAO接口 2.一个DAO接口的具体类: 3.数据 ...
- JavaBean在DAO设计模式简介
一.信息系统开发框架 客户层-------显示层-------业务层---------数据层---------数据库 1.客户层:客户层是client,简单的来说就是浏览器. 2.显示层:JSP/Se ...
随机推荐
- <Python基础>装饰器的基本原理
1.装饰器 所谓装饰器一般是对已经使用(上线)的函数增加功能. 但是因为一般的大公司的严格按照开放封闭原则(对扩展是开放的,对修改是封闭的),不会让你修改原本的函数. 装饰器就是在不改变原本的函数且不 ...
- css之height: 100%的有效场景
在css的日常应用中,经常会遇到想要通过 height: 100%来达到使子盒子与父盒子高度一样的目的,但是偶尔明明设置了height: 100%,但是却没有达到想要的结果,这次我们就一起探索一下,什 ...
- 线性dp——求01串最大连续个数不超过k的方案数,cf1027E 好题!
只写了和dp有关的..博客 https://www.cnblogs.com/huyufeifei/p/10351068.html 关于状态的继承和转移 这题的状态转移要分开两步来做: 1.继承之前状态 ...
- dijkstra (模板)
突然意识到以前写的都是假的dij,感谢GhostCai神犇. #include<iostream> #include<cstdio> #include<cstring&g ...
- pytorch 入门指南
两类深度学习框架的优缺点 动态图(PyTorch) 计算图的进行与代码的运行时同时进行的. 静态图(Tensorflow <2.0) 自建命名体系 自建时序控制 难以介入 使用深度学习框架的优点 ...
- JS全局函数里面的一些区别
- SpringBoot学习笔记(三):SpringBoot集成Mybatis、SpringBoot事务管理、SpringBoot多数据源
SpringBoot集成Mybatis 第一步我们需要在pom.xml里面引入mybatis相关的jar包 <dependency> <groupId>org.mybatis. ...
- 更改git提交显示的用户名
问题描述 同一项目多人开发难免会用到版本控制,最为流行的当属git.开发中出现一个小问题,每个人提交后显示的用户名,如下图 组长发话:把用户名都改成自己的名字! 这时发现用户名并不是自己的名字,怎么改 ...
- Spring Boot Starter自定义实现三步曲
实现自定义的spring boot starter,只需要三步: 1.一个Bean 2.一个自动配置类 3.一个META-INF/spring.factories配置文件 下面用代码演示这三步. 项目 ...
- Java超简明入门学习笔记(四)
Java编程思想第4版学习笔记(四) 第六章 访问权限控制 访问权限控制是面向对象编程中的重要概念,它划分了类设计者和类使用者的界限.通过设置权限,它一方面告诉类设计者,哪个部分的修改 ...