文档章节

DAO,接口,工厂模式,java类的动态加载,ioc-----一起杂谈

ruyees
 ruyees
发布于 2014/10/05 11:47
字数 1233
阅读 25
收藏 0

起因是一个朋友写的DAO代码,我看了觉得有些缺陷,就是定义一个类XXXXDAO,里面若干给static的方法如

getXXX(),命名也有些不规范,每个方法都做一些查询啊,插入啊,等等的操作,调用的时候就用

XXXXDAO.getXXX(),看起来倒是简单明了,但从我的观点来看,觉得可以做些改进,如是就把我的想法或设计思

路告诉了他。


这里贴出来的是写得一些具体得例子,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得内容如下

 


 


 

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

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


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

 

 

详细出处参考:http://www.itqun.net/content-detail/237126_1.html

本文转载自:http://zuoqiang.iteye.com/blog/667537

共有 人打赏支持
ruyees
粉丝 3
博文 71
码字总数 0
作品 0
深圳
产品经理
python 与设计模式 ——工厂与单例

python 与设计模式 源码地址:[http://git.oschina.net/duoduo3_69/python_design_pattern][1] git checkout v001(这个版本与此篇博客相符) zarkpy里面运用了很多设计模式,以前一直很费解p...

duoduo3_69
2013/11/27
0
0
设计模式3——Proxy设计模式

Proxy代理设计模式是一种控制对象访问的设计模式,类似于网络代理,网络代理机制如下图: Proxy代理设计模式机制如下: 代理模式UML图如下: 代理模式顺序图如下: 客户端程序通过代理程序来...

小米米儿小
2013/12/06
0
0
20个设计模式和软件设计面试问题

不管是参加Java面试还是C#面试,设计模式和软件设计都是任何编程面试中的必问问题。实际上,编程能力和设计技巧是对彼此很好的补充。一个好的程序员通常都是一个好的软件设计人员。他们知道怎...

LCZ777
2014/08/13
0
0
java中23种设计模式(上)

参考网址:http://blog.csdn.net/zhangerqing 资源:http://download.csdn.net/detail/zhangerqing/4835830 设计模式(Design Patterns) 设计模式(Design pattern)是一套被反复使用、多数...

青涩的梦
06/26
0
0
从 Java 到 Scala (三): object 的应用

本文由 Captain 发表在 ScalaCool 团队博客。 在上篇 Java 到 Scala 系列中,我想你或多或少在语言特性上对有了一定的掌握,在了解完它酷酷的语言特性——让静态回归常态并能简单运用其衍生出...

ScalaCool
09/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Redis常用命令

keys 我把这个命令放在第一位,是因为笔者曾经做过的项目,以及一些朋友的项目,都因为使用keys这个命令,导致出现性能毛刺。这个命令的时间复杂度是O(N),而且redis又是单线程执行,在执行k...

谢思华
27分钟前
2
0
关于css宽度分离

所谓宽度分离就是width 属性不与影响宽度的 padding/border(有时候包括 margin)属性共存 例如: .box{width:200px;padding:20px;border:1px solid;} 为何要做宽度分离 一说到分离就是为了好...

莫西摩西
38分钟前
1
0
Linux常用命令

###############常用命令说明############################## cat /proc/version 显示内核的版本 mv dir1 new_dir 重命名/移动 一个目录 rm -rf a.txt b.txt c.txt 删除多个文件 chmod 777 ......

lyle_luo
44分钟前
2
0
全国地区代码科普

全国地区代码表 天津市 地区代码 地区名称 1100 天津市 辽宁省 地区代码 地区名称 2210 沈阳市 2210 法库县 2210 康平县 2210 辽中县 2210 新民市 2220 大连市 2222 普兰店市 2223 庄河市 22...

恋码之子
45分钟前
1
0
DbForge Schema Compare for MySQL入门教程:生成比较报告

【dbForge Schema Compare for MySQL下载】 当架构比较完成后,您可以生成比较报告以保留架构更改的记录。 1. 在“Comparison” 菜单中,单击“Generate Comparison Report” 。将打开“Gen...

Miss_Hello_World
46分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部