设计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. OO第二单元作业分析

    前言 这一单元关于线程安全的作业结束了,在助教提供的接口的帮助以及老师提供的设计模型的指导下,这三次作业还是相对轻松地完成了,中间也没有出现什么bug,可能就是因为简单的逻辑不容易出错吧,可惜两次都由 ...

  2. 二.Flask 学习模板

    Flask 为你配置 Jinja2 模板引擎.使用 render_template() 方法可以渲染模板,只需提供模板名称和需要作为参数传递给模板的变量就可简单执行. 至于模板渲染? 简单来说,就是将 ...

  3. smart contract 知识点

    知识点 memory vs storage vs stack storage , where all the contract state variables reside. Every contra ...

  4. PHP使用PDO操作数据库的示例

    <pre><?phpheader("Content-type:text/html;charset=utf8");//error_reporting(E_ALL^E ...

  5. KiCad EDA 原理图库的最佳实践

    KiCad EDA 原理图库的最佳实践 由于有 Alias 别名元件,可以不用一个每一个元件都有一个元件. 对每种元件类型建议一个元件库. 因为 Value 和 元件名是一样的,所以元件名要尽可能的简 ...

  6. Java面试问题汇总

    转一些面试经验 刚看到下面这份面试清单,从个人的开发面试经历看,里面总结的大部分内容还是很不错的.年后想跳槽的朋友可以选取里面的问题准备一下. GitHub上的面试总结帖 Interview-Note ...

  7. .NET微信开发Charles突破微信授权,获取任意微信网页源代码(含Https)

    简介 Charles其实是一款代理服务器,通过成为电脑或者浏览器的代理,然后截取请求和请求结果达到分析抓包的目的.该软件是用Java写的,能够在Windows,Mac,Linux上使用.开发iOS都在 ...

  8. html中radio单选和文本框限制只能输入数字的解决方案

    一.当html中存在多个radio单选按钮时将所有的单选按钮name属性设置为一样,就可实现每次只选中一个的效果. 二.限制文本框只能输入数字,代码如下: $(function(){ $(" ...

  9. GitHub下载单个文件

    1. 点击某个文件. 2. 右键点击RAW. 3. 另存为

  10. 通过excel创建表

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...