zoukankan      html  css  js  c++  java
  • 使用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;
    }
    }

  • 相关阅读:
    java实现从实体到SQL语句的转换
    Mybatis Plus 入坑(含最新3.X配置)
    Spring cloud config client获取不到配置中心的配置
    Spring Cloud Config-Client 无法获取 Config-Server 在 github 上的配置文件的属性值,竟然是因为
    QMessageBox 的四种用法
    龙芯派二代发布,简化国产软硬件开发难度
    解析Qt元对象系统(五) Q_INVOKABLE与invokeMethod(automatic connection从Qt4.8开始的解释已经与之前不同,发送对象驻足于哪一个线程并不重要,起到决定作用的是接收者对象所驻足的线程以及发射信号(该信号与接受者连接)的线程是不是在同一个线程)good
    解析Qt元对象系统(四) 属性系统(确实比较方便)
    HTML如何让IMG自动适应DIV容器大小
    布隆过滤---判断一个元素在亿级数据中是否存在
  • 原文地址:https://www.cnblogs.com/liuyanmin/p/5146556.html
Copyright © 2011-2022 走看看