文档章节

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

ruyees
 ruyees
发布于 2014/10/05 11:47
字数 1233
阅读 23
收藏 0
点赞 0
评论 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
深圳
产品经理
java开发中的常用的设计模式

设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代...

qq_38024548 ⋅ 05/28 ⋅ 0

简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别

转载:原地址http://www.cnblogs.com/zhangchenliang/p/3700820.html 简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别 结合简单示例和UML图,讲解工厂模式简单原理。 一、引子 话说...

法斗斗 ⋅ 05/08 ⋅ 0

为什么我墙裂建议大家使用枚举来实现单例。

关于单例模式,我的博客中有很多文章介绍过。作为23种设计模式中最为常用的设计模式,单例模式并没有想象的那么简单。因为在设计单例的时候要考虑很多问题,比如线程安全问题、序列化对单例的...

⋅ 06/10 ⋅ 0

Java篇-接口interface关键字

一 : interface关键字 接口是与类并行的一个概念 Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,...

TianTianBaby223 ⋅ 04/24 ⋅ 0

代理模式(Proxy Pattern):动态代理 - 最易懂的设计模式解析

前言 今天我来全面总结开发中最常用的设计模式 - 代理模式中的动态代理模式 其他设计模式介绍 1分钟全面了解“设计模式” 单例模式(Singleton) - 最易懂的设计模式解析 简单工厂模式(Sim...

Carson_Ho ⋅ 04/09 ⋅ 0

详解Proxy代理模式的场景分析

代理模式是一个十分优秀的软件架构模式,许多应用都用到了代理模式。代理模式就是为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不合适或者不能直接引用另一个对象,...

Java架构 ⋅ 05/30 ⋅ 0

2018年Java编程学习面试最全知识点总结

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰 ⋅ 05/14 ⋅ 0

Spring IOC FactoryBean检测与获取Bean

Spring中有两种类型的Bean,一种是普通Bean,另一种是工厂Bean,即FactoryBean。Spring FactoryBean是创建复杂的bean,一般的bean直接用xml配置即可,如果一个bean的创建过程中涉及到很多其他的b...

哲别0 ⋅ 05/28 ⋅ 0

Spring中涉及的设计模式总结

Spring中涉及的设计模式总结 1.简单工厂(非23种设计模式中的一种) 实现方式:BeanFactory。 Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得Bean对象,但是否是...

caoxiaohong1005 ⋅ 04/22 ⋅ 0

spring源码解析系列之事件驱动模型架构

说在前面 为什么要去研究spring源码,我认为java最NX的就是我写接口你来实现,像oracle,要么就是想spring这样框架,什么框架我都可以整合你,这么NX的框架你没有想研究下源码的冲动吗。O(∩...

天河2018 ⋅ 04/26 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

mysql5.7系列修改root默认密码

操作系统为centos7 64 1、修改 /etc/my.cnf,在 [mysqld] 小节下添加一行:skip-grant-tables=1 这一行配置让 mysqld 启动时不对密码进行验证 2、重启 mysqld 服务:systemctl restart mysql...

sskill ⋅ 昨天 ⋅ 0

Intellij IDEA神器常用技巧六-Debug详解

在调试代码的时候,你的项目得debug模式启动,也就是点那个绿色的甲虫启动服务器,然后,就可以在代码里面断点调试啦。下面不要在意,这个快捷键具体是啥,因为,这个keymap是可以自己配置的...

Mkeeper ⋅ 昨天 ⋅ 0

zip压缩工具、tar打包、打包并压缩

zip 支持压缩目录 1.在/tmp/目录下创建目录(study_zip)及文件 root@yolks1 study_zip]# !treetree 11└── 2 └── 3 └── test_zip.txt2 directories, 1 file 2.yum...

蛋黄Yolks ⋅ 昨天 ⋅ 0

聊聊HystrixThreadPool

序 本文主要研究一下HystrixThreadPool HystrixThreadPool hystrix-core-1.5.12-sources.jar!/com/netflix/hystrix/HystrixThreadPool.java /** * ThreadPool used to executed {@link Hys......

go4it ⋅ 昨天 ⋅ 0

容器之上传镜像到Docker hub

Docker hub在国内可以访问,首先要创建一个账号,这个后面会用到,我是用126邮箱注册的。 1. docker login List-1 Username不能使用你注册的邮箱,要用使用注册时用的username;要输入密码 ...

汉斯-冯-拉特 ⋅ 昨天 ⋅ 0

SpringBoot简单使用ehcache

1,SpringBoot版本 2.0.3.RELEASE ①,pom.xml <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.3.RELE......

暗中观察 ⋅ 昨天 ⋅ 0

监控各项服务

比如有三个服务, 为了减少故障时间,增加监控任务,使用linux的 crontab 实现. 步骤: 1,每个服务写一个ping接口 监控如下内容: 1,HouseServer 是否正常运行,所以需要增加一个ping的接口 ; http...

黄威 ⋅ 昨天 ⋅ 0

Spring源码解析(八)——实例创建(下)

前言 来到实例创建的最后一节,前面已经将一个实例通过不同方式(工厂方法、构造器注入、默认构造器)给创建出来了,下面我们要对创建出来的实例进行一些“加工”处理。 源码解读 回顾下之前...

MarvelCode ⋅ 昨天 ⋅ 0

nodejs __proto__跟prototype

前言 nodejs中完全没有class的这个概念,这点跟PHP,JAVA等面向对象的语言很不一样,没有class跟object的区分,那么nodejs是怎么样实现继承的呢? 对象 对象是由属性跟方法组成的一个东西,就...

Ai5tbb ⋅ 昨天 ⋅ 0

Ubuntu16.04 PHP7.0 不能用MYSQLi方式连接MySQL5.7数据库

Q: Ubuntu16.04 PHP7.0 不能用MYSQLi方式连接MySQL5.7数据库 A: 执行以下2条命令解决: apt-get install php-mysql service apache2 restart php -m 执行后会多以下4个模块: mysqli mysqlnd...

SamXIAO ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部