Java Web Dao层设计

UML设计图

Dao层设计

实体类

package cn.zzuli.oa.domain;

public class Role {

}

package cn.zzuli.oa.domain;

public class User {

private Long id;

private String username;

public User() {

super();

}

public Long getId() {

return id;

}

public void setId(Long id) {

this.id = id;

}

public String getUsername() {

return username;

}

public void setUsername(String username) {

this.username = username;

}

}

BaseDao接口

package cn.zzuli.oa.base;

import java.util.List;

public interface BaseDao {

/**

* 保存实体

* @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 id的集合

* @return

*/

List listByIds(Long[] ids);

/**

* 查询所有

* @return

*/

List listAll();

}

BaseDaoImpl代码,实现BaseDao接口

package cn.zzuli.oa.base.impl;

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;

import cn.zzuli.oa.base.BaseDao;

@SuppressWarnings("unchecked")

public abstract class BaseDaoImpl implements BaseDao {

@Resource

private SessionFactory sessionFactory;

protected Class clazz;

public BaseDaoImpl() {

//通过反射得到T的真实类型

ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();//获取这个父类的泛型类型

this.clazz = (Class) pt.getActualTypeArguments()[0]; //获取第一个泛型T的类型

System.out.println("clazz = " + clazz.getName());

}

@Override

public void save(T entity) {

getSession().save(entity);

}

@Override

public void delete(Long id) {

Object obj = getSession().get(clazz, id);

getSession().delete(obj);

}

@Override

public void update(T entity) {

getSession().update(entity);

}

@Override

public T getById(Long id) {

return (T) getSession().get(clazz, id);

}

@Override

public List listByIds(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();

}

@Override

public List listAll() {

return getSession().createQuery("FROM " + clazz.getSimpleName()).list();

}

/**

* 获取当前可用的Session

*

* @return 当前可用的Session

*/

protected Session getSession() {

return sessionFactory.getCurrentSession();

}

}

RoleDao接口,继承BaseDao

package cn.zzuli.oa.dao;

import cn.zzuli.oa.base.BaseDao;

import cn.zzuli.oa.domain.Role;

public interface RoleDao extends BaseDao {

}

UserDao接口,继承BaseDao

UserDao实现类UserDaoImpl可以实现的自己的功能代码

package cn.zzuli.oa.dao;

import cn.zzuli.oa.base.BaseDao;

import cn.zzuli.oa.domain.User;

public interface UserDao extends BaseDao{

}

RoleDaoImpl代码,继承BaseDaoImpl,实现RoleDao

package cn.zzuli.oa.dao.impl;

import org.springframework.stereotype.Repository;

import cn.zzuli.oa.base.impl.BaseDaoImpl;

import cn.zzuli.oa.dao.RoleDao;

import cn.zzuli.oa.domain.Role;

@Repository

public class RoleDaoImpl extends BaseDaoImpl implements RoleDao {

}

UserDaoImpl代码,继承BaseDaoImpl,实现UserDao

package cn.zzuli.oa.dao.impl;

import org.springframework.stereotype.Repository;

import cn.zzuli.oa.base.impl.BaseDaoImpl;

import cn.zzuli.oa.dao.UserDao;

import cn.zzuli.oa.domain.User;

@Repository

public class UserDaoImpl extends BaseDaoImpl implements UserDao{

}

测试类

package cn.zzuli.oa.base;

import org.junit.Test;

import cn.zzuli.oa.dao.RoleDao;

import cn.zzuli.oa.dao.UserDao;

import cn.zzuli.oa.dao.impl.RoleDaoImpl;

import cn.zzuli.oa.dao.impl.UserDaoImpl;

import cn.zzuli.oa.domain.Role;

import cn.zzuli.oa.domain.User;

public class BaseDaoTest {

@Test

public void testGetById() {

UserDao userDao = new UserDaoImpl();

RoleDao roleDao = new RoleDaoImpl();

}

}

实现效果

实现效果

此处输出的正是BaseDao实现类BaseDaoImple中构造方法获取的泛型的类型,

