您的位置:首页 > 其它

ssh框架中关于泛型<T>的·使用

2017-01-10 12:08 204 查看
1.得到<T> .class 类型

    private final Class classt;

    /**

     * 把泛型的参数提取出来的过程放入到构造器中写,因为当子类

     * 创建对象的时候,直接调用父类的构造函数

     */

    @SuppressWarnings("rawtypes")

    public BaseDaoImpl(){

        /**

         * this代表的是子类

         * this.getClass().getGenericSuperclass();就是父类:BaseDaoImpl<T> 泛型

         * 如果不带T.this.getClass().getGenericSuperclass()返回的就是class类型,而不是ParameterizedType

         * spring(2.x和3.x)容器不支持带泛型的创建对象

         */

        ParameterizedType type = (ParameterizedType)this.getClass().getGenericSuperclass();

        //得到T的实现类型  (Class)type.getActualTypeArguments()[0]代表泛型里面的第一个参数

        this.classt = (Class)type.getActualTypeArguments()[0];

    }

    

    调用方式:this.classt.getSimpleName()

    

2.得到<T> .class 类型的Id

    private ClassMetadata classMetadata;//元数据,描述持久化类的对象

    public void init(){

        this.classMetadata = this.hibernateTemplate.getSessionFactory().getClassMetadata(this.classt);

    }

    调用的方式:this.classMetadata.getIdentifierPropertyName()

3.baseDaoImpl中的getCount方法

    (1)方法的参数为baseQuery,在该BaseQuery中有一个方法buildWhere,利用

    该方法可以得到查询条件的map形式

    (2)拼接hql语句的where条件语句

    (3)动态及的传入参数的值

        /**

     * 查询总数

     */

    @Override

    public int getCount(final BaseQuery baseQuery) {

        return this.hibernateTemplate.execute(new HibernateCallback<Integer>() {

            @Override

            public Integer doInHibernate(Session session)

                    throws HibernateException, SQLException {

                //创建一个StringBuffer

                StringBuffer buffer = new StringBuffer();

                //classt.getSimpleName()得到类的名字,只是classt的话是包含路径的全名

                buffer.append("select count(*)  from "+ classt.getSimpleName());

                buffer.append(" where 1 = 1 ");

                //获取所有查询条件

                Map<String, Object> keyValues = baseQuery.buildWhere();

                /**

                 * 拼接where条件的过程

                 */

                for (Entry<String, Object> entry : keyValues.entrySet()) {

                    buffer.append("and "+entry.getKey()+"=:"+entry.getKey());

                }

                //打印hql语句

                System.out.println("hql语句:"+buffer.toString());

                //存放一个hql语句

                Query query = session.createQuery(buffer.toString());

                /**

                 * 把where条件中的参数传递值的过程

                 */

                for (Entry<String, Object> entry : keyValues.entrySet()) {

                    query.setParameter(entry.getKey(), entry.getValue());

                }

                Long count  = (Long)query.uniqueResult();

                return count.intValue();//long转化为int

            }

            

        });

    }

    

4.findPageResult方法

public PageResult<T> findPageResult(final BaseQuery baseQuery) {

        //返回根据查询条件查询的总的记录数

        int totleRows = this.getCount(baseQuery);

        //创建PageResult对象

        final PageResult<T> pageResult = new PageResult<T>(baseQuery.getCurrentPage(),baseQuery.getPageSize(),totleRows);

        /**

         * 拼接where条件语句

         */

        final StringBuffer stringBuffer = new StringBuffer();

        stringBuffer.append("from "+this.classt.getSimpleName());

        stringBuffer.append(" where 1=1 ");

        //在map中封装的查询条件

        final Map<String, Object> keyValues = baseQuery.buildWhere();

        for (Entry<String, Object> entry : keyValues.entrySet()) {//把查询条件放到where的后面

            stringBuffer.append(" and "+entry.getKey()+"=:"+entry.getKey());

        }

        

        return this.hibernateTemplate.execute(new HibernateCallback<PageResult<T>>() {

            @Override

            public PageResult<T> doInHibernate(Session session) throws HibernateException,

                    SQLException {

                //根据拼接的hql语句产生一个query对象

                Query query = session.createQuery(stringBuffer.toString());

                /**

                 * 给hql语句的参数赋值

                 */

                for (Entry<String, Object> entry : keyValues.entrySet()) {

                    query.setParameter(entry.getKey(), entry.getValue());

                }

                //设置当前页的第一行在集合中的位置

                int firstResult = (baseQuery.getCurrentPage()-1)*baseQuery.getPageSize();

                //设置每页显示的做多的行数

                int maxResult = baseQuery.getPageSize();

                //用hibernate的方式设置分页

                query.setFirstResult(firstResult).setMaxResults(maxResult);

                //返回分页后的结果集

                List<T> rows = query.list();

                //把结果设置到pageResult

                pageResult.setRows(rows);

                return pageResult;

            }

        });

    }

    

5.根据Ids查询一堆数据

    /**

     * 根据ids获取一堆数据

     */

    @Override

    public Set<T> getEntriesByIds(Serializable[] ids) {

        StringBuffer buffer = new StringBuffer();

        for (int i = 0; i < ids.length; i++) {

            if(i == ids.length-1){

                buffer.append(ids[i]);

            }else{

                buffer.append(ids[i] + ",");

            }

        }

        StringBuffer hql = new StringBuffer();

        hql.append("from " + this.classt.getSimpleName());

        hql.append(" where " + this.classMetadata.getIdentifierPropertyName());

        hql.append("in(" + buffer.toString() + ")");

        List<T> list = this.hibernateTemplate.find(hql.toString());

        return new HashSet<T>(list);//讲list转化成一个set

    }

    

    http://localhost:8080/gylxt/departmentAction_showPageResult.action
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  泛型使用