在我们以前的开发中,我们在写Dao层的时候,我们都是先声明一个接口,然后写一个具体的实现类,在声明的这个接口中,通常就是我们定义的一些CRUD的一些操作,在写业务逻辑的时候,我们发现最后CRUD的操作基本会有冗余,于是,我们开发BaseDao接口和它的实现类BaseDaoImpl。
下面看我的BaseDao的接口代码
public interface BaseDao<T> { public void save(T t); public void update(T t); public void delete(T t); public void saveOrUpdate(T t); public T findById(java.io.Serializable id); public List<T> findAll(); }
下面是我的BaseDao的具体实现类
package com.itheima.crm.base.impl; import java.io.Serializable; import java.lang.reflect.ParameterizedType; import java.util.List; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import com.itheima.crm.base.BaseDao; public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T> { //T 编译时,注释变量。在运行时,才可以获得具体的类型 private Class<?> beanClass; public BaseDaoImpl() { //获得运行时的类型 , BaseDaoImpl<CrmStaff>被参数化的类型 ParameterizedType paramType = (ParameterizedType) this.getClass().getGenericSuperclass(); //获得实际参数的 ,获得所有。此时只有一个 beanClass = (Class<?>) paramType.getActualTypeArguments()[0]; } @Override public void save(T t) { this.getHibernateTemplate().save(t); } @Override public void update(T t) { this.getHibernateTemplate().update(t); } @Override public void delete(T t) { this.getHibernateTemplate().delete(t); } @Override public void saveOrUpdate(T t) { this.getHibernateTemplate().saveOrUpdate(t); } @Override public T findById(Serializable id) { return (T) this.getHibernateTemplate().get(beanClass, id); } @Override public List<T> findAll() { // getName() 获得类的全限定名称, com.itheima.crm.staff.domain.CrmStaff return this.getHibernateTemplate().find("from " + beanClass.getName()); // hql // session.createQuery("from CrmStaff"); //简写,存在自动导包 , <hibernate-mapping auto-import="true"> // session.createQuery("from com.itheima.crm.staff.domain.CrmStaff"); //完整写法 } }
我们在使用ssh进行整合开发的时候,我们使用Hibernate进行保存操作的时候,我们需要有具体的类.Class。所以,我在使用Hiberante进行整合开发的时候,我需要使用泛型获得具体的类的信息,也就是Class对象的一个具体的api,this.getClass().getGenericSuperclass();,这个方法可以获得父类的ParameterizedType类型,具体可以看这个博客 http://blog.csdn.net/tanksyg/article/details/49928115,我们通过这个paramType.getActualTypeArguments()[0] ,可以得到具体的类型,但是这个返回的是一个数组,原因BaseDaoImpl<T>,我可以写成BaseDaoImpl<T,K,G>,所以在得到具体的类的Type的时候,返回的是一个数组,但是通常我们在类定义泛型的时候,一般只定义一个,因为我们这个BaseDaoImpl也只定义了一个,所以我们直接取出第一个元素就可以。
开发完Basedao和BaseDaoImpl之后,我来说一下具体怎么使用。
通常,我们还是会定义一个接口,例如上面的StaffDao,这个接口我们定义一些特殊的抽象方法,然后我们这个StaffDao去继承BaseDao,然后在我也会创建一个具体的实现类,在这个实现类中,我要实现我的StaffDao也要去继承我的BaseDao,并且要注入泛型,这样我在开发的时候,基本的CRUD可以不再写,非常的方便,代码也不再冗余。
相关推荐
在IT行业中,数据库操作是应用程序开发中的重要环节。"基于BaseDao的手动数据库操作"是一...在实际开发中,使用BaseDao可以大大提高开发效率,但同时也要注意避免过度抽象和通用性问题,确保代码的可维护性和可扩展性。
**基于Hibernate的BaseDAO*...理解并掌握BaseDAO的原理和使用,能够有效提升Java项目的开发效率和质量。这个压缩包中的"baseDAO"文件,是学习和实践这一概念的良好资源,其详尽的注释将帮助你更好地理解和运用BaseDAO。
泛型的使用还有其他好处,比如类型擦除后生成的字节码能够进行高效的运行时操作。同时,由于类型信息在编译时就被检查,因此可以避免运行时的ClassCastException。 在实际开发中,BaseDao和BaseService的泛型设计有...
在企业级软件开发中,通用BaseDao方法集是提高代码复用性和开发效率的重要工具。BaseDao(Base Data Access Object)通常是一个基类,它包含了数据库操作的基本方法,供其他具体的DAO类继承使用。BaseDao的设计理念...
在Java开发中,Dao(Data Access Object)层是负责处理数据访问的,通常用于与数据库进行交互。 首先,我们要理解SpringBoot中的数据访问。SpringBoot集成了多种数据访问技术,如JDBC、MyBatis、Hibernate等,使得...
7. **泛型应用**:为了提高代码的可复用性和类型安全性,`BaseDAO`往往采用泛型设计。通过指定具体的实体类型,`BaseDAO<T>`可以为任何类型的实体提供数据访问服务。 8. **缓存支持**:Hibernate支持一级缓存...
"常用的BaseDAO及其实现" ...BaseDAO提供了统一的数据访问接口,封装了数据访问的基本操作,简化了数据访问的编程工作。BaseDAO的实现可以通过继承HibernateDaoSupport类实现,提供了灵活的数据访问方式。
在Java编程语言中,BaseDao(基础数据访问对象)是一个常见的设计模式,它为数据库操作提供了一种统一的接口。BaseDao通常包含了CRUD(创建、读取、更新、删除)的基本方法,使得开发者可以方便地对数据库进行操作,...
MyBatis BaseDAO 是一种基于 MyBatis 框架的工具类库,它旨在简化数据库操作,通过封装常见的CRUD(Create、Read、Update、Delete)方法,为开发者提供便利,减少重复代码,提高开发效率。在Java Web 开发中,...
总结,Spring的声明式事务管理简化了事务处理,使得开发者可以专注于业务逻辑,而BaseDao则是数据库访问层的良好实践,提供了一种抽象和复用的方式。结合Spring的事务管理和BaseDao设计,可以构建出高效、稳定的Java...
下面我们将详细讨论`BaseDao`的原理、实现方式以及它在实际开发中的应用。 首先,`BaseDao`通常是一个抽象类或者接口,它是所有特定DAO类的基础。它包含了通用的数据库操作方法,如添加、删除、修改和查询等。这些...
1. **BaseDao**:BaseDao是DAO层的基类,它的设计目的是为了代码复用和简化开发。在这个上下文中,BaseDao可能包含了如下的方法: - `queryByPage`: 这个方法是分页查询的核心,接受参数如当前页数、每页大小,返回...
在IT行业中,SSH(Spring、Struts、Hibernate)是一个经典的Java Web开发框架组合,而BaseDao是常用于数据访问层的一个基类设计。本话题主要围绕如何利用SSH框架结合BaseDao实现分页功能来展开。 首先,让我们了解...
在IT行业中,数据库操作是开发工作中的重要环节,而ORM(Object-Relational Mapping)技术则是连接业务逻辑和数据存储层的关键桥梁。...通过这种方式,你可以更好地理解和掌握数据库操作的技巧,提升自己的编程能力。
**正文** `jdbcBaseDao` 是一个基于Java的数据库访问层基础类,它封装了JDBC(Java Database Connectivity)的一些常见操作,如增、删、改...了解并熟练运用这个类,有助于提升开发效率,同时加深对数据库编程的理解。
NC65通过BaseDAO操作数据库,包含接口类及接口实现类: /** * 获取baseDAO * @return */ public BaseDAO getBaseDAO() { if(baseDAO == null){ baseDAO = new BaseDAO(); } return baseDAO; } public ...
这个是一个公共的basedao类。需要使用的话直接复制。内容看看就明白了
`BaseDao` 和 `DaoUtil` 的组合使用,使得开发者能够以更安全、高效的方式进行数据库操作,同时避免了直接与JDBC API打交道时的繁琐细节。这种设计模式在Java Web开发中非常常见,特别是在基于Spring框架的项目中,...
在Java编程中,JDBC(Java Database Connectivity)是Java语言与数据库交互的标准API,它使得开发者可以使用统一的方式来处理各种数据库。"基于JDBC封装的BaseDao实例"是一个常见的设计模式,用于简化数据库操作,...
这个模式的主要目标是提高代码的复用性和可维护性,通过抽象出基本的CRUD(创建、读取、更新、删除)操作,让具体的DAO类只需要继承或实现BaseDao,就可以快速地进行数据库交互。这里的"BaseDao"是用连接池实现的,...