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

DAO设计模式


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 
);


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

相关推荐

C# WinForms项目里开箱即用的SQL Server数据操作工具类(含参数化与动态参数支持)

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

view3的博客 254

禅道常用查询

#通过迭代查找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

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

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

通过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

部署Doris

本文详细介绍了Apache Doris三节点集群(3 FE + 3 BE)的部署流程。首先从硬件配置、系统参数调优等准备工作入手,然后分步说明FE和BE节点的配置方法,包括端口设置、存储路径规划等关键参数。部署完成后提供SQL测试用例和数据一致性验证方法,并总结常见问题解决方案,如节点加入失败、磁盘容量异常等。文档包含完整的命令和配置示例,强调高可用配置和监控建议,为生产环境部署提供实用指导。

神棍之路 1714

大模型事件抽取学习——论文学习笔记《LLMs Learn Task Heuristics from Demonstrations:......》

本篇博客介绍一篇发表在2024 ACL main上的文章:《LLMs Learn Task Heuristics from Demonstrations: A Heuristic-Driven Prompting Strategy for Document-Level Event Argument Extraction》 方向:大模型事件抽取 本篇博客为个人阅读论文的总结与笔记,在这里进行简单的分享 论文链接:https://arxiv.org/abs/

weixin_53751318的博客 1852

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

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

liuyuqin1991的专栏 3192

深度解析NXP AMCLIB状态观测器:PMSM无感FOC控制实战指南

状态观测器是现代电机控制中的核心算法,它基于电机数学模型,通过测量定子电压和电流,实时估算出转子的位置和速度,从而替代了传统的物理传感器。其原理遵循“预测-校正”的闭环结构,通过比较模型预测值与实际采样值的误差,不断修正内部状态估计。这项技术的核心价值在于实现了无传感器控制,显著降低了系统成本、提升了可靠性与紧凑性,广泛应用于伺服驱动、变频器、电动汽车和家电等领域。本文聚焦于NXP AMCLIB库中的角度跟踪观测器和反电动势观测器,深入剖析其设计思路、固定点运算实现以及参数整定方法,为工程师在永磁同步电机无

cumi7754的博客 2833

不同于hibernate,利用通用持久类实现数据增、删、改、查,可极大提高开发效率

DAO类+通用持久类,实现数据增、删、改、查 标题中“DAO类”指net.newxy.dbm.BaseDAO或其子类,“通用持久类”指net.newxy.dbm.DynaDto。利用newxy(新坐标)DAO类及通用持久类对数据进行增、删、改操作可以不依赖于struts,运用系统不一定要支持struts,方法极其简便。一、通用持久类简介:1.net.newxy.dbm.Dy

nlhlx的专栏 3565

2023-10-20 - MacBook - 优化外接2k显示器体验:告别字小与字虚的终极指南

本文针对MacBook外接2K显示器时普遍遇到的字体过小和边缘发虚问题,提供了终极解决方案。通过深入解析macOS的HiDPI与Retina显示原理,并详细指导使用SwitchResX等工具开启隐藏的HiDPI模式,实现完美的2倍整数缩放,从而在保证字体大小合适的同时获得清晰锐利的显示效果,彻底告别字小与字虚的困扰。

solidity8miner的博客 477

海鸥派OpenEuler开发板实战:从烧写到SSH连接的完整指南

本文提供海鸥派OpenEuler开发板从开箱到SSH远程连接的完整实战指南。详细介绍了基于海思SD3403/SS928芯片的算力开发板系统烧写、存储扩容、网络配置等关键步骤,帮助开发者快速上手这款AI边缘计算设备,并实现高效的远程开发与管理。

ruby5的博客 1121

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

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

chihuo2428的博客 138

含分布式光伏的IEEE 33节点配电网电压越限仿真分析

摘要 本文针对分布式光伏接入配电网引发的电压越限问题,基于IEEE 33节点系统开展仿真研究。首先分析了光伏出力的随机性和波动性特性,采用Beta分布和马尔可夫链方法建立光伏出力模型;其次在MATLAB/Simulink平台搭建完整测试系统,包含光伏模型、配电网线路模型和控制模块;最后通过多场景仿真定量分析了不同光伏渗透率和接入位置对节点电压的影响。结果表明:光伏渗透率提高会显著增加电压越限风险,特别是线路末端节点;光伏接入位置对电压分布具有决定性影响,馈线末端接入更易引发电压越限。研究为含高比例光伏的配电

huanghm88的专栏 322

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

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

zhouhui001的博客 212

【肌电处理】肌电信号EMG积分肌电值+均方根值+中值频率+平均功率频率【含Matlab源码 3386期】

肌电信号EMG积分肌电值+均方根值+中值频率+平均功率频率 完整的代码,方可运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 826

AgentScope实战训练营:构建计划可视化管理和HITL的AI智能计划助手

本文基于AgentScope Java SDK和Spring Boot WebFlux,从零构建一个支持SSE流式对话、计划可视化管理和HITL的AI智能计划助手Web应用PlanNotebook。涵盖项目架构设计、ReActAgent初始化、自定义工具注册、Hook机制实现、SSE事件协议定义、前端流式渲染等核心技术点,提供完整可运行的代码示例和详细的REST API参考。

program哲学 400

hibernate4 DAO

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

yz16808334330的专栏 266

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

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

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

MVC设计模式

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

扮猪吃老虎二号的博客 292

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

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
上一篇: java反射机制模式
下一篇: DAO设计模式之禅之数据库万能查询操作
AndyChen9988
博客等级 码龄11年 276粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值