标签:
最近上课,老师提到DAO,也是因为后面做作业的需要,就花了一点时间,来看一下DAO,也只是泛泛而谈,自己学习的一些总结,也希望给想学习的新手一些帮助吧。
1。什么是DAO
说来说去,DAO到底是什么呢?神神秘秘的,让我们来一层层的解开她的面纱。在核心J2EE模式中是这样介绍的:为了建立一个健壮的J2EE应用,应该将所有对数据源的访问操作抽象封装在一个公共的API当中。用程序设计的语言来说,就是建立一个接口,接口中定义了此应用程序中将会用到的所有事物方法。在这个应用程序中,当需要和数据源进行交互的时候就使用这个接口,并且编写一个单独的类来实现这个接口在逻辑上对应这个特定的数据存储。 总之,DAO就是应用在数据层一块,用来访问数据库,并且对数据库进行操作的类
2.JAVA DAO的设计模式
JAVA DAO的设计模式一般分为几个类: 1.一个DAO工厂类 2.一个DAO接口, 3.一个实现DAO接口的具体类 4.数据传输对象可能这边说的还是有一些抽象,话不多说,我们来看看DAO设计模式的具体实现
3.JAVA DAO设计模式的实现
DAO设计模式的实现大同小异:
1.抽象工厂
抽象工厂类包含两个部分,第一部分包括一些抽象方法,这些方法是所有实现该抽象工厂的具体工厂类所必须实现的。第二部分是一个静态方法,该方法用来创建一个具体类型数据源的工厂对象
//首先需要工厂定义DAO的每一个类型
public abstract class DAOFactory{ public static final int CLOUDSCAPE = 1; public static final int ORACLE = 2; public static final int SYBASE = 3; }
2.实现这个抽象工产的工厂类必须要有的方法,用这些方法来创建具体的DAO类,必须要有的代码
创建各个类型数据源的工厂类,实现在他继承的那个抽象工厂类中的抽象方法。
public abstract CustomerDAO getCustomerDAO(); public abstract AccountDAO getAccountDAO(); public abstract OrderDAO getOrderDAO();
3.创建具体的DAO工厂类,
public static DAOFactory getDAOFactory(int whichFactory){ switch(whichFactory){ case CLOUDSCAPE: return new CloudscapeDAOFactory(); case ORACLE: return new OracleDAOFactory(); case SYBASE: return new SybaseDAOFactory(); } }
定义具体DAO类的接口,并在接口中定义所有的业务方法,和数据操作方法,定义具体的DAO类,在这个类中是实际的业务方法和数据的操作的实现
4.CloudscapeDAOFactory类,在这个类中,实现了该类型的数据库的链接,以及实现了他所继承的抽象工厂类中所必须实现的那些方法,在这些方法中创具体的DAO对象。定义数据传输对象,它是用来在客户端和DAO之间传递数据的
public class CloudscapeDAOFactory extends DAOFactory{ public static final String DRIVER = ""; public static final String DBURL = ""; //建立Cloudscape连接 public static Connection createConnection(){ } public CustomerDAO getCustomerDAO(){} public AccountDAO getAccountDAO(){} public OrderDAO getOrderDAO(){} }
最后加上一些源代码帮助大家理解
1.首先是一个连接工厂,用来连接数据库,这样一来,方便后面的调用
public class ConnectionFactory { public static Connection getConnection(String className){ Connection conn = null; try{ String url = "jdbc:sqlserver//localhost:1433;databasename=wa"; Class.forName(className); conn = DriverManager.getConnection(url,"sa","1203"); }catch(Exception e){ } return conn; } }
2.AbstractDate类对操作符进行分装,这样子,当以后还有别的数据库需要这些操作的时候可以直接使用这个类,很显然,这个类返定义了增删改,方便用户使用。同时,定义了getOpercode()和setOperacode()方法,使得操作符可以从外部读取,并进行操作。
public abstract class AbstractDate { protected byte opercode; public static final byte ADD = 10; public static final byte DELETE = 20; public static final byte UPDATE = 30; public byte getOpercode() { return opercode; } public void setOpercode(byte opercode) { this.opercode = opercode; } }
3.新建了一个user这个数据库,对应的新建一个这个user类,因为这个类需要用到AbstractDate,继承AbstractDate类。这个user类中定义了三个私有属性user_name user_password user_role,每个属性都需要有对应的set和get方法,方便以后对数据的防范和修改,同时因为继承了AbstractDate,所以三个属性都可以调用其中的方法。
public class User extends AbstractDate{ private String user_name; private String user_password; private byte user_role; public String getUser_name() { return user_name; } public void setUser_name(String user_name) { this.user_name = user_name; } public String getUser_password() { return user_password; } public void setUser_password(String user_password) { this.user_password = user_password; } public byte getUser_role() { return user_role; } public void setUser_role(byte user_role) { this.user_role = user_role; } }
4.如何实现具体的工厂类呢?因为对于每一个工厂,都需要有增删改的功能,我们就想,为什么不把这些共同的方法放到一起?因此想到了定义一个抽象的DAO类,方便以后所有的DAO去实现。这个DAO类实现了哪些功能?
public abstract class AbstractDAO { @SuppressWarnings("null") protected String[] getColumnNames(String sql){ Connection conn = null; PreparedStatement pstm = null; /*PreparedStatement使sql语句准备好,包含于PreparedStatement语句中的sql语句可以有多个参数,这些 *参数的值在创建的时候未被指定,相反每一个参数保留一个?作为占位符,每一个?都通过setXXX来传值/* ResultSet rs = null; /*结果集是数据中查询结果返回的一种对象,可以说这个存储数据查询的对象,但是同时结果集也可以操纵数据,完 成对数据的更新 */ String[] columnNames = null; try{ pstm = conn.prepareStatement(sql); rs = pstm.executeQuery(); /*executeQuery()方法适用于SELECT等查询资料库的SQL,executeQuery()会传回ResultSet物件 代表变更或查询的结果,查询的结果会是一笔一笔的资料。 */ ResultSetMetaData rsmd = rs.getMetaData(); int cols = rsmd.getColumnCount(); columnNames = new String[cols + 3]; for(int i = 0; i < cols; i++){ columnNames[i] = rsmd.getColumnName(i + 1); } columnNames[cols] = "add"; columnNames[cols + 1] = "delete"; columnNames[cols + 2] = "update"; }catch(Exception e){ }finally{ try{ if(rs != null){ rs.close(); } if(pstm != null){ pstm.close(); } if(conn != null){ conn.close(); } }catch(Exception e){ } } return columnNames; } public String editRecords(ArrayList<AbstractDate> records){ ArrayList<AbstractDate> addList = new ArrayList<AbstractDate>(); ArrayList<AbstractDate> deleteList = new ArrayList<AbstractDate>(); ArrayList<AbstractDate> updateList = new ArrayList<AbstractDate>(); int size = records.size(); for(int index = 0; index < size; index++){ AbstractDate d = records.get(index); byte opercode = d.getOpercode(); switch(opercode){ case AbstractDate.ADD: addList.add(d); break; case AbstractDate.DELETE: deleteList.add(d); break; case AbstractDate.UPDATE: updateList.add(d); break; } } int add = 0; int delete = 0; int update = 0; Connection conn = null; try{ conn = ConnectionFactory.getConnection(null); boolean old = conn.getAutoCommit(); conn.setAutoCommit(false); add = addRecords(conn,addList); delete = deleteRecords(conn,deleteList); update = updateRecords(conn,updateList); conn.commit(); conn.setAutoCommit(old); }catch(Exception e){ try{ conn.rollback(); }catch(Exception ex){ } }finally{ try{ if(conn != null){ conn.close(); } }catch(Exception ex){ } } StringBuffer buffer = new StringBuffer(); buffer.append("成功添加" + add + "条记录,成功删除" + delete + "条记录,成功修改" + update + "条记录"); return buffer.toString(); } protected abstract int addRecords(Connection conn,ArrayList<AbstractDate> records); protected abstract int deleteRecords(Connection conn,ArrayList<AbstractDate> records); protected abstract int updateRecords(Connection conn,ArrayList<AbstractDate> records); public abstract String[] getColumnNames(); }
5.每一个明确DAO类继承上一个抽象类并去实现具体的类,继承所有的增删改的方法,具体功能要具体实现。
public class RoleDAO extends AbstractDAO { @Override protected int addRecords(Connection conn, ArrayList<AbstractDate> records) { // TODO Auto-generated method stub return 0; } @Override protected int deleteRecords(Connection conn, ArrayList<AbstractDate> records) { // TODO Auto-generated method stub return 0; } @Override protected int updateRecords(Connection conn, ArrayList<AbstractDate> records) { // TODO Auto-generated method stub return 0; } @Override public String[] getColumnNames() { // TODO Auto-generated method stub String sql = "select role_id,role_name from roles"; return getColumnNames(sql); } }
JAVA DAO(Data Access Object)的个人总结
标签:
原文地址:http://my.oschina.net/u/2391943/blog/482533