前面我们已经搭建好了开发环境所需要的框架,并将它们整合在了一起。

今天,我们主要完成:日志说明、资源分类,BaseDao与BaseDaoImpl的设计。

日志说明:

测试日志:

资源分类:

BaseDao与BaseDaoImpl的设计:

1,设计 BaseDao 与 BaseDaoImpl1,设计接口 BaseDao1,每个实体都应有一个对应的Dao接口,封装了对这个实体的数据库操作。例实体         Dao接口               实现类========================================================User         --> UserDao          --> UserDaoImplRole          --> RoleDao          --> RoleDaoImplDepartment        --> DepartmentDao    --> DepartmentDaoImplArticle         --> ArticleDao       --> ArticleDaoImpl...2,在每个Dao接口中都应有一个基本的增删改查的方法,但每个Dao接口中都写一遍就是重复的代码,可以把这些方法抽取到一个父接口中,定义为:public interface BaseDao<T> {save(entity : T) : voiddelete(id : Serializable) : voidupdate(entity : T) :voidgetById(id : Serializable) : TgetByIds(ids : Serializable[]) : List<T>findAll() : List<T>}3,说明:1,使用泛型的技术,可以在使用时更方便,如:User user = userDao.getById(1L); // 不需要强制转型2,getById(id : Long) 与 getByIds(ids : Long[]) 不要合并为一个有可变参数的方法,因为那个用起来就不方便了,比如要经常使用的根据一个id获取一个对象时就很不方便:List<User> list = userDao.getByIds(1L); User user = list.size() > 0 ? list.get(0) : null。3,以后再有Dao接口就可以继承这个 BaseDao,以拥有基本的增删改查方法,如:UserDao extends BaseDao<User>RoleDao extends BaseDao<Role>2,设计实现类 BaseDaoImpl1,每个Dao的接口还要有相应的实现类才可以,在每个DaoImpl中都要实现Dao接口中定义的所有方法,当然也包括公共的增删改查方法(BaseDao中定义的6个基本方法)。2,每个DaoImpl中都实现一遍公共方法显示是重复的,所以也可以抽取出来为一个父类BaseDaoImpl,在BaseDaoImpl中实现了BaseDao接口的所有方法,我们的DaoImpl只需要继承他就可以不用重复的写公共方法的实现了。声明如下:public class BaseDaoImpl<T> implements BaseDao<T> {@Resource private SessionFactory sessionFactory; // 让Spring注入sessionFactory private Class<T> clazz; // 要想办法得到T的Classpublic void save(T entity) { }public void delete(Long id) { }public void update(T entity) { }public T getById(Long id) { }public List<T> getByIds(Long[] ids) { }public List<T> findAll() { }}在实现方法时,获取Session的代码为:sessionFactory.getCurrentSession()3,在获取clazz时有两种方法1,方法一:1,把clazz声明成protected修饰符的,这样子类中就可以访问了,2,在每个子类的构造方法中传递这个属性的值,如:public RoleDaoImpl() { clazz = Role.class; }public UserDaoImpl() { clazz = User.class; }2,方法二:使用反射的方式:1,在BaseDaoImpl的默认构造方法中写如下代码就可以了:ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();clazz = (Class) pt.getActualTypeArguments()[0];2,说明:BaseDaoImpl不能直接使用,只能使用他的子类,否则这段代码就无效了。

代码实现:

BaseDao.java
package cn.xbmu.oa.base;
import java.util.List;
public interface BaseDao<T> {/*** 保存实体* @param entity*/void save(T entity);/*** 删除实体* @param id*/void delete(Long id);/*** 更新实体* @param entity*/void update(T entity);/*** 查询实体* @param id* @return*/T getById(Long id);/*** 查询实体* @param ids* @return*/List<T> getByIds(Long[] ids);/*** 查询所有* @return*/List<T> findAll();
}

BaseDaoImpl.java

package cn.xbmu.oa.base;import java.lang.reflect.ParameterizedType;
import java.util.Collections;
import java.util.List;import javax.annotation.Resource;import org.hibernate.Session;
import org.hibernate.SessionFactory;
public class BaseDaoImpl<T> implements BaseDao<T> {@Resourceprivate SessionFactory sessionFactory;protected Class<T> clazz;public BaseDaoImpl(){//通过反射得到T的真是类型ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();this.clazz = (Class<T>) pt.getActualTypeArguments()[0];System.out.println("clazz="+clazz.getName());}public void save(T entity) {getSession().save(entity);}public void update(T entity) {getSession().update(entity);}public void delete(Long id) {Object obj = getSession().get(clazz, id);getSession().delete(obj);}public T getById(Long id) {return (T)getSession().get(clazz, id);}public List<T> getByIds(Long[] ids) {if(ids == null || ids.length == 0){return Collections.EMPTY_LIST;//避免空指针异常          }return getSession().createQuery(//"FROM "+clazz.getSimpleName()+" WHERE id IN(:ids)")//.setParameterList("ids", ids)//.list();}public List<T> findAll() {return getSession().createQuery(//"FROM "+clazz.getSimpleName())//.list();}/*** 获取当前可用的session* @return*/protected Session getSession() {return sessionFactory.getCurrentSession();}}

RoleDao.java

package cn.xbmu.oa.dao;import cn.xbmu.oa.base.BaseDao;
import cn.xbmu.oa.domain.Role;public interface RoleDao extends BaseDao<Role>{}

RoleDaoImpl.java

package cn.xbmu.oa.dao.impl;import cn.xbmu.oa.base.BaseDaoImpl;
import cn.xbmu.oa.dao.RoleDao;
import cn.xbmu.oa.domain.Role;public class RoleDaoImpl extends BaseDaoImpl<Role> implements RoleDao{}

UserDao.java

package cn.xbmu.oa.dao;import cn.xbmu.oa.base.BaseDao;
import cn.xbmu.oa.domain.User;public interface UserDao extends BaseDao<User>{}

UserDaoImpl.java

package cn.xbmu.oa.dao.impl;import cn.xbmu.oa.base.BaseDaoImpl;
import cn.xbmu.oa.dao.UserDao;
import cn.xbmu.oa.domain.User;public class UserDaoImpl extends BaseDaoImpl<User> implements UserDao{}

BaseDaoTest.java

package cn.xbmu.oa.base;import org.junit.Test;import cn.xbmu.oa.dao.RoleDao;
import cn.xbmu.oa.dao.UserDao;
import cn.xbmu.oa.dao.impl.RoleDaoImpl;
import cn.xbmu.oa.dao.impl.UserDaoImpl;public class BaseDaoTest {@Testpublic void testGetById() {UserDao userDao = new UserDaoImpl();RoleDao roleDao = new RoleDaoImpl();}}

测试:


工程目录包分布:

OA项目实战学习(1)相关推荐

