public class BaseDaoImpl<T> extends HibernateDaoSupport implements IBaseDao<T> {
private Class<T> entity;
@Override //初始化的時候執行,拿到超類的全類名
protected void initDao() throws Exception {
ParameterizedType parameterizedType = (ParameterizedType)this.getClass().getGenericSuperclass();
Type[] types = parameterizedType.getActualTypeArguments();
entity = (Class<T>)types[0];
}
//初始化的時候執行,拿到超類的全類名,也可以在構造器裏執行
// public BaseDaoImpl(){
// ParameterizedType parameterizedType = (ParameterizedType)this.getClass().getGenericSuperclass();
//
// Type[] types = parameterizedType.getActualTypeArguments();
//
// entity = (Class<T>)types[0];
// }
// Dao層裏注入sessionFactory
@Autowired
@Override
protected HibernateTemplate createHibernateTemplate(SessionFactory sessionFactory) {
HibernateTemplate hibernateTemplate = super.createHibernateTemplate(sessionFactory);
setHibernateTemplate(hibernateTemplate);
return hibernateTemplate;
}
/**
* 生成hql語句
*/
private String getUpdateHql(T t) {
Field[] declaredFields = entity.getDeclaredFields();
StringBuffer buffer = new StringBuffer();
buffer.append("update ").append(entity.getSimpleName()).append(" set ");
Integer id = null;
for (Field field : declaredFields) {
try {
field.setAccessible(true);
String name = field.getName();
Object value = field.get(t);
if("id".equals(name)){
id=Integer.parseInt(value.toString());
continue;
}
if(value!=null){
if(value instanceof String){
buffer.append(name).append(" = ").append("'").append(value).append("'").append(",");
}else {
buffer.append(name).append(" = ").append(value).append(",");
}
}
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
int lastIndexOf = buffer.lastIndexOf(",");
String hqlPrefix = buffer.substring(0,lastIndexOf);
String updateHql = hqlPrefix.concat(" where id = "+id);
return updateHql;
}
public int add(T t) {
return Integer.parseInt(getHibernateTemplate().save(t).toString());
}
public int update(T t) {
String hql = getUpdateHql(t);//根據t拿到更新的hql
return getHibernateTemplate().bulkUpdate(hql);
}
public T getById(Integer id) {
return getHibernateTemplate().get(entity, id);
}
public int delete(Integer id) {
getHibernateTemplate().bulkUpdate("delete from "+entity.getSimpleName()+" where id=?",id);
return 0;
}
public int getCount() {
return getHibernateTemplate().execute(new HibernateCallback<Integer>() {
public Integer doInHibernate(Session session) throws HibernateException, SQLException {
Query query = session.createQuery("select count(t) from "+entity.getSimpleName()+" t");
Long count = (Long)query.uniqueResult();
return count.intValue();
}
});
}
public List<T> getList(Integer startIndex, Integer size) {
try {
return getHibernateTemplate().findByExample(entity.newInstance(), startIndex, size);
} catch (DataAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
}
private Class<T> entity;
@Override //初始化的時候執行,拿到超類的全類名
protected void initDao() throws Exception {
ParameterizedType parameterizedType = (ParameterizedType)this.getClass().getGenericSuperclass();
Type[] types = parameterizedType.getActualTypeArguments();
entity = (Class<T>)types[0];
}
//初始化的時候執行,拿到超類的全類名,也可以在構造器裏執行
// public BaseDaoImpl(){
// ParameterizedType parameterizedType = (ParameterizedType)this.getClass().getGenericSuperclass();
//
// Type[] types = parameterizedType.getActualTypeArguments();
//
// entity = (Class<T>)types[0];
// }
// Dao層裏注入sessionFactory
@Autowired
@Override
protected HibernateTemplate createHibernateTemplate(SessionFactory sessionFactory) {
HibernateTemplate hibernateTemplate = super.createHibernateTemplate(sessionFactory);
setHibernateTemplate(hibernateTemplate);
return hibernateTemplate;
}
/**
* 生成hql語句
*/
private String getUpdateHql(T t) {
Field[] declaredFields = entity.getDeclaredFields();
StringBuffer buffer = new StringBuffer();
buffer.append("update ").append(entity.getSimpleName()).append(" set ");
Integer id = null;
for (Field field : declaredFields) {
try {
field.setAccessible(true);
String name = field.getName();
Object value = field.get(t);
if("id".equals(name)){
id=Integer.parseInt(value.toString());
continue;
}
if(value!=null){
if(value instanceof String){
buffer.append(name).append(" = ").append("'").append(value).append("'").append(",");
}else {
buffer.append(name).append(" = ").append(value).append(",");
}
}
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
int lastIndexOf = buffer.lastIndexOf(",");
String hqlPrefix = buffer.substring(0,lastIndexOf);
String updateHql = hqlPrefix.concat(" where id = "+id);
return updateHql;
}
public int add(T t) {
return Integer.parseInt(getHibernateTemplate().save(t).toString());
}
public int update(T t) {
String hql = getUpdateHql(t);//根據t拿到更新的hql
return getHibernateTemplate().bulkUpdate(hql);
}
public T getById(Integer id) {
return getHibernateTemplate().get(entity, id);
}
public int delete(Integer id) {
getHibernateTemplate().bulkUpdate("delete from "+entity.getSimpleName()+" where id=?",id);
return 0;
}
public int getCount() {
return getHibernateTemplate().execute(new HibernateCallback<Integer>() {
public Integer doInHibernate(Session session) throws HibernateException, SQLException {
Query query = session.createQuery("select count(t) from "+entity.getSimpleName()+" t");
Long count = (Long)query.uniqueResult();
return count.intValue();
}
});
}
public List<T> getList(Integer startIndex, Integer size) {
try {
return getHibernateTemplate().findByExample(entity.newInstance(), startIndex, size);
} catch (DataAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
}