5.5其他WEB技术——利用反射泛型写通用DAO层

Java泛型DAO设计模式详解 本文还有配套的精品资源,点击获取 简介:Java中的泛型DAO设计模式允许开发者创建可重用的数据访问对象(DAO)接口和实现,以处理不同类型的实体对象。泛型概念自Java SE 5引入,提升了代码的类型安全性和效率,并减少了编译时的类型转换。本文深入探讨泛型DAO的原理、优势及在实际项目中的应用。介绍了DAO模式的作用,展示了如何通过泛型接口处理多种实体类,并讨论了泛型DA... 阅读详情

JAVAWEB学习文章索引点这里
注意事项:
1,程序结构为BaseDao,PersonDao和StudentDao直接继承BaseDao。BaseDao中写一些通用点的方法
2,需要导入dbutils,c3p0,mysql驱动等包
3,表分别为person(id,name),student(id,name)预先填入了部分数据

首先介绍用于获取数据源的DBUtils:

package com.dbutils;

import java.beans.PropertyVetoException;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;

public class DBUtils {
    public static ComboPooledDataSource ds = new ComboPooledDataSource();
    static { 
        try {
            ds.setDriverClass("com.mysql.jdbc.Driver");
            ds.setJdbcUrl("jdbc:mysql://localhost:3306/test");
            ds.setUser("root");
            ds.setPassword("123456");
            ds.setInitialPoolSize(5);//设置初始化连接数量
            ds.setMaxPoolSize(10);//设置最大连接数量
        } catch (PropertyVetoException e) {
            e.printStackTrace();
        }
    }
    public static DataSource getDataSource() {
        return ds;
    }
}

PersonDao:

package com.dao;

import com.bean.Person;

public class PersonDao extends BaseDao<Person>{

}

StudentDao:

package com.dao;

import com.bean.Student;

public class StudentDao extends BaseDao<Student>{

}

BaseDao:

package com.dao;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.sql.SQLException;
import java.util.*;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import com.dbutils.DBUtils;

