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
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
相关文章推荐
- 关于使用<ajax:CascadingDropDown>控件出现的500错误和ScriptManager出现的注册表冲突错误解决方案
- 关于excel->csv文件的转换需要使用宏,高分求助- VB / VBA
- 关于spring 3.0.5的<mvc:resources> 标签的使用
- 关于使用<s:property value="">形式取得 数据库图片地址的注意事项
- 关于使用SSH框架写的项目没有网络会报错的问题
- 关于<a>标签的使用
- 关于使用commons-betwixt组件实现xml信息-->Java Bean的转化的一些感受
- <<Think in Java 4 >>中关于使用XOM操作xml文件
- 关于使用ssh框架时,pojo、dao、service三层的关系
- HTML5-关于如何使用<input>tags~汇总
- 关于List<T> :Distinct 和 OrderBy 、GroupBy使用简例
- 关于delegate的简单使用说明<转载两篇>
- 关于使用ssh框架时,pojo、dao、service三层的关系
- 关于spring切面使用<aop:aspectj-autoproxy/>报错的解决方法
- 关于使用ssh框架时,pojo、dao、service三层的关系
- 关于使用RadioButton和CheckBox控件(Asp.net)生成html包含<label>控件的一点认识
- [笔记].关于使用Nios II Flash Programmer下载后无法从EPCS启动的一种解决方法;sof+elf>flash>hex>jic
- JAVA1.5 关于解决泛型<T>当中无法获得class的问题
- 关于火狐在<td>中不支持使用position:relative
- 关于使用ssh框架时,pojo、dao、service三层的关系