DAO设计模式

DAO:Data Access Object,数据访问对象。

DatabaseConnection:专门负责数据库的打开与关闭操作的类。

VO:主要由属性、setter、getter方法组成,VO类中的属性与表中的字段相对应,每一个VO类的对象都表示表中的每一条记录。

DAO:主要定义操作的接口,定义一系列数据库的原子性操作标准,如增加、修改、按ID查询等。

Impl:DAO接口的真实实现类,完成具体的数据库操作

Proxy:代理实现类,主要完成数据库的打开和关闭,并且调用真实实现类对象的操作。

Factory:工厂类,通过工厂类取得一个DAO的实例化对象。


第1步:数据库建表,emp。

第2步:定义对应的VO类-Emp.java

package cn.edu.lyu.vo;

import java.util.Date;


public class Emp

{

private int empno;

private String name;

private String job;

private Date hiredate;

private float sal;

public int getEmpno()

{

return empno;

}

public void setEmpno(int empno)

{

this.empno = empno;

}

public String getName()

{

return name;

}

public void setName(String name)

{

this.name = name;

}

public String getJob()

{

return job;

}

public void setJob(String job)

{

this.job = job;

}

public Date getHiredate()

{

return hiredate;

}

public void setHiredate(Date hiredate)

{

this.hiredate = hiredate;

}

public float getSal()

{

return sal;

}

public void setSal(float sal)

{

this.sal = sal;

}

}


第3步:定义一个DatabaseConnection.java类,此类主要完成数据库的打开及关闭操作。

package cn.edu.lyu.dbc;


import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.*;


import com.mysql.jdbc.Connection;


