DAO设计模式之禅之数据库万能查询操作

一键生成Java三层架构代码及配套文档实战工具 在典型的三层架构中,DAO位于最底层,直接与数据库交互,向上为Service层提供数据服务。它的主要角色包括:数据读写封装:封装对单个实体或关联实体集合的CRUD操作。事务无关性:DAO本身不管理事务,仅负责执行具体的数据操作,事务控制交由上层Service处理。异常转换:将底层数据库异常(如SQLException)转换为更友好的运行时异常(如PersistenceException),避免污染业务层。查询定制化支持。 阅读详情


          DAO(Data Access Object) 数据访问对象是第一个面向对象的接口,它显露了 Microsoft Jet 数据库引擎(由 Microsoft Access 所使用),并允许 Visual Basic 开发者通过 ODBC 像直接连接到其他数据库一样,直接连接到 Access 表。DAO 最适用于单系统应用程序或小范围本地分布使用。


          这里的DAO也就一个功能实现重用的效果、直接来示例代码吧!



第一类:用户类

package com.dao.bean;

/*
 * 属性的封装类
 * A class to do one thing
 */
public class Animals {
		private int id;
		private String name;
		private int age;
		private int anId;
		
		public Animals(){
			
		}
		
		public int getId() {
			return id;
		}
		public void setId(int id) {
			this.id = id;
		}
		public String getName() {
			return name;
		}
		public void setName(String name) {
			this.name = name;
		}
		public int getAge() {
			return age;
		}
		public void setAge(int age) {
			this.age = age;
		}
		public int getAnId() {
			return anId;
		}
		public void setAnId(int anId) {
			this.anId = anId;
		}
		
}


第二:数据库链接类

package com.jdbc.uitl;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
/*
 *  DAO工具类
 *  A class to do one thing
 * 
 */
public class JDBCUtil {
		public static Connection open(){
			
			Connection conn = null;
			
			try {				
				//加载驱动
				Class.forName("com.mysql.jdbc.Driver");
				//获取连接数据库
				conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/animal","root","123456");  
				
			}catch (Exception e) {
				System.out.println("数据库连接失败!");
			}
			return conn;
		}
		
		//关闭 2种 资源的方法
		public static void closeRes(Connection conn ,PreparedStatement ps){
			try {
				if(ps!=null){
					ps.close();
				}
				if(conn!=null){
					conn.close();
				}
			} catch (Exception e) {
				System.out.println("数据库资源已经关闭!");
			}
		}
		
		//关闭 3种 资源的方法
		public static void closeRes(Connection conn ,PreparedStatement ps,ResultSet rs){
			try {
				if(rs!=null){
					rs.close();
				}
				if(ps!=null){
					ps.close();
				}
				if(conn!=null){
					conn.close();
				}
			} catch (Exception e) {
				System.out.println("数据库资源已经关闭!");
			}
		}
}

第三:Dao类
package com.dao.data;

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import com.jdbc.uitl.JDBCUtil;

/*
 * 万能DAO
 * 
 * */
public class DaoSelect {
	
	//1、查询所有属性[返回一个集合、ArrayList]
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public ArrayList getList(Class<?> cl){
		
		ArrayList ar = new ArrayList();	
		
		Connection conn = JDBCUtil.open();
		PreparedStatement ps = null;
		ResultSet rs = null;
		
		//获取类型名字、这里表示表名[对象.getSimpleName()]
		String sql = "select *  from "+ cl.getSimpleName();
		//获取属性[对象.getDeclaredFields()]
		Field[] fi = cl.getDeclaredFields();
		
		try {
			//链接数据库
			ps = conn.prepareStatement(sql);
			rs = ps.executeQuery();
			Object ob = null;
			
			while(rs.next()){
		
				ob = cl.newInstance();
				
				for(Field ff : fi){
					//属性可见
					ff.setAccessible(true);
					ff.set(ob, rs.getObject(ff.getName()));
				}
				ar.add(ob);
			}
		} catch (Exception e) {
			System.out.println("查询所以属性操作失败!");
		}finally{
			//关闭资源
			JDBCUtil.closeRes(conn, ps, rs);
		}
		return ar;
	}
	
