1. 设计说明

在我们的电子相册系统中,主要的两个对象就是:相片(photo)、用户(user)。所以我们就针对这两个对象来进行设计。而这两个对象都涉及到了对其进行:添加、删除、更新、查找。所以我们可以把共有的方法封装到一个方法。由于我们的编程提倡是用接口思想,所以最好是设计个接口,然后用实现类来实现。例如,我们设计个BaseDao的接口,这个接口中包含了所在共用的方法名,然后用BaseDaoImpl的类实现BasseDao的方法。这样共用的方法就设计好了。接下来就是根据具体的对象来调用了。如,我们对User进行DAO的操作,那么我们就会设计个UserDao来继承接口BaseDao,然后用UserDaoImpl来继承BaseDaoImpl类,这样实现的类也就设计好了。

2. Dao实例图

3. 代码实现

1)        公用接口BaseDao,这里就包含了所有的对象操作的公共部分。这里包含了发下几个方面:根据ID加载实体、保存实体、更新实体、删除实体、删除实体、根据ID删除实体、获取所有实体、获取实体总数。值我们去注意的就是,这里我们用了泛型的设计,因为它是公共的方法,所以我们也不清楚是什么对象调用了这个接口。

public interface BaseDao<T>
{/*** 根据ID加载实体* @param entityClazz* @param id* @return*/T get(Class<T> entityClazz, Serializable id);/*** 保存实体* @param entity* @return*/Serializable save(T entity);/*** 更新实体* @param entity*/void update(T entity);/*** 删除实体* @param entity*/void delete(T entity);/*** 根据ID删除实体* @param entity* @param id*/void delete(Class<T> entity, Serializable id);/*** 获取所有实体* @param entityClazz* @return*/List<T> findAll(Class<T> entityClazz);/*** 获取实体总数* @param entityClazz* @return*/long findCount(Class<T> entityClazz);
}

2)        编写好了接,那么接下来我们要做的事情就是要实现这些接口的方法。

 public class BaseDaoImpl<T> implements BaseDao<T>
{//DAO组件进行持久操作底层依赖的SessionFactory组件private SessionFactory sessionFactory;public SessionFactory getSessionFactory(){return this.sessionFactory;}public void setSessionFactory(SessionFactory sessionFactory){this.sessionFactory = sessionFactory;}@SuppressWarnings("unchecked")@Overridepublic T get(Class<T> entityClazz, Serializable id){return (T)getSessionFactory().getCurrentSession().get(entityClazz, id);}@Overridepublic Serializable save(T entity){return getSessionFactory().getCurrentSession().save(entity);}@Overridepublic void update(T entity){getSessionFactory().getCurrentSession().update(entity);}@Overridepublic void delete(T entity){getSessionFactory().getCurrentSession().delete(entity);}@Overridepublic void delete(Class<T> entity, Serializable id){delete(get(entity, id));}@Overridepublic List<T> findAll(Class<T> entityClazz){return find("select en from " + entityClazz.getSimpleName() + " en");}@Overridepublic long findCount(Class<T> entityClazz){List list = find("select count(*) from " + entityClazz.getSimpleName());if (list != null && list.size() == 1){return (Long) list.get(0);}return 0; }/*** 根据HQL语句查询实体* @param hql* @return*/@SuppressWarnings("unchecked")protected List<T> find(String hql){return (List<T>)getSessionFactory().getCurrentSession().createQuery(hql).list();}/*** 根据带占位符参数HQL语句查实体* @param hql* @param params* @return*/@SuppressWarnings({ "unchecked", "unused" })protected List<T> find(String hql, Object...params){Query query = getSessionFactory().getCurrentSession().createQuery(hql);for (int i=0, len = params.length; i < len; i++){query.setParameter(i + "", params[i]);}return (List<T>)query.list();}/*** 分页查询* @param hql* @param pageNo* @param pageSize* @return*/@SuppressWarnings("unchecked")protected List<T> findByPage(String hql, int pageNo, int pageSize){return getSessionFactory().getCurrentSession().createQuery(hql).setFirstResult((pageNo - 1) * pageSize).setMaxResults(pageSize).list();}/*** 分页查询,多个参数* @param hql* @param pageNo* @param pageSize* @param params* @return*/@SuppressWarnings("unchecked")protected List<T> findByPage(String hql, int pageNo, int pageSize, Object...params){Query query = getSessionFactory().getCurrentSession().createQuery(hql);for (int i = 0, len = params.length; i < len; i++){query.setParameter(i + "",  params[i]);}return query.setFirstResult((pageNo - 1) * pageSize).setMaxResults(pageSize).list();}
}

3)        现在我们设计个用户的接口——UserDao,这个接口只要继承BaseDao就可以了,同时,如果有自己的独有的方法,那么就再进行添加。

public interface UserDao extends BaseDao<User>
{/*** 根据用户名查找的用户* @param name 需要查找的用户的用户名* @return 查找到的用户*/User findByName(String name);
}

4)        一样的,我们也要对这个接口进行实现。注意的是,这个接口不仅要实现UserDao的方法,同时还要继承接口BaseDaoImpl。

 public class UserDaoImpl extends BaseDaoImpl<User> implements UserDao
{@Overridepublic User findByName(String name){List<User> users = find("select u from User u where u.name = ?0", name);if (users != null && users.size() == 1){return users.get(0);}return null;}}

