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

基于openwrt平台搭建局域网技术验证之四

1、测试目的 验证l2tp客户端模式的可行性。 提供vpn-l2tp模式的客户端功能。 2、参考资料 参考链接1:https://www.lucktang.com/191.html 3、测试过程 测试过程需要用到的资源: 路由器俩个 win7系统电脑俩台 ③ 交换机一个 ④ 网线三根 测试组网如下图所示: 组网说明: R0公司路由器 S1 交换机 R1 路由器1 R2 路由器2 PC1 个人电脑1 PC2 个人电脑2 (R0) lan口接(S1)...

caofengtao1314的专栏 1960

Unity2D像素刀光实现:粒子方向控制与像素级渲染规范

像素风游戏中的刀光特效并非普通粒子动画,而是需严格遵循像素艺术原理的视觉暂留模拟。其核心在于将‘瞬时切割感’转化为程序可执行的渲染逻辑:通过禁用纹理滤波保障1:1像素锐度,绑定刀锋向量控制粒子运动方向,限定≤0.15秒生命周期匹配人眼暂留阈值,并采用Stretched Billboard实现动态拉伸拖影。该方案兼顾美术语义(如直劈、横扫、突刺)与工程约束(Sorting Layer分层、对象池复用、单粒子GPU优化),广泛适用于Unity2D平台的动作反馈系统,尤其适配《空洞骑士》《死亡细胞》类高节奏像素R

weixin_32390647的博客 283

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

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

412

n8n实战:动态报表生成与企业微信自动化推送

本文详细介绍了如何利用n8n实现动态报表生成与企业微信自动化推送的全流程。通过配置n8n Form触发器、智能报表生成核心逻辑以及企业微信Webhook推送,帮助企业大幅提升数据收集与报表推送效率,实现从数据录入到报表推送的全自动化处理。

weixin_29267307的博客 304

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

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

BlueSky_USC的博客 757

RT-Thread stm32h7使用串口DMA

stm32h7在rtthread中无法使用串口DMA,通过更改驱动代码使其支持串口DMA

qq_35141454的博客 2286

4.7W防削顶单声道D类音频功率放大器HT6872介绍

HT6872是一款低EMI,防削顶失真,单声道免滤波D类音频功率放大器。在6.5V电源,10%THD+N,4Ω负载条件下,输出4.71W功率,在各类音频终端应用中维持高效率并提供AB类放大器的性能。

weichen_78的博客 4699

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

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

smallhc的博客 477

YOLO26优化:注意力魔改 | EMA:基于跨空间学习的高效多尺度注意力,效果优于ECA、CBAM、CA

加入EMA注意力,一种基于跨空间学习的高效多尺度注意力,效果优于ECA、CBAM、CA等经典注意力。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 334

反射泛型的使用

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

1392252267@qq.com 973

【23】OpenCV C++实战篇——张正友相机标定【相机标定原理、相机标定流程、标定结果评价、图像畸变矫正】

R是3×3的正交单位矩阵(即旋转矩阵),t为平移向量,R、t与摄像机无关,所以称这两个参数为摄像机的外参数(extrinsicparameter),可以理解为两个坐标原点之间的距离,因其受x,y,z三个方向上的分量共同控制,所以其具有三个自由度。R是3×3的正交单位矩阵(即旋转矩阵),t为平移向量,R、t与摄像机无关,所以称这两个参数为摄像机的外参数(extrinsicparameter),可以理解为两个坐标原点之间的距离,因其受x,y,z三个方向上的分量共同控制,所以其具有三个自由度。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 4479

基于STM32L4XX、HAL库的CH182H1以太网收发器(PHY)驱动程序设计

define PHY_REG_PHYSCR 0x12 // PHY特殊控制寄存器。#define PHY_REG_PHYSTS 0x10 // PHY状态寄存器。#define PHY_REG_PHYIDR 0x11 // PHY标识寄存器。#define PHY_REG_ID1 0x02 // PHY标识符1。#define PHY_REG_ID2 0x03 // PHY标识符2。

zhusl6688的博客 404

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

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

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

SSM框架各层作用及其关系

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

qq_37293879的博客 1万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

假人有限元模型

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

SSH实战 第三天 代码

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

树叶子的博客 489

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

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、付费专栏及课程。

余额充值