	//2、查询单个属性[返回一个属性、Object]
	@SuppressWarnings("rawtypes")
	public Object getObById(Class cl,int id){
		
		Object ob = null;
		
		Connection conn = JDBCUtil.open();
		PreparedStatement ps = null;
		ResultSet rs =null;
		
		//获取属性[对象.getDeclaredFields()]
		Field[] fi = cl.getDeclaredFields();
		//获取属性名[对象.getSimpleName()]
		String sql = "select * from "+cl.getSimpleName()+" where "+fi[0].getName()+" = "+id;     
		
		try {
			//链接数据库
			ps = conn.prepareStatement(sql);
			rs = ps.executeQuery();
			
			while(rs.next()){
				
				ob = cl.newInstance();
				
				for(Field ff : fi){
					ff.setAccessible(true);
					ff.set(ob,rs.getObject(ff.getName()));
				}
			}
		} catch (Exception e) {
			System.out.println("查询单个属性操作失败!");
		}finally{
			JDBCUtil.closeRes(conn, ps, rs);
		}
		return ob;
	}
	
	//3、查询未知属性[返回一个集合、ArrayList]
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public ArrayList getListBySome(Class cl ,String name,Object value){
		
		ArrayList ar = new ArrayList();
		Object ob = null;
		
		Connection conn = JDBCUtil.open();
		PreparedStatement ps = null;
		ResultSet rs = null;
		
		//获取属性、属性名[对象.getDeclaredFields()][对象.getSimpleName()]
		Field[] fi = cl.getDeclaredFields();
		String sql = "select * from "+cl.getSimpleName()+" where "+name+" = '"+value+"'";
		
		try {
			//连接数据库
			ps = conn.prepareStatement(sql);
			rs = ps.executeQuery();
			
			while(rs.next()){
				
				ob = cl.newInstance();
				
				for(Field ff : fi){
					ff.setAccessible(true);
					ff.set(ob, rs.getObject(ff.getName()));
				}
				ar.add(ob);
			}
			
		} catch (Exception e) {
			System.out.println("查询未知属性操作失败!");
		}finally{
			JDBCUtil.closeRes(conn, ps, rs);
		}
		return ar;
	
	}
}

第四:实现类

package com.dao.data;

import java.util.ArrayList;
import com.dao.bean.Animals;


/*
 * 万能测试Class
 * 
 */
public class TestSelect {
	@SuppressWarnings("unchecked")
	public static void main(String[] args) {

		DaoSelect dao = new DaoSelect();
		
//		//1、Animals类、所有属性
		ArrayList<Animals> ar = dao.getList(Animals.class);
		for (Animals an: ar) {
			System.out.print("编号:" + an.getId() + "——名字:" + an.getName());
			System.out.println("——年龄:" + an.getAge() + "——类型ID:" + an.getAnId());
		}
		
//		//2、Animals类、查询单个属性
//		Animals ar1 = (Animals) dao.getObById(Animals.class, 2);
//		System.out.println("id为2的名字是:" + ar1.getName());
		
		//3、Animals类、查询单个属性
//		ArrayList<Animals> ar1 = dao.getListBySome(Animals.class, "name", "陈郑游");
//		
//		ArrayList<Animals> ar = dao.getListBySome(Animals.class, "age", "21");
//		for (Animals an: ar ) {
//			System.out.println("编号:" + an.getId() + "——名字:" + an.getName());
//		}
	}

}

第五:数据库SQL语句

//动物类数据库

create database animals ;
use  animals;

create table  animals 
(	id int primary key,  
	name varchar(20) ,
	sex char(2), 
	age int ,
	anid int 
);


C# WinForms项目里开箱即用的SQL Server数据操作工具类(含参数化与动态参数支持) 一套面向Windows Forms场景的轻量级C#数据库操作工具,基于原生ADO.NET封装,不依赖任何第三方框架,兼容.NET Framework 4.0+。提供三类实用接口:基础版覆盖增删改查常用操作;参数化版本严格使用SqlParameter传递参数,有效防范SQL注入;可变长参数版本专为IN语句、多条件动态拼接等灵活场景设计,逻辑独立、调用简洁。所有代码组织清晰,已集成到完整VS解决方案WindowsFormsAdo.sln中,Test4目录内置对应测试用例,方便一键验证功能正确性。长度可变参数相关 阅读详情

相关推荐

万能查询,万能查询数据库

单击“查询”按钮,进入“查询”模块,如图1.2所示。在“表达式”中可以手动输入查询语句,也可以在查询条件中设置条件,然后单击“查询”按钮,显示查询结果。

