泛型(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 }

 

 

 
 
posted @ 2013-04-29 10:17  hacket520  阅读(394)  评论(0编辑  收藏  举报