首先分析DAO模式中的每一部分





VO(对象实体):这个类成员变量与数据库中每个字段一一对应,同时提供了相应是set和get方法来设置或取得数值。这个类一般是通过IDE自动生成的





DAO(数据访问接口):这个是业务逻辑层使用数据持久化层服务的一个接口





DAOFactory(工厂类):它提供了创建DAO类的一个方法,目的是更改数据持久化层实现时(比如更换数据库),不需要对业务逻辑层进行更改,只要再创建一个实现了DAO接口的类,再交给DAOFactory创建对象就可以了。为程序提供了更好的扩充性





DAOImpl(实现类):这个类实现了DAO接口。同时也是代码最多的类。





从上文分析看出,抽象DAO首先要从实现类下手。在不同的表中,DAO提供的操作基本类似,所以实现类所实现的方法基本相同,不同的地方主要有这样几个方面:





1、传递的实体类类型





2、实体类的取值赋值方法





3、SQL语句





这些问题第一个解决起来最容易,可以通过Java的泛型解决。第三个也比较容易,可以在创建时传入字段,执行时生成SQL语句。只有第二个最困难,因为并不知道实体类提供哪些方法,以及方法的返回值和参数列表,怎么样去调用未知的方法?





关键技术:

Java为我们提供了反射机制,来进行一些对象的操作。





比如通过这个方法可以让加载器加载一个类:





Class c = Class.forName(className);

得到Class对象以后,我们可以调用它的公有的无参构造方法,获得它的一个实例





Object o = c.newInstance();

也可以获得描述它所有方法的一个数组





Method[] m = c.getMethods();

也可以得到某一个方法的方法名





System.out.println(m[0].getName());

或者对一个方法的参数列表及返回值类型的描述

System.out.println(m[0].toGenericString());

通过以上方法,可以分析出哪个方法是我们想要的方法,我们怎么调用它呢

public Object invoke(Object obj, Object... args)

参数:

obj - 从中调用底层方法的对象

args - 用于方法调用的参数

返回:

使用参数 args 在 obj 上指派该对象所表示方法的结果

通过这个方法,在第一个参数传入一个创建的对象,2~n个参数传入调用方法的参数,就可以调用这个方法,

同时也可以接受得到Object类型的返回值。想了解更详细的内容可以参考JDK API

理解了以上的函数,我们可以动手编写这个类了。

配置文件dao.properties

com.vince.orders.dao.IOrderDAO=com.vince.orders.dao.impl.OrderDAOImpl

com.vince.orders.dao.IOrderItemDAO=com.vince.orders.dao.impl.OrderItemDAOImpl

com.vince.orders.dao.IUserDAO=com.vince.orders.dao.impl.UserDAOImpl

DAOFactory.java

package com.vince.orders.dao.factory;









import java.io.IOException;

import java.io.InputStream;

import java.util.Properties;





import com.vince.orders.dao.IOrderDAO;

import com.vince.orders.dao.IOrderItemDAO;

import com.vince.orders.dao.IUserDAO;





/**

 * @deprecated: DAO工厂类

 * @author: vince

 * @version 1.0

 * @email finally_m@yahoo.cn

 */

public class DAOFactory {

private static Properties config = null;

static {

/**

* Thread.currentThread():返回当前正在执行的线程.

* getContextClassLoader: 返回该线程的上下文 ClassLoader,供运行于该线程中的代码在加载类和资源时使用.

* getResourceAsStream(String name):返回读取指定资源的输入流.

*/

InputStream input = Thread.currentThread().getContextClassLoader()

.getResourceAsStream("com/vince/orders/dao/factory/dao.properties");

config = new Properties();

try {

config.load(input);//从输入流中读取属性列表(键和元素对)。





} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}





/**

* 返回订单DAO对象

* @return

*/

public static IOrderDAO getOrderDAO() throws Exception{

String instance = config.getProperty("com.vince.orders.dao.IOrderDAO");// 用指定的键在此属性列表中搜索属性。

IOrderDAO orderDAO = null;

try {

orderDAO = (IOrderDAO) Class.forName(instance).newInstance();//创建类的实例

} catch (Exception e) {

e.printStackTrace();

throw e;

}

return orderDAO;

}



/**

* 返回用户DAO对象

* @return

*/

public static IUserDAO getUserDAO() throws Exception{

String instance = config.getProperty("com.vince.orders.dao.IUserDAO");

IUserDAO userDAO = null;

try {

userDAO = (IUserDAO) Class.forName(instance).newInstance();

} catch (Exception e) {

e.printStackTrace();

throw e;

}

return userDAO;

}



/**

* 返回订单明细DAO对象

* @return

* @throws Exception

*/

public static IOrderItemDAO getOrderItemDAO() throws Exception{

String instance = config.getProperty("com.vince.orders.dao.IOrderItemDAO");

IOrderItemDAO orderItemDAO = null;

try {

orderItemDAO = (IOrderItemDAO) Class.forName(instance).newInstance();

} catch (Exception e) {

e.printStackTrace();

throw e;

}

return orderItemDAO;

}

}

