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