DAO,接口,工厂模式,java类的动态加载,ioc

    技术2022-05-11  13

    这里贴出来的是写得一些具体得例子,java类,也是从头到尾改进其dao得过程。

    1,

    DAO就是数据访问对象,一般来说我们就是在其中封装一些对数据库的操作,比如插入,修改,查询等,几乎所

    有的DAO都避免不了这些操作,那么我们应该很自然的想到Interface--接口。我们应该定义一个标准的DAO接口

    ,然后让所有的DAO都实现这个接口。我写DAO如下,

     

    package cn.xp1204.dao;

    import java.util.HashMap;import java.util.List;

    import cn.xp1204.hibernate.util.Pager;

    //这里的pager类是一个实现hibernate翻页的类,里面包含了页的所有信息和本页的数据

     

    /** * 类说明 * * @author xp1204  E-mail: xp1204@gmail.com * @version 创建时间:2009-2-17 下午01:44:42 * @see 相关 */public interface DAO { public int save(Object obj) throws Exception; public int del(Object obj) throws Exception; public Object get(long id) throws Exception; public Object get(String id) throws Exception; public List select() throws Exception; public void setPager(HashMap map) throws Exception; //这个是根据map中的参数实现分页查询 public Pager getPager() throws Exception;//这个是取分页数据}

     

    2,接口设计好了,接下来就是实现具体DAO,这里做了个DAO,如下package cn.xp1204.dao;

    import java.util.HashMap;import java.util.List;

    import org.apache.log4j.Logger;import org.hibernate.Session;

    import cn.xp1204.hibernate.Sport;import cn.xp1204.hibernate.util.Pager;import cn.xp1204.struts.form.PatSportForm;

    /** * 类说明 * * @author xp1204  E-mail: xp1204@gmail.com * @version 创建时间:2009-2-17 下午01:54:18 * @see 相关 */public class SportDAO implements DAO {  public static Logger log = Logger.getLogger(SportDAO.class);    Session session; public SportDAO(Session session) {  log.info("create SportDao...");  this.session = session;  // TODO Auto-generated constructor stub }

     public int del(Object obj) {   return 0; }

     /**  * 活动类型  *   * @param session  * @param fm  */ public int save(Object fm1) {  log.info("save sport object");    return rev; }

     public Object get(String id) {  // TODO Auto-generated method stub    return obj; }

     public List select() {  List list = session.createQuery(    "from Sport a").list();  // TODO Auto-generated method stub  return list; }

     public Object get(long id) {  // TODO Auto-generated method stub  return null; }

     public Pager getPager() throws Exception {  // TODO Auto-generated method stub  return null; }

     public void setPager(HashMap map) throws Exception {  // TODO Auto-generated method stub   }

    }

     

    以上就是代码,主要的工作就试根据情况完成每个方法的实现,我没必要一一写完了。

    3,接口好了,具体的DAO也实现了,现在就试使用了,这里就了下说工厂模式,这个我相信大部分都还是了解的

    。DAO的工厂类如下package cn.xp1204.dao;

    import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStream;import java.lang.reflect.Constructor;import java.lang.reflect.InvocationTargetException;import java.util.Iterator;import java.util.List;import java.util.Properties;

    import org.apache.log4j.Logger;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Element;import org.dom4j.io.SAXReader;import org.hibernate.Session;

    import cn.xp1204.servlet.InitServlet;

    /** * 类说明 *  * @author xp1204 E-mail: xp1204@gmail.com * @version 创建时间:2009-2-17 下午01:40:50 * @see 相关 */public final class DAOFactory{ public static Logger log = Logger.getLogger("");

     private static ClassLoader classLoader;

     public DAOFactory() {

     }

      public static DAO getDAO(Session session, String daoName) {

      if (("SportDAO").equals(daoName)) {   return new SportDAO(session);  }

      

        return null;

     } 

    }

    到这一步,结构基本就好了。然后就是调用。

    4,在需要使用道DAO的地方,代码如下DAOFactory.getDAO(session,"SportDAO").save(fm);根据需要的具体的dao通过dao工厂去获取实例,然后执行相应的方法。

    这个条理应该是比较清楚的,工厂模式的优点我就不说了,大家去网上查,大把的资料。

    5,java类的动态加载。将工厂类在升级下,就用到java类的动态加载方法,我们在工厂类中补充

    下,加一个方法loadDAO,如下

    package cn.xp1204.dao;

    import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStream;import java.lang.reflect.Constructor;import java.lang.reflect.InvocationTargetException;import java.util.Iterator;import java.util.List;import java.util.Properties;

    import org.apache.log4j.Logger;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Element;import org.dom4j.io.SAXReader;import org.hibernate.Session;

    /** * 类说明 *  * @author xp1204 E-mail: xp1204@gmail.com * @version 创建时间:2009-2-17 下午01:40:50 * @see 相关 */public final class DAOFactory{ public static Logger log = Logger.getLogger("");

     private static ClassLoader classLoader;

     public DAOFactory() {

     }

     public static DAO loadDAO(Session session, String daoName) {  // Object implClass = null ;  DAO dao = null;  String implClassName = "";  SAXReader reader = new SAXReader();  Document doc = null;  try {   doc = reader.read(new FileInputStream("daoMap.xml"));   //daoMap.xml得内容请见后面  } catch (FileNotFoundException e2) {   // TODO Auto-generated catch block   e2.printStackTrace();  } catch (DocumentException e2) {   // TODO Auto-generated catch block   e2.printStackTrace();  }

      String xpath = "/daos/dao";  List list = doc.selectNodes(xpath);    for (Iterator i = list.iterator(); i.hasNext();) {   Element e = (Element) i.next();      if (daoName.equals(e.attributeValue("name"))){        implClassName = e.attributeValue("class");     break;   }   

      }

      Class daoClass = null;  try {   classLoader = DAOFactory.class.getClassLoader();      daoClass = classLoader.loadClass(implClassName);   log.info("load class ok:"+ implClassName);  } catch (ClassNotFoundException e1) {   // TODO Auto-generated catch block   log.error("class not found."+implClassName, e1);  }

      Constructor[] constructors = daoClass.getConstructors();

      // 创建实例.

      try {   dao = (DAO) constructors[0].newInstance(new Object[] { session });  } catch (Exception e) {

       // TODO Auto-generated catch block   log.error("newInstance fail.", e);

      }

      return dao; }

     public static DAO getDAO(Session session, String daoName) {

      if (("SportDAO").equals(daoName)) {   return new SportDAO(session);  }

      return null;

     }

    }

    daoMap.xml得内容如下<?xml version="1.0" encoding="UTF-8"?><daos>  <dao name="SportDAO" class="cn.xp1204.dao.SportDAO"/></daos>

     

    调用得时候DAOFactory.loadDAO(session,"SportDAO").save(fm);

    这里得SportDO就是daoMap.xml得name="SportDAO",到时动态加载得类就是cn.xp1204.dao.SportDAO

    6,java类得动态加载是ioc的基础,如果有多个类相互依赖,可以用ioc把关系移到程序外面得配置文件中。

     

    到此结束。

     


    最新回复(0)