使用DAO工厂创建实现类对象的更多相关文章

  1. File类的特点?如何创建File类对象?Java中如何操作文件内容,什么是Io流Io流如何读取和写入文件?字节缓冲流使用原则?

    重难点提示 学习目标 1.能够了解File类的特点(存在的意义,构造方法,常见方法) 2.能够了解什么是IO流以及分类(IO流的概述以及分类) 3.能够掌握字节输出流的使用(继承体系结构介绍以及常见的 ...

  2. 2、创建File类对象

    既然是内置类,那么我们创建对象时自然要看它封装好的构造函数咯,由下图的4中构造函数我们可知有4种办法来创建File对象 具体代码如下 public class Demo { public static ...

  3. 利用MAP动态创建C++类对象

    MFC的CRuntimeClass利用链表实现了C++类的动态创建.但是如果项目中对动态创建的要求比较低,我们完全可以利用map实现简单的动态创建. http://blog.csdn.net/yeji ...

  4. 1 实现添加功能 1.1 定义一个学员类(Student),在Student类中定义姓名、性别和年龄属性,定义有 参数的构造方法来初始化所以的成员属性 1.2 创建学员类对象来存放学员信息,并且为每一个学生对象添加的相应的编号。并将 学员类对象添加到Map<Integer,Student>集合中 1.3 添加完成后,显示所有已添加的学员姓名 1.4 限制年龄文本框只能输入正整数,否则的会采

    学生类 package com.lanxi.demo1_3; public class Student { private String name; private String sex; priva ...

  5. [原创] Java JDBC连接数据库,反射创建实体类对象并赋值数据库行记录(支持存储过程)

    1.SqlHelper.java import java.lang.reflect.*; import java.sql.*; import java.util.*; public class Sql ...

  6. C++用new和不用new创建类对象区别

    new创建类对象,使用完后需使用delete删除,跟申请内存类似.所以,new有时候又不太适合,比如在频繁调用场合,使用局部new类对象就不是个好选择,使用全局类对象或一个经过初始化的全局类指针似乎更 ...

  7. Mybaits 源码解析 (八)----- 全网最详细,没有之一:结果集 ResultSet 自动映射成实体类对象(上篇)

    上一篇文章我们已经将SQL发送到了数据库,并返回了ResultSet,接下来就是将结果集 ResultSet 自动映射成实体类对象.这样使用者就无需再手动操作结果集,并将数据填充到实体类对象中.这可大 ...

  8. class中new与未new的区别 类对象占用空间--转载

    转载自http://blog.sina.com.cn/shuiwuhendeboke    颗颗的博客 (1)作用域不同 不用new:作用域限制在定义类对象的方法中,当方法结束时,类对象也被系统释放了 ...

  9. OC 类对象和类加载

    //------------------------Persion类----------------------------// 1 #import "Person.h" @imp ...

随机推荐

  1. 为什么选择使用Spring Cloud而放弃了Dubbo

    为什么选择使用Spring Cloud而放弃了Dubbo 可能大家会问,为什么选择了使用Dubbo之后,而又选择全面使用Spring Cloud呢?其中有几个原因: 1)从两个公司的背景来谈:Dubb ...

  2. Spring MVC属于SpringFrameWork的后续产品

    Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring MVC 分离了控制器.模型对象.分派器以及处理程序对象的角色,这种分离让它 ...

  3. IoC就是IoC,不是什么技术,与GoF一样,是一种设计模式。

    IoC就是IoC,不是什么技术,与GoF一样,是一种设计模式. InterfaceDrivenDesign接口驱动,接口驱动有很多好处,可以提供不同灵活的子类实现,增加代码稳定和健壮性等等,但是接口一 ...

  4. 【BZOJ】1061: [Noi2008]志愿者招募(费用流+数学)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1061 好神的一题! 学会了一种建模方式: 当方程组内的任意变量都在其中两个方程出现且一正一负,可以建 ...

  5. zabbix服务器搭建

    zabbix服务器源码安装 参看官方文档 这里不做过多的翻译,我的系统是centos6.5,安装的时候是base安装,所以要装一些其他依赖包,除此之外,还有一些php插件: extension=bcm ...

  6. db2 导入cvs

    1)       打开DB2 命令行 2)       如果是第一次连接到远程的DB2 数据库:如果不是,请直接跳转到3) 在DB2 命令行窗口执行: catalog tcpip node DB21 ...

  7. 编程之美 set 15 高效率地安排见面会

    题目 有 n 个学生分别对 m 个见面会感兴趣, 为了满足所有学生的要求, HR 希望每个学生都能参加自己感兴趣的所有见面会 思路 1. 假设某一个同学同时对k个小组感兴趣, 那么这k个小组两两之间都 ...

  8. 机器学习(Machine Learning)

    机器学习(Machine Learning)是一门专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能的学科.

  9. mysql5.5的安装配置

    1.wget http://120.52.72.23/cdn.mysql.com/c3pr90ntc0td//Downloads/MySQL-5.5/mysql-5.5.50-linux2.6-x86 ...

  10. pdb文件及引发的思考

    最初只想知道线上iis里需要不需要pdb文件,了解部分之后对于.net底层产生了浓厚的兴趣,看了一点点资料 资料来源: https://www.cnblogs.com/itech/archive/20 ...