public class BaseDao<T> {
    Class T_class;
    public BaseDao() {
        /*
         * Type 是 Java 编程语言中所有类型的公共高级接口。
         * 它们包括原始类型、参数化类型、数组类型、类型变量和基本类型
         * */
        //假设PersonDao调用,这里得到的是 Type类型的BaseDao<Person>
        Type type = this.getClass().getGenericSuperclass();
        //将type转成参数化类型,得到的是参数化类型的BaseDao<Person>
        ParameterizedType ptype= (ParameterizedType)type;
        //获取泛型内容数组
        Type[] actTypeArgs = ptype.getActualTypeArguments();
        //由于Class类似Type接口的实现类,所以进行一个强转,得到Person类的
        T_class = (Class)actTypeArgs[0];
    }
    public List<T> selectAll() {
        try {
            String sql = "select * from "+ T_class.getSimpleName().toLowerCase();
            QueryRunner qr = new QueryRunner(DBUtils.getDataSource());
            return (List<T>)qr.query(sql, new BeanListHandler(T_class));
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
}

最后在service中测试方法:

package com.service;

import java.util.*;

import org.junit.jupiter.api.Test;

import com.bean.*;
import com.dao.PersonDao;
import com.dao.StudentDao;

public class MyService {
    public List<Person> getPersonList(){
        return new PersonDao().selectAll();
    }

    public List<Student> getStudentList(){
        return new StudentDao().selectAll();
    }
    @Test
    public void test() {
        for (Person person : getPersonList()) {
            System.out.println(person.toString());
        }
        for (Student student : getStudentList()) {
            System.out.println(student.toString());
        }
    }
}

运行结果:

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

相关推荐

Hibernate_通用DAO模式,一个写好的dao层

这个是不同类型的表单通用的dao模式,简洁明了,注释清楚,可移植性很强

dao泛型及优化

dao泛型优化使用 1.加依赖     org.springframework.data     spring-data-jpa     1.10.2.RELEASE 2.配置bean.xml,@:entityManagerFactory的配置 xml version="1.0" encoding="UTF-8"?> xmlns="http://www.sprin

G_honey的博客 579

基于注解反射封装的BaseDao(支持一对多查询)

能够实现一对多查询的basedao实现

java 使用反射编写通用DAO<T>

前言   反射在框架中的应用还是很多的,比如spring框架里面AOP用到的动态代理,而动态代理就是基于反射的。本文主要通过学习java的反射,最后编写通用的DAO类。最近在复习java web,在做数据库访问的时候做了一个事情。   写一个CustomerDAO类(获取数据库连接,执行sql,获取resultSet,获取对象,关闭数据库等操作),用于根据用户名来获取一个用户对象。这个时候有一个新...

阿璐4r的博客 1225

HibernateGenericDAO框架资料

HibernateGenericDAO是一款googlecode上的开源持久层框架,基于Hibernate。 本人偶然找到该框架,研究发现对于快速开发Hibernate的持久层程序非常有帮助,因此下载研究并写了一个Maven的示例工程和一篇快速入门攻略供大家学习交流。

基于java泛型的通用DAO(CURD)实现

现在无论做什么应用,基本上都会有涉及对象持久化这方面的操作。通常创建大量的DAO对象是我们开发过程中最常见的操作了。创建DAO对象的优点主要体现在提高代码复用和降低业务逻辑操作与业务实体持久化之间的耦合。 DAO对象一般都包括CRUD动作,如果在一个应用中,大量的重复定义这些CRUD方法,会占用大量的开发时间及测试时间,那在这一方面,有没有改进的方法呢? 其实,利用Java面向对象的基本特性及JDK5新引入的泛型语法,我们可以创建通用的DAO对象的CRUD方法,同时又可保证类型的安全性。下面DAO的实现以Hibernate为基础加以演示。

java泛型详解和反射泛型通用BaseDao实现

一 泛型的基本概念 1.1什么是泛型? 泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。1.2泛型的作用? JDK5中的泛型允许程序员在编写集合代码时,就限制集合

nwpu_geeker的博客 5384

经典泛型dao层代码,非常好用简易

使用了泛型的dao,在ssh里的应用,非常的简便好用

利用反射泛型编写通用的增删查改Dao父类

import ming.stop.utils.JDBCUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; i...

Wim的博客 789

零基础玩转IndexTTS2:5分钟搭建个人语音克隆工具(支持B站同款情感语音)

本文详细介绍了如何零基础使用IndexTTS2快速搭建个人语音克隆工具,支持B站同款情感语音。IndexTTS2作为自回归零样本TTS系统,突破传统技术限制,实现精准时长控制和丰富情感表达。通过HuggingFace在线演示,用户可轻松克隆音色并调节情感参数,适用于自媒体配音、有声书朗读等场景。

purple的博客 918

ROS2_IGH方案配置(二)——Ubuntu22.04 实时内核性能验证与调优

本文详细介绍了在Ubuntu22.04系统上配置ROS2_IGH方案时,如何验证和调优PREEMPT_RT实时内核性能。通过使用cyclictest工具进行基准测试和压力测试,分析中断与硬件延迟,并优化内核参数,确保系统满足工业控制领域对硬实时性的苛刻要求。文章还提供了针对ROS2的特殊优化建议和性能监控方案,帮助开发者实现毫秒级延迟的稳定控制。

weixin_30791095的博客 224

JavaWeb使用c3p0,dbutils以及泛型反射抽取Dao

1. 泛型概念,泛型类,泛型方法,泛型接口以及用法泛型只在编译时期有效,编译后的字节码文件中不存在泛型信息,这一点对于我们判断泛型使用规范很有帮助。例如通常情况下,方法中接受的参数列表如果被写为public void save(List<? extends Number> list){ System.out.println(list.get(0)); }就代表,传入的List集合中元素,必须

412

SQL 通过sum() over(order by ,rownum)实现财务现金日记账实例

SELECT 类型,to_char(发生日期,'yyyy-MM-dd') 发生日期,期初余额,借方金额,贷方金额, (CASE WHEN 借方金额>0 THEN '借' WHEN 贷方金额>0 THEN '贷' ELSE '平' END) 方向, sum(收支金额) over(order by 发生日期, rownum) 余额 FROM( SELECT LX 类型,账户,账号,摘要,发生日期,单据ID, ...

qq_41451794的博客 1023

Web基础之反射机制优化JDBC中DAO层对象的封装

Web基础之反射机制优化JDBC中DAO层对象的封装 一、前言: 在前面我们完成的Servlet+JDBC+JSP项目实战中,我们的DAO层代码(即封装数据库操作的代码)中,有许多类似的代码,我们将通过我们前面学的反射知识来解决这一问题,减少类似的代码,到达优化的目的; 二、分析: 在我们前面的项目中,每个DAO层(ClassInfoDao、StudentInfoDao)的

BlueSky_USC的博客 757

PADS VX2.4差分对设置避坑指南:常见错误与解决方案

本文深度解析了在PADS VX2.4中进行高速PCB设计时,差分对设置的核心要点与常见陷阱。针对Layout规则设置、Router布线实战中的阻抗控制、线长匹配等关键环节,提供了具体的避坑指南和解决方案,帮助工程师确保信号完整性,提升设计质量。

weixin_29216049的博客 359

香橙派5Max + Realsense D435i + Fast-Drone-250:手把手教你搭建一个完整的无人机视觉开发环境

本文详细介绍了如何利用香橙派5Max、Realsense D435i深度相机和Fast-Drone-250项目搭建完整的无人机视觉开发环境。从硬件连接到ROS配置,再到项目部署与性能优化,提供全栈式实战指南,助力开发者快速实现SLAM算法验证和自主导航功能开发。

weixin_30879169的博客 463

5.6其他WEB技术——利用反射注解写通用DAO层

1,注解简单介绍: 注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。 常见注解: 注解形式 注解作用 @Override 告诉编译器强制对方法进行覆盖 @SuppressWarnings 告诉编译器压制代...

smallhc的博客 477

【实战指南】从零构建UNet多分类分割数据集:标注、转换与训练全流程

本文提供了一份从零构建UNet多分类分割数据集的完整实战指南。详细介绍了使用Labelme进行图像标注的核心技巧与规范,并通过Python脚本将标注结果转换为模型可用的VOC格式。最后,指导如何修改经典的PyTorch版UNet代码,以适配自定义数据集并进行训练与测试,帮助读者完成从数据准备到模型训练的全流程。

arduino9maker的博客 287

反射泛型的使用

对于反射泛型的简单应用(有关泛型的知识请自行学习)!!!在web开发应用中,会遇到多种类拥有类似的操作,例如对数据库中的学生和教师都有查找所有人、根据ID查找某人的信息,此时可以利用反射泛型将类似操作提取出来成Base类,使得拥有Base类中的操作的类继承即可。操作步骤:       1.以下是StudentDao与TeacherDao类的共有操作           2.提取出      具体实...

1392252267@qq.com 973

精度与速度双突破:YOLOv8-Pose 在 RK3588 上实现高性能人体姿态分析部署

本教程从YOLOv8-pose模型的姿态识别训练,到RK3588的边缘量化部署,为你打造了一套“高精度+高实时性+低成本”的人体姿态分析解决方案。无论是健身动作纠正、智能安防行为检测,还是工业人员姿态监控,这套技术都能直接复用——你只需替换数据集与业务逻辑,即可快速落地专属的边缘AI姿态识别系统。如果你在实践中遇到任何卡点,欢迎随时交流。记住,人体姿态识别的价值在于“关键点准、推理快、部署易”,而这三者的平衡,正是你通过本教程能掌握的核心能力。

know_F0727的博客 434

ADAS方案设计-CAN网络管理与休眠唤醒机制

文章摘要:本文介绍了车载控制系统的五种工作模式及其转换条件,包括睡眠模式、准备睡眠模式、就绪睡眠模式、正常工作模式和重复消息状态。系统唤醒条件包括接收到网络管理报文或电源ON档信号,休眠条件则需满足电源OFF档、功能完成等多重要求。针对下挂节点的网络管理报文发送规则,详细说明了不同状态下的报文发送策略,特别是在哨兵模式、OTA模式等特殊场景下的处理方式。系统在满足休眠条件后会立即停止发送下挂节点网络管理报文,确保电源管理的有效性。

xiandang8023的博客 325

Dao泛型设计和反射反型

(1)DAO泛型设计:当二哥或多个类中有类似的方法时,可以将这些累死的方法提出到类中,形式一个泛型父类 (2)反射反型:在泛型父类中获取子类的具体类型的过程,叫反射反型 1 package cn.itcast.web.generic; 2 3 import java.lang.reflect.ParameterizedType; 4 import java.lang.ref...

weixin_33724046的博客 81

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

SSM框架各层作用及其关系

SSM中各层作用及关系 1.持久层:DAO层(mapper层)(属于mybatis模块) List item DAO层:主要负责与数据库进行交互设计,用来处理数据的持久化工作。 DAO层的设计首先是设计DAO的接口,也就是项目中你看到的Dao包。 然后在Spring的xml配置文件中定义此接口的实现类,就可在其他模块中调用此接口来进行数据业务的处理,而不用关心接口的具体实现类是哪个类,这里往往用到的就是反射机制,DAO层的jdbc.properties数据源配置,以及有 关数据库连接的参数都

qq_37293879的博客 1万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

SSH实战 第三天 代码

需求在这 目录 BaseServlet抽取(抽取简单增删改查的代码,以后传个类型就不用写了) BaseDao.java BaseDaoImpl.java 简单调用(仅仅继承时改下 没有动任何配置文件) CustomerDao.java CustomerDaoImpl.java BaseAction的抽取 BaseAction.java LinkmanAction.java 顺...

树叶子的博客 489

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

java通用分页(非常方便)

文章目录前言通用分页核心思想原理分析需要的工具类运行流程注意事项案例运用 前言        今天来实现的是通用分页,可以这么说一个网站或者一个app分页是必备的功能,如果你没看博主写的这篇你可能会但是看完后你就不会那么麻烦了!试想一下我每一个类别都需要写一套分页或者修改吗?这样会造成不必要的麻烦和代码的冗余。 思考: 既然大部分的代码是相同的,那么能不能出现一个basedao完成所有的类似查询需求? 答:能、我们可以把共有的部分抽取出来

qq_45384482的博客 1156
上一篇: 5.4技术补充——反射机制
下一篇: 5.6其他WEB技术——利用反射注解写通用DAO层
海棠花开
博客等级 码龄10年 33粉丝 81原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值