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
;
public class Emp {
private int 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
;
}
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
;
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";
private static final String DBUSER
="root";
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
;
public interface IEmpDAO {
public boolean doInsert(Emp emp
) throws Exception
;
public List
<Emp> getAll(String keyWord
) throws Exception
;
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
;
public class EmpDAOImpl implements IEmpDAO{
private java
.sql
.Connection conn
=null
;
private java
.sql
.PreparedStatement pst
=null
;
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));
all
.add(emp
);
}
return all
;
}
@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
;
public EmpDAOProxy() throws Exception
{
this.dbc
=new DataBaseConnection();
this.dao
=new EmpDAOImpl(this.dbc
.getConnection());
}
@Override
public boolean doInsert(Emp emp
) throws Exception
{
boolean flag
=false;
try {
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
;
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
;
@WebServlet("/testInsert")
public class testInsert extends HttpServlet {
private static final long serialVersionUID
= 1L
;
public testInsert() {
super();
}
@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
) {
e
.printStackTrace();
}
}
}
protected void doPost(HttpServletRequest request
, HttpServletResponse response
) throws ServletException
, IOException
{
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
;
@WebServlet("/testGet")
public class testGet extends HttpServlet {
private static final long serialVersionUID
= 1L
;
public testGet() {
super();
}
protected void doGet(HttpServletRequest request
, HttpServletResponse response
) throws ServletException
, IOException
{
List
<Emp> allEmps
= null
;
try {
allEmps
= DAOFactory
.getIEmpDAOInstance().getAll("Jack");
} catch (Exception e
) {
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());
}
}
protected void doPost(HttpServletRequest request
, HttpServletResponse response
) throws ServletException
, IOException
{
doGet(request
, response
);
}
}