java dao层_JavaWeb Dao层架构设计相关推荐

  1. java 单例模式 泛型_设计模式之架构设计实例(工厂模式、单例模式、反射、泛型等)...

    设计模式, 架构设计实例, 使用到了工厂模式.单例模式.反射.泛型等 项目包结构如下图: 1.bean包 (1)Base.java父类 package test.bean; public class ...

  2. 为什么要用impl继承service层_JavaWeb service层 dao层 采用接口+impl 的原因

    service层 采用接口+impl : 是为了应对可能不同情形下,会存在多套业务逻辑.在调用的时候,根据实际情况去调用对应的serviceImpl eg: 存在 serviceImp1, servi ...

  3. Java峰值和削峰_架构设计之流量削峰

    前言 针对于秒杀场景来说,流量往往在一个特定时间点有个高度集中的流量洪峰,这个瞬时对于资源的消耗是很大的,这时往往对于服务的稳定性带来了极大的挑战,如果按照流量洪峰预估系统资源,则可能存在极大的资源浪 ...

  4. java系统架构设计,2022最新

    Java中23种设计模式的详细解析Java开发中23种设计模式详细介绍设计模式介绍设计模式分类设计模式六大原则开闭原则(Open Close Principle)里氏代换原则(Liskov Subst ...

  5. 29W 字总结阿里 Java 高并发编程:案例 + 源码 + 面试 + 系统架构设计

    下半年的跳槽季已经开始,好多同学已经拿到了不错的 Offer,同时还有一些同学对于 Java 高并发编程还缺少一些深入的理解,不过不用慌,今天老师分享的这份 27W 字的阿里巴巴 Java 高并发编程 ...

  6. java系统项目分为哪五大层次?控制层_业务_一个项目中说系统分为表现层、控制层、逻辑层、DAO层和最终数据库五层架构-转...

    表现层就是看到的东西,比如你现在看到的当前页面 控制层就将你的请求从页面传到后台代码 逻辑层就是处理你的请求的代码 DAO层就是将数据存到数据库中的代码 数据库就是数据库了,存东西用的 ,DAO层就是 ...

  7. Spring Boot开发基于三层架构设计:Dao层、Service层、Controller层

    三层架构设计:基于Spring Boot开发要使用三层架构: 数据访问层(Dao).业务逻辑层(Service).控制层(Control-ler) (1)数据访问层(Dao):Dao层是最底层的设计, ...

  8. 在 Java Web 项目中,Service 层和 Dao 层真的有必要每个类都加上接口吗

    作者 l 会点代码的大叔(CodeDaShu) 很多程序员在刚开始工作的时候,接触到的项目都是这样做的:项目的代码被分成 Controller.Service.Dao 层,一个接口对应一个实现类,然后 ...

  9. java action dao_java中Action层、Service层和Dao层的功能区分

    一.Action/Service/DAO简介: Action是管理业务(Service)调度和管理跳转的. Service是管理具体的功能的. Action只负责管理,而Service负责实施. DA ...

最新文章

  1. 北大网络教育计算机作业,北大网络教育(计算机专业)网络基础作业答案.doc
  2. HDU 1022[Train Problem I] 栈的应用
  3. 【OpenCV3】将图像指定区域使用另一图像(或ROI)覆盖
  4. Python基础——PyCharm版本——第二章、数据类型和变量(超详细)
  5. 查看Servlet 3.0的新增功能
  6. WPF入门教程系列十四——依赖属性(四)
  7. form表单重复提交
  8. 关于专注,关于最近的一些事情
  9. PHP防止数字太大转化为科学计数法的方法
  10. linux之sed用法-转
  11. 子域收集-fierce
  12. typec扩展坞hdmi没反应_HDMI+两个USB接口,让surface秒变办公神器?这个扩展坞真香...
  13. c语言有趣代码,实用有趣的C语言程序
  14. 电脑接收,怎么在电脑上发传真 在电脑上接收传真方法介绍【详细步骤】
  15. wps怎么关闭修改痕迹_WPS文字如何保留修改痕迹?WPS文字保留修改痕迹教程
  16. POI库读取xlsx和xls格式excel以及解决安卓上的适配
  17. 《代码整洁之道》--读书笔记
  18. javaScript特殊知识点归纳
  19. 微信小程序接收二进制流文件(图片预览,文件打开)
  20. RTL8723BU BTwifi

热门文章

  1. 周末都花费在智能车实验室,结果......
  2. 智能车竞赛技术报告 | 节能信标组 - 重庆大学- 赛博坦汽车人联盟
  3. Python图片操作-psd_tools:将psd文件转换成BMP
  4. 2021年春季学期-信号与系统-第十三次作业参考答案-第十小题
  5. 华北赛区,我们来啦!
  6. 特斯拉线圈的阻抗分析
  7. 批处理处理远程计算机,使用批处理文件在远程计算机上调整PowerShell窗口的大小...
  8. mysql中date转sqlserver_MySQL和SQLServer互转
  9. 成都黑帽门图片大全_2020成都第一波出行/便民/打卡免费大全
  10. python简单计算器异常处理_Python实现的简单计算器