泛型写基础DAO

DAO层使用泛型的两种方式 1.而有时我们为了方便起见,对于一些简单的项目,DAO的操作很单一,不会有很复杂的操作,那么我们直接用泛型方法类代替泛型类,主要就不需要写其他的DAO来继承, 整个DAO层就一个DAO类。 接口: package com.xidian.dao; import java.util.List; import com.xidian.bean.Admin; import com. 阅读详情
 

Java代码

/* 

 * Created on 2006-07-xx 

 * 

 */ 

package net.yigoware.common.dao.impl.hibernate;  

 

import java.io.Serializable;  

import java.util.List;  

import java.util.Map;  

 

import net.yigoware.common.dao._BaseDAO;  

import net.yigoware.common.exception.ObjectNotFoundException;  

import net.yigoware.common.util.MyBeanUtils;  

import net.yigoware.common.util.PageInfo;  

 

import org.apache.commons.logging.Log;  

import org.apache.commons.logging.LogFactory;  

import org.hibernate.Criteria;  

import org.hibernate.HibernateException;  

import org.hibernate.Session;  

import org.hibernate.criterion.DetachedCriteria;  

import org.hibernate.criterion.Example;  

import org.hibernate.criterion.Expression;  

import org.hibernate.criterion.Projections;  

import org.springframework.orm.hibernate3.HibernateCallback;  

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;  

 

// 这个不能算是渗透哦,没办法,common beanutils没法解决  

// import com.opensymphony.util.BeanUtils;  

 

/** 

 *  

 * @author Yigo 

 * @createdate 2006-07-xx 

 * @param <T> 

 * @param <ID> 

 */ 

