ItcastOA_设计BaseDao_设计DAO接口和实现类_写DAO实现类中的方法内容
3. 基础功能
3.1. 设计BaseDao接口与BaseDaoImpl类
每个实体都应有一个对应的Dao,他封装了对这个实体的数据库操作。例
实体Dao接口实现类
========================================================
User--> UserDao--> UserDaoImpl
Role--> RoleDao--> RoleDaoImpl
Department--> DepartmentDao--> DepartmentDaoImpl
Article--> ArticleDao--> ArticleDaoImpl
...
设计Dao接口(抽取接口的公共方法)
BaseDao.java----把每个dao都需要的方法放到这里,好让他们继承
public interface BaseDao<T> {
void save(T entity);
/**
* 保存实体
* @param id
*/
void delete (Long id);
/**
* 删除实体
* @param entity
*/
void update(T entity);
/**
* 更新实体
* @param id
* @return
*/
T getById(Long id);
/**
* 按id查询
* @return
*/
List<T> getByIds(Long[] id);
/**
* 按id查询
* @return
*/
List<T> findAll();
/**
* 查询所有
*/
}
UserDao.java----一些公用的方法继承BaseDao即可
public interface UserDao extends BaseDao<User>{
//自己有的特殊方法写在自己这里面
}
RoleDao.java
public interface RoleDao extends BaseDao<Role>{
}
增删改查等共有方法都有了

设计Dao实现类(抽取实现类的公共方法)
//实现RoleDao,实现所有未实现的方法
public class RoleDaoImpl implements RoleDao{ public void save(Role entity) {
} public void delete(Long id) {
} public void update(Role entity) {
} public Role getById(Long id) {
return null;
} public List<Role> getByIds(Long[] id) {
return null;
} public List<Role> findAll() {
return null;
}
}
public class UserDaoImpl implements RoleDao{
public void save(Role entity) {
}
public void delete(Long id) {
}
public void update(Role entity) {
}
public Role getById(Long id) {
return null;
}
public List<Role> getByIds(Long[] id) {
return null;
}
public List<Role> findAll() {
return null;
}
}
public class BaseDaoImpl<T> implements BaseDao<T> {
public void save(T entity) {
}
public void delete(Long id) {
}
public void update(T entity) {
}
public T getById(Long id) {
return null;
}
public List<T> getByIds(Long[] id) {
return null;
}
public List<T> findAll() {
return null;
}
}
public class RoleDaoImpl extends BaseDaoImpl<Role> implements RoleDao{
}
public class UserDaoImpl extends BaseDaoImpl<User> implements UserDao{
}
可以看出这两个实现类的很多方法都重复了,我们把它抽取出来,我们写一个类它事先实现了里面的公共方法,让这两个实现类继承即可。
BaseDaoImpl里方法是有了,但里面还没有内容,接下来写该实现类里面的方法内容
@SuppressWarnings("unchecked")
public abstract class BaseDaoImpl<T> implements BaseDao<T> {
@Resource
private SessionFactory sessionFactory;// 通过注入得到SessionFactory,要把它放到容器里才能注入,在具体的实现类上声明@Repository
private Class<T> clazz;
public BaseDaoImpl() {
//使用反射技术得到T的真实类型
ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();//获取当前new类型的泛型的父类类型
this.clazz = (Class<T>) pt.getActualTypeArguments()[0];//获取第一个类型参数的真实类型,只有一个泛型参数,所以写0
System.out.println("clazz--->" + clazz);
}
/**
* 获取当前可用的session对象,用protected修饰方便子类得到session
*/
protected Session getSession() {
return sessionFactory.getCurrentSession();
}
public void save(T entity) {
// 不需要自己关事务了,spring框架已经帮我们做了,我们用它的事务管理
getSession().save(entity);
}
public void update(T entity) {
getSession().update(entity);
}
public void delete(Long id) {
Object obj = getById(id);
if (obj != null) {
getSession().delete(obj);
}
}
public T getById(Long id) {
return (T) getSession().get(clazz, id);
}
public List<T> getByIds(Long[] ids) {
return getSession().createQuery(//
"FROM User WHERE id=IN(:ids)")//
.setParameter("", ids)
.list();
}
public List<T> findAll() {
return getSession().createQuery(//
"FROM " + clazz.getSimpleName())//
.list();
}
}

