java开发中的Dao设计模式解析
程序员文章站
2023-11-29 17:37:16
DAO设计模式DAO(Data Access Object,数据访问对象),主要的功能就是用 于进行数据操作的,在程序的标准开发架构中属于数据层的操作。DAO的组成部分DAO由几下几个部分组成:(1)VO:封装数据信息,主要属性和getXXX() setXXX()方法组成,VO 类中的属性和表中的字段相对应,每个VO类的对象相当于数据库表中的一行记录。***.vo.***,vo的命名要与表的命名一致。(2)DatabaseConnection:专门负责数据库打开和关闭操作的类。***.dbc....
DAO设计模式
DAO(Data Access Object,数据访问对象),主要的功能就是用 于进行数据操作的,在程序的标准开发架构中属于数据层的操作。
DAO的组成部分
DAO由几下几个部分组成:
(1)VO:封装数据信息,主要属性和getXXX() setXXX()方法组成,VO 类中的属性和表中的字段相对应,每个VO类的对象相当于数据库表中的一行记录。***.vo.***,vo的命名要与表的命名一致。
(2)DatabaseConnection:专门负责数据库打开和关闭操作的类。***.dbc.DatabaseConnection
(3)DAO:主要定义操作的接口,定义一系列数据库的原子性操作的标准,如增,删,改,查等。***.dao.I***DAO
(4)Impl:DAO接口的真实实现类,完成具体的数据库操作,但是不负责数据库打开和关闭。***.dao.impl.***DAOImpl
(5)Proxy:代理实现类,主要完成数据库的打开和关闭,并且调用真实实现类对象操作。***.dao.proxy.***DAOProxy
(6)Factory:工作类,通过工厂类取得一个DAO的实例化对象。***.factory.DAOFactory
DAO模式的案例——员工信息添加和查询
新建数据库,命名为Emp(要和vo数据类命名一致)
一. Vo信息类
package com.org.vo; //VO类封装数据信息VO 类中的属性和表中的字段相对应 //每个VO类的对象相当于数据库表中的一行记录。 //***.vo.***,vo的命名要与表的命名一致。 public class Emp { private int id; //员工Id private String name; //员工姓名 private String job; //员工工作 private String hireDate; //入职日期 private float sal; //薪水 /********get方法**********/ public int getId() { return this.id; } public String getName() { return this.name; } public String getJob() { return this.job; } public String getHireDate() { return this.hireDate; } public float getSal() { return this.sal; } /*********set方法*********/ public void setId(int id) { this.id=id; } public void setName(String name) { this.name=name; } public void setJob(String job) { this.job=job; } public void setHireDate(String hireDate) { this.hireDate=hireDate; } public void setSal(float sal) { this.sal=sal; } }
二. DataBaseConnection数据库连接类
package com.org.dbc; //DatabaseConnection专门负责数据库打开和关闭操作的类。 import java.sql.*; public class DataBaseConnection { private static final String DBDRIVER="com.mysql.cj.jdbc.Driver";//驱动器 private static final String DBURL="jdbc:mysql://localhost:3306/test?serverTimezone=UTC";//URL,test为数据库名 private static final String DBUSER="root";//user private static final String DBPASSWORD="*******";//密码 private Connection conn=null; //构造函数加载驱动 public DataBaseConnection() throws Exception{ try{ Class.forName(DBDRIVER); this.conn=DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD); }catch(Exception e){ throw e; } } //获取连接对象 public Connection getConnection(){ return this.conn; } //关闭连接 public void close() throws Exception{ if(this.conn!=null){ try{ this.conn.close(); }catch(Exception e){ throw e; } } } }
三. 定义DAO接口类
package com.org.dao; import java.util.List; //接口类,主要定义操作的接口,定义一系列数据库的原子性操作的标准,如增,删,改,查等 import com.org.vo.Emp; //导入VO数据类 public interface IEmpDAO { //插入操作 public boolean doInsert(Emp emp) throws Exception; //多条查询 public List <Emp> getAll(String keyWord) throws Exception; //Id查询 public Emp getById(int id) throws Exception; }
四. 实现类Impl——实现DAO中的方法
package com.org.dao.impl; import java.sql.ResultSet; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; import com.org.dao.IEmpDAO; import com.org.vo.Emp; /*
DAO接口的真实实现类,完成具体的数据库操作,但是不负责数据库打开和关闭。
*/ public class EmpDAOImpl implements IEmpDAO{ private java.sql.Connection conn=null;//连接对象 private java.sql.PreparedStatement pst=null;//数据库PreparedStatement对象 //构造方法 public EmpDAOImpl(java.sql.Connection conn) { super(); this.conn=conn; } //插入 @Override public boolean doInsert(Emp emp) throws Exception { boolean flag=false; String sql="INSERT INTO emp(id,name,job,hireDate,sal) VALUES(?,?,?,?,?)"; this.pst=this.conn.prepareStatement(sql); this.pst.setInt(1,emp.getId()); this.pst.setString(2, emp.getName()); this.pst.setString(3,emp.getJob()); System.out.println(emp.getHireDate());//打印录入时间 DateFormat df=new SimpleDateFormat("yyyy-MM-dd"); java.util.Date date=df.parse(emp.getHireDate()); //设置时间 this.pst.setDate(4, new java.sql.Date(date.getTime())); this.pst.setFloat(5, emp.getSal()); if(this.pst.executeUpdate()>0)//插入成功 { flag=true; } this.pst.close();//关闭 return flag; } //模糊查询多条 @Override public List<Emp> getAll(String keyWord) throws Exception { List<Emp> all=new ArrayList<Emp>(); String sql="SELECT * FROM emp WHERE name like ? OR job like ?"; this.pst=this.conn.prepareStatement(sql); this.pst.setString(1, "%"+keyWord+"%"); this.pst.setString(2, "%"+keyWord+"%"); ResultSet rs=this.pst.executeQuery(); Emp emp=null; while(rs.next()){ emp=new Emp(); emp.setId(rs.getInt(1)); emp.setName(rs.getString(2)); emp.setJob(rs.getString(3)); emp.setHireDate(rs.getDate(4).toString()); emp.setSal(rs.getFloat(5)); //加入序列List all.add(emp); } return all; } //查询Id @Override public Emp getById(int id) throws Exception { Emp emp=null; String sql="SELECT * FROM emp WHERE id=?"; this.pst=this.conn.prepareStatement(sql); this.pst.setInt(1, id); ResultSet rs=this.pst.executeQuery(); if(rs.next()){ emp=new Emp(); emp.setId(rs.getInt(1)); emp.setName(rs.getString(2)); emp.setJob(rs.getString(3)); emp.setHireDate(rs.getDate(4).toString()); emp.setSal(rs.getFloat(5)); } return emp; } }
五.代理类
package com.org.dao.proxy; import java.util.List; import com.org.dao.IEmpDAO; import com.org.dao.impl.EmpDAOImpl; import com.org.dbc.DataBaseConnection; import com.org.vo.Emp; //代理实现类,主要完成数据库的打开和关闭并且调用真实实现类对象的操作; public class EmpDAOProxy implements IEmpDAO{ private DataBaseConnection dbc=null;//数据库连接类 private IEmpDAO dao=null;//DAO抽象类 //构造函数 public EmpDAOProxy() throws Exception{ //实例化DataBaseConnection和EmpDAOImpl实现类对象 this.dbc=new DataBaseConnection(); this.dao=new EmpDAOImpl(this.dbc.getConnection()); } @Override public boolean doInsert(Emp emp) throws Exception { boolean flag=false; try { //没有找到Id成员,执行插入 if(this.dao.getById(emp.getId())==null) { flag=dao.doInsert(emp); } } catch (Exception e) { throw e; }finally { this.dbc.close(); } return flag; } @Override public List<Emp> getAll(String keyWord) throws Exception { List<Emp> all=null; try { all=this.dao.getAll(keyWord); }catch (Exception e) { throw e; }finally { this.dbc.close(); } return all; } @Override public Emp getById(int id) throws Exception { Emp emp=null; try { emp=this.dao.getById(id); } catch (Exception e) { throw e; }finally { this.dbc.close(); } return emp; } }
六.工厂类
package com.org.factory; import com.org.dao.IEmpDAO; import com.org.dao.proxy.EmpDAOProxy; //工厂类通过工厂类取得一个DAO的实例化对象。 public class DAOFactory { public static IEmpDAO getIEmpDAOInstance() throws Exception{ return new EmpDAOProxy(); } }
验证Insert功能
import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.org.factory.DAOFactory; import com.org.vo.Emp; /**
* Servlet implementation class testInsert
*/ @WebServlet("/testInsert") public class testInsert extends HttpServlet { private static final long serialVersionUID = 1L; /**
* @see HttpServlet#HttpServlet()
*/ public testInsert() { super(); // TODO Auto-generated constructor stub } /**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/ @SuppressWarnings("null") protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Emp emp=new Emp(); for(int i=0;i<5;i++) { emp.setId(i); emp.setName("Jack"+i); emp.setJob("Job"+i); emp.setHireDate("2020-07-02"); emp.setSal(10000); try { DAOFactory.getIEmpDAOInstance().doInsert(emp); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } /**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }
模糊查询
import java.io.BufferedReader; import java.io.IOException; import java.nio.Buffer; import java.util.Iterator; import java.util.List; import java.util.Scanner; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.catalina.connector.InputBuffer; import com.org.factory.DAOFactory; import com.org.vo.Emp; /**
* Servlet implementation class testGet
*/ @WebServlet("/testGet") public class testGet extends HttpServlet { private static final long serialVersionUID = 1L; /**
* @see HttpServlet#HttpServlet()
*/ public testGet() { super(); // TODO Auto-generated constructor stub } /**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { List<Emp> allEmps = null; try { allEmps = DAOFactory.getIEmpDAOInstance().getAll("Jack"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } Iterator<Emp> iterator=allEmps.iterator(); while(iterator.hasNext()) { Emp emp=iterator.next(); System.out.println(emp.getId()+" "+emp.getName()+" "+emp.getJob()+" "+emp.getHireDate()+" "+emp.getSal()); } } /**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }
本文地址:https://blog.csdn.net/weixin_44307065/article/details/107077375