设计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. Hello2实例的分析

    首先: java EE 上的hello2项目是一个部署在glass fish上的开发源码的java web项目,在终端通过命令行使用maven进行打包成.war文件,最后部署到相关的glass fis ...

  2. Python中的常用魔术方法介绍

    1.__init__ 初始化魔术方法 触发时机:初始化对象时触发(不是实例化触发,但是和实例化在一个操作中) 参数:至少有一个self,接收对象 返回值:无 作用:初始化对象的成员 注意:使用该方式初 ...

  3. SDL2.0.9源码分析

    1.首先 2.0.9编译so出来跟一直不一样,多了个hidapi  库 2.跟Tocy的对比,SDLmain 执行的路径不一样,一个是/src/main/android/SDL_android_mai ...

  4. Linux可以生产uImage

    默认kernel只生产Image和zImage,若想让kernel生产uImage,需要用到mkimage,这个是uboot可以提供的,位于uboot/tool/目录下,将其加入到环境变量即可.

  5. js获取世界不同时区的当前时间

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  6. 【mysql-server】遇到的坑

    一.前提 最近因为工作原因,不得不用windows电脑,发现windows装mysql真的坑太多 23333: 二.环境 windows 环境 mysql 5.7(不建议用5.8坑更多) 三.步骤 3 ...

  7. mysql(linux下)bug集结

    Mysql 启动测试: # systemctl status mysqld.service  

  8. 引擎设计跟踪(九.14.2 final) Inverse Kinematics: CCD 在Blade中的实现

    因为工作忙, 好久没有记笔记了, 但是有时候发现还得翻以前的笔记去看, 所以还是尽量记下来备忘. 关于IK, 读了一些paper, 觉得之前翻译的那篇, welman的paper (http://gr ...

  9. Nginx 配置location root 转自https://blog.csdn.net/rofth/article/details/78581617

    nginx指定文件路径有两种方式root和alias,root与alias主要区别在于nginx如何解释location后面的uri,这会使两者分别以不同的方式将请求映射到服务器文件上. 最基本的区别 ...

  10. Creating Excel files with Python and XlsxWriter——Introduction

    XlsxWriter 是用来写Excel2007版本以上的xlsx文件的Python模块. XlsxWriter 在供选择的可以写Excel的Python模块中有自己的优缺点. #---------- ...