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 ...
随机推荐
- 增强基本选择器[selector_3.html]
增强基本选择器[selector_3.html] $("ul li:first") $("ul li:last") $("table tr:even& ...
- Using AutoFac
第一次整理了下关于autofac的一些具体的用法 1. 安装 Autofac: Install-Package Autofac -Version 4.8.1 2. 创建两个类库项目,IService ...
- EMQ ---websocket
简介 近年来随着 Web 前端的快速发展,浏览器新特性层出不穷,越来越多的应用可以在浏览器端或通过浏览器渲染引擎实现,Web 应用的即时通信方式 WebSocket 得到了广泛的应用. WebSock ...
- chome 离线安装包地址
https://www.chromedownloads.net/chrome32win-stable/ --32bit https://www.chromedownloads.net/chrome6 ...
- RFID编码
信号编码系统包括信源编码和信道编码两大类,器作用是把要传输的信息尽可能的与传输信道相匹配,并提供对信息的某种保护以防止信息受到干扰.信源编码与信源译码的目的是提高信息传输的有效性以及完成模数转换等:信 ...
- jquery常见插件用法表
一:美化select表单:chosen.jquery.js http://harvesthq.github.io/chosen/ 关于ajax更新列表后需要触发下插件的事件,才会表现出来:(http: ...
- mysql基础知识详解
分享一些mysql数据库的基础知识. 1.每个客户端连接都会从服务器进程中分到一个属于它的线程.而该连接的相应查询都都会通过该线程处理.2.服务器会缓存线程.因此并不会为每个新连接创建或者销毁线程.3 ...
- 安卓-APP安装后多个图标的解决
原因是在不同Activity的intent中配置了多个LAUNCHER. <intent-filter> <action android:name="android.int ...
- Decoration7:注册登录设计
首先顶一个小目标:从前台写入用户数据后,登录的时候输入用户名和密码,能够查询数据库成功,同时记录session数据 1.Login界面,为了只关注主线任务,我直接套用一个bootstrap模板admi ...
- <LeetCode OJ> 234. Palindrome Linked List
Total Accepted: 40445 Total Submissions: 148124 Difficulty: Easy Given a singly linked list, determi ...