5)        对于相片的Dao实现与用户的实现是一样的,所以这里就不给出了。读者可以见源码。

电子相册系统(一)Dao的组件设计相关推荐

  1. 前端组件设计之理论篇

    前端组件设计之理论篇 前言 一.什么是前端组件 二.组件设计原则 1.单一职责 2.封装 3.组合 4.复用 5.富有意义 6.可测试 三.总结 前言 什么是前端组件?对于一个前端开发人员来说再熟悉不 ...

  2. vue组件引入scss变量_SCSS特色的Vue.js ui组件设计系统

    vue组件引入scss变量 Kotti设计系统 (Kotti Design System) This design system helps to unify our design language ...

  3. 【C#+SQL Server+打印组件】实现电商快递单打印系统 五:自定义组件和快递单模板设计(附源码和资源)

    需要源码和资源请点赞关注收藏后评论区留言私信~~~ 一.自定义组件(扩展TextBox) 由于快递单种类较多,所以在设计系统时考虑开发一个通用模板,由用户根据自己使用的快递单样式自行定义快递单的文本输 ...

  4. jsp mysql 在线相册_网上电子相册系统的设计(JSP+MySQL)含录像

    摘 要:网上电子相册系统是采用JSP开发的一个基于B/S构架的连接数据库的电子相册网站.相比起互联网的发展,电子相册出现的时间不算太长,但却迎合了大多数网民的需求,是一个大有"前途" ...

  5. SpringBoot实现Java高并发秒杀系统之DAO层开发(一)

    SpringBoot实现Java高并发秒杀系统之DAO层开发(一) 秒杀系统在如今电商项目中是很常见的,最近在学习电商项目时讲到了秒杀系统的实现,于是打算使用SpringBoot框架学习一下秒杀系统( ...

  6. ueditor上传组件显示乱码_最全面的移动端 UI组件设计详解:中篇

    上一期给大家讲解了<最全面的移动端UI组件设计详解:上篇>,主要分享了:布局组件和导航组件2个部分:这次给大家带来:基础组件.表单组件和反馈组件详解,希望你在设计APP.小程序.H5页面中 ...

  7. COM 组件设计与应用(六)——用 ATL 写第一个组件(vc.net)

    一.前言 1.与 <COM 组件设计与应用(五)>的内容基本一致.但本回讲解的是在 vc.net 2003 下的使用方法,即使你不再使用vc6.0,也请和上一回的内容,参照比对. 2.这第 ...

  8. 最小系统必须安装的组件(仅做参考)

    此是最小系统安装组件,如果做成XPE,可能会出现问题.不推荐最小化组件构建系统. ★最小系统必须安装的组件 Design Templates→Windows-based Terminal Profes ...

  9. COM 组件设计与应用(十一)—— IDispatch 及双接口的调用

    原文:http://www.vckbase.com/index.php/wv/1236 一.前言 前段时间,由于工作比较忙,没有能及时地写作.其间收到了很多网友的来信询问和鼓励,在此一并表示感谢.咳. ...

  10. 【转载】COM 组件设计与应用(四)——简单调用组件

    原文:http://vckbase.com/index.php/wv/1211.html 一.前言 同志们.朋友们.各位领导,大家好. VCKBASE 不得了, 网友众多文章好. 组件设计怎么学? 知 ...

最新文章

  1. 2022-2028年中国降解塑料聚酯行业运行动态及投资机会分析报告
  2. mysql unoin排序
  3. C# 实现ADSL自动断网和拨号(适用于拨号用户)
  4. python re正则_正则表达式+Python re模块详解
  5. Nginx 编译参数详解/大全
  6. linux jsp mysql_Linux JSP连接MySQL数据库
  7. ISO50001认证辅导,ISO50001验厂优化所有流程中的能源性能,促进更高效的能源管理
  8. 微信聊天记录数据分析
  9. CAD选择时会卡一下的解决办法
  10. c语言编写函数isprime(int a),用来判断自变量a是否为素数,若是素数,函数返回1,否则返回0。
  11. ios中常用英语单词汇总
  12. GoLand No Tests Were Run : 不能使用 fmt.Printf() BUG
  13. 计算机系统基础实验 pa1
  14. 深度学习-20:神经科学、脑科学和稀疏特性
  15. networkx 画图布局
  16. final变量要么定义时初始化,要么在代码块中初始化
  17. 计算机系统会受到什么损害,影子系统是什么?会损害电脑硬盘吗?
  18. 英语-非谓语动词作定语
  19. git 安装后,右键没有 git clone
  20. Windows 10家庭中文版中启用WSL 2

热门文章

  1. find命令进阶用法(一)
  2. OC第七节——内存管理
  3. CentOS系统启动过程1-10 详细叙述
  4. 在php中使用Memcache
  5. 多记,多问为什么,最古老的学习方法怎么能丢?!
  6. MPLS virtual private network OptionA实验(华为设备)
  7. HCIE Security PKI 备考笔记(幕布)
  8. CSS详解(一)——CSS基本原理
  9. leetcode 14 最长公共前缀(python)
  10. PHP扩展部署之最佳实践