  1. OA项目实战学习(3)——实现岗位管理增删改查

    我们这里注重实现功能,对页面不进行布局. 一.分析增删改查的功能: 添加.修改.删除成功后 要重定向到列表功能,这样在刷新页面时才不会出现"又做一次增.删.改"的操作. 列表与删除 ...

  2. FPGA项目实战学习分享_W2

    FPGA项目实战学习分享_W2 Day1(210121Thu) 工程创建与Basys3计算器实例测试 Getting Started with the Basys 3 (Legacy) 约束文件与顶层 ...

  3. 苏嵌项目实战 学习日志1

    苏嵌项目实战 学习日志1 姓名:王尹新叶 日期: 2018/09/03 今日学习任务 安装VM,学习用虚拟机运行Linux系统,复习C语言知识,进行相关操作. 今日任务完成情况 安装完VM,并在虚拟机 ...

  4. OA项目实战(二) 开发准备

    上次的博文OA系统实践(一) 概述中,我们已经了解了OA的相关概念.从本次博文开始,我们做一个简单的OA实例. 在OA开发之前,有几个工作们需要提前做.一个是对需求进行分析,另一个是对开发环境进行选择 ...

  5. 【首次开放】京东商城AI项目实战学习

    <京东NLP企业项目实战训练营> 专注于培养行业TOP10%的NLP工程师 对课程有意向的同学 添加课程顾问小姐姐微信 报名.课程咨询 ???????????? 01 京东NLP项目内容详 ...

  6. oa项目实战php网盘,赵庆轩OA项目实战视频教程附源码+静态页+PPT

    ├oa_day1.zip ├oa_day10.zip ├oa_day11.zip ├oa_day12.zip ├oa_day2.zip ├oa_day3.zip ├oa_day4.zip ├oa_da ...

  7. Python项目实战学习案例--股票模拟交易系统

    Python学习案例–股票模拟交易系统 源代码地址:https://gitee.com/wujize188_admin/mini_stock.git 主要技术 后台:Flask框架,sqlalchem ...

  8. 传智播客——OA项目实战(四)阿汤哥真情流露

    今天是OA的最后一天,讲了很多零碎的东西,后来阿汤哥讲到情深处,向我们毫无保留的研讨自己是人生观和学习方法. 阿汤哥的世界观:万物都需要平衡,在各种平衡中前进看起来慢其实是最快. 阿汤哥的学习方法:暂 ...

  9. 松勤11期软件测试之Jmeter高级性能测试项目实战学习笔记

    看我名字,其他不重要,你懂就好 功用测验针对系统的功用目标,建立功用测验模型,制定功用测验计划,制定监控战略,在场景条件之下执行功用场景,剖析判别功用瓶颈并调优,终究得出功用成果来评估系统的功用目标是 ...

最新文章

  1. sequence_lenth构建神经网络填充数据理解
  2. 我的Android学习体系
  3. java中,字符串和集合判断是否为空
  4. 都大二下学期了,说说读大学的感受吧
  5. chrome中F12工具说明
  6. Python 面向对象封装和继承
  7. 中断(interrupted()、isInterrupted())、Executor的中断
  8. Spring Boot 你所不知道的超级知识学习路线清单
  9. 洛谷2657 windy数(数位DP)
  10. SoapUI接口测试之实战运用操作(五)
  11. java类的成员变量和局部变量的区别
  12. TeeChart7 在delphi7中的安装步骤
  13. matlab识别水雷岩石,基于MATLAB的微弱信号检测方法仿真分析
  14. LabWindows操作Access
  15. 自动驾驶传感器---毫米波雷达原理(测距、测速、角速度测量),毫米波雷达系统构成
  16. 英国留学生Discursive Essay怎么写?
  17. Windows安全更新出现0x800f081f错误解决方案
  18. 网络游戏程序员须知 目录
  19. 独立开发者为什么不需要运营也能月薪几万,甚至几十万?
  20. SVG排版公众号图文『实时计算日期差』模板代码

热门文章

  1. 简单 python 爬虫(一)
  2. 零基础怎样自学编程?新手如何学习编程?编程学习入门指南
  3. 使用vuex对兄弟组件传值_vue组件之间相互传值的方式
  4. 护眼灯哪些牌子好?央视推荐的护眼台灯
  5. 在Mac中使用OpenNI
  6. 挖藕!模拟sql抓取qq密码
  7. STM32的中断向量表是干什么的?到底有什么用?它放在哪里?
  8. idea 集成python
  9. 史上最全Hashmap面试总结,51道附带答案,持续更新中...
  10. 我的世界java边境之地_我的世界:MC人迹罕至的6种“边境之地”,最后1种让人后背发凉!...