禅道常用查询

#通过迭代查找story SELECT * FROM zentao.zt_story where zentao.zt_story.id in(SELECT story FROM zentao.zt_projectstory where project in (SELECT id FROM zentao.zt_project where name='2020-16')); #通过迭代查找task SELECT zentao.zt_task.id FROM zentao.zt_task where st...

1812

【STM32】433MHz OOK信号软解码实战:从EV1527协议到嵌入式实现

本文详细介绍了基于STM32微控制器实现433MHz OOK信号软解码的完整实战过程。文章从EV1527协议解析入手,重点阐述了利用STM32的GPIO和定时器进行信号采样、脉宽还原、同步头识别以及数据位判决的核心算法,并提供了对抗无线干扰的容错优化策略,帮助开发者深入理解并掌握低成本无线通信的嵌入式实现方案。

weixin_29299807的博客 786

通过Xshell访问禅道以及数据库

1、通过ipconfig查询本地主机IP,通过ifconfig查询服务器被分配的IP地址(因为服务器被分配的IP是随机的,可以设置固定的IP,这些命令可以在网上进行搜索),确保主机和服务器能够ping通。 2、点击Xshell,进入相关会话,通过"/opt/zbox/zbox start"启动Apache和MySQL服务。 3、出现Start Apache success;Start Mysql success;即启动成功,若启动失败检查一下端口号是否设置冲突。 4、通过"/opt/zbox/auth

weixin_45638534的博客 1403

SAP PS项目结算实操:从CJ20N到CJ88,手把手搞定项目成本结转与凭证生成

本文详细解析SAP PS项目结算全流程,从CJ20N到CJ88的操作要点,涵盖成本归集、结算规则配置、结果分析及凭证生成等关键环节。特别针对FICO模块中的项目凭证流转问题提供实战解决方案,帮助财务人员规避常见配置错误,提升项目结算效率与准确性。

weixin_26833503的博客 820

CTS实战:如何用set_sense优化时钟树平衡(附ICC2避坑指南)

本文深入探讨了在时钟树综合(CTS)中,如何正确使用`set_sense`命令优化时钟树平衡,并对比了其与`set_disable_timing`的本质区别。通过实战案例详细解析了`-stop_propagation`和`-clock_leaf`参数的应用场景,并提供了ICC2工具中的关键避坑指南,帮助后端工程师精准控制时钟拓扑,避免时序分析漏洞。

weixin_28933797的博客 460

通用型Dao层简单化查询通用方法

与hibernate的Critical类似,是一种通用的Dao层简单化查询通用方法,是我在13年刚接触hibernate的,因为当时的业务性质,需要频繁的简单查询,但我还不知Critical,所以编写了这么一套通用查询方法,思想应该与Critical是一致的 首先是service层,这个通用的service使得可以直接从action层传递参数,查询出相应的对象或集合 package c

liuyuqin1991的专栏 3192

MIPI信号的分析--结合示波器实际测试波形

如果排查的思路对你有帮助,请记住 消雨匆匆 or 大吊工。码字和排查很累,仅此而已 ,硬件不是抄电路,拿烙铁,懂点软件,细致分析,找问题和破案搜集线索是一样的。 部分内容来自于此博客的大神总结: http://www.elecfans.com/news/wangluo/20170323499614.html http://www.elecfans.com/yuanqijian/jieko...

消雨匆匆 4万+

【框架:MyBatis】基础(二:Dao代理实现数据库操作)

1. 工具类的使用 我们在第一个实例中,有很多的工作实际上是重复的,所以我们可以将这些工作抽离出来包装成工具类,以供后期使用。 MyBatisUtils.java package com.sdnu.utils; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSessionFactory; import org.ap

北极星的博客 580

VAY 是 SAP 自动科目确定(OBYC-GBB)中的科目修改码,专用于带科目分配对象的销售订单发货场景,核心是触发 “Dr 成本要素科目(如销售费用 / 特定成本对象) Cr 库存商品” 的分录,

摘要:VAY是SAP中用于带科目分配对象(如成本中心、WBS)的销售订单发货的科目修改码,与标准VAX场景不同,它生成"借成本要素科目/贷库存商品"的分录。配置路径为OBYC-GBB-VAY,需确保借方科目为成本要素。典型业务场景包括免费样品、项目专用发货等。常见问题包括VAY未触发或科目记账错误,需检查销售订单科目分配、移动类型设置及OBYC配置。特殊场景建议单独配置科目以便费用分析。

