JDK5中的泛形允许程序员在编写集合代码时,就限制集合的处理类型,从而把原来程序运行时可能发生问题,转变为编译时的问题,以此提高程序的可读性和稳定性(尤其在大型程序中更为突出)。
注意:泛型是提供给javac编译器使用的,它用于限定集合的输入类型,让编译器在源代码级别上,即挡住向集合中插入非法数据。
     但编译器编译完带有泛形的java程序后,生成的class文件中将不再带有泛形信息,以此使程序运行效率不受到影响,这个过程称之为“擦除”。
  泛形的基本术语,以ArrayList<E>为例:<>念着typeof
•ArrayList<E>中的E称为类型参数变量
•ArrayList<Integer>中的Integer称为实际类型参数
•整个称为ArrayList<E>泛型类型
•整个BaseDao<Type>ParameterizedType/Type参数化的类型
泛型类
如果一个类多处都要用到同一个泛型,这时可以把泛形定义在类上(即类级别的泛型),语法格式如下:

public class GenericDao<T> {

private T field1;

public void save(T obj){}

public T getId(int id){}

}

注意,静态方法不能使用类定义的泛形,而应单独定义泛形。
--domain
1、BaseBean
 1 //基础Bean
 2 public class BaseBean {
 3     public int id;
 4     public String title;
 5     public BaseBean(){}
 6     public int getId() {
 7         return id;
 8     }
 9     public void setId(int id) {
10         this.id = id;
11     }
12     public String getTitle() {
13         return title;
14     }
15     public void setTitle(String title) {
16         this.title = title;
17     }
18 }

   2、版块

1 //版块
2 public class Type extends BaseBean{
3
4 }

3、主题
 1 //主题
 2 public class Topic extends BaseBean{
 3     private String name;
 4     public Topic(){}
 5     public String getName() {
 6         return name;
 7     }
 8     public void setName(String name) {
 9         this.name = name;
10     }
11 }

--dao
1、BaseDao
 1 import java.lang.reflect.ParameterizedType;
 2 import java.lang.reflect.Type;
 3 import java.sql.SQLException;
 4 import org.apache.commons.dbutils.QueryRunner;
 5 import org.apache.commons.dbutils.handlers.BeanHandler;
 6 import cn.itcast.java.util.JdbcUtil;
 7
 8 public class BaseDao<T> {
 9     private Class clazz;
10     private String tableName;
11     public BaseDao(){
12         //取得BaseDao的字节码对象
13         Class baseDaoClass = this.getClass();
14         //取得BaseDao的泛型类型
15         Type type = (Type) baseDaoClass.getGenericSuperclass();
16         //将Type转发ParameterizedType,即取得BaseDao<Type>的参数化类型
17         ParameterizedType pt = (ParameterizedType) type;
18         //取得参数化类型中的实例参数类型,即Type,返回的是一个数组,取第一个 Map<String,Integer> 对应[0] [1]
19         this.clazz = (Class) pt.getActualTypeArguments()[0];
20         int index = this.clazz.getName().lastIndexOf(".");
21         //表名
22         this.tableName = this.clazz.getName().substring(index+1).toLowerCase();
23     }
24     public T findTById(int id) throws SQLException {
25         T t = null;
26         QueryRunner runner = new QueryRunner(JdbcUtil.getDataSource());
27         String sql = "select * from " + tableName + " where id = ?";
28         t = (T) runner.query(sql, id, new BeanHandler(clazz));
29         return t;
30     }
31 }

  2、TypeDao

1 import cn.itcast.java.domain.Type;
2
3 public class TypeDao extends BaseDao<Type>{
4 }

  3、TopicDao

1 import cn.itcast.java.domain.Topic;
2
3 public class TopicDao extends BaseDao<Topic>{
4 }

--test

 1 import cn.itcast.java.dao.dao3.ReplyDao;
 2 import cn.itcast.java.dao.dao3.TopicDao;
 3 import cn.itcast.java.dao.dao3.TypeDao;
 4 import cn.itcast.java.domain.Reply;
 5 import cn.itcast.java.domain.Topic;
 6 import cn.itcast.java.domain.Type;
 7
 8 public class TestDao3 {
 9     public static void main(String[] args) throws Exception {
10         TypeDao typeDao = new TypeDao();
11         Type type = typeDao.findTById(3);
12         System.out.println(type.getId()+":"+type.getTitle());
13         System.out.println("===============================");
14         TopicDao topicDao = new TopicDao();
15         Topic topic = topicDao.findTById(3);
16         System.out.println(topic.getId()+":"+topic.getTitle() + ":" + topic.getName());
17         System.out.println("===============================");
18         ReplyDao replyDao = new ReplyDao();
19         Reply reply = replyDao.findTById(3);
20         System.out.println(reply.getId() + ":" + reply.getTitle());
21     }
22 }

转载于:https://www.cnblogs.com/hacket/archive/2013/04/29/3050377.html

