设计IBseDao接口,定义公共的CRUD方法。

// IBaseDao 接口,定义公共的CRUD方法
public interface IBaseDao<T> { public void add(T t);
public void update(T t);
public void delete(T t);
public T getById(int id);
public List<T> getList(int startIndex,int pageSize);
public int getTotalCount(); }
// BaseDaoImpl接口,实现公共的CRUD方法
public class BaseDaoImpl<T> extends HibernateDaoSupport implements IBaseDao<T> {
private Class<T> entityClass; // 子类的实例化需调用父类的无参构造方法,通过构造方法获取父类的泛型类型
public BaseDaoImpl() { // this.getClass() --> 子类的class对象, getGenericSuperclass() ---> 获取父类的Type
ParameterizedType pType = (ParameterizedType) this.getClass().getGenericSuperclass(); // 获取第一个类型参数的真实类型,只有一个泛型参数,所以写0
// ParameterizedType 参数化类型, getActualTypeArguments(),返回表示此类型实际类型参数的Type对象的数组
entityClass = (Class<T>) pType.getActualTypeArguments()[0]; } @Override
public void add(T t) { // 增加
this.getHibernateTemplate().save(t);
} @Override
public void update(T t) {// 修改
this.getHibernateTemplate().update(t);
} @Override
public void delete(T t) {// 删除
this.getHibernateTemplate().delete(t);
} @Override
public T getById(int id) { // 查询单个对象
return this.getHibernateTemplate().get(entityClass, id);
} @Override
public List<T> getList(int startIndex, int pageSize) { // 分页查询
return this.getHibernateTemplate().execute(new HibernateCallback<List<T>>() { @Override
public List<T> doInHibernate(Session session) throws HibernateException {
Query query = session.createQuery("from " + entityClass.getName());
query.setFirstResult(startIndex);
query.setMaxResults(pageSize);
return query.list();
}
});
} @Override
public int getTotalCount() { // 查询总记录数
return this.getHibernateTemplate().execute(new HibernateCallback<Integer>() { @Override
public Integer doInHibernate(Session session) throws HibernateException {
Query query = session.createQuery("select count(*) from " + entityClass.getName());
Long count = (Long) query.uniqueResult();
return count.intValue();
}
});
} }
// IUserDao 继承 IBaseDao接口
public interface IUserDao extends IBaseDao<User> { }
// UserDaoImpl 继承BaseDaoImpl类,实现 IUserDao接口
public class UserDaoImpl extends BaseDaoImpl<User> implements IUserDao { }

==========================================================================

Service层同理,设计IBseService接口,定义公共的CRUD方法。

// IBaseService接口,定义CRUD方法
public interface IBaseService<T> {
public void add(T t);
public void update(T t);
public void delete(T t);
public T getById(int id);
public List<T> getList(int startIndex,int pageSize);
public Page<T> getPage(String currentPage);
}
// BaseServiceImpl类,实现IBaseService接口
public abstract class BaseServiceImpl<T> implements IBaseService<T> { //提供一个抽象方法,让子类返回对应的子类Dao
public abstract IBaseDao<T> getBaseDao(); @Override
public void add(T t) {
getBaseDao().add(t);
} @Override
public void update(T t) {
getBaseDao().update(t);
} @Override
public void delete(T t) {
getBaseDao().delete(t);
} @Override
public T getById(int id) {
return getBaseDao().getById(id);
} @Override
public List<T> getList(int startIndex, int pageSize) {
return getBaseDao().getList(startIndex, pageSize);
} @Override
public Page<T> getPage(String currentPage) {
Page<T> page = new Page<>(1, 3);
if(currentPage!=null){
page.setCurrentPage(Integer.parseInt(currentPage));
}
int totalCount = getBaseDao().getTotalCount();
int totalPage = totalCount%page.getPageSize()==0?totalCount/page.getPageSize():totalCount/page.getPageSize()+1;
List<T> list = getList((page.getCurrentPage()-1)*page.getPageSize(),page.getPageSize());
page.setTotalPage(totalPage);
page.setList(list);
return page;
}
}
// IUserService 继承 IBaseService接口
public interface IUserService extends IBaseService<User> { }
// UserServiceImpl 继承 BaseServiceImpl类,实现IUserService 接口
public class UserServiceImpl extends BaseServiceImpl<User> implements IUserService { private IUserDao userDao; public IUserDao getUserDao() {
return userDao;
} public void setUserDao(IUserDao userDao) {
this.userDao = userDao;
} @Override
public IBaseDao<User> getBaseDao() {
return userDao;
}
}

