dao持久层通用泛型接口模板

Java泛型DAO设计模式详解与实践 数据访问对象(Data Access Object,简称DAO)是软件设计模式中的一种,用于将低级数据访问层与高级业务逻辑层分离的一种抽象。DAO模式通常通过封装数据库操作(如CRUD:创建、读取、更新、删除),以简化业务逻辑层的代码。DAO通常包含了与数据库交互所需的所有方法,它能将数据源的变化对业务逻辑层的影响降到最低,增强系统的可维护性和可扩展性。在Java中,DAO通常通过接口与实现类来定义,使得具体的数据访问逻辑与业务逻辑代码分离,从而提高了代码的可维护性。 阅读详情

我们在编写Dao层时,免不了会出现大量的重复性代码(增删改查)。这时如果有一个通用的模板来使用,我们就可以达到事半功倍的效果

一、原理说明

1. 编写持久层通用模板BaseDao<T>,编写增删改查方法

2. 编写模板实现类BaseDaoImpl<T>,实现接口方法

3. 编写用户持久层接口与实现类

4. 分别继承通用模板,实现方法

这样做的好处是:
1. 因为所有的pojo模型与数据库交互无非就是增删改查,可以单独进行编码,但这样会出现大量重复性代码

2. 所以抽取通用持久层模板接口,编写通用方法,继承模板接口实现类

3. 难点:如何根据不同的pojo获取不同的泛型呢?

4. 需要动态获取pojo的类型(具体如代码所示)

二、代码

package com.wanghang.T.domain;

import java.io.Serializable;

/**
 * 用户模型类
 * 
 * @author Hang.W
 * @version 1.0, 2017-03-10 15:06:50
 */
public class UserModel implements Serializable {

	private String uid;

	private String username;

	private String password;

	public String getUid() {
		return uid;
	}

	public void setUid(String uid) {
		this.uid = uid;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

}

 

package com.wanghang.T.basedao;

import java.io.Serializable;

/**
 * 带泛型持久层通用模板类接口
 *
 * @author Hang.W
 * @version 1.0, 2017-02-27 00:58:38
 */
public interface BaseDao<T> {

	/**
	 * 添加
	 * 
	 * @param entity
	 */
	public void save(T entity);
	
	/**
	 * 删除
	 * 
	 * @param entity
	 */
	public void delete(T entity);
	
	/**
	 * 修改
	 * 
	 * @param entity
	 */
	public void update(T entity);
	
	/**
	 * 根据id查询对象
	 * 
	 * @param id 对象id属性
	 */
	public T findById(Serializable id);
	
	/**
	 * 保存或修改用户
	 * 
	 * @param entity 用户对象
	 */
	public void saveOrUpdate(T entity);
}

 

package com.wanghang.T.basedao;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

/**
 * 带泛型持久层通用模板接口实现类
 *
 * @author Hang.W
 * @version 1.0, 2017-02-27 01:01:51
 */
public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T> {

	/** 声明泛型类的类型 */
	private Class<T> domainClass;
	
	/**
	 * 在构造器内获取泛型类型
	 */
	public BaseDaoImpl() {
		// 通过子类获取父类带泛型的字节码文件
		ParameterizedType genericSuperclass = (ParameterizedType) this.getClass().getGenericSuperclass();
		
		// 获取泛型
		Type[] actualTypeArguments = genericSuperclass.getActualTypeArguments();
		
		// 获取具体泛型类型
		domainClass = (Class<T>) actualTypeArguments[0];
	}
	
	@Override
	public void save(T entity) {
		this.getHibernateTemplate().save(entity);
	}

	@Override
	public void delete(T entity) {
		this.getHibernateTemplate().delete(entity);
	}

	@Override
	public void update(T entity) {
		this.getHibernateTemplate().update(entity);
	}

	@Override
	public T findById(Serializable id) {
		return this.getHibernateTemplate().get(domainClass, id);
	}

	@Override
	public void saveOrUpdate(T entity) {
		
	}
	
}

 

package com.wanghang.T.dao;

import com.wanghang.T.basedao.BaseDao;
import com.wanghang.T.domain.UserModel;

/**
 * 用户模型持久层接口
 *
 * @author Hang.W
 * @version 1.0, 2017-03-10 15:08:43
 */
public interface UserDao extends BaseDao<UserModel> {

}

 

package com.wanghang.T.dao;

import java.io.Serializable;
import org.hibernate.Query;
import org.hibernate.Session;
import com.wanghang.T.basedao.BaseDaoImpl;
import com.wanghang.T.domain.UserModel;

/**
 * 用户模型持久层接口实现类
 * 
 * @author Hang.W
 * @version 1.0, 2017-03-10 15:10:25
 */
public class UserDaoImpl extends BaseDaoImpl<UserModel> implements UserDao {

