=====基于Spring4和Hibernate4的通用泛型DAO实现===== \\ //通用DAO实现的目的\\ 是为了将纷繁重复的数据库操作统一放到一个公共类中统一处理,将精力从重复的劳动中抽离//((目前还处于逐步完善的阶段)) \\ ---- ====通用DAO接口设计==== * 只展示CRUD操作((在实体类的层次结构中本应该以BaseEntity为顶层实体抽象,基于项目中使用到的未基于BaseEntity的实现,已经将BaseEntity调整为Object)) public interface GenericDao { public PK save(T t); public void delete(T t); public void update(T t); public T findUnique(Class entityClass, PK paramSerializable); } ---- ====通用DAO实现==== public class GenericDaoImpl implements GenericDao { @Autowired private SessionFactory sessionFactory; private Session getCurrentSession() { return sessionFactory.getCurrentSession(); } @Override public PK save(T t) { return (PK) getCurrentSession().save(t); } @Override public void delete(T t) { getCurrentSession().delete(t); } @Override public void update(T t) { getCurrentSession().update(t); } @Override public T findUnique(Class entityClass, PK id) { return (T) getCurrentSession().get(entityClass, id); } } ---- ====具体使用配置==== 由于Java中的泛型信息只在编译器有效,在运行期被擦除,也就是说所有泛型参数类型信息在编译后都会被清除掉。所以直接在 Service中使用GenericDao类似的自动注入字段是会引发异常的。因此只有交给Spring容器去管理泛型信息, 我们知道Spring的依赖注入,IOC是在运行期实现的,单单添加自动注入的注解肯定是不行的。基于以上的原因,我们需要在使用 时,手动的配置泛型信息,让Spring容器解析出泛型信息,完成自动注入泛型DAO。 * 配置信息示例 @Configuration public class QrcodeDaoConfiguration { @Bean public GenericDao createQrcodeInfoDao() { return new GenericDaoImpl<>(); } @Bean public GenericDao createQrcodeTypeDao() { return new GenericDaoImpl<>(); } @Bean public GenericDao createMatchCodeDao() { return new GenericDaoImpl<>(); } } * 使用示例 @Autowired private GenericDao typeDao; 使用时申明需要自动注入的泛型DAO,Spring从配置信息中匹配符合的泛型Bean结果,实现自动装配。 ---- ====总结和思考==== 通过以上的配置,就能实现基本的通用泛型DAO结构,已经可以替代以前的DAO层结构。但是,Java中的泛型是没有办法从泛型中获取到 字节码信息的,所以在和Hibernate结合使用时,很多时候需要传入类型信息。这样的话,我们是否应该将以上的泛型DAO实现转换为一 个非泛型无配置文件的通用DAO结构设计更好呢。 ---- //Copyright (c) 2014 北京微朴信息技术有限责任公司//