泛型(Generic)-反射泛形-Dao相关推荐

  1. java如何用反射把具体方法抽象_如何在Java 中使用泛型或反射机制对DAO进行抽象...

    如何在Java 中使用泛型或反射机制对DAO进行抽象 发布时间:2020-11-26 16:07:42 来源:亿速云 阅读:80 作者:Leah 本篇文章为大家展示了如何在Java 中使用泛型或反射机 ...

  2. 支撑Java框架的基础技术:泛型,反射,动态代理,cglib

    以Spring为例要想看明白他的源码需要彻底理解Java的一些基础技术泛型,反射同时对于一些高级技术例如动态代理,cglib和字节码技术也需要掌握,下面就按章节来一一说清楚这些技术的核心部分,最后手写 ...

  3. DotNET:LINQ对泛型(Generic)操作和泛型方法及属性

    ylbtech-DotNET:泛型(Generic)和LINQ操作 1,遍历泛型集合 2,根据索引位置移除项(RemoveAt()) 3,查询一个人(Single()) 3.2,查询一个人(Singl ...

  4. 【中级05】Java泛型、反射

    java泛型简介 Java泛型(Generic)是J2 SE1.5中引入的一个新特性,其本质是参数化类型,也就是说所操作的数据类型被指定为一个参数(type parameter)这种参数类型可以用在类 ...

  5. 实施 ORM 的两项要旨:泛型和反射

    鄙人认为,实施 ORM 的两项要旨乃泛型和反射.开始的时候 DAO 并没有实现 ORM,下面就看看怎么为 DAO 层添砖加瓦. 首先,在 DBAccess 基础上扩展 DBAccessORM 接口,形 ...

  6. 【JavaLearn】(19)反射、Class类、使用反射创建对象-操作属性-执行方法、泛型与反射、反射案例

    目录 1. 反射 1.1 反射引入 1.2 反射的入口-Class类 2. 认识 Class 类 3. 使用反射创建对象 4. 使用反射操作属性 5. 使用反射执行方法 6. 使用反射操作泛型 6.2 ...

  7. 【JavaLearn】#(19)反射、Class类、使用反射创建对象-操作属性-执行方法、泛型与反射、反射案例

    1. 反射 1.1 反射引入 编译时,知道类或对象的具体信息,此时直接对类和对象进行操作即可 编译时不知道类或对象的具体信息,只有运行时知道,需要使用反射来实现 ==> 比如驱动的类的名称放在 ...

  8. 泛型方法的定义和使用_泛型( Generic )

    泛型(Generic) 1. 泛型概述 泛型是一个未知的, 不确定的数据类型. 比如ArrayList 中的E, 就是一个未知的不确定的数据类型, 那么他就是一个泛型 泛型虽然是一个未知的, 不确定的 ...

  9. 你真的了解泛型 Generic 嘛?

    泛型 Generic Programming[1] 通常指允许程序员在强类型程序设计语言中,编写代码时使用一些以后才指定的类型,在实例化时作为参数指明这些类型,即类型参数化 首先我们不是科班讨论学术, ...

最新文章

  1. JQuery中$.ajax()方法参数详解(转)
  2. 选中条目android spinner的使用
  3. 向左滚动,每次滚动的长度可以设置,然后暂停后继续滚动
  4. phison主控ps3111量产工具_从固态硬盘拆解看门道 深入解读闪存编号和主控容量...
  5. mysql按中文拼音字母排序_解析MySQL按常规排序、自定义排序和按中文拼音字母排序的方法...
  6. PHP图片验证码制作(上)
  7. OC 内存管理之手动内存管理MRC
  8. [label][responsive-web-design]网页响应测试各种尺寸的工具
  9. EtherCAT:wireshark抓包分析
  10. 百度硬盘和Google桌面的比较
  11. 用html制作带阴影小球弹跳,AE怎么制作一个有影子的弹跳小球动画?
  12. 如何将idea代码提交到远程仓库
  13. java redis scan6_Redis中scan命令的深入讲解
  14. 企业邮箱邮件在网页版显示正常在Foxmail 显示不全
  15. 三星手机如何通过Exchange账户同步联系人到手机中?
  16. 【肝帝一周总结:全网最全最细】☀️Mysql 索引数据结构详解与索引优化☀️《❤️记得收藏❤️》
  17. webuploader+上传文件夹
  18. 中国化肥产业发展现状及趋势分析,化肥产能过剩情况得到缓解「图」
  19. 服务监控CAT的使用
  20. 详解FPGA实现8b10b编码原理(含VHDL及verilog源码)

热门文章

  1. 互联网产品发布之灰度发布
  2. ListView在列表中新增一行的操作(增加、取消)
  3. How to go between HK and Shenzhen (Futian)?
  4. 在.NET程序中使用PIPE(管道技术)
  5. java阅读doc文件格式_java – 正确区分.xls和.doc文件的方法?
  6. leetcode算法题--Russian Doll Envelopes
  7. opencv 计数后不动了 训练模型时_用OpenCV和深度学习进行年龄识别
  8. OPENSSL_Uplink(0098E000,07): no OPENSSL_Applink 错误分析
  9. 首尾连接的数组的求和问题
  10. 华农oj Problem K: 负2进制【有技巧构造/待补】