package com.hunqing.common.framework.dao;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.hunqing.common.reflex.GenericsUtils;
@SuppressWarnings("unchecked")
@Transactional //在本类里面加上事物处理
public abstract class DaoSupport<T> implements Dao<T> {
@PersistenceContext
EntityManager em;
//protected Class<T> entityClass=getEntityClass(); //获取实体类
protected Class<T> entityClass=GenericsUtils.getSuperClassGenricType(getClass());
public QueryResult<T> getScrollData(int firstResult,int maxResult){
String entityName=getEntityName(entityClass);
Query query=em.createQuery("select o from "+entityName+" o");
query.setFirstResult(firstResult).setMaxResults(maxResult); //limit 0,10 从0开始取10条
QueryResult<T> qr= new QueryResult<T>();
qr.setResultList(query.getResultList());
query= em.createQuery("select count(o) from "+entityName+" o"); //获取记录总数
qr.setRecordtotal((Long)query.getSingleResult());
return qr;
}
// public String getEntityName(){ //取得实体名称
// String entityName=this.entityClass.getSimpleName();
// Entity entity=this.entityClass.getAnnotation(Entity.class);
// if(entity.name() !=null&& !"".equals(entity.name())) entityName=entity.name();
// return entityName;
// }
//上面的方法试直接获取,下面这个是通过传参数来获取,并声明为静态方法
//protected static <T> String getEntityName(Class<T> entityClass){ //取得实体名称
public <E> String getEntityName(Class<E> entityClass) {
String entityName=entityClass.getSimpleName();
Entity entity=entityClass.getAnnotation(Entity.class);
if(entity.name() !=null&& !"".equals(entity.name())) entityName=entity.name();
return entityName;
}
// public Class<T> getEntityClass(){
// Type parentType=getClass().getGenericSuperclass(); //取得支持泛型的父类
// if (parentType instanceof ParameterizedType){ //所有的泛型都实现了ParameterizedType 这个接口(判断当前类是否支持泛型)
// ParameterizedType ptype=(ParameterizedType)parentType; //转换为泛型接口用于获取泛型里面的实际接收类型
// return (Class<T>)ptype.getActualTypeArguments()[0];//获取真实的类型参数,可以定义多个<T,M...>,当前只有一个
// }
// return null;
// }
public void deleteOne(Serializable entityId) {
em.remove(em.getReference(entityClass, entityId));
}
@Transactional(propagation=Propagation.NOT_SUPPORTED) //查询不需要添加事务处理
public T find(Serializable entityId) {
return em.find(entityClass, entityId);
}
@Transactional(propagation=Propagation.NOT_SUPPORTED) //查询不需要添加事务处理
public long getCount() {
return (Long)em.createQuery("select count(o) from "+getEntityName(this.entityClass)+" o ").getSingleResult();
}
public void save(T entity) {
em.persist(entity);
}
public void update(T entity) {
em.merge(entity);
}
}
分享到:
相关推荐
`DaoSupport.class`可能是提供通用DAO方法的辅助类。 5. **控制层**:`StartExam.class`和`Student.class`可能是处理特定业务逻辑的Action类,`StartExam`可能与在线考试功能相关,`Student`类则可能用于管理学生...
具体到`BlandServiceBean`类,它继承自`DaoSupport`,实现了`BlandService`接口,提供了`save`方法,用于保存实体到数据库。此外,`BlandService`接口本身也是一个DAO接口,定义了数据访问的操作契约。 ### 视图层...
例如,通过`@DAOSupport`注解,可以创建一个基类,为所有数据访问类提供通用的方法。`@SQL`和`@ResultMap`等注解则用于指定SQL语句和结果映射。这样,开发者只需关注业务逻辑,无需关心底层的SQL执行细节。 ### ...
- DaoSupport用于通用的DAO操作,封装分页功能,并使用自定义泛型。 - 文件上传下载通过IO和特定库如JSPSmartUpload、Spring的POI实现。 这份简历展示了应聘者扎实的Java Web开发基础,丰富的框架使用经验以及...
Spring JDBC还提供了一些更高级的查询接口,如`GenericSqlQuery`,用于通用查询;`UpdatableSqlQuery`,它可以更新结果集中的数据;`MappingSqlQueryWithParameter`则用于将结果集映射到Java对象。 - `SqlUpdate`和...