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>
密&nbsp;码:<input type = "password" name="userpass"><br>
<input type = "submit" value = "登录">
<input type = "reset" value = "重置">
</form>
</body>
</html>

实现代码图:

DAO设计模式总结的更多相关文章

  1. DAO设计模式

    DAO设计模式 DAO设计模式简介: DAO设计模式可以减少代码量,增强程序的可移植性,提高代码的可读性. DAO(数据库操作对象)设计模式是 JavaEE 数据层的操作.主要由五部分组成: 1.数据 ...

  2. JavaWeb技术(二):DAO设计模式

    1. DAO全称:Data Access Object , 数据访问对象.使用DAO设计模式来封装数据持久化层的所有操作(CRUD),使得数据访问逻辑和业务逻辑分离,实现解耦的目的. 2. 典型的DA ...

  3. Java Dao设计模式

    一.信息系统的开发架构   客户层-------显示层-------业务层---------数据层---------数据库 1.客户层:客户层就是客户端,简单的来说就是浏览器. 2.显示层:JSP/S ...

  4. MySQL数据库学习笔记(十一)----DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  5. DAO设计模式 -- 使用数据库连接类连接MySql数据库并实现添加用户

    1. DAO简介    DAO设计模式是属于J2EE数据库层的操作,使用DAO设计模式可以简化大量代码,增强程序的可移植性. 2. DAO各部分详解    DAO设计模式包括5个重要的部分,分别为数据 ...

  6. JavaBean中DAO设计模式介绍(转)

    一.信息系统的开发架构 客户层-------显示层-------业务层---------数据层---------数据库 1.客户层:客户层就是客户端,简单的来说就是浏览器. 2.显示层:JSP/Ser ...

  7. jsp DAO设计模式

    DAO(Data Access Objects)设计模式是属于J2EE体系架构中的数据层的操作. 一.为什么要用DAO? 比较在JSP页面中使用JDBC来连接数据库,这样导致了JSP页面中包含了大量的 ...

  8. 简单的Dao设计模式

    简单的DAO设计模式 这两天学习到了DAO(Data Access Object 数据存取对象)设计模式.想谈谈自己的感受,刚开始接触是感觉有点难,觉得自己逻辑理不清,主要是以前学的知识比较零散没有很 ...

  9. Java学习之DAO设计模式

    DAO设计模式是一个javaEE里的设计模式,DAO是Data Access Object 数据访问接口. 一个典型的DAO实现有三个组件: 1.一个DAO接口 2.一个DAO接口的具体类: 3.数据 ...

  10. JavaBean在DAO设计模式简介

    一.信息系统开发框架 客户层-------显示层-------业务层---------数据层---------数据库 1.客户层:客户层是client,简单的来说就是浏览器. 2.显示层:JSP/Se ...

随机推荐

  1. Git reset的参数

    (1) 默认的mixed参数:git reset commit_id,将本地版本库的头指针全部重置到指定版本,且会重置暂存区,即这次提交之后的所有变更都移动到未暂存阶段. (2) soft 参数:gi ...

  2. Java 10的10个新特性,将彻底改变你写代码的方式!

    Java 9才发布几个月,很多玩意都没整明白,现在Java 10又快要来了.. 这时候我真尼玛想说:线上用的JDK 7 甚至JDK 6,JDK 8 还没用熟,JDK 9 才发布不久不知道啥玩意,JDK ...

  3. MybatisPlus联合分页查询

    跟单表分页查询差不多 1.编写查询语句 public interface QuestionMapper extends BaseMapper<Question> { @Select(&qu ...

  4. C++的注释

    ### 1.2 注释 **作用**:在代码中加一些说明和解释,方便自己或其他程序员程序员阅读代码 **两种格式** 1. **单行注释**:// 描述信息  - 通常放在一行代码的上方,或者一条语句的 ...

  5. 滑雪 矩阵中的最长上升路径 /// 记忆化DFS || DP oj22919

    大致题意: Description 难怪Michael喜欢滑雪,因为滑雪确实很刺激.为了获得加速度,滑雪道必须向下倾斜,而且当滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道在一 ...

  6. RPM包安装MySQL 5.7.18

    系统: CentOS 7 RPM包: mysql-community-client-5.7.18-1.el7.x86_64.rpm mysql-community-server-5.7.18-1.el ...

  7. odoo 下 get_object_reference 函数

    get_object_reference是 ir.model.data 模块中下的一个函数 该函数通过调用ir.model.data 模块中另外一个函数 xmlid_lookup 返回结果 def g ...

  8. Joomla - 部署(线上部署)

    一.线上部署 线上部署可以理解为把本地网站迁移到线上,使用 akeeba backup 进行备份和迁移即可 参考 Joomla - akeeba backup(joomla网站备份.迁移扩展)的第三. ...

  9. 为什么Java中的String是设计成不可变的?(Why String is immutable in java)

    There are many reasons due to the string class has been made immutable in Java. These reasons in vie ...

  10. mysql limit 偏移量过大效率解决方式 转贴

    原文地址:https://www.jianshu.com/p/f8d81df7ab28 SELECT * FROM product , ) limit SELECT * FROM product a ...