首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

DAO形式的优势在哪

2012-08-19 
DAO模式的优势在哪?这是DAO模式的代码:Java codepackage cn.jbit.vo/** *宠物类 */public class Pet {pri

DAO模式的优势在哪?
这是DAO模式的代码:

Java code
package cn.jbit.vo;/** *  宠物类 */public class Pet {    private int id;//宠物id    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }        private int masterId;//主人id    public int getMasterId() {        return masterId;    }    public void setMasterId(int masterId) {        this.masterId = masterId;    }        private String name;//昵称    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }        private int typeId;//类型id    public int getTypeId() {        return typeId;    }    public void setTypeId(int typeId) {        this.typeId = typeId;    }        private int health;//健康值    public int getHealth() {        return health;    }    public void setHealth(int health) {        this.health = health;    }        private int love ;//亲密度    public int getLove() {        return love;    }    public void setLove(int love) {        this.love = love;    }        private String adoptTime;//领养时间    public String getAdoptTime() {        return adoptTime;    }    public void setAdoptTime(String adoptTime) {        this.adoptTime = adoptTime;    }        private int status;//状态    public int getStatus() {        return status;    }    public void setStatus(int status) {        this.status = status;    }}


Java code
package cn.jbit.dao;import java.util.List;import cn.jbit.vo.Pet;/** * 接口 */public interface IPetDAO {    public boolean doCreate(Pet pet)throws Exception;    public List<Pet>findInfo(int keyword)throws Exception;}


Java code
package cn.jbit.dbc;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import org.apache.log4j.Logger;/** *  数据库连接 */public class DataBaseConnection {    //记录日志    private Logger logger = Logger.getLogger(DataBaseConnection.class);    private static final String driverClassName = "oracle.jdbc.driver.OracleDriver";  //驱动字符串    private static final String url = "jdbc:oracle:thin:@127.0.0.1:1521:oracle10";  //连接字符串    private static final String user = "admin";    private static final String password = "admin";    private Connection conn = null;        public DataBaseConnection()throws Exception{        Class.forName(driverClassName);        this.conn = DriverManager.getConnection(url,user,password);        logger.debug("连接成功");    }        public Connection getConnection(){        return this.conn;    }        /**     * 关闭连接     */    public void close(){        if(null!=conn){            try {                conn.close();            } catch (SQLException e) {                System.out.println(e);            }        }    }}

Java code
package cn.jbit.factory;import cn.jbit.Proxy.PetDaoProxy;import cn.jbit.dao.IPetDAO;public class factory {    public static IPetDAO getIpetDAOinstance()throws    Exception{        return new PetDaoProxy();    }}


Java code
package cn.jbit.impl;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.util.ArrayList;import java.util.List;import cn.jbit.dao.IPetDAO;import cn.jbit.vo.Pet;public class PetDaoImpl implements IPetDAO {    Connection conn = null;    PreparedStatement patmt = null;    ResultSet rs = null;        public PetDaoImpl(Connection conn){        this.conn = conn;    }    public boolean doCreate(Pet pet) throws Exception {        boolean flag = false;        String sql = "insert into pet values(pet_sep.nextval,?,?,?,?,?,sysdate,?)";        this.patmt = this.conn.prepareStatement(sql);        this.patmt.setInt(1, pet.getMasterId());        this.patmt.setString(2, pet.getName());        this.patmt.setInt(3,pet.getTypeId());        this.patmt.setInt(4, pet.getHealth());        this.patmt.setInt(5, pet.getLove());        this.patmt.setInt(6, pet.getStatus());        if(this.patmt.executeUpdate()>0){                        System.out.println("插入成功");            flag = true;        }         return flag;    }    public List<Pet> findInfo(int keyword) throws Exception {        List<Pet> list = new ArrayList<Pet>();        String sql = "select id,master_id,name,health,love from pet where id = ?";        this.patmt = this.conn.prepareStatement(sql);        this.patmt.setInt(1, keyword);        rs = this.patmt.executeQuery();        Pet pet = new Pet();        while(rs.next()){            pet = new Pet();            pet.setId(rs.getInt(1));            pet.setMasterId(rs.getInt(2));            pet.setName(rs.getString(3));            pet.setHealth(rs.getInt(4));            pet.setLove(rs.getInt(5));        }        list.add(pet);        System.out.println("***狗狗***");        System.out.println("编号\t主人编号\t名字\t健康值\t亲密度");            System.out.print(pet.getId()+"\t");            System.out.print(pet.getMasterId()+"\t");            System.out.print(pet.getName()+"\t");            System.out.print(pet.getHealth()+"\t");            System.out.print(pet.getLove()+"\n");        this.patmt.close();        return list;    }} 


Java code
package cn.jbit.Test;import cn.jbit.factory.factory;import cn.jbit.vo.Pet;public class Test {    /**     * @param args     */    public static void main(String[] args) {         Pet pet=new Pet();           pet.setMasterId(1);           pet.setName("СС");           pet.setTypeId(1);           pet.setHealth(85);           pet.setLove(100);           pet.setStatus(1);           try {               factory.getIpetDAOinstance().doCreate(pet);        } catch (Exception e) {            e.printStackTrace();        }    }}


普通的代码:
Java code
import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.util.*;/** * 测试类 * */public class Test {    public static void main(String[] args) {            Scanner input = new Scanner(System.in);        System.out.print("请输入你要查询的编号:");        int no = input.nextInt();        try {            serachData(no);        } catch (Exception e) {            System.err.println(e);        }    }    /**     * 按编号查询狗狗的信息     * @param no     * @throws Exception     */    public static void serachData(int no) throws Exception{        Connection connection = Connection();        PreparedStatement pstms = null;        ResultSet rs = null;        String sql = "select id,master_id,name,health,love from pet where id = ?";        pstms = connection.prepareStatement(sql);        pstms.setInt(1, no);        rs = pstms.executeQuery();        System.out.println("***狗狗***");        System.out.println("编号\t主人编号\t名字\t健康值\t亲密度");        while(rs.next()){            System.out.println(rs.getInt(1)+"\t"+rs.getInt(2)+"\t"+rs.getString(3)+"\t"+rs.getInt(4)+"\t"+rs.getInt(5));        }    }    /**     * 连接的方法     * @return conn     * @throws Exception     */    public static Connection Connection() throws Exception{        Connection conn = null;        if(conn == null){            Class.forName("oracle.jdbc.driver.OracleDriver");            conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:oracle10","admin","admin");            System.out.println("连接成功");        }        return conn;    }}


虽然学了OOP编程思想,但感觉DAO模式和普通代码没什么区别,反而没用模式的代码还简单一点。
有点迷惑...
就算在普通代码里扩展其他功能,不用改其他方法。也可以实现。
说白了,在普通代码中只要有一个方法或一个类的改动能影响到其他方法、类。有实例来证明。 谢谢!

[解决办法]
那是你的系统还太简单:
如果有N个DAOImpl都统一有IPetDAO接口的功能,你分发给程序员去做,按你规定的接口规格开发.
你觉得得有必要吗?

他们只要implements IPetDAO,系统就会给他们规定好方法格式,而且实现了多态,对系统扩充有很大帮助.


[解决办法]
是的,可以实现,但是在大型的项目开发中,不是一个人开发的,那么多人协作的这种开发模式这种做法显然不合适,这主要体香分层的思想,不同的层次处理不同的事情,想DAO层主要处理与数据库的交互,service主要处理业务逻辑,service层调用DAO层提供的接口,不用管他的实现!
在维护的时候这种方式也是很好的,可以很快找到责任出在哪里!~
[解决办法]
DAO模式作为与数据库打交道的东西,他只关注怎么将数据写入数据库,和怎么取出来.
作为DAO中的数据类型他不依赖于任何技术,jdbc也好,hibernate也好,他对你底层的访问提供了很好的支持
例如:UserDao(Interface)
这个时候你可以实现一个UserDaoJdbcImp,也可以实现UserDaoHibernateImp,
在这一层,我们不关心具体的业务逻辑,可以进行单独的测试,是一个独立的模块.利于分工.
而在service层次上,我们更加关注业务,我们要保证业务的完整性,和数据的一制性,我们并不关心底层是jdbc还是hibernate,在这里我们需要向UI层提供Bussiness Logic,也许以后你的实现将会更改成为分布的,需要调用EJB,JMS,或者,webservice,那么我们替换掉serviceImp即可.
通过实现DAO,我们达到了解耦合的目的,达到了饮场实现的目的,使的程序更加的健壮,虽然复杂性是增加了.
 
这样说比较抽象,或许你还没明白,特别时(当你的开发中只涉及到一种数据库链接方式hibernate,jdbc或其它的;又或者当你的开发每个service中只涉及一个dao,不牵涉多个表操作,但这种情况比较少)你还是会觉得dao的作用不大。
 
但是,以软件开发思想及面向对象思想考虑,dao还是有必要的——特别是对于比较大型的项目时,分工比较细,为了方便后期维护。当然,没有绝对的技术,开发时应该看需要,看环境灵活应用.


[解决办法]
DAO 模式可以提供更好的解糯,将业务逻辑层与持久层访问技术分离,使业务逻辑
层无须关注底层数据库访问的实现。使用DAO 模式主要有如下优势。


? DAO 模式可抽象出数据访问方式,在BO 访问数据源时,完全感觉不到数据源的
存在。软件工程里面有一条很重要的法则,就是一个对象对其他对象的了解越少
越好,了解越少就意味着依赖越少,可复用性越高。

? DAO 将数据访问集中在独立的一层。因为所有的数据访问都由DAO 代理,这层
独立的DAO 就将数据访问的实现与系统的其余部分剥离,将数据访问集中使得
系统更具可维护性。

? DAO 还降低了BO 层的复杂程度。由DAO 管理复杂的数据访问,从而简化了BO 。
所有与数据访问实现有关的代码(如SQL 语言等)都不用写在BO 里,从而使
BO 可以集中精力处理业务逻辑,提高了代码的可读性和生产率。


? DAO 还有助于提升系统的可移植性。独立的DAO 层使得系统能在不同的数据库
之间轻易切换,底层的数据库实现对于BO 来说是不可见的。数据移植时影响的
仅仅是DAO 层,切换不同的数据库并不会影响BO ,因此提高了系统的可复用性。

[解决办法]
很小的系统,分层了 只会增加代码的复杂度;
需求稳定的系统,分层 也只会增加代码的复杂度;

大系统,牛逼的系统,不分层,就等着分人来维护吧;

分层,是一个隔离的概念,没层处理每层的事情,变化有可能只影响到一层,比如业务逻辑变化只在service层;持久层 基本不影响,因为他逻辑很问题就是 c/r/u/d

封装变化点,利于维护;

代码清晰了,维护方便了,就少了骂娘的声音......
[解决办法]
????为什么我的回复显示不出来?

热点排行