BaseDao 接口
2024-08-25 09:20:56
// 以后所有的 Dao 接口都需要继承 BaseDao 接口;
// 自定义泛型接口
public interface BaseDao<T>{
public void save(T t);
public void delete(T t);
public void update(T t);
public T findById(Long id);
public List<T> findAll();
// 分页查询
public PageBean<T> findByPage(Integer pageCode, Integer pageSize, DetachedCriteria criteria);
}
// 以后所有的 XxxDaoImpl 都可以继承 BaseDaoImpl
public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T>{
// 定义成员属性,代表的是某个实体的类型
private Class<T> entityClass;
// 有参构造方法
public BaseDaoImpl(Class<T> entityClass){
this.entityClass = entityClass;
}
// 添加方法
public void save(T t){
this.getHibernateTemplate().save(t);
}
// 删除方法
public void delete(T t){
this.getHibernateTemplate().delete(t);
}
// 修改方法
public void update(T t){
this.getHibernateTemplate().update(t);
}
// 按主键查找
public T findById(Long id){
return (T)this.getHibernateTemplate().get(entityClass,id);
}
// 查询所有
public List<T> findAll(){
return (List<T>)this.getHibernateTemplate().find("from "+ entityClass.getSimpleName());
}
// 分页查询
public PageBean<T> findByPage(Integer pageCode, Integer pageSize, DetachedCriteria criteria){
// 创建分页对象
PageBean<T> page = new PageBean<T>();
// 给其各个属性赋值
page.setPageCode(pageCode);
page.setPageSize(pageSize);
// 设置聚合函数, 此时,SQL 语句已经变成 select count(*) from
criteria.setProjection(Projections.rowCount());
List<Number> list = (List<Number>)this.getHibernateTemplate().fingByCriteria(criteria);
if(list != null && list.size() > 0){
int totalCount = list.get(0).intValue();
// 设置总记录数
page.setTotalCount(totalCount);
}
// 重置 SQL 语句, select * from
criteria.setProjection(null);
List<T> beanList = (List<T>)this.getHibernateTemplate().findByCriteria(
criteria,(pageCode - 1)*pageSize, pageSize
);
page.setBeanList(beanList);
return page;
}
}
// 具体应用
// customer 的接口
public interface CustomerDao extends BaseDao<Customer>{ }
// customer 的实现类
public class CustomerDaoImpl extends BaseDaoImpl<Customer> implements CustomerDao{
// 解决按主键查找时, 需要 clazz 类的问题
public CustomerDaoImpl(){
// 调用父类的有参构造方法
super(Customer.class);
}
}
// 第二种解决 clazz 类的问题
public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T>{
// 定义成员属性
private Class<T> clazz;
// 当启动服务器时, applicationContext.xml 加载;
// CustomerDaoImpl 类创建对象, 加载父类, 父类也创建
// 父类中的空参构造方法执行
public BaseDaoImpl(){
// this 表示子类, c表示 CustomerDaoImpl 的 Class 对象
// 1. 即得到当前运行类的 Class
Class c = this.getClass();
// 因为 CustomerDaoImpl extends BaseDaoImpl<Customer>
// 2. 获取到运行类的 父类的参数化类型: BasDaoImpl<Customer>
// type 是接口, java.lang.reflect.Type 包中
Type type = c.getGenericSuperclass();
// 3. 转换成子接口 ParameterizedType
// java.lang.reflect.ParameterizedType;
ParameterizedType ptype = (ParameterizedType) type;
// 得到实际类型参数: <Customer> 里面的 Customer
// 例如Map<key,value>, 返回的类型中可能有多个值,所以类型为数组
Type[] types = ptype.getActualTypeArguments();
// type 接口的实现类是 Class
// 赋值给成员属性
this.clazz = (Class<T>)types[0];
}
// 按主键查找
public T findById(Long id){
return (T)this.getHibernateTemplate().get(clazz,id);
}
// 查询所有
public List<T> findAll(){
// 使用 Class 里面getSimpleName(), 得到类名称
// 注意: from 后面需要加空格
return (List<T>)this.getHibernateTemplate().find("from "+ clazz.getSimpleName());
}
}
最新文章
- HTML 学习笔记 JQuery(选择器)
- 支付宝通知页面notify_url、返回页面return_url
- html 输入框验证
- servlet&;jsp高级:第五部分
- JDOM方法实现对XML文件的解析
- javascript创建对象(一)
- iOS打电话、发邮件、发短信、打开浏览器
- 新手必看:如何快速看懂VC++项目
- 四种JavaScript隐式类型转换的总结
- HTML5图片居中的问题
- iOS 10.0之前和之后的Local Notification有神马不同
- wtforms-表单生成及验证
- hg和git命令对照表
- [总结]其他杂项数学相关(定理&;证明&;板子)
- Cisco DHCP 配置方法
- Windows Phone本地数据库(SQLCE):11、使用LINQ查询数据库(翻译) (转)
- Android基础(五) Service全解析----看不见的Activity
- 在一个gradle 的maven property 里添加多个URL
- Comet:基于 HTTP 长连接的“服务器推”技术(转载)
- webpack 分析