说明:
4, 实体的Dao接口要继承BaseDao接口。
5, Dao的实现类要继承DaoImplBase类。
6, 也可以不继承指定的接口或类,这样就要自己写相应的方法。
7, T getById(Long id)与List<T> getByIdList(Long[] idList)不要合并为List getById(Long... ids),因为获取一个对象时也是返回List,不方便。
获取 BaseDao的类型参数T的Class
问题:
1, 有了DaoBase与DaoImplBase,还要用UserDao、RoleDao吗?
答:要用。因为UserDao或RoleDao中的方法可以分为有公有的方法与特有的方法两部分。公有的方法是通过继承BaseDao得到的,特有的方法要写在自己里面(BaseDao中是没有的)。
2, UserDaoImpl已经继承了BaseDaoImpl,就不实现UserDao可以吗?
答:不可以。否则UserDao userDao = new UserDaoImpl(); 就不成立。
使用反射获取类型参数的真实类型的代码如下:
|
public DaoBaseImpl () { Type type = this.getClass().getGenericSuperclass(); ParameterizedType pt = (ParameterizedType) type; this.clazz = (Class<T>) pt.getActualTypeArguments()[0]; } |
说明:
1, 使用Session时,不要自己创建,也不要管理事务,直接调用getSession()即可。
2, 暂时不实现getSession()方法,在后面的事务管理中实现:
protected Session getSession(){
throw new UnsupportedOperationException();
}
ItcastOA_设计BaseDao_设计DAO接口和实现类_写DAO实现类中的方法内容的更多相关文章
- 【面向对象设计原则】之接口隔离原则(ISP)
接口隔离原则(Interface Segregation Principle, ISP):使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口. 从接口隔离原则的定义可以看 ...
- 我对面向对象设计的理解——Java接口和Java抽象类
在没有好好地研习面向对象设计的设计模式之前,我对Java接口和Java抽象类的认识还是很模糊,很不可理解. 刚学Java语言时,就很难理解为什么要有接口这个概念,虽说是可以实现所谓的多继承,可一个只有 ...
- 面象对象设计原则之四:接口隔离原则(The Interface Segregation Principle,ISP)
接口隔离原则定义如下: 接口隔离原则(Interface Segregation Principle, ISP):使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口. 根 ...
- 使用JWT设计SpringBoot项目api接口安全服务
转载直: 使用JWT设计SpringBoot项目api接口安全服务
- 为何有DAO与Service层?为何先搞Dao接口在搞DaoImpl实现?直接用不行吗?
转自 http://blog.sina.com.cn/s/blog_4b1452dd0102wvox.html 我们都知道有了Hibernate后,单独对数据的POJO封装以及XML文件要耗损掉一个类 ...
- 重学 Java 设计模式:实战代理模式「模拟mybatis-spring中定义DAO接口,使用代理类方式操作数据库原理实现场景」
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 难以跨越的瓶颈期,把你拿捏滴死死的! 编程开发学习过程中遇到的瓶颈期,往往是由于看不 ...
- 好的框架需要好的 API 设计 —— API 设计的六个原则
说到框架设计,打心底都会觉得很大很宽泛,而 API 设计是框架设计中的重要组成部分.相比于有很多大佬都认可的面向对象的六大原则.23 种常见的设计模式来说,API 设计确实缺少行业公认的原则或者说设计 ...
- Java生鲜电商平台-商品基础业务架构设计-商品设计
Java生鲜电商平台-商品基础业务架构设计-商品设计 在生鲜电商的商品中心,在电子商务公司一般是后台管理商品的地方.在前端而言,是商家为了展示商品信息给用户的地方,它是承担了商品的数据,订单,营销活动 ...
- Java基础-继承-编写一个Java应用程序,设计一个汽车类Vehicle,包含的属性有车轮个数 wheels和车重weight。小车类Car是Vehicle的子类,其中包含的属性有载人数 loader。卡车类Truck是Car类的子类,其中包含的属性有载重量payload。每个 类都有构造方法和输出相关数据的方法。最后,写一个测试类来测试这些类的功 能。
#29.编写一个Java应用程序,设计一个汽车类Vehicle,包含的属性有车轮个数 wheels和车重weight.小车类Car是Vehicle的子类,其中包含的属性有载人数 loader.卡车类T ...
随机推荐
- 执行pig出错Unhandled internal error. Found interface jline.Terminal, but class was expected
执行pig时报例如以下错误 2015-07-14 10:41:12,869 [main] ERROR org.apache.pig.Main - ERROR 2998: Unhandled inter ...
- Zmodem transfer canceled by remote side问题的解决办法!
在使用跳转机跳转到另外一台机器的时候,上传一个安装包,此时使用rz命令上传文件,例如:resin-pro-4.0.44.tar.gz,结果出现如下错误提示: 点击确定之后,界面出现乱码,并退回到了跳转 ...
- linux 源码安装 Nginx
1.安装前环境准备安装make:# yum -y install gcc automake autoconf libtool make安装g++:# yum install gcc gcc-c++ 2 ...
- C#: 数字经纬度和度分秒经纬度间的转换
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Cons ...
- 实现WinForm窗体的美化(借助第三方控件)
在winform项目中,其实皮肤就是一个第三方的控件,名字是IrisSkin4.dll只要添加到你的工具箱里就可以和其它控件一样使用了 一.添加控件IrisSkin4.dll.方法: 先把IrisSk ...
- FPGA的EPCS 配置的2种方法 FPGA下载程序的方法(EPCS)
使用主动串行配置模式对Cyclone FPGA进行配置前,必须将配置文件写入串行配置器件EPCS.将配置文件写入EPCS的方法有三种: (1)在Quartus II的Programmer中,通过专门与 ...
- Ajax异步打开新页面弹框被拦截,无法将参数值传递到后台
一.Form提交,打开新页面被拦截 手动触发Form提交打开新页面是不会被拦截的,但是如果通过Ajax异步处理回调后再程序自动触发Form提交的话,就会被浏览器当成广告弹框拦截 1.暂时的解决办法:如 ...
- xml去除指定节点,保留子节点操作
现有xml文件: <?xml version="1.0" encoding="utf-8" ?> <ShiftConfig xmlns:xsi ...
- web压力测试指标
1.TPS每秒钟完成的web请求响应数量TPS=并发数/响应时间TPS是衡量系统性能的重要指标 2.并发数时间段内,系统同时处理的web请求响应数量 3.响应时间所有web请求处理完毕的时间 4.吞吐 ...
- codeblocks 配置OpenGL
一.选择编译器环境 这里选择codeblocks,带MinGW的版本. 二.下载glut工具包 网址:http://pan.baidu.com/s/1eQriTQM 三.配置glut 解压缩下载的gl ...