反射泛型,Dao设计模型 (编码时需要用到)

Dao

package com.xiaofan.reflect;

import java.io.Serializable;

public interface Dao<T> {
    /**
     * 添加实体(Entity--Domain)数据到数据库中
     * @param t
     */
    void save(T t);
    /**
     * 修改数据库中的实体
     * @param t
     */
    void update(T t);
    /**
     * 根据主键删除记录
     * @param pk
     */
    void delete(Serializable pk);
    /**
     * 根据主键查询一条记录
     * @param pk
     * @return
     */
    T find(Serializable pk);

}

Dao

DAOBase

package com.xiaofan.reflect;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;

import org.hibernate.Session;

public abstract class DAOBase<T> implements Dao<T> {
    private Session session;
    private Class clazz;
    //反射泛型
    public DAOBase(){
        Class clz = this.getClass();//具体的Dao实现类  com.xiaofan.reflect.BookDaoImpl
//        System.out.println(clz.getName());
        ParameterizedType pt = (ParameterizedType)clz.getGenericSuperclass();//  DAOBase<Book>
//        System.out.println(pt);
        clazz = (Class)pt.getActualTypeArguments()[0];// Book.class
//        System.out.println(clazz);
    }

    public void save(T t) {
        session.save(t);
    }

    public void update(T t) {
        session.update(t);
    }

    public void delete(Serializable pk) {
        T t = (T)session.get(clazz, pk);
        session.delete(t);
    }

    public T find(Serializable pk) {
        return (T)session.get(clazz, pk);
    }

}

DAOBase

BookDao

package com.xiaofan.reflect;

public interface BookDao extends Dao<Book>{
    /**
     * 根据条件查询
     * @param where
     */
    void queryByCondition(String where);
}

BookDao

BookDaoImpl

package com.xiaofan.reflect;

public class BookDaoImpl extends DAOBase<Book> implements BookDao{

    public void queryByCondition(String where) {

    }

}

BookDaoImpl

Book

package com.xiaofan.reflect;

public class Book {

}

Book

CustomerDao

package com.xiaofan.reflect;

public interface CustomerDao extends Dao<Customer>{

}

CustomerDao

CustomerDaoImpl

package com.xiaofan.reflect;

public class CustomerDaoImpl extends DAOBase<Customer> implements CustomerDao {

}

CustomerDaoImpl

Customer

package com.xiaofan.reflect;

public class Customer {

}

Customer

Client

package com.xiaofan.reflect;

public class Client {

    public static void main(String[] args) {
        BookDao bDao = new BookDaoImpl();
        bDao.queryByCondition("condition");
        CustomerDao cDao = new CustomerDaoImpl();
        cDao.find(001);
    }

}

Client

时间: 2024-08-29 17:42:52

反射泛型,Dao设计模型 (编码时需要用到)的相关文章

JPA的泛型DAO设计及使用

使用如Hibernate或者JPA作为持久化的解决方案时,设计一个泛型的DAO抽象父类可以方便各个实体的通用CRUD操作.由于此时大部分实体DAO的CRUD操作基本一样,采用泛型设计解决这个问题,带来了简洁代码的好处. 问题的关键在于我们需要在代码中获取抽象DAO父类(BaseEntityDAOImpl<T>)中的泛型信息. 由于Java的泛型是基于泛型擦除实现的,因此无法直接获取如果直接获取,在Java中,如果子类继承一个泛型的父类,会保存父类中泛型的信息,因此可以采用如下方法获取泛型信息.

建立分析模型和设计模型

OOA面向对象分析 面向对象分析产生三种分析模型 功能模型(即用例模型à作为输入) 对象模型:对用例模型进行分析,把系统分解成互相协作的分析类,通过类图/对象图描述对象/对象的属性/对象间的关系,是系统的静态模型 动态模型:描述系统的动态行为,通过时序图/协作图描述对象的交互,以揭示对象间如何协作来完成每个具体的用例,单个对象的状态变化/动态行为可以通过状态图来表达  OOD面向对象的设计 OOD是对OOA的细化  没有严格的界线  OOD的结果直接用于编码 ?   与OOA的输出一样,只是更加

框架学习前基础加强 泛型,注解,反射(泛型&注解)应用案例,IOC,Servlet3.0,动态代理,类加载器

泛型 1. 泛型类 :具有一个或多个类型变量的类,称之为泛型类! class A<T> { } 2. 在创建泛型类实例时,需要为其类型变量赋值 A<String> a = new A<String>(); * 如果创建实例时,不给类型变量赋值,那么会有一个警告! 3. 泛型方法 :具有一个或多个类型变量的方法,称之为泛型方法! class A<T> { public T fun(T t1) {} } fun()方法不是泛型方法!它是泛型类中的一个方法! pu

反射是框架设计的灵魂

反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码))   一.反射的概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 要想解剖一个类,必须先要获取到该类的字节码文件对象.而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对

基于SpringJdbc的泛型Dao

> 使用的Spring是3.1版本,不是3.0版本.两者还是有区别的,其中一点就是:SimpleJdbcTemplate在3.1版本被标记为过时了,而SimpleJdbcTemplate的一些方法,被JdbcTemplate吸收了.所以,个人推荐使用3.1版本. 需要的JAR文件: org.springframework.aop-3.1.0.RELEASE.jar org.springframework.asm-3.1.0.RELEASE.jar org.springframework.bean

SSAS 表格设计模型--外键

表格设计模型中,同多维设计模型相似, 维表和事实表相互独立,通过关系数据库中的外键来联系,互相关联构成一个统一的架构. DB中外键是需要唯一性约束的,即A表某列建立主键或者唯一键后,B表才可以引用为外键. 多维设计模型--星型结构 星形架构(star schema)是以事实表为核心,其他的维表围绕这个核心表呈星形分布,维表彼此之间没有任何联系,每个维表中的主键都只能是单列的,同时该主键被放置在事实表中,作为事实表与维表连接的外键. 表格设计模型-- 在创建关系时,提示:无法创建关系,因为每个列都

设计模型

完成了“领域模型”阶段后,面向对象已经初具雏形,我们已经看到了那熟悉的“对象”了,例如“商品”.“交易”.“商品清单”等,看起来已经进入了面向对象的世界了,你是否已经摩拳擦掌,跃跃欲试,准备开始编码了呢? 且慢,“领域模型”只是万里长征的第一步,通过领域模型分析得到的类还不能指导编码,还需要经过“设计模型”这个阶段的处理,才能基本上指导编码. 前面我们提过,领域模型的对象是没有方法的,但最终的实现肯定是有方法的,因此设计模型的第一个任务就是“为对象添加方法”. 那么是否给领域模型中的对象添加完方

泛型DAO

最近正在学习泛型DAO,通过网上查阅资料,汇总并自己整理了一下.提前需要学习的知识java反射.泛型 用到的反射如下: Class<T>类 是java.lang包下,Class类的实例表示正在运行的 Java 应用中的类和接口. Type接口 是java.lang.reflect包下的是Java类型的通用超级接口.这些包括原始类型,参数化类型,数组类型和类型变量 ParameterizedType接口 是java.lang.reflect包下是Type的子接口,表示一个参数化类型,如Colle

DAO层单元测试编码和问题排查

DAO层单元测试编码和问题排查 SecKillDaoTest .java(注意接口参数使用注解@Parm("parameter")) package org.secKill.dao; import org.junit.Test;import org.junit.runner.RunWith;import org.secKill.entity.SecKill;import org.springframework.test.context.ContextConfiguration;impo