DAO,接口,工厂模式,java类的动态加载,ioc
来源:互联网 发布:心知天气——查天气 编辑:程序博客网 时间:2024/04/27 06:35
这里贴出来的是写得一些具体得例子,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把关系移到程序外面得配置文件中。
到此结束。
- DAO,接口,工厂模式,java类的动态加载,ioc
- 设计模式学习(二):接口的作用1-动态加载实例-简单工厂模式
- Java Dao工厂设计模式
- 小型Java Web项目之DAO操作标准、DAO接口真实实现类、DAO代理实现类、DAO工厂
- Java 接口工厂模式
- java抽象工厂以及动态加载类
- 浅谈java中dao工厂设计模式
- 浅谈java中dao工厂设计模式
- Java的几个概念AOP、IOC、DI、DIP、工厂模式、IOC容器
- [置顶] 关于JAVA动态加载类[简单IOC的实现] -- vb2005xu自己动手
- 动态的工厂模式
- DAO工厂类的实现
- 工厂模式之DAO
- Dao工厂模式
- Java面向接口编程(DAO模式)
- 关于工厂模式和spring的IOC
- Spring Ioc与工厂模式的区别
- Spring Ioc与工厂模式的区别
- 个人写的双缓冲 CDC绘图函数
- 开张
- 我的博客不在这
- 目前国内一些Web mail存在的一个安全漏洞
- AJAX并不神秘:揭密各种AJAX控件和类库
- DAO,接口,工厂模式,java类的动态加载,ioc
- [Web开发] 如何改变IE滚动条的颜色
- Africa, and world, celebrate Obama victory
- 组件化的开发
- 中国手机网民上网行为差异化明显
- Linux访问Windows下的共享文件夹
- csapp “链接”
- java的jar文件下载
- E-mail 工作原理及安全漏洞