zoukankan      html  css  js  c++  java
  • 泛型(Generic)反射泛形Dao

     
    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 }
     
     
  • 相关阅读:
    vim 查找文件指定内容所在位置
    tar 使用小技巧
    dpkg 安装deb包
    Jetbrains 全家桶(IDEA,PyCharm...)
    Python如何生成requirements.txt文件
    MySQL——导入数据报字段编码错误
    视图的概念、作用以及如何创建
    hive与hbase及MySQL的区别
    mysql—排序函数rank() over()、dense_rank() over()、row_num() over()
    mysql —net start mysql 命令发生系统错误5和错误1058的解决方法
  • 原文地址:https://www.cnblogs.com/hacket/p/3050377.html
Copyright © 2011-2022 走看看