核心代码:(编写在父类中)
public class BaseDaoImpl<T> implements BaseDao<T> {
private Class<T> beanClass;
@SuppressWarnings("unchecked")
public BaseDaoImpl() {
ParameterizedType parameterizedType=(ParameterizedType)this.getClass().getGenericSuperclass();
beanClass=(Class<T>) parameterizedType.getActualTypeArguments()[0];
}
// 省略具体的操作....
}
应用场景:
目标:为了实现代码的重用性,编写了父类接口BaseDao和父类方法BaseDaoImpl,想用BaseDaoImpl类实现操作数据库共有的增删改查。
问题:因此父类方法必须用到泛型,以保证所有数据库不同的表都能够被操作。所以子类在编写sql语句的时候(继承父类方法,只需要提供表名即可),为了简单,我们希望拿到泛型的名称。
比如说:UserDaoImpl为了获取数据库中所有的User,为了重用,父类方法应该考虑到子类使用方便,因此编写以上代码,父类需要拿到T泛型的类名。比如以下代码是编写在BaseDaoImpl中的:
public List<T> getAll(String param) {
String sql="delete from "+beanClass.getSimpleName()+" "+param;
System.out.println(sql);
// 添加执行此sql语句的代码,并且作为返回值
return null;
}
也就是说这个时候,子类(比如说UserImpl类)继承BaseDaoImpl的时候注意填写泛型为对应的表名User就好了(当然其他表也一样)
public class UserDaoImpl extends BaseDaoImpl<User> implements UserDao {
}