	@Override
	public UserModel findById(Serializable id) {
		// 获取session
		Session session = this.getSession();
		
		// 编写hql语句
		String hql = "SELECT u.uid, u.username, u.password FROM UserModel u WHERE id = ?";
		
		// 获取query对象
		Query query = session.createQuery(hql);
		
		// 设置参数
		query.setParameter(0, id);
		
		// 执行
		UserModel user = (UserModel) query.uniqueResult();
		return user;
	}

	@Override
	public void saveOrUpdate(UserModel entity) {
	}

}

 

 

 

 

 

 

一个很好的通用泛型dao(含源码) 为什么我们要使用通用DAO接口呢,因为我们的数据库操作无非是增删改查,CRUD操作,我们不需要为每个实体去编写一个dao接口,对于相似的实体操作可以只编写一个通用接口,然后采用不同的实现! DAO已经成为持久层的标准模式,DAO使结构清晰,面向接口编程为代码提供了规范。而泛型DAO是一个类型安全的,代码精简的设计模式(相对于传统DAO),尤其在DAO组件数量庞大的时候,代码量的减少更加明显。 泛型DAO的核心是定义一个GenericDao接口,声明基本的CRUD操作: 用hibernate作为持久化解决方案的GenericHibernateDao实现类,被定义为抽象类,它提取了CRUD操作,这就是简化代码的关键,以便于更好的重用,这个就不给例子了,增删改都好写,查就需要各种条件了。 然后是各个领域对象的dao接口,这些dao接口都继承GenericDao接口,这样各个领域对象的dao接口就和传统dao接口具有一样的功能了。 下一步是实现类了,个自领域对象去实现各自的接口,还要集成上面的抽象类,这样就实现了代码复用的最大化,实现类中只需要写出额外的查询操作就可以了。当然还要获得域对象的Class实例,这就要在构造方法中传入Class实例。用spring提供的HibernateTemplate注入到GenericHibernateDao中,这样在各个实现类就可以直接调用HibernateTemplate来实现额外的查询操作了。 如果在实现类中不想调用某个方法(例如:update()),就可以覆盖它,方法中抛出UnsupportedOperationException()异常。 立即下载

相关推荐

泛型dao 泛型dao 泛型dao

Struts2、Hibernate、Spring整合的泛型DAO (本人评价: 代码开发效率提高30% 代码出错率减少70%) 对于大多数开发人员,系统中的每个 DAO 编写几乎相同的代码到目前为止已经成为一种习惯。虽然所有人都将这种重复标识为 “代码味道”,但我们大多数都已经学会忍受它。能不能不写重复的dao 呢 ? 泛型dao,顾名思义就是一个dao可以对多个实体对象进行持久化。当应用中需要使用到上十张表时,DAO的维护变得日益困难,主要表现在这几个方面: 1)dao类的繁多,很多设计都是一个entity对应一个dao (不同的只有类名和方法名) 2)dao接口需要维护的method庞大。 3)业务逻辑改变时,dao需要同时修改两个类文件(接口和实现类) 在本文中,我将为您展示如何避免再三地重复 DAO 代码。 在这里我建议项目最好使用一个共通的DAO,因为这样会为你省去非常多的类,而那些类里的逻辑往往差不多。当然是用共通的DAO你需要对结果转型,转成你需要的bean,但这也比写那么多DAO强多了,你可以放下包袱,只关注你的业务逻辑。 如果你真能只用一个dao解决,那么祝贺你,你得到了一个虚拟数据层(高度抽象的数据接口)。这是一个比dao更高级的存在。 欢迎大家指正 -_- 虚心求教 代码层次: bean-->dao-->service-->action 技术概述:1.继承 继承是利用现有的类创建新类的过程,现有的类称作基类(或父类),创建的新类称作派生类(子类)。继承其实就是自动地共享基类中成员属性和成员方法的机制。引入继承,实现了代码重用; 2.泛型 泛型类型的限定 3.反射 代码概述: bean :Person.java 这个人员类我就不说了 泛型dao接口 :GenericDao 泛型作为DAO的通用接口 CRUD方法 dao接口 : PersonDAO extends GenericDao 可以不写代码,方法已经在父类泛型dao里了,这里为了说明:可扩展添加 findByNameExact()方法 子类的附加方法。 泛型daoimpl :GenericDaoImpl implements GenericDao 必须提供的构造方法,以便创建实例的时候就知道具体实体的类型。 daoimpl :PersonDAOImpl extends GenericDaoImpl implements PersonDAO public PersonDAOImpl() { super(Person.class); } 告诉对哪个类操作,如不需要自定义扩展方法就作有一个构造方法。 泛型Service:GenericService.java 与泛型dao没有区别 Service :PersonService.java 直接继承。 泛型serviceimpl与serviceimpl实现和dao层实现一样。 Action : SavePersonAction直接调用PersonService。 下面是代码 为了演示减少代码量而且直观去掉些方法方便读者自己扩展写出适合自己的代码,这里我只抛砖引玉了。主要介绍这个技术。 本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/zylyueliang/archive/2010/09/17/5890043.aspx