Dao层抽取BaseDao公共方法的更多相关文章

  1. MyBatis逆向工程生成dao层增删改查方法解释使用(转载)

    int countByExample(BUserExample example); //根据条件查询数量 /** * 示例 * public int countByExample() { * BUse ...

  2. DAO层,Service层,Controller层、View层 的分工合作

    DAO层:DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DAO的接口,然后在Spring的配置文件中定义此接口的实现类,然后就可在模块中调用此接口 ...

  3. [转]DAO层,Service层,Controller层、View层

    来自:http://jonsion.javaeye.com/blog/592335 DAO层 DAO 层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DA ...

  4. Mybatis Dao层注解及XML组合Dao的开发方式

    mybatis可以用xml进行数据操作,也可以在dao层用注解的方式,也可以采取xml和dao层接口组合使用的方法.显然 ,后者更加简单. 实体类Student   package com.zhao. ...

  5. DAO层,Service层,Controller层、View层

    DAO层:DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DAO的接口,然后在Spring的配置文件中定义此接口的实现类,然后就可在模块中调用此接口 ...

  6. 分层 DAO层,Service层,Controller层、View层

    前部分摘录自:http://blog.csdn.net/zdwzzu2006/article/details/6053006 DAO层:DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务 ...

  7. DAO层,Service层,Controller层、View层介绍

    来自:http://jonsion.javaeye.com/blog/592335 DAO层 DAO 层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DA ...

  8. MyBatis框架的XML数据访问Dao层接口的组合使用

    MyBatis 的前生为Apache的开源项目iBatis.其优势在于灵活,几乎可以替代JDBC,同时提供了编程接口.目前MyBatis的数据访问Dao层不需要实现类,也不需要像JDBC那样拼接Hql ...

  9. 【DRP】-Dao层常用功能代码:增删改查

    本系列博客内容为:做DRP系统中Dao层常用功能. 该项目采用MVC架构 C(Controller)控制器,主要职责;1.取得表单参数:2.调用业务逻辑:3.转向页面 M(Model)模型,主要职责: ...

随机推荐

  1. SQA计划

    一.SQA计划 1.软件工程 所做程序是一个长沙大学的学习app系统 .可以实现用户的注册登录,课程学习,以及活动参加.根据需求建模,进行体系结构设计,然后设计. 2.质量保证 (1)项目需要符合IE ...

  2. npm,bower安装失败

    安装一些软件时,总是会出现一些莫名其妙的问题.我在安装node.js时,默认安装到C:\Program Files\nodejs之后,安装bower时,bower_components默认装到C:\W ...

  3. Javascript 4.4

    childNodes属性:可以从给定文档的节点树里把任何一个元素的所有子元素检索出来 返回的值是一个数组,此数组包含给定元素节点的全体子元素:element.childNodes nodeType属性 ...

  4. PYTHON之路,线程

    关于多任务的理解, 代码要执行,首先得变成机器认识的东西执行,那么需要解释器.那么执行按道理,一段程序在这里就具体来说一段代码的执行吧,我们知道代码的执行是从上至下按顺序执行,那么这里有条件分支结构, ...

  5. 学习笔记TF065:TensorFlowOnSpark

    Hadoop生态大数据系统分为Yam. HDFS.MapReduce计算框架.TensorFlow分布式相当于MapReduce计算框架,Kubernetes相当于Yam调度系统.TensorFlow ...

  6. [工作积累] UE4 TAA ReProjection的精度处理

    先贴一个UE4 TAA的slidehttps://de45xmedrsdbp.cloudfront.net/Resources/files/TemporalAA_small-59732822.pdf ...

  7. c++ 调用 wmi 获取数据

    #define _WIN32_DCOM #include <iostream> using namespace std; #include <comdef.h> #includ ...

  8. fiddler 按条件过滤

    使用fiddler抓包过程中最希望获取自己想要的数据,不重要的信息最希望的是过滤,如果重要和不重要的数据都展示对我们在寻找资源的时候产生了很大的干扰,所以我们需要按条件过滤: 1.启用fiddler ...

  9. Linux基础入门-文件打包与解压缩

    文件打包与解压缩: Windows上常见的压缩文件后缀有*.zip(zip程序打包压缩), *.rar(rar程序压缩), *.7z(7zip程序压缩),在Linux上常见的还有*.gz(gzip程序 ...

  10. netty原理解析

    netty主要采用的是reactor模式(事件)驱动模型,以下主要对reactor进行总结: C/S架构可以抽象为如下模型: C就是Client(客户端),上面的B是Browser(浏览器) S就是S ...