abstract public class _BaseDAOImplHibernate<T, ID extends Serializable> extends 

        HibernateDaoSupport implements _BaseDAO<T, ID> {  

    @SuppressWarnings("unused")  

    private static final Log log = LogFactory  

            .getLog(_BaseDAOImplHibernate.class);  

 

    private Class<T> objectClass;  

 

    private _BaseDAOImplHibernate() {  

 

    }  

 

    // protected abstract String getUniqueKeyName();  

 

    /** 

     * @param objectClass 

     */ 

    public _BaseDAOImplHibernate(Class<T> objectClass) {  

        this.objectClass = objectClass;  

    }  

 

    public T findById(ID id) throws ObjectNotFoundException {  

        // log.debug("getting instance with id: " + id);  

        try {  

            T instance = (T) getHibernateTemplate().get(objectClass, id);  

            if (null == instance) {  

                throw new ObjectNotFoundException(objectClass, id);  

            }  

            return instance;  

        } catch (RuntimeException re) {  

            log.error("get failed", re);  

            throw re;  

        }  

    }  

 

    public T findDetailsById(ID id) throws ObjectNotFoundException {  

        T instance = findById(id);  

        getHibernateTemplate().initialize(instance);  

        return instance;  

    }  

 

    public T findByUniqueKey(String keyName, Serializable key)  

            throws ObjectNotFoundException {  

        log.debug("read instance by uniquekey - " + keyName + ": " + key);  

        try {  

            DetachedCriteria detachedCriteria = DetachedCriteria  

                    .forClass(this.objectClass);  

            // log.debug("this.objectClass:" + this.objectClass);  

            detachedCriteria = detachedCriteria  

                    .add(Expression.eq(keyName, key));  

            List<T> list = this.getHibernateTemplate().findByCriteria(  

                    detachedCriteria);  

 

            // log.debug("list:" + list);  

            if (list.size() == 0) {  

                log.error("not found!");  

                throw new ObjectNotFoundException(this.objectClass, key);  

            } else if (list.size() > 1) {  

                // throw new NotUniqueKeyException();  

                // return null;  

                throw new RuntimeException("RuntimeException:NotUniqueKey");  

            } else {  

                return list.get(0);  

            }  

        } catch (RuntimeException e) {  

            log.error("readByUniqueKey failed", e);  

            throw e;  

        }  

    }  

 

    public List<T> findAll() {  

        // log.debug("findAll");  

        try {  

            return this.getHibernateTemplate().loadAll(this.objectClass);  

        } catch (RuntimeException e) {  

            log.error("findAll failed", e);  

            throw e;  

        }  

    }  

 

    /** 

     *  

     */ 

    public List<T> findByExample(Map<String, Object> values) {  

        // log.debug("finding instance by example");  

        try {  

            // List results =  

            // this.getHibernateTemplate().findByExample(instance);  

            // TODO 3.2 不需要不必要的初始化  

            Class<T> c = null;  

            T object = null;  

            try {  

                object = c.newInstance();  

            } catch (InstantiationException e) {  

                // TODO Auto-generated catch block  

                e.printStackTrace();  

            } catch (IllegalAccessException e) {  

                // TODO Auto-generated catch block  

                e.printStackTrace();  

            }  

            for (String key : values.keySet()) {  

                MyBeanUtils.setValue(object, key, values.get(key));  

            }  

            // List<T> results = getSession().createCriteria(  

            // this.objectClass.getName()).add(Example.create(instance))  

            // .list();  

            List<T> results = getSession().createCriteria(  

                    this.objectClass.getName()).add(Example.create(object))  

                    .list();  

            // log.debug("find by example successful, result size: "  

            // + results.size());  

            return results;  

        } catch (RuntimeException re) {  

            log.error("find by example failed", re);  

            throw re;  

        }  

    }  

 

    /** 

     * 根据查询条件查询的方法 

     */ 

    public List<T> findByCriteria(DetachedCriteria criteria) {  

        try {  

            List<T> results = getHibernateTemplate().findByCriteria(criteria);  

            // log.debug(results);  

            return results;  

        } catch (RuntimeException re) {  

            log.error("find by Criteria failed", re);  

            throw re;  

        }  

    }  

 

    /** 

     * 支持分页的查询,测试中 

     */ 

 

    // public List<T> findByCriteria(final DetachedCriteria detachedCriteria,  

    // final int pageSize, final int startIndex) {  

    // try {  

    // List<T> results = getHibernateTemplate().findByCriteria(  

    // detachedCriteria, pageSize, startIndex);  

    // return results;  

    // } catch (RuntimeException re) {  

    // log.error("find by Criteria failed", re);  

    // throw re;  

    // }  

    // }  

    // public List<T> findByCriteria(DetachedCriteria criteria, int firstResult,  

    // int maxResults);  

    public List<T> findByCriteria(final DetachedCriteria criteria,  

            final int pageSize, final int startIndex) {  

        try {  

            List<T> results = getHibernateTemplate().findByCriteria(criteria,  

                    startIndex, pageSize);  

            // log.debug(results);  

            return results;  

        } catch (RuntimeException re) {  

            log.error("find by Criteria failed", re);  

            throw re;  

        }  

    }  

 

    @SuppressWarnings("unchecked")  

    public PageInfo<T> findPageByCriteria(  

            final DetachedCriteria detachedCriteria, final int pageSize,  

            final int startIndex) {  

 

        // int totalCount = getHibernateTemplate()  

        // .findByCriteria(detachedCriteria).size();  

        // List<T> list =  

        // getHibernateTemplate().findByCriteria(detachedCriteria,  

        // startIndex, pageSize);  

        // return new PageInfo<T>(list, totalCount, pageSize, startIndex);  

 

        return (PageInfo<T>) getHibernateTemplate().execute(  

                new HibernateCallback() {  

                    @SuppressWarnings("unchecked")  

                    public PageInfo<T> doInHibernate(Session session)  

                            throws HibernateException {  

                        Criteria criteria = detachedCriteria  

                                .getExecutableCriteria(session);  

 

                        if (startIndex >= 0) {  

                            criteria.setFirstResult(startIndex);  

                        }  

                        if (pageSize > 0) {  

                            criteria.setMaxResults(pageSize);  

                        }  

                        List<T> list = criteria.list();  

 

                        criteria.setFirstResult(0);  

                        criteria.setMaxResults(999);  

 

                        // criteria.setFirstResult(0).setMaxResults(maxResults);  

                        int totalCount = ((Integer) criteria.setProjection(  

                                Projections.rowCount()).uniqueResult())  

                                .intValue();  

                        // criteria.setProjection(null);  

                        // log.debug(totalCount);  

                        // log.debug(pageSize);  

                        // log.debug(startIndex);  

                        PageInfo<T> ps = new PageInfo<T>(list, totalCount,  

                                pageSize, startIndex);  

                        return ps;  

                    }  

                }, true);  

    }  

 

    public void create(T transientInstance) {  

        log.debug("create... transientInstance" + transientInstance);  

        try {  

            getHibernateTemplate().save(transientInstance);  

            // log.debug("create successful");  

        } catch (RuntimeException re) {  

            log.error("create failed", re);  

            throw re;  

        }  

    }  

 

    public void update(ID id, Map<String, Object> values)  

            throws ObjectNotFoundException {  

        // log.debug("update transientInstance");  

        try {  

            T cacheObject = this.findById(id);  

            for (String key : values.keySet()) {  

                MyBeanUtils.setValue(cacheObject, key, values.get(key));  

            }  

            // Map<String, Object> map = MyBeanUtils.getValues(object,  

            // MyBeanUtils   

            // .getPropertyNames(object));  

            // for (String key : map.keySet()) {  

            // Object value = map.get(key);  

            // log.debug("key:::::::::::::::" + key);  

            // log.debug("value:::::::::::::::" + value);  

            // if (null != value) {  

            // MyBeanUtils.setValue(cacheObject, key, value);  

            // }  

            // }  

            this.getHibernateTemplate().update(cacheObject);  

        } catch (RuntimeException re) {  

            log.error("update failed", re);  

            throw re;  

        }  

 

        // 错了!原先的代码错了,DAO层不应该有隐含逻辑:只更新非空属性。  

        // 应该只是update。至于原来的webwork框架会从页面上读取的VO,只有部分属性的问题:  

        // 可以先根据load对象,再在web层把非空属性写入。  

        // 最后传到dao一起update。  

 

        // 再者!原先的ID和ObjectNotFoundException也不需要了,因为在业务层要把vo的值复制过去,就要根据id  

        // load一次了。  

        // 如果这里在load一次,为的是抛出ObjectNotFoundException的话,就load了两次。  

        // 只有对象的id在,就传给hibernate去处理吧。  

 

        // 以上好像又全错了,“更新”的概念可以这样理解:  

        // 给定一个主键ID的对象,更新属性为传来vo的非空。  

        // 而不是直接传一个什么都写好了的PO  

 

        // 他妈的全都错了,最后改成用map类型的values来记录哪些要改的属性,甚至包括设置成null。  

        // 至于这些属性的生产,在web层做,交给webwork,不行!(想了一下,因为没有FormBean)  

 

        // log.debug("update transientInstance");  

        // try {  

        // getHibernateTemplate().save(object);  

        // log.debug("save successful");  

        // } catch (RuntimeException re) {  

        // log.error("save failed", re);  

        // throw re;  

        // }  

    }  

 

    public void delete(ID id) throws ObjectNotFoundException {  

        // log.debug("deleting instance");  

        try {  

            getHibernateTemplate().delete(this.findById(id));  

            // log.debug("delete successful");  

        } catch (RuntimeException re) {  

            log.error("delete failed", re);  

            throw re;  

        }  

    }  

}  

