DAO模式的优势在哪?
这是DAO模式的代码:
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; }}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;}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); } } }}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(); }}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; }}
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(); } }}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; }}
[解决办法]
DAO 模式可以提供更好的解糯,将业务逻辑层与持久层访问技术分离,使业务逻辑
层无须关注底层数据库访问的实现。使用DAO 模式主要有如下优势。
? DAO 模式可抽象出数据访问方式,在BO 访问数据源时,完全感觉不到数据源的
存在。软件工程里面有一条很重要的法则,就是一个对象对其他对象的了解越少
越好,了解越少就意味着依赖越少,可复用性越高。
? DAO 将数据访问集中在独立的一层。因为所有的数据访问都由DAO 代理,这层
独立的DAO 就将数据访问的实现与系统的其余部分剥离,将数据访问集中使得
系统更具可维护性。
? DAO 还降低了BO 层的复杂程度。由DAO 管理复杂的数据访问,从而简化了BO 。
所有与数据访问实现有关的代码(如SQL 语言等)都不用写在BO 里,从而使
BO 可以集中精力处理业务逻辑,提高了代码的可读性和生产率。
? DAO 还有助于提升系统的可移植性。独立的DAO 层使得系统能在不同的数据库
之间轻易切换,底层的数据库实现对于BO 来说是不可见的。数据移植时影响的
仅仅是DAO 层,切换不同的数据库并不会影响BO ,因此提高了系统的可复用性。
[解决办法]
很小的系统,分层了 只会增加代码的复杂度;
需求稳定的系统,分层 也只会增加代码的复杂度;
大系统,牛逼的系统,不分层,就等着分人来维护吧;
分层,是一个隔离的概念,没层处理每层的事情,变化有可能只影响到一层,比如业务逻辑变化只在service层;持久层 基本不影响,因为他逻辑很问题就是 c/r/u/d
封装变化点,利于维护;
代码清晰了,维护方便了,就少了骂娘的声音......
[解决办法]
????为什么我的回复显示不出来?