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 ...
随机推荐
- 【CF888G】Xor-MST
题目 也不是很知道为什么这道题要和某\(B\)姓算法扯上关系 首先有一个非常显然基于那个\(B\)姓算法的做法,每次启发式合并\(trie\)即可,复杂度是\(O(n\ logn\ loga_i)\) ...
- Educational Codeforces Round 69 D E
Educational Codeforces Round 69 题解 题目编号 A B C D E F 完成情况 √ √ √ ★ ★ - D. Yet Another Subarray Problem ...
- 洛谷P2371 [国家集训队]墨墨的等式
P2371 [国家集训队]墨墨的等式 题目描述 墨墨突然对等式很感兴趣,他正在研究a1x1+a2y2+-+anxn=Ba_1x_1+a_2y_2+-+a_nx_n=Ba1x1+a2y2+-+a ...
- Python全栈开发:socket
Socket socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. sock ...
- Android开发 MediaPlayer将视频播放时尺寸适配完美
前言 视频播放有一个较为蛋疼的问题,那就是尺寸适配.如果不做尺寸适配视频将会变形拉伸或者压缩.下面我就介绍个人实现的算法. 满足一边的算法 满足一边?你可能是疑问是什么意思.意思是就是始终将视频的高度 ...
- Django问题
Django问题 'WSGIRequest' object has no attribute 'user' django python 关注 2 关注 收藏 0 收藏,413 浏览 当我的djan ...
- LUOGU P3355 骑士共存问题(二分图最大独立集)
传送门 因为骑士只能走"日"字,所以一定是从一个奇点到偶点或偶点到奇点,那么这就是一张二分图,题目要求的其实就是二分图的最大独立集.最大独立集=n-最大匹配. #include&l ...
- iPhone开发关于UDID和UUID的一些理解
一.UDID(Unique Device Identifier) UDID是Unique Device Identifier的缩写,中文意思是设备唯一标识. 在很多需要限制一台设备一个账号的应用中 ...
- Office宏的基本利用
前言 Office宏,译自英文单词Macro.宏是Office自带的一种高级脚本特性,通过VBA代码,可以在Office中去完成某项特定的任务,而不必再重复相同的动作,目的是让用户文档中的一些任务自动 ...
- 如何学习AxureRP Axure学习方法
从作者最初接触的5.5版本,到5.6版本,到后来6.0的多个迭代版本,直到现在的6.5版本,AxureRP每次的版本升级都伴随着新功能的增 加,也解决了原型设计上的一些难题.这也从另一个方面诠释了“学 ...