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>
实现代码图:
美梦成真,变为事实。