使用DAO工厂创建实现类对象
首先分析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工厂创建实现类对象的更多相关文章
- File类的特点?如何创建File类对象?Java中如何操作文件内容,什么是Io流Io流如何读取和写入文件?字节缓冲流使用原则?
重难点提示 学习目标 1.能够了解File类的特点(存在的意义,构造方法,常见方法) 2.能够了解什么是IO流以及分类(IO流的概述以及分类) 3.能够掌握字节输出流的使用(继承体系结构介绍以及常见的 ...
- 2、创建File类对象
既然是内置类,那么我们创建对象时自然要看它封装好的构造函数咯,由下图的4中构造函数我们可知有4种办法来创建File对象 具体代码如下 public class Demo { public static ...
- 利用MAP动态创建C++类对象
MFC的CRuntimeClass利用链表实现了C++类的动态创建.但是如果项目中对动态创建的要求比较低,我们完全可以利用map实现简单的动态创建. http://blog.csdn.net/yeji ...
- 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 ...
- [原创] Java JDBC连接数据库,反射创建实体类对象并赋值数据库行记录(支持存储过程)
1.SqlHelper.java import java.lang.reflect.*; import java.sql.*; import java.util.*; public class Sql ...
- C++用new和不用new创建类对象区别
new创建类对象,使用完后需使用delete删除,跟申请内存类似.所以,new有时候又不太适合,比如在频繁调用场合,使用局部new类对象就不是个好选择,使用全局类对象或一个经过初始化的全局类指针似乎更 ...
- Mybaits 源码解析 (八)----- 全网最详细,没有之一:结果集 ResultSet 自动映射成实体类对象(上篇)
上一篇文章我们已经将SQL发送到了数据库,并返回了ResultSet,接下来就是将结果集 ResultSet 自动映射成实体类对象.这样使用者就无需再手动操作结果集,并将数据填充到实体类对象中.这可大 ...
- class中new与未new的区别 类对象占用空间--转载
转载自http://blog.sina.com.cn/shuiwuhendeboke 颗颗的博客 (1)作用域不同 不用new:作用域限制在定义类对象的方法中,当方法结束时,类对象也被系统释放了 ...
- OC 类对象和类加载
//------------------------Persion类----------------------------// 1 #import "Person.h" @imp ...
随机推荐
- PyCharm中设置菜单字体大小
file——>setting,然后选择appearance,下图右侧红色边框中的内容即设置菜单的字体和大小
- MyBatis-Spring 使用总结
说明:Java-based Config. 不是通过 mybatis 的 SqlSessionFactoryBuilder 来创建 SqlSessionFactory ,而是通过 mybatis-sp ...
- 越大优先级越高,优先级越高被OS选中的可能性就越大
进程的休眠:Thread sleep(1000);//括号中以毫秒为单位 当main()运行完毕,即使在结束时时间片还没有用完,CPU也放弃此时间片,继续运行其他程序. Try{Thread.slee ...
- web 前端 转盘界面
http://www.cnblogs.com/arfeizhang/p/turntable.html "如果有个做转盘的需求,你准备怎么做?设计师只会提供一个转盘的图片,其余都需要你完成,不 ...
- 【BZOJ】1633: [Usaco2007 Feb]The Cow Lexicon 牛的词典(dp)
http://www.lydsy.com/JudgeOnline/problem.php?id=1633 一开始也想到了状态f[i]表示i以后的字符串最少删的数 然后想到的转移是 f[i]=min{f ...
- MathType怎么编辑双箭头
很多的数学相关工作者在写文章或论文的时候常常会用到数学公式编辑器.MathType就是一款深受大家欢迎的公式编辑器.很多的用户在使用过程中会用到双箭头符号来表示推理过程,但是怎么编辑又不知道,下面本教 ...
- Hibernate_day01--解决配置文件没有提示问题_演示常见错误
解决配置文件没有提示问题 1 可以上网 2 把约束文件引入到eclipse中 (1)在配置文件中复制一句话 重启eclipse开发工具 演示常见错误 1 在映射配置文件中,把name属性值写错了,和实 ...
- Qt slot中获取sender
调用sender();函数 例如获取一个QRadioButton QRadioButton *rb = qobject_cast<QRadioButton *>(sender());
- 使用js里面的迭代器filter实现数组去重
实现数组去重的方法很多,最原始的方法是一个值一个值的去遍历,写到空数组里面: let r=[],arr = ['a', 'b', 'c', 'a']; for(var i=0,len=arr.leng ...
- JSP内置对象——session
sessionsession表示客户端与服务器的一次会话Web中的session指的是用户在浏览某个网站时,从进入网站到浏览器关闭所进过的这段时间,也就是用户浏览这个网站所花费的时间从上述定义中可以看 ...