Java之dao模式详解及代码示例
什么是dao模式?
DAO(DataAccessObject)顾名思义是一个为数据库或其他持久化机制提供了抽象接口的对象,在不暴露底层持久化方案实现细节的前提下提供了各种数据访问操作。在实际的开发中,应该将所有对数据源的访问操作进行抽象化后封装在一个公共API中。用程序设计语言来说,就是建立一个接口,接口中定义了此应用程序中将会用到的所有事务方法。在这个应用程序中,当需要和数据源进行交互的时候则使用这个接口,并且编写一个单独的类来实现这个接口,在逻辑上该类对应一个特定的数据存储。DAO模式实际上包含了两个模式,一是DataAccessor(数据访问器),二是DataObject(数据对象),前者要解决如何访问数据的问题,而后者要解决的是如何用对象封装数据。
一、信息系统的开发架构
客户层-------显示层-------业务层---------数据层---------数据库
1.客户层:客户层就是客户端,简单的来说就是浏览器。
2.显示层:JSP/Servlet,用于给浏览器显示。
3.业务层:对于数据层的原子操作进行整合。
4.数据层:对于数据库进行的原子操作,增加、删除等;
二、DAO(DataAccessObject)介绍
DAO应用在数据层那块(对于数据库进行的原子操作,增加、删除等;),用于访问数据库,对数据库进行操作的类。
三、DAO设计模式的结构
DAO设计模式一般分为几个类:
1.VO(ValueObject):一个用于存放网页的一行数据即一条记录的类,比如网页要显示一个用户的信息,则这个类就是用户的类。
2.DatabaseConnection:用于打开和关闭数据库。
3.DAO接口:用于声明对于数据库的操作。
4.DAOImpl:必须实现DAO接口,真实实现DAO接口的函数,但是不包括数据库的打开和关闭。
5.DAOProxy:也是实现DAO接口,但是只需要借助DAOImpl即可,但是包括数据库的打开和关闭。
6.DAOFactory:工厂类,含有getInstance()创建一个Proxy类。
四、DAO的好处
DAO的好处就是提供给用户的接口只有DAO的接口,所以如果用户想添加数据,只需要调用create函数即可,不需要数据库的操作。
五、DAO包命名
对于DAO,包的命名和类的命名一定要有层次。
1.Emp.Java
packageorg.vo;
importjava.util.*;
publicclassEmp{
privateintempno;
privateStringename;
privateStringjob;
privateDatehireDate;
privatefloatsal;
publicEmp(){
}
publicintgetEmpno(){
returnempno;
}
publicvoidsetEmpno(intempno){
this.empno=empno;
}
publicStringgetEname(){
returnename;
}
publicvoidsetEname(Stringename){
this.ename=ename;
}
publicDategetHireDate(){
returnhireDate;
}
publicvoidsetHireDate(DatehireDate){
this.hireDate=hireDate;
}
publicfloatgetSal(){
returnsal;
}
publicvoidsetSal(floatsal){
this.sal=sal;
}
publicStringgetJob(){
returnjob;
}
publicvoidsetJob(Stringjob){
this.job=job;
}
}
2.DatabaseConnection.java
packageorg.dbc;
importjava.sql.*;
publicclassDatabaseConnection{
privateConnectioncon=null;
privatestaticfinalStringDRIVER="com.mysql.jdbc.Driver";
privatestaticfinalStringUSER="root";
privatestaticfinalStringURL="jdbc:mysql://localhost:3306/mldn";
privatestaticfinalStringPASS="12345";
publicDatabaseConnection()throwsException{
Class.forName(DRIVER);
con=DriverManager.getConnection(URL,USER,PASS);
}
publicConnectiongetConnection()throwsException{
returncon;
}
publicvoidclose()throwsException{
if(con!=null){
con.close();
}
}
}
3.IEmpDAO.java
packageorg.dao;
importjava.util.List;
importorg.vo.*;
publicinterfaceIEmpDAO{
publicbooleandoCreate(Empemp)throwsException;
publicListfindAll()throwsException;
publicEmpfindById(intempno)throwsException;
}
4.EmpDAOImpl.java
packageorg.dao.impl;
importorg.dao.*;
importjava.sql.*;
importorg.vo.*;
importjava.util.*;
publicclassEmpDAOImplimplementsIEmpDAO{
privateConnectioncon;
privatePreparedStatementstat=null;
publicEmpDAOImpl(Connectioncon){
this.con=con;
}
publicbooleandoCreate(Empemp)throwsException{
Stringsql="INSERTINTOemp(empno,ename,job,hiredate,sal)VALUES(?,?,?,?,?)";
stat=con.prepareStatement(sql);
stat.setInt(1,emp.getEmpno());
stat.setString(2,emp.getEname());
stat.setString(3,emp.getJob());
stat.setDate(4,newjava.sql.Date(emp.getHireDate().getTime()));
stat.setFloat(5,emp.getSal());
intupdate=stat.executeUpdate();
if(update>0){
returntrue;
}
else{
returnfalse;
}
}
publicListfindAll()throwsException{
Stringsql="SELECTempno,ename,job,hiredate,salFROMemp";
stat=con.prepareStatement(sql);
ResultSetrs=stat.executeQuery();
Empemp=null;
Listlist=newArrayList();
while(rs.next()){
intempno=rs.getInt(1);
Stringename=rs.getString(2);
Stringjob=rs.getString(3);
floatsal=rs.getFloat(5);
emp=newEmp();
emp.setEmpno(empno);
emp.setEname(ename);
emp.setJob(job);
emp.setHireDate(rs.getDate(4));
emp.setSal(sal);
list.add(emp);
}
returnlist;
}
publicEmpfindById(intempno)throwsException{
Stringsql="SELECTempno,ename,job,hiredate,salFROMempWHEREempno=?";
stat=con.prepareStatement(sql);
stat.setInt(1,empno);
ResultSetrs=stat.executeQuery();
Empemp=null;
if(rs.next()){
Stringename=rs.getString(2);
Stringjob=rs.getString(3);
floatsal=rs.getFloat(5);
emp=newEmp();
emp.setEmpno(empno);
emp.setEname(ename);
emp.setJob(job);
emp.setHireDate(rs.getDate(4));
emp.setSal(sal);
}
returnemp;
}
}
5.EmpDAOProxy.java
packageorg.dao.impl;
importorg.dao.*;
importjava.sql.*;
importorg.vo.*;
importjava.util.*;
importorg.dbc.*;
publicclassEmpDAOProxyimplementsIEmpDAO{
privateDatabaseConnectiondbc;
privateIEmpDAOdao=null;
publicEmpDAOProxy()throwsException{
dbc=newDatabaseConnection();
dao=newEmpDAOImpl(dbc.getConnection());
}
publicbooleandoCreate(Empemp)throwsException{
booleanflag=false;
if(dao.findById(emp.getEmpno())==null){
flag=dao.doCreate(emp);
}
dbc.close();
returnflag;
}
publicListfindAll()throwsException{
Listlist=dao.findAll();
dbc.close();
returnlist;
}
publicEmpfindById(intempno)throwsException{
Empemp=dao.findById(empno);
dbc.close();
returnemp;
}
}
6.DAOFactory.java
packageorg.dao.factory;
importorg.dao.*;
importjava.sql.*;
importorg.vo.*;
importjava.util.*;
importorg.dbc.*;
importorg.dao.impl.*;
publicclassDAOFactory{
publicstaticIEmpDAOgetInstance(){
IEmpDAOdao=null;
try{
dao=newEmpDAOProxy();
}
catch(Exceptione){
e.printStackTrace();
}
returndao;
}
}
7.TestDAO.java
packageorg.dao.test;
importorg.dao.factory.*;
importorg.vo.*;
importorg.dao.*;
publicclassTestDAO{
publicstaticvoidmain(Stringargs[])throwsException{
Empemp=null;
for(inti=0;i<5;i++){
emp=newEmp();
emp.setEmpno(i);
emp.setEname("xiazdong-"+i);
emp.setJob("stu-"+i);
emp.setHireDate(newjava.util.Date());
emp.setSal(500*i);
DAOFactory.getInstance().doCreate(emp);
}
}
}
通过DAO设计模式,可以在JSP中屏蔽了数据库连接的操作,达到JSP只负责显示的效果。
//对应 Stringsql="INSERTINTOemp_table(ename,job,sal,hiredate)VALUES(?,?,?,?)"; stat=(PreparedStatement)con.prepareStatement(sql); stat.setString(1,emp.getEname()); stat.setString(2,emp.getJob()); stat.setFloat(3,emp.getSal());
总结
以上就是本文关于Java之dao模式详解及代码示例的全部内容,希望对大家有所帮助,欢迎参阅:Java设计模式笔记之抽象工厂代码示例、Java多线程之线程通信生产者消费者模式及等待唤醒机制代码详解、Java单例模式实现静态内部类方法示例等,有什么问题可以随时留言,感谢大家!