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 ...
随机推荐
- Git reset的参数
(1) 默认的mixed参数:git reset commit_id,将本地版本库的头指针全部重置到指定版本,且会重置暂存区,即这次提交之后的所有变更都移动到未暂存阶段. (2) soft 参数:gi ...
- Java 10的10个新特性,将彻底改变你写代码的方式!
Java 9才发布几个月,很多玩意都没整明白,现在Java 10又快要来了.. 这时候我真尼玛想说:线上用的JDK 7 甚至JDK 6,JDK 8 还没用熟,JDK 9 才发布不久不知道啥玩意,JDK ...
- MybatisPlus联合分页查询
跟单表分页查询差不多 1.编写查询语句 public interface QuestionMapper extends BaseMapper<Question> { @Select(&qu ...
- C++的注释
### 1.2 注释 **作用**:在代码中加一些说明和解释,方便自己或其他程序员程序员阅读代码 **两种格式** 1. **单行注释**:// 描述信息 - 通常放在一行代码的上方,或者一条语句的 ...
- 滑雪 矩阵中的最长上升路径 /// 记忆化DFS || DP oj22919
大致题意: Description 难怪Michael喜欢滑雪,因为滑雪确实很刺激.为了获得加速度,滑雪道必须向下倾斜,而且当滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道在一 ...
- 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 ...
- odoo 下 get_object_reference 函数
get_object_reference是 ir.model.data 模块中下的一个函数 该函数通过调用ir.model.data 模块中另外一个函数 xmlid_lookup 返回结果 def g ...
- Joomla - 部署(线上部署)
一.线上部署 线上部署可以理解为把本地网站迁移到线上,使用 akeeba backup 进行备份和迁移即可 参考 Joomla - akeeba backup(joomla网站备份.迁移扩展)的第三. ...
- 为什么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 ...
- mysql limit 偏移量过大效率解决方式 转贴
原文地址:https://www.jianshu.com/p/f8d81df7ab28 SELECT * FROM product , ) limit SELECT * FROM product a ...