金牌架构师 1257

Android面试必考问题:Android性能优化最全面试题及参考答案(8万字长文)

Android 中的 OOM(Out Of Memory,内存溢出)异常是指应用程序在运行过程中,由于申请的内存空间超过了系统所能提供的最大内存限制而导致的错误。在 Android 中,内存泄漏是指应用中的某些对象在不再被使用后,仍然被其他对象持有引用,导致这些对象无法被垃圾回收器回收,从而占用内存空间,随着时间的推移可能会导致应用内存不足,甚至崩溃。在一次开发 Android 应用的过程中,我发现应用在长时间运行后会出现内存占用过高的情况,导致应用变得卡顿,甚至可能会被系统强制关闭。

大模型大数据攻城狮的专栏 2534

DAO设计模式之禅[数据库万能查询操作]

DAO设计模式 这里的DAO也就一个功能实现重用的效果: 看看查询实例: 第一类:用户类 package com.dao.bean; /* * 属性的封装类 * A class to do one thing */ public class...

chihuo2428的博客 138

静态时序分析(STA)—— 标准单元库

目录 1、时序库 概览 2、时序模型 1、基本概念 2、影响因素 3、线性延时模型 4、非线性延时模型 5、单元时序弧 1、组合逻辑单元 2、时序逻辑单元 6、线负载模型 参考说明 上一篇,学习了 STA相关的基本概念,本篇继续学习 STA相关的 标准单元库。 1、时序库 概览 库文件概览: 2、时序模型 1、基本概念 2、影响因素 对于组合逻辑的时序弧而言,其延时的大小取决于: 1、输出负载,即,输出端的电容负载的大小。容性负载越大,...

记录所学,分享知识,结识挚友 2855

你写的 DAO 越来越像万能类——Repository 模式跟 DAO 差了一个抽象层

Java 后端项目里,DAO 和 Repository 这两个词经常被混着用,甚至很多团队里就是同一个东西两个名字。但我最近重构一个 3 年老项目时发现,这俩在抽象层级上完全不是一回事。当你把所有数据访问都叫 DAO 时,你的 DAO 就会越写越大,最后变成"什么都能查、什么都能改"的万能类,业务逻辑和数据访问混在一起,改一行 SQL 动 20 个文件。Repository 模式不是给 DAO 换名字,是把数据访问的抽象层级从"行"升到"集合"。

zhouhui001的博客 212

OceanBase数据库LSM-Tree存储引擎深度解析:合并写入与压缩优化策略

OceanBase数据库采用创新的LSM-Tree架构设计,通过"基线-增量"分离存储实现高性能。内存中的MemTable处理写入,磁盘上的SSTable存储有序数据,利用多级缓存加速读取。写入时先写日志再更新内存,合并操作将增量数据整合为基线数据以优化查询性能。相比传统B+树引擎,OceanBase在写入吞吐、压缩效率和存储成本方面优势显著,特别适合写入密集型场景。合并操作作为核心机制,通过多种触发方式和执行策略平衡性能与资源消耗。

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1342

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

hibernate4 DAO

参考地址:http://www.verydemo.com/demo_c146_i10010.html 基于hibernate的通用、”万能“Dao的设计(4) 基于hibernate的通用、”万能“Dao的设计(四) 万能Dao,应该说绝大多数情况下,它就能提供足够多的操作数据库的功能。@Repository public class UniversalDao extends Ba...

yz16808334330的专栏 266

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

java web 设计模式之道_JavaWeb之MVC设计模式

时间:2016-11-26 16:22——MVCMVC模式(Model - View - Controller)是软件工程中的一种架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)、控制器(Controller)MVC模式最早为Trygve Reenskaug提出,为施乐帕罗奥多研究中心(Xerox PARC)的Smalltalk语言发明的一种软件设计模式。MVC对程序的后...

weixin_27038245的博客 330

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

MVC设计模式

1、MVC设计模式: 控制器Controller:对请求进行处理,负责请求转发;负责找到合适的模型对象来处理业务逻辑,转发到合适的视图 视图View:界面设计人员进行图形界面设计;用来与用户打交道。负责接收用来的数据,以及显示数据给用户 模型Model:程序编写程序应用的功能(实现算法等等)、数据库管理。完成具体的业务工作,例如:开启、转账等 二、JavaWeb经典三层框架 我们...