public class DatabaseConnection
{
private static final String DBDRIVER = "com.mysql.jdbc.Driver";
private static final String DBURL = "jdbc:mysql://localhost:3306/mysql";
private static final String DBUSER = "root";
private static final String DBPASS = "123456";

private  Connection conn = null;

public DatabaseConnection()
{
try {
Class.forName(DBDRIVER);
try {
this.conn = (Connection) DriverManager.getConnection(DBURL, DBUSER, DBPASS);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public Connection getConnection()
{
return this.conn;
}

public void close()
{
if(this.conn != null)
try {
this.conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}


第4步:定义最重要的DAO接口,在定义DAO接口之前必须对业务进行详细的分析,要清楚地知道一张表在整个系统中应该具备何种功能。定义DAO操作标准-IEmpDAO.java

package cn.edu.lyu.dao;

import java.util.List;

import cn.edu.lyu.vo.Emp;


public interface IEmpDAO

{

public boolean doCreate(Emp emp) throws Exception;

public List<Emp> findAll(String keyWord) throws Exception;

public Emp findById(int empno) throws Exception;

}


第5步:真实主题实现类--EmpDAOImpl.java

package cn.edu.lyu.dao.impl;


import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;


import cn.edu.lyu.dao.IEmpDAO;
import cn.edu.lyu.vo.Emp;


public class EmpDAOImpl implements IEmpDAO
{
private Connection conn = null;//数据库连接对象
private PreparedStatement pstmt = null;//数据库操作对象

public EmpDAOImpl(Connection conn)//通过构造方法取得数据库连接
{
this.conn = conn;//获得数据库连接
}

public boolean doCreate(Emp emp) throws Exception
{
boolean flag = false;//定义标志位
String sql = "insert into emp(empno,ename,job,hiredate,sal) values(?,?,?,?,?)";
this.pstmt = this.conn.prepareStatement(sql);//实例化PreparedStatement对象
this.pstmt.setInt(1, emp.getEmpno());//设置empno
this.pstmt.setString(2, emp.getName());//设置ename
this.pstmt.setString(3, emp.getJob());
this.pstmt.setDate(4, new java.sql.Date(emp.getHiredate().getTime()));
this.pstmt.setFloat(5, emp.getSal());

if(this.pstmt.executeUpdate()>0)//更新记录的行数大于0
{
flag = true;//修改标志位
}
this.pstmt.close();
return flag;
}


public List<Emp> findAll(String keyWord) throws Exception
{
List<Emp> all = new ArrayList<Emp>();//定义集合,接收全部数据
String sql = "select empno,ename,job,hiredate,sal from emp where ename like ? or job like ?";
this.pstmt = this.conn.prepareStatement(sql);//实例化PreparedStatement对象
this.pstmt.setString(1, "%"+keyWord+"%");//设置查询关键字
this.pstmt.setString(2, "%"+keyWord+"%");
ResultSet rs = this.pstmt.executeQuery();//执行查询操作
Emp emp = null;
while(rs.next())
{
emp = new Emp();
emp.setEmpno(rs.getInt(1));
emp.setName(rs.getString(2));
emp.setJob(rs.getString(3));
emp.setHiredate(rs.getDate(4));
emp.setSal(rs.getFloat(5));
all.add(emp);
}
this.pstmt.close();
return all;
}


public Emp findById(int empno) throws Exception
{
Emp emp = null;
String sql = "select empno,ename,job,hiredate,sal from emp where empno = ?";
this.pstmt = this.conn.prepareStatement(sql);
this.pstmt.setInt(1, empno);
ResultSet rs = this.pstmt.executeQuery();
if(rs.next())
{
emp = new Emp();
emp.setEmpno(rs.getInt(1));
emp.setName(rs.getString(2));
emp.setJob(rs.getString(3));
emp.setHiredate(rs.getDate(4));
emp.setSal(rs.getFloat(5));
}
this.pstmt.close();
return emp;
}
}


第6步:代理主题实现类--IEmpDAOProxy.java

package cn.edu.lyu.proxy;

import java.util.List;

import cn.edu.lyu.dao.IEmpDAO;

import cn.edu.lyu.dao.impl.EmpDAOImpl;

import cn.edu.lyu.dbc.DatabaseConnection;

import cn.edu.lyu.vo.Emp;


public class EmpDAOProxy implements IEmpDAO

{

private DatabaseConnection dbc = null;

private IEmpDAO dao = null;

public EmpDAOProxy() throws Exception

{

this.dbc = new DatabaseConnection();

this.dao = new EmpDAOImpl(this.dbc.getConnection());

}

@Override

public boolean doCreate(Emp emp) throws Exception

{

boolean flag = false;

if(this.dao.findById(emp.getEmpno()) == null)//如果要插入的雇员编号不存在

{

flag = this.dao.doCreate(emp);//调用真实主题操作

}

this.dbc.close();

return flag;

}

@Override

public List<Emp> findAll(String keyWord) throws Exception

{

List<Emp> all = null;

all = this.dao.findAll(keyWord);//调用真实主题操作

this.dbc.close();

return all;

}

@Override

public Emp findById(int empno) throws Exception

{

Emp emp = null;

emp = this.dao.findById(empno);

this.dbc.close();

return emp;

}

}


第7步:DAO工厂类--DAOFactory

package cn.edu.lyu.factory;

import cn.edu.lyu.dao.IEmpDAO;

import cn.edu.lyu.proxy.EmpDAOProxy;


public class DAOFactory

{

public static IEmpDAO getIEmpDAOInstance() throws Exception

{

return new EmpDAOProxy();

}

}


第8步:测试DAO插入功能--TestDAOInsert.java

ackage cn.edu.lyu.dao.test;

import cn.edu.lyu.factory.DAOFactory;

import cn.edu.lyu.vo.Emp;


public class TestDAOInsert

{

public static void main(String[] args) throws Exception

{

Emp emp = null;

for(int x = 0; x < 5; x++)

{

emp = new Emp();

emp.setEmpno(1000 + x);

emp.setName("张龙翔 -" + x);

emp.setJob("程序员 -" + x);

emp.setHiredate(new java.util.Date());

emp.setSal(500 * x);

DAOFactory.getIEmpDAOInstance().doCreate(emp);

}

}

}


第9步:JSP调用DAO 


 增加雇员---emp_insert.jsp

<%@ page contentType="text/html; charset=utf-8"%>

<html>

<head><title>张龙翔Java高端培训</title></head>

<body>

<form action="emp_insert_do.jsp" method="post">

雇员编号:<input type="text" name="empno"><br>

雇员姓名:<input type="text" name="name"><br>

雇员职位:<input type="text" name="job"><br>

雇佣日期:<input type="text" name="hiredate"><br>

基本工资:<input type="text" name="sal"><br>

<input type = "submit" value = "注册">

<input type = "reset" value = "重置">

</form>

</body>

</html>


完成增加雇员的操作--emp_insert_do.jsp

<%@ page contentType="text/html; charset=utf-8"%>

<%@ page import="cn.edu.lyu.factory.*,cn.edu.lyu.vo.*"%>

<%@ page import="java.text.*"%>

<html>

<head><title>张龙翔Java高端培训</title></head>

<body>

<%

Emp emp = new Emp();

emp.setEmpno(Integer.parseInt(request.getParameter("empno")));

emp.setName(request.getParameter("name"));

emp.setJob(request.getParameter("job"));

emp.setHiredate(new SimpleDateFormat("yyyy-MM-dd").parse(request.getParameter("hiredate")));

emp.setSal(Float.parseFloat(request.getParameter("sal")));

if(DAOFactory.getIEmpDAOInstance().doCreate(emp)){

%>

<h3>雇员信息添加成功!</h3>

<%

}else{

%>

<h3>雇员信息添加失败!</h3>

<%

}

%>

</body>

</html>


数据查询----emp_list.jsp

<%@ page contentType="text/html; charset=utf-8"%>

<%@ page import = "cn.edu.lyu.factory.*,cn.edu.lyu.vo.*"%>

<%@ page import = "java.util.*"%>

<html>

<head><title>张龙翔高端Java培训</title></head>

<body>

<%

String keyWord = request.getParameter("kw");

if(keyWord==null)

{

keyWord="";

}

List<Emp> all=DAOFactory.getIEmpDAOInstance().findAll(keyWord);

Iterator<Emp> iter=all.iterator();

%>


<form action="emp_list.jsp" method="post">

请输入查询关键字(姓名或职位)<input type="text" name="kw">

<input type="submit" value="查询">

</form>

<table border="1" width="80%">

<tr>

<td>雇员编号</td>

<td>雇员姓名</td>

<td>雇员工作</td>

<td>雇员工资</td>

<td>雇佣日期</td>

</tr>

<%

while(iter.hasNext())

{

Emp emp = iter.next();

%>

<tr>

<td><%=emp.getEmpno()%></td>

<td><%=emp.getName()%></td>

<td><%=emp.getJob()%></td>

<td><%=emp.getSal()%></td>

<td><%=emp.getHiredate()%></td>

</tr>

<%

}

%>

</table>

</body>

</html>



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值