1、dao层公共接口与实现
package com.ytmr.dao.base;
import java.io.Serializable;
import java.util.Collection;
public interface CommonDao<T> {
//根据id删除一个对象
public void deleteEntry(Serializable id);
//添加一个对象
public void saveEntry(T t);
//更新一个对象
public void updateEntry(T t);
//保存或更新一个对象
public void saveOrUpdate(T t);
//根据id查询出持久化类中的某一对象
public T getEntryById(Serializable id);
//查询所有数据
public Collection<T> findAllEntry();
//根据多个id查询出一个集合对象
public Collection<T> findAllEntryByIds(Serializable[] ids);
}
package com.ytmr.dao.base.impl;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import javax.annotation.Resource;
import org.hibernate.metadata.ClassMetadata;
import org.springframework.orm.hibernate3.HibernateTemplate;
import com.ytmr.dao.base.CommonDao;
public class CommonDaoImpl<T> implements CommonDao<T> {
@SuppressWarnings("rawtypes")
private Class clazz;
@SuppressWarnings("rawtypes")
public CommonDaoImpl() {
/**
* 1、得到泛型
* (1)this:谁调用了该构造函数this就代表谁
* (2)假如UserDaoImpl extends CommonDaoImpl<User>
* (3)UserDaoImpl将会交给 spring来创建对象,但spring没有办法给泛型创建对象,
* 所以不能再UserDaoImpl创建对象 时传递参数,所以只能通过第二步的方式把参数
* 传递进去。
* (4)this代表CommonDaoImpl的子类
* (5)getGenericSuperclass得到的是this的父类CommonDaoImpl
* (6)this.getClass().getGenericSuperclass()得到的是class
*/
ParameterizedType type = (ParameterizedType) this.getClass()
.getGenericSuperclass();
/**
* 2、返回表示此类型实际参数类型的Type对象数组,getActualTypeArguments
* 获得实际参数类型
*/
Type[] param = type.getActualTypeArguments();
/**
* 3、得到T的Class形式
*/
this.clazz = (Class) param[0];
}
//有spring的配置文件將其引入到spring的容器中
public HibernateTemplate hibernateTemplate;// 需要导入spring的jar包
public HibernateTemplate getHibernateTemplate() {
return hibernateTemplate;
}
public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
this.hibernateTemplate = hibernateTemplate;
}
// 根据id删除一个对象
@SuppressWarnings("unchecked")
@Override
public void deleteEntry(Serializable id) {
T t = (T) this.getHibernateTemplate().get(this.clazz, id);
this.getHibernateTemplate().delete(t);
}
// 保存一个对象
@Override
public void saveEntry(T t) {
this.getHibernateTemplate().save(t);
}
// 更新一个对象
@Override
public void updateEntry(T t) {
this.getHibernateTemplate().update(t);
}
// 保存或更新一个对象
@Override
public void saveOrUpdate(T t) {
this.getHibernateTemplate().saveOrUpdate(t);
}
// 根据id得到某一个对象
@SuppressWarnings("unchecked")
@Override
public T getEntryById(Serializable id) {
return (T) this.getHibernateTemplate().get(this.clazz, id);
}
// 查询所有的对象
@SuppressWarnings("unchecked")
@Override
public Collection<T> findAllEntry() {
return this.getHibernateTemplate().find("from" + this.clazz.getName());
}
// 根据多个id查询出一个集合对象
@SuppressWarnings("unchecked")
@Override
public Collection<T> findAllEntryByIds(Serializable[] ids) {
//调用下面的方法,將数组转化成字符串
String condition = ArrayToString(ids);
//ClassMetadata持久化类的原数组,需要导入hibernate的jar包
ClassMetadata metadata = this.getHibernateTemplate()
.getSessionFactory().getClassMetadata(this.clazz);
//getIdentifierPropertyName 标示符的名称,getEntityName持久化类的名称,getPropertyNames一般属性名字
List<T> list = this.getHibernateTemplate().find(
"from " + this.clazz.getName() + " where "
+ metadata.getIdentifierPropertyName() + " in("
+ condition + ")");
//将list集合转换成set集合返回
return new HashSet<T>(list);
}
//將数组转化成字符串
private String ArrayToString(Serializable[] ids) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < ids.length; i++) {
//目的去除最后一个字符是逗号
if (i == ids.length - 1) {
sb.append(i);
} else {
sb.append(i).append(",");
}
}
return sb.toString();
}
}
2、action层
package com.ytmr.web.action.base;
import java.lang.reflect.ParameterizedType;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
@SuppressWarnings("serial")
public class BaseAction<T> extends ActionSupport implements ModelDriven<T> {
private T t;
@SuppressWarnings("rawtypes")
private Class clazz;
@SuppressWarnings({ "unchecked", "rawtypes" })
public BaseAction() {
// 得到泛型
ParameterizedType type = (ParameterizedType) this.getClass()
.getGenericSuperclass();
// 得到参数类型
this.clazz = (Class) type.getActualTypeArguments()[0];
// 给实参具体类型创建对象
try {
this.t = (T) this.clazz.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public T getModel() {
return t;
}
}