通用的DAO,运用泛型 方式一:构造方法中传入一个Class 1、通用的DAO的接口 package com.itheima.crm.dao; import java.io.Serializable; import java.util.List; import org.hibernate.criterion.DetachedCriteria; /** * 通用DAO的接口 * @author tycoon... 阅读详情

相关推荐

Java泛型DAO设计模式详解与实践

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

weixin_30598047的博客 1107

最基础的Dao层代码

Dao层的内容 public List queryMessageList(String command, String description){         List messageList = new ArrayList();         try{             Class.forName("com.mysql.jdbc.Driver");

zy1104560031的专栏 1118

Java泛型DAO设计模式详解

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

weixin_42593130的博客 1410

【mybatis基础】mybatis开发dao两种方法

mybatis是一个支持普通SQL查询,存储过程和高级映射的优秀的持久层的框架,是apache下的顶级项目。mybatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。mybatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO映射成数据库中的记录。 其中,开发dao有两种方法,一种原始的dao开发方法,程序员需要写dao接口和dao实现类。另一种

IT Girl 7519

最新Mamba环境配置教程:从CUDA到causal-conv1d的完整安装流程

本文提供最新Mamba环境配置教程,涵盖从CUDA到causal-conv1d的完整安装流程。针对深度学习领域的长序列处理需求,详细指导如何正确配置CUDA工具链、安装PyTorch及关键依赖causal-conv1d,解决常见报错问题,并验证mamba-ssm集成效果。

bush的博客 418

Blender学习笔记——制作向量场

#下载Blender - UE4 - FGA Vector Field Editor插件的压缩包,Github上的下载地址如下:https://github.com/isathar/Blender_UE4_VectorFieldEditor #下载并解压后将FGA VectorFields文件夹复制到C:\Program Files\Blender Foundation\Blender 2.83\2.83\scripts\addons目录下,此步骤可根据blender安装的位置自行调整,只要放入addon

wychao2020的博客 1725

泛型 DAO 的基础CRUD

对于大多数开发人员,为系统中的每个 DAO 编写几乎相同的代码到目前为止已经成为一种习惯。虽然所有人都将这种重复标识为 “代码味道”,但我们大多数都已经学会忍受它。其实有解决方案。可以使用许多 ORM 工具来避免代码重复。例如,使用 Hibernate,您可以简单地为所有的持久域对象直接使用会话操作。这种方法的缺点是损失了类型安全。 为什么您要为数据访问代码提供类型安全接口?我会争辩说,当它

Kei's Blog 1919

苹果开发者账号( Apple Developer)登录出现:你的 Apple ID 暂时不符合使用此应用程序的条件(您的apple账户不符合资格)

Apple开发对于新手来说确实可能会遇到各种问题,在遇到 Apple Developer 账号登录问题时,除了检查账号的安全性设置和协议确认外,还需要考虑账号的具体配置问题,比如主邮箱的设置。

Winter_Sun灬的博客 4144

spring中service中findAll无法取到值的问题

[b]IcreaderService.java[/b] [code="java"] package gate.service; import gate.SessionFactory.HibernateSessionFactory; import gate.dao.AdminDAO; import gate.dao.IcreaderDAO; import gate.model.Icr...

mywayscut的专栏 746

【网络】PFC背景和原理 、文档(DCB=PFC + ETS,DCBX=DCB扩展)

目录 零、背景 一、PFC 1.概述 2.报文格式 3.工作机制 二、ETS 产生原因 基本原理 优先级组的调度 优先级的调度 三、DCBX 产生原因 基本原理 DCBX TLV介绍 五、PFC 拥塞研究(文档收集) 六、DC-QCN算法 (网络工程师必会) 7.1 α更新 7.2 降速 7.3 提速 8.总结 ...

小鱼菜鸟的博客 2167

LabVIEW新手必看:5分钟搞定S7-1200 OPC通信(附完整配置截图)

本文详细介绍了LabVIEW与西门子S7-1200 PLC通过OPC通信实现工业监控系统的完整配置流程。从环境准备、PLC数据块配置到OPC Server高级设置,逐步指导新手快速建立稳定通信链路,并分享工业级应用的优化技巧和异常处理方案,帮助用户提升自动化系统集成效率。

rl6adventurer的博客 641

泛型dao的设计

  最近一直在设计自己的blog系统,但是觉得我以前对dao层设计的理解始终不太好,于是在群里问了很多高手,在网上找了很多例子看,呵呵!下面这边是我在网上收到的一个关于泛型dao的设计我觉得写很详细,转载至这里,和大家共享下,呵呵!转载至:http://www.po-soft.com/blog/yongtree/1.html泛型是JDK1.5的一个新的特性,使用泛型机制编写的程序代码要比那

2870

相控阵雷达仿真入门:TWS与TAS模式实战解析(附代码示例)

本文深入解析相控阵雷达仿真中的TWS(边搜索边跟踪)与TAS(搜索加跟踪)模式,提供实战代码示例和优化策略。通过简化模型设计和对象化建模,帮助开发者快速构建高效仿真系统,适用于军事推演和装备评估。文章涵盖核心逻辑、数据结构设计及性能优化技巧,提升仿真效率与准确性。

weixin_30687051的博客 455

使用泛型写DAO

        在分层设计的时候,一般都不会省略掉DAO这层。泛型在JAVA1.5开始出现,它会使DAO的实现变得更简更美。       比如有实体对象教师(Teacher)与学生(Student),我们可以抽象出教师与学生的共性,他们都有编号、姓名、性别,就可以写个Person基类。public class Person ...{    private Long id;    pri

剑心博客 1559

YOLO11改进 | 注意力机制 | 添加SimAM注意力机制【全网独家+附完整代码】

yolo11,yolo11改进,yolo11创新,yolo11添加注意力机制

kay_545 1236

BAT007:批量为当前目录下的文件夹添加前缀或后缀

摘要:编写批处理程序,实现批量为当前目录下的文件夹添加前缀或后缀。

qq_31762031的博客 4054

Java + MyBatis + 泛型 DAO

1、创建表user_info实体类2、创建表user_login_log实体类3、创建表user_receive_address实体类4、创建通用DAO接口IBaseMapper5、创建表user_info的DAO接口6、创建表user_login_log的DAO接口7、创建表user_receive_address的DAO接口8、创建表user_info的接口实现Mapper文件9、创建表user_login_log的接口实现Mapper文件。

red_redemption的博客 1123

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

JPA的泛型DAO设计及使用

使用如Hibernate或者JPA作为持久化的解决方案时,设计一个泛型的DAO抽象父类可以方便各个实体的通用CRUD操作。由于此时大部分实体DAO的CRUD操作基本一样,采用泛型设计解决这个问题,带来了简洁代码的好处。 问题的关键在于我们需要在代码中获取抽象DAO父类(BaseEntityDAOImpl<T>)中的泛型信息。 由于Java的泛型是基于泛型擦除实现的,因...

banglaiqi4707的博客 821

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

jre9下载 jdk9

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

浅谈Java——泛型DAO

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

mosterRan的博客 455

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

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

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

weixin_42186015的博客 403

JAVA泛型(DAO)

[置顶] JAVA中泛型的一个实例(DAO)package com.fx.dao; import java.io.Serializable; import java.util.List; import org.hibernate.HibernateException; import org.hibernate.Query; import org.hibernate.

zw520的专栏 2302

Hibernate泛型DAO设计

泛型是JDK1.5的一个新的特性,使用泛型机制编写的程序代码要比那些杂乱的使用Object变量,然后再进行强制类型转换的代码具有更好的安全性和可读性。如果你的系统运行在JDK1.5以上的版本上,建议多使用泛型来代替无休止的对象转换。          在软件设计中我们开始对

969

Hibernate泛型DAO

以下的文章转载自http://kevintse.javaeye.com/blog/151090原文地址:http://www.hibernate.org/328.html 这是一个来自CaveatEmptor实例应用,在JDK5.0下实现的DAO模式. 这个模式在Java Persistence With Hibernate里面也有讲到. 另外有两个链接,可能会对你有用,

javakevin的专栏 1203

关于细粒度泛型DAO封装的一些思考

关于细粒度泛型DAO封装的一些思考  此文首发于老紫竹的Java世纪网,原文地址:http://www.java2000.net/p17630 还是把自己花了时间写的文章复制一份到自己的博客保存,以下为原文内容: 1、泛型查询动作接口(非完整版本,如分页功能都未加入)package com.china.codingmouse.cmsdk4j.dao.generics

CodingMouse的专栏 1678

Java泛型Dao学习笔记

Java泛型Dao学习笔记

木子木泗的博客 948

详细介绍 Hibernate 泛型 DAO 及其使用方法

  编写Spring+Hibernate框架下的应用,总是离不了编写一个通用的泛型GenericHibernateDao。查阅了网上不少的GenericHibernateDao实现,归纳整理为如下实现,供后续编码参考。 首先定义接口泛型DAO接口 GenericDaopackage com.th.huz;import java.io.Serializable;import ja

阿铮的箩筐 3万+
上一篇: 关于 DAO 接口设计的思考
下一篇: DWR之HelloWorld
janejava
博客等级 码龄19年 0粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值