OA项目实战学习(1)
前面我们已经搭建好了开发环境所需要的框架,并将它们整合在了一起。
今天,我们主要完成:日志说明、资源分类,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不能直接使用,只能使用他的子类,否则这段代码就无效了。
代码实现:
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)相关推荐
- OA项目实战学习(3)——实现岗位管理增删改查
我们这里注重实现功能,对页面不进行布局. 一.分析增删改查的功能: 添加.修改.删除成功后 要重定向到列表功能,这样在刷新页面时才不会出现"又做一次增.删.改"的操作. 列表与删除 ...
- FPGA项目实战学习分享_W2
FPGA项目实战学习分享_W2 Day1(210121Thu) 工程创建与Basys3计算器实例测试 Getting Started with the Basys 3 (Legacy) 约束文件与顶层 ...
- 苏嵌项目实战 学习日志1
苏嵌项目实战 学习日志1 姓名:王尹新叶 日期: 2018/09/03 今日学习任务 安装VM,学习用虚拟机运行Linux系统,复习C语言知识,进行相关操作. 今日任务完成情况 安装完VM,并在虚拟机 ...
- OA项目实战(二) 开发准备
上次的博文OA系统实践(一) 概述中,我们已经了解了OA的相关概念.从本次博文开始,我们做一个简单的OA实例. 在OA开发之前,有几个工作们需要提前做.一个是对需求进行分析,另一个是对开发环境进行选择 ...
- 【首次开放】京东商城AI项目实战学习
<京东NLP企业项目实战训练营> 专注于培养行业TOP10%的NLP工程师 对课程有意向的同学 添加课程顾问小姐姐微信 报名.课程咨询 ???????????? 01 京东NLP项目内容详 ...
- 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 ...
- Python项目实战学习案例--股票模拟交易系统
Python学习案例–股票模拟交易系统 源代码地址:https://gitee.com/wujize188_admin/mini_stock.git 主要技术 后台:Flask框架,sqlalchem ...
- 传智播客——OA项目实战(四)阿汤哥真情流露
今天是OA的最后一天,讲了很多零碎的东西,后来阿汤哥讲到情深处,向我们毫无保留的研讨自己是人生观和学习方法. 阿汤哥的世界观:万物都需要平衡,在各种平衡中前进看起来慢其实是最快. 阿汤哥的学习方法:暂 ...
- 松勤11期软件测试之Jmeter高级性能测试项目实战学习笔记
看我名字,其他不重要,你懂就好 功用测验针对系统的功用目标,建立功用测验模型,制定功用测验计划,制定监控战略,在场景条件之下执行功用场景,剖析判别功用瓶颈并调优,终究得出功用成果来评估系统的功用目标是 ...
最新文章
- sequence_lenth构建神经网络填充数据理解
- 我的Android学习体系
- java中,字符串和集合判断是否为空
- 都大二下学期了,说说读大学的感受吧
- chrome中F12工具说明
- Python 面向对象封装和继承
- 中断(interrupted()、isInterrupted())、Executor的中断
- Spring Boot 你所不知道的超级知识学习路线清单
- 洛谷2657 windy数(数位DP)
- SoapUI接口测试之实战运用操作(五)
- java类的成员变量和局部变量的区别
- TeeChart7 在delphi7中的安装步骤
- matlab识别水雷岩石,基于MATLAB的微弱信号检测方法仿真分析
- LabWindows操作Access
- 自动驾驶传感器---毫米波雷达原理(测距、测速、角速度测量),毫米波雷达系统构成
- 英国留学生Discursive Essay怎么写?
- Windows安全更新出现0x800f081f错误解决方案
- 网络游戏程序员须知 目录
- 独立开发者为什么不需要运营也能月薪几万,甚至几十万?
- SVG排版公众号图文『实时计算日期差』模板代码
热门文章
- 简单 python 爬虫(一)
- 零基础怎样自学编程?新手如何学习编程?编程学习入门指南
- 使用vuex对兄弟组件传值_vue组件之间相互传值的方式
- 护眼灯哪些牌子好?央视推荐的护眼台灯
- 在Mac中使用OpenNI
- 挖藕!模拟sql抓取qq密码
- STM32的中断向量表是干什么的?到底有什么用?它放在哪里?
- idea 集成python
- 史上最全Hashmap面试总结,51道附带答案,持续更新中...
- 我的世界java边境之地_我的世界:MC人迹罕至的6种“边境之地”,最后1种让人后背发凉!...