美文网首页
java 范型 Hibernate Jackson的一些应用和思

java 范型 Hibernate Jackson的一些应用和思

作者: MicoCube | 来源:发表于2018-04-19 11:04 被阅读0次
    • Hibernate 范型基类通用DAO的解释

      • Hibernate 基类DAO接口
        import java.io.Serializable;
        import java.util.List;
        public interface BaseDao<T> {
            T get(Serializable id);
            List<T> getAll();
        //  List<T> find(String hql,);
            void save(Object o);
            void remove(Object o);
            void update(Object o);
        }
      
      • Hibernate DAO基类
        import java.io.Serializable;
        import java.lang.reflect.ParameterizedType;
        import java.lang.reflect.Type;
        import java.util.List;
        import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
        public class HibernateBaseDao<T> extends HibernateDaoSupport implements BaseDao<T>{
            private Class<T> entityClass;
            public HibernateBaseDao() {
                Type genType = getClass().getGenericSuperclass();
                Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
                entityClass =  (Class)params[0];
            }
            public T get(Serializable id) {
                return (T)getHibernateTemplate().load(entityClass, id);
            }
             public List<T> getAll() {
                return getHibernateTemplate().loadAll(entityClass);
            }
            public void save(Object o) {
                getHibernateTemplate().saveOrUpdate(o);
            }
            public void remove(Object o) {
                getHibernateTemplate().delete(o);
            }
            public void update(Object o) {
                getHibernateTemplate().update(o);
            }
        }
      
      • 实体DAO类
        import java.util.Iterator;
        import java.util.List;
        import com.baobaotao.dao.ForumDao;
        import com.baobaotao.dao.HibernateBaseDao;
        import com.baobaotao.domain.Forum;
        public class ForumHibernateDao2 extends HibernateBaseDao<Forum> implements ForumDao{
            public long getForumNum() {
                Iterator iter = getHibernateTemplate().iterate(
                "select count(f.forumId) from Forum f");
                return ((Long)iter.next());
            }
        }
      
      • 关键在于 Type genType = getClass().getGenericSuperclass(); Type[] params =((ParameterizedType)genType).getActualTypeArguments(); entityClass = (Class)params[0];这3句,看实体类的DAO,一般是继承基类然后加个实体范型,extends HibernateBaseDao<Forum>,那么,第一句是获取父类的Type,这里第一句获取的就是类型HibernateBaseDao<Forum>,第二句就是获取该类型的范型数组,[Forum],第三个将范型转为class返回,这样实体类DAO初始化之后,相应的DAO就知道自己对应的是什么实体类型,PS:这是泛型擦拭法使得Generic无法获取自己的Generic Type类型。实际上HibernateBaseDao<Forum>()实例化以后Class里面就不包括T的信息了,对于Class而言T已经被擦拭为Object,而真正的T参数被转到使用T的方法(或者变量声明或者其它使用T的地方)里面(如果没有那就没有存根),所以无法反射到T的具体类别,也就无法得到T.class。而getGenericSuperclass()是Generic继承的特例,对于这种情况子类会保存父类的Generic参数类型,返回一个ParameterizedType,这时可以获取到父类的T.class了,这也正是子类确定应该继承什么T的方法。
    • 验证

      • 基类:
        import java.lang.reflect.ParameterizedType;
        import java.lang.reflect.Type;
        
        public class Attribute<T>{
            private Type type;
            public Attribute(){
                ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass();
                Type actualTypeArguments = genericSuperclass.getActualTypeArguments()[0];
                type=actualTypeArguments;
          }
        
          public Type getType() {
              return type;
          }
        
          public void setType(Type type) {
              this.type = type;
          }
        }
        
      • 子类
        public class Attribute2 extends Attribute<Integer>{
            
        }
        
      • 测试类
        public class TestMain {
          public static void main(String[] args) {
              Attribute2 attribute2 = new Attribute2();
              System.out.println(attribute2.getType());
          }
        }
        
      • 测试结果
        class java.lang.Integer
        
    • gson和jackson转换复杂的带泛型List的对象时,比如List<Person>无法将json字符串中的Data数据转为Person对象集合 只能转换成List<LinkedHashMap>,还得手动转换,直到我发现jackson的ObjectMapper对象有一个convertValue方法,方法签名:public <T> T convertValue(Object fromValue, TypeReference<?> toValueTypeRef),使用:

      List<POJO> pojos = mapper.convertValue(listOfObjects, new TypeReference<List<POJO>>() { });
      

    相关文章

      网友评论

          本文标题:java 范型 Hibernate Jackson的一些应用和思

          本文链接:https://www.haomeiwen.com/subject/bkkbkftx.html