我在练手项目中,编写了一个BaseDao(使用泛型)的基本实现类
如下代码:
public class BaseDaoImpl<T> implements IBaseDao<T> { private Class<T> entityClass; // 构造函数: 1. 获取当前运行类的参数化类型; 2. 获取参数化类型中实际类型的定义(class) public BaseDaoImpl() { entityClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; } public Session getSession() { return HibernateSessionFactory.getSession(); } public void closeSession(){ HibernateSessionFactory.closeSession(); } /* 省略本分代码 */ }
但是我在struts2的框架 UserAction里直接使用了如上基本实现类BaseDaoImpl<T>
//这就是出错的原因 private BaseDao<HouseUser> dao = new BaseDaoImpl<HouseUser>();
导致在jsp页面跳转到UserAction就会报 错
java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
----------------------------------------------------------------------------------
最后找到问题所在
原因是我运行时传参,在UserAction使用 BaseDao 的基本实现 BaseDaoImpl<T>时,才确定泛型类型
这样就会出错
因为 泛型类型 是要在编译时就确定的,如果运行时去设置泛型类型,编译器就会出现类型转换错误
----------------------------------------------------------------------------------
解决办法:
先 编写 接口继承 我的BaseDao,给他指明类型
public interface IUserDao extends BaseDaoImpl<User> {
/* 省略部分代码 */
public void add(User user, Integer groupid);
}
在 编写上面接口的实现类
public class UseDaoImpl extends BaseDaoImpl<User> implements IUserDao{
/*
这里去实现你的 UserDao
*/
}
----------------------------------------------
就是要在编译时就确定 BaseDaoImpl<User> 里是类型
java的泛型在编译的时候可以保证,但是运行的时候泛型是会被擦除的。
相关推荐
在给定的“hibernate basedao(泛型版本)”中,开发人员通过引入泛型进一步提高了代码的复用性和灵活性。泛型是Java SE 5.0引入的新特性,它允许在类、接口和方法中使用类型参数,从而实现更强大的类型检查和减少...
在Java中,我们可以使用泛型来让BaseDao更加通用。例如,我们可以声明一个泛型接口`BaseDao<T>`,其中T代表我们将要操作的实体类型。这样,每个具体的DAO实现类(如`UserDao extends BaseDao<User>`)就可以操作特定...
在IT行业中,数据库操作是应用程序开发中的重要环节。"基于BaseDao的手动数据库操作"是一...在实际开发中,使用BaseDao可以大大提高开发效率,但同时也要注意避免过度抽象和通用性问题,确保代码的可维护性和可扩展性。
"SpringBoot_BaseDao.zip"这个压缩包文件显然与SpringBoot相关的数据库操作有关,特别是关于BaseDao的基础使用和实现。在Java开发中,Dao(Data Access Object)层是负责处理数据访问的,通常用于与数据库进行交互。...
泛型是Java 5引入的新特性,它允许在类、接口和方法中使用类型参数,从而提高了代码的类型安全性和可读性。在`BaseDao.java`中,可能会定义一个泛型基类,如: ```java public abstract class BaseDao<T> { public...
7. **泛型应用**:为了提高代码的可复用性和类型安全性,`BaseDAO`往往采用泛型设计。通过指定具体的实体类型,`BaseDAO<T>`可以为任何类型的实体提供数据访问服务。 8. **缓存支持**:Hibernate支持一级缓存...
1. **泛型**: BaseDAO通常会使用泛型来定义与特定实体类的关联,这样在具体使用时可以避免类型转换的麻烦。 2. **基本操作**: 包含CRUD(Create, Read, Update, Delete)等基本数据库操作,如insert、update、...
本压缩包提供的"baseDAO"文件,包含了一个详细注释的BaseDAO实现,旨在提供一种易于理解和使用的Hibernate基础操作模板。 1. **Hibernate框架简介** Hibernate是一个开源的对象关系映射(ORM)框架,它简化了Java...
# 电影后台管理系统 ...- [x] baseDao定义泛型抽象出基本dao操作 ## 导入项目 ### 导入SQL文件 进入到db文件夹,将ssh.sql文件导入到数据库中 ### 修改数据库密码 修改hibernate.cfg.xml文件 ```xml ...
在Android应用开发中,数据持久化是一个至关重要的环节,它涉及到如何将应用程序中的数据存储到本地,以便在后续使用时能够快速访问。ORMLite是一个轻量级的Java ORM(对象关系映射)库,它可以帮助开发者简化数据库...
"常用的BaseDAO及其实现" BaseDAO是Java中一种常用的数据访问对象(DAO),它提供了统一的数据访问接口,封装了数据访问的基本操作。BaseDAO通常是通过继承HibernateDaoSupport类实现的。 BaseDAO的主要功能包括:...
NC65通过BaseDAO操作数据库,包含接口类及接口实现类: /** * 获取baseDAO * @return */ public BaseDAO getBaseDAO() { if(baseDAO == null){ baseDAO = new BaseDAO(); } return baseDAO; } public ...
在使用MyBatis BaseDAO时,首先需要在项目中引入相关的依赖,通常是MyBatis的核心库以及BaseDAO的实现库。接下来,开发者需要定义自己的实体类,这些类对应数据库中的表结构。然后,创建Mapper接口,这个接口会继承...
例如,我们可以定义一个`BaseDAO<T>`,其中`T`是代表实体类的泛型参数,然后在具体使用时传入如`User.class`或`Product.class`。 反射则常用于动态获取类的信息,如类名、属性、方法等,以及在运行时调用这些方法。...
当应用程序需要与数据库交互时,不是每次都需要创建新的数据库连接,而是从连接池中获取已经存在的连接,使用完毕后再归还到池中,这样可以避免频繁创建和销毁连接带来的性能开销。常见的JDBC连接池工具有C3P0、DBCP...
这个是一个公共的basedao类。需要使用的话直接复制。内容看看就明白了
2. **事务管理**:Spring的声明式事务可以应用于BaseDao的方法,确保在出现异常时能正确回滚事务。 3. **模板方法**:在BaseDao中,可以定义模板方法,例如executeSql,子类在实现具体操作时调用这个模板方法,从而...
在IT行业中,SSH(Spring、Struts、Hibernate)是一个经典的Java Web开发框架组合,而BaseDao是常用于数据访问层的一个基类设计。本话题主要围绕如何利用SSH框架结合BaseDao实现分页功能来展开。 首先,让我们了解...
在描述的示例中,我们看到`BaseDao`是一个泛型抽象类,它有一个泛参数`M extends Serializable`。`OrganizationDao`和`UserDao`分别继承自`BaseDao`,并具体化了泛型类型,`OrganizationDao`中的`M`为`Organization`...
4. **提高可维护性**:当数据库操作方式发生变化时,只需修改BaseDao,不影响其他依赖它的DAO层代码。 **BaseDao的实现** 一个简单的BaseDao.java文件可能包含以下方法: 1. **插入(Insert)**:使用JDBC的...