java 泛型dao_浅谈Java——泛型DAO

首先解释一下为什么要学习泛型DAO。平时在写DAO的时候是一个接口对应一个实现类,实现类里面要写很多的操作数据库的方法。当我们有很多的javaben的时候我们会写很多的接口和实现类,并且里面的代码都是相同的,这样太麻烦,我们就不能写一个类,在类里面传入泛型,让类根据泛型,创建出一个实例对象,这样就出现了泛型DAO。一、需要提前准备的知识如下反射关键的类:Class类 是java.lang包下,Cl...

weixin_42186015的博客 401

泛型dao

NULL 博文链接:https://rooi.iteye.com/blog/1032620

浅谈Java——泛型DAO

首先解释一下为什么要学习泛型DAO。平时在写DAO的时候是一个接口对应一个实现类,实现类里面要写很多的操作数据库的方法。当我们有很多的javaben的时候我们会写很多的接口和实现类,并且里面的代码都是相同的,这样太麻烦,我们就不能写一个类,在类里面传入泛型,让类根据泛型,创建出一个实例对象,这样就出现了泛型DAO。 一、需要提前准备的知识如下 反射关键的类: Class&lt;T&gt;类 ...

mosterRan的博客 454

【python3.7】解决报错 error: Microsoft Visual C++ 14.0 or greater is required. Get it with “Microsoft C++

解决pip安装py7zr遇到的报错问题。

水w的博客 3941

DySAT+: Enhancing Dynamic Graph Representation Learning with Multi-Head Self-Attention and Temporal-

本文深入探讨了DySAT+模型在动态图表示学习中的创新应用,通过多头时空注意力机制和层级信息融合策略,有效解决了动态图数据中的时间维度信息捕捉和结构演变动态适应问题。该模型在社交网络异常检测和金融交易网络分析等场景中表现出色,显著提升了预测准确率和响应速度。

weixin_29035405的博客 335

泛型dao 详细剖析

由于 Java™ 5 泛型的采用,有关泛型类型安全 Data Access Object (DAO) 实现的想法变得切实可行。在本文中,系统架构师 Per Mellqvist 展示了基于 Hibernate 的泛型 DAO 实现类。然后展示如何使用 Spring AOP introductions 将类型安全接口添加到类中以便于查询执行。 对 于大多数开发人员,为系统中的每个 D...

Reasonsoft的专栏 277

检索增强世界模型(R-WoM)原理与应用实践

世界模型是AI系统理解环境的核心技术,通过构建环境的内部表示实现状态预测和行动规划。传统方法基于RNN或VAE等神经网络,而检索增强世界模型(R-WoM)创新性地引入检索机制,结合外部记忆库提升系统性能。这种架构突破模型参数限制,使AI能像人类一样利用历史经验解决问题,在游戏AI、虚拟助手等场景表现优异。关键技术包括FAISS相似性搜索、分层记忆管理和动态检索策略,其中Transformer编码器和GRU动态模型的组合实现高效环境建模。实践表明,该方法可提升47%的战术多样性,加快32%的应急响应速度。

weixin_42676876的博客 341

自己动手写泛型dao

在经过一系列的问题得到解决之后,泛型dao终于写出来了。泛型dao相比于以前写的dao最大的好处就是,大大提高了代码的复用性,以往我们要对数据库中表中的数据进行操作的时候,每张表都需要写一个dao来操作,当表非常多的时候,代码量就会很大,还有就是这些代码大部分都是重复的,获取数据库连接、s...

weixin_33951761的博客 159

从信号到振镜:STM32F103 + XY2-100协议 + AM26LS31芯片的激光打标/雕刻系统信号链搭建指南

本文详细介绍了基于STM32F103微控制器和XY2-100协议的激光打标/雕刻系统信号链搭建方法。从数字振镜控制协议解析、AM26LS31差分驱动电路设计到信号完整性优化,提供了一套完整的解决方案,帮助工程师实现高精度激光控制系统的开发与调试。

weixin_42536058的博客 235

若依(RuoYi)框架从零到部署:Spring Boot+Vue权限系统完整配置指南

在Java企业级应用开发中,Spring Boot作为构建微服务和单体应用的基石,极大地简化了项目初始化和配置流程。其核心原理在于通过自动配置和起步依赖,快速整合数据访问、安全认证、缓存等常用模块,显著提升开发效率。这一技术价值在需要快速构建后台管理系统的场景中尤为突出,例如权限管理、用户角色分配等通用需求。若依(RuoYi)框架正是基于Spring Boot和Vue.js的优秀实践,它封装了RBAC权限模型、代码生成器等高频功能,提供了开箱即用的解决方案。本文聚焦于若依框架的【环境配置】与【项目部署】,通

weixin_33984032的博客 455

HibernateTemplate的用法

HibernateTemplate作用:从字面上意思我们就知道他是一个模板,然后我们又知道hibernate是一个对象关系映射的框架,所以我们很容易联想到他的功能就是将Hibernate 的持久层访问模板化。或者我们直接叫他为hibernate的持久化模板。 HibernateTemplate用法: 1、直接用,在实现类中继承HibernateDaoSupport类,然后this.getHibernateTemplate()直接获取到HibernateTemplate对象,就可以调用H...

weixin_57763462的博客 779

机器人中的数值优化(十三)——QP二次规划

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考,主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等,本系列文章篇数较多,不定期更新,上半部分介绍无约束优化,下半部分介绍带约束的优化,中间会穿插一些路径规划方面的应用实例

慕羽★的博客 2793

T4模版生成SpringMVC构造REST代码:第四篇 用T4模版生成Dao数据持久层接口代码

T4模版生成代码的基础前面三篇基本介绍了,下面开始《用T4模版生成Dao数据持久层接口代码》工作。 第一步、在“解决方案JavaGenerate”中添加类库,用于存放dao的模版及相应文件,我们命名这个类库为JavaDaos。       点击“解决方案JavaGenerate”,右键,选择“添加 ”--〉“新建项目”,再选择"类库",名称中输入JavaModels。返回后,在“解决方案Jav

lxhjh的专栏 1618

configure: error: no acceptable C compiler found in $PATH解决方案

本文主要介绍了configure: error: no acceptable C compiler found in $PATH解决方案,希望能对使用Linux的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 4万+

cdk&java | 分子sdf文件生成

sdf

ASKCOS博客 1089

泛型理解及应用(二):使用泛型编写通用型Dao层

  相信目前所有的IT公司网站在设计WEB项目的时候都含有持久层,同样地使用过Hibernate的程序员都应该看过或者了解过Hibernate根据数据库反向生成持久层代码的模板。对于Hibernate生成的这个通用型的模板,可以看一下了解Hibernate是怎么处理这一层的。笔者来到公司作为开发的时候,项目已经有了一个比较成型的Dao层代码。当然这个层级代码是用C#+NHibernate写的。在...

weixin_30267691的博客 254

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

BOS项目02_05_Dao高级实现原理以及代码实现、-获取泛型的真实(即具体的数据类型)类型

系列文章目录 文章目录系列文章目录一、Dao高级实现原理二、Dao高级实现-代码实现三、Dao高级代码实现—获取泛型的真实类型总结 一、Dao高级实现原理 现在我们来开始项目的Dao这一层 回顾一下以前,先写一个接口,然后写一个实现类 对,就是这样,没错,但是在这个项目中也可以这样吗?这个思路到底对不对呢? 下面我们看分析 再仔细看会发现不仅如此,接口里面也有相同的代码 这里就可以想到设计模式,我们能不能把相同的方法提取出来呢? 所以这里这两个我们都可以写个继承,后面继承就行了,这样就把相同的代码提取出来