扮猪吃老虎二号的博客 292

java毕业设计-基于springboot+vue的校园万能墙,校园表白墙系统(源码+LW+部署文档+全bao+远程调试+代码讲解等)

java毕业设计-基于springboot+vue的校园万能墙,校园表白墙系统(源码+LW+部署文档+全bao+远程调试+代码讲解等)

1291

万能JAVA面试题

进大厂是大部分程序员的梦想,而进大厂的门槛也是比较高的,所以这里整理了一份阿里、美团、滴滴、头条等大厂面试大全,其中概括的知识点有:Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、 Redis、MySQL 等技术栈共有100+道面试题。 对于Java后端的朋友来说应该是最全面最完整的面试备战仓库,为了更好地整理每个模块,我也参考了很多网上的优质博文和项目,力求不漏掉每一个知识点,很多朋友靠着这些内容进行复习,拿到了BATJ等大厂的offer, 也已经

Code Writers 701

资源库模式:解耦业务逻辑与数据访问的架构设计实践

在软件架构设计中,解耦是提升代码可维护性和可测试性的核心原则。资源库模式作为一种经典的结构型设计模式,通过在业务层与数据访问层之间引入抽象接口,有效隔离了业务逻辑与持久化细节。其核心原理是伪装成内存集合的数据网关,让业务代码以操作领域对象集合的方式访问数据,而底层实现可灵活替换。这一模式的技术价值在于大幅提升代码的纯粹性与可测试性,使单元测试无需依赖真实数据库,并能透明支持多种数据源。在应用场景上,它尤其适用于需要清晰分离关注点的领域驱动设计项目,无论是基于JPA、MyBatis还是内存缓存的实现,都能通过

weixin_29722783的博客 252

搞不懂SSH与JAVA+Servlet+javabean有什么关系

在SSH中:struts 是控制层,同时与Jsp结合代表表现层,同时负责客户端请求的处理,Spring主要处理逻辑事物处理,Hibernate主要对数据库的持久化操作。 Jsp+Servlet+JavaBean中的Jsp负责V,Servlet代表C,JavaBean是M的体现 但是在实际的项目中到底该用哪种模式来实现,他们都是体现了三层架构 首先我们了解一下各自模式中各个框架的技术: 那首...

weixin_30648587的博客 94

SSH 和 JSP+servlet+JavaBean到底谁更优秀

在SSH中:struts 是控制层,同时与Jsp结合代表表现层,同时负责客户端请求的处理,Spring主要处理逻辑事物处理,Hibernate主要对数据库的持久化操作。 Jsp+Servlet+JavaBean中的Jsp负责V,Servlet代表C,JavaBean是M的体现

张彬在奋斗 6114

设计模式七大原则

一:单一职责原则 单一职责原则告诉我们:一个类不能做太多的东西。在软件系统中,一个类(一个模块、或者一个方法)承担的职责越多,那么其被复用的可能性就会越低。一个很典型的例子就是万能类。其实可以说一句大实话:任何一个常规的MVC项目,在极端的情况下,可以用一个类(甚至一个方法)完成所有的功能。但是这样做就会严重耦合,甚至牵一发动全身。一个类承(一个模块、或者一个方法)担的职责过多,就相当于将这些职责耦合在一起,当其中一个职责变化时,可能会影响其他职责的运作,因此要将这些职责进行分离,将不同的...

m0_57126456的博客 347

拒绝“万能类”:从 CRM 图表显示看开闭原则与单一职责原则的重构实战

一个类应该只有一个引起它变化的原因。通俗地说,就是一个类只做一件事。如果一个类承担了太多的职责,那么这些职责就会耦合在一起,牵一发而动全身。无论是 CRM 系统的图表展示,还是登录功能的实现,核心思想都是解耦。开闭原则告诉我们:面对变化,要通过扩展(增加新类)来应对,而不是修改旧代码。单一职责原则告诉我们:不要让一个类承担太多责任,把复杂的逻辑拆分成简单的小模块。

xiaoliang6959的博客 243
上一篇: DAO设计模式之禅之数据库万能查询操作
下一篇: 23种设计模式—之桥接模式
AndyChen9988
博客等级 码龄11年 276粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值