小良的博客 317

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Hibernate泛型DAO(结合spring模板支持)

详细介绍 Hibernate 泛型 DAO 及其使用方法 编写Spring+Hibernate框架下的应用,总是离不了编写一个通用的泛型GenericHibernateDao。查阅了网上不少的GenericHibernateDao实现,归纳整理为如下实现,供后续编码参考。

581

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

从控制层到持久层数据方法模板封装

由于公司产品属于从0到1初始阶段,数据库库表的不断增多,在基于控制层,业务层,持久层这种模式的开发下的话,频繁目录结构,实现基础功能如增删改查的话太过于繁琐,于是思考决定采用模板模式对这些功能进行封装, 公司相关技术栈采用 springboot+mybatis方向,因为持久层用的mybatis,所以直接采用二次封装好的框架mybatis-plus, 除mybatis-plus提供好的模板方法外,自定义的sql方法采用代码生成器生成 前提先介绍下使用领域模型,为简单描述,这里只采用此三种领域模型对象,如

a547195893的博客 728

使用Spring的JdbcTemplate实现DAO

直接使用JDBC操作数据库来实现DAO,相对于使用持久层框架(Hibernate等) ,可以减少映射等带来的性能损失。一般而言,使用JDBC来操作数据库,无非是以下几个步骤:    获取数据源    取得数据库连接    执行SQL语句    处理执行结果和异常    释放数据库连接这些步骤是每次进行数据库操作都必须进行的。很显然,可以使用模板模式来简化设计,将执行SQL语句的部分抽象出来,其它的

小陆的笔记 3105

Spring Data JPA的持久层

1.概述 本文将重点介绍Spring 3.1,JPA和Spring Data的持久层的配置和实现。 有关使用基于Java的配置和项目的基本Maven pom设置Spring上下文的分步介绍,请参阅本文 。 持久性与春天 系列 : 第1部分 – 具有Spring 3.1和Hibernate的持久层 第2部分 – 使用Spring和Java泛型简化数据访问层 第3部分 – 具有...

最佳 Java 编程 557

Spring 基于SSM框架,BaseDao --> dao层的抽取优化

通常来说,在一个项目中我们会使用到多个dao,比如在一个信息管理系统中,有 UserDao/ MessageDao等; 每个 dao 都有相同的 CRUD 代码,每个 dao 去写也是可以的,但是代码量会偏多,代码结构不够好,显得比较臃肿;实际上可以通过泛型来抽取出一个 BaseDao,这个 BaseDao 包含了各个 dao 的增删改查代码,创建新的 dao 时继承BaseDao,就可以减少很

u011997561的博客 2076

spring DAO体系结构

springDAO体系结构在spring的众多应用中,对数据库的操作是一个很重要的部分,spring对DAO结构的抽象是一个非常值得研究的问题。这里并不打算讨论spring在数据库操作中的底层技术,例如数据库异常转换系统、事务抽象等,这里我只想讨论一下在数据库操作中与程序员接口的

Zhongxiucheng的专栏 1457

【Spring 持久层】Spring 与 Mybatis 整合

持久层持久层整合总述Mybatis 开发步骤回顾Mybatis 开发中存在的问题Spring 与 Mybatis 整合思路Spring 与 Mybatis 整合的开发步骤Spring 与 Mybatis 整合的编码搭建开发环境 pom.xmlSpring 配置文件的配置编码Spring 与 Mybatis 整合细节 更多内容请查看笔记目录:【Spring 5.x】学习笔记汇总 持久层整合总述 1、Spring 框架为什么要与持久层技术进行整合? JavaEE开发需要持久层进行数据库的访问操作 JDBC

萌宅鹿的技术小屋 2743

电商项目笔记之二:自定义带泛型的DaoSupport<T>类

这个项目里所有的DaoImpl没有直接继承Spring的HibernateDaoSupport,使用其中常用的方法  而是自己实现了一个带泛型的Dao支持类 ,多封装了一层以后, 具体的Dao再去继承这个支持类, 非常的nb啊. 想了一下这样设计的好处, 一是等于在底层实现了泛型 ,二是自己设计查询语句的传参(适配器) . 多一层封装还是有必要的. 不过我觉得继承方式有待改进

徐行 1174
上一篇: jsonp跨域请求详解
下一篇: 无法使用aliyun的maven镜像
Haaaaaang
博客等级 码龄10年 62粉丝 65原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值