关于泛型的使用,最近才开始的,因为公司以前的产品都要求兼容1.4,所以没有办法用这些“新”功能,这里之所以打上引号,是因为现在已经算是旧的成熟的功能了。
刚开始使用的时候,感觉类型安全,同时可以减少不必要的类型强制转换,还可以很方便的使用for/in的语法, 带来很多方便,但是使用多了,觉得满眼都是尖括号(<>)又感觉有点不太爽,代码看得乱乱的,觉得付出代码“乱”的代价,得到效益好像不太大。
但是后来通过不断重构DAO代码,发现巨大的好处了。觉得DAO的代码不用以前那样写很多重复代码了,可以把大部分代码都转移到BasDAO这个基类里。而DAO实现类里基本没有什么代码的,有的就直接继承BasDAO就可以了。DAO的接口还是要保留原来的样子,就是对外该提供什么接口还提供什么接口,这有利于扩展,如果只是一个DAO接口需要的功能,可以直接在接口里加一个声明,然后在实现类里加一个实现,通过在这里都是加一些逻辑处理,而且可以直接使用BaseDAO的方法进行持久化。而且BaseDAO里的通常需要得到T.class, 可以参考:
http://grandboy.iteye.com/admin/blogs/434062
下面给一个演示例子:
public abstract class AbstractBasDao <T> {
static Logger logger = Logger.getLogger(AbstractBasDao.class);
private Class<T> entityClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
public void deleteByIdList(List<String> idList) {
//实现略
}
public void deleteAll() {
//实现略
}
public void deleteById(String id) {
//实现略
}
public Object insert(T entity) {
//实现略
}
public T selectById(String id) {
//实现略
}
public List<T> selectByPage(PageBean page) {
//实现略
}
public List<T> selectByIdList(List<String> idList) {
//实现略
}
public void updateById(T entity) {
//实现略
}
}
BaseDAO接口:
public interface BaseDao<T> {
@Transactional
public Object insert(T o);
@Transactional
public void deleteById(String id);
@Transactional
public void deleteByIdList(List<String> idList);
@Transactional
public void deleteAll(); // Just for unit testing
@Transactional
public void updateById(T o);
@Transactional("readonly")
public T selectById(String id);
@Transactional("readonly")
public List<T> selectByIdList(List<String> idList);
}
直接对上一层提供服务的DAO接口如下
public interface AccountDao extends BaseDao<Account>{
//如果需要提供新功能就在这里加方法声明
}
接口实现如下:
public final class AccountDaoImpl extends AbstractBasDao<Account> implements AccountDao {
public void deleteById(String id) {
//这个方法加要加一些逻辑
//然后再调用基类的方法去持久化对象
super.deleteById(id);
}
}
是不是发现Dao没有以前那么多重复代码了? 这可是巨大好处。以后写DAO的代码少了,自然维护的代码量也就少了。可以把更多的精力放在业务逻辑上。
分享到:
相关推荐
Struts2、Hibernate、Spring整合的泛型DAO (本人评价: 代码开发效率提高30% 代码出错率减少70%) 对于大多数开发人员,系统中的每个 DAO 编写几乎相同的代码到目前为止已经成为一种习惯。虽然所有人都将这种重复...
自己写的泛型通用DAO,可以很简化DAO层的代码,但是目前只能支持单表的增,删,查,改。可以充分的理解jdk5.0的泛型和反射机制。希望大家指正不足之处!
使用了泛型的dao,在ssh里的应用,非常的简便好用
而泛型DAO是一个类型安全的,代码精简的设计模式(相对于传统DAO),尤其在DAO组件数量庞大的时候,代码量的减少更加明显。 泛型DAO的核心是定义一个GenericDao接口,声明基本的CRUD操作: 用hibernate作为持久化...
一个通用的基于泛型的dao层,可以减少程序的工作量,方法齐全
基于hibernate5 泛型Dao实例,下载后改一下数据库 配置直接可以用
S2SH整合例子 注解配置 JSON 泛型Dao
ssh通用泛型DAO 共包含3个类:BaseHibernateDAO,Page,QueryParameter
NULL 博文链接:https://rooi.iteye.com/blog/1032620
泛型DAO 完善的dao代码及criteria查询底层代码
java的基于泛型+反射的通用DAO例子,原创,没事写着玩的,请多指教哈。。。
Struts2、Hibernate、Spring整合的泛型DAO (本人评价: 代码开发效率提高30% 代码出错率减少70%) 对于大多数开发人员,系统中的每个 DAO 编写几乎相同的代码到目前为止已经成为一种习惯。虽然所有人都将这种重复...
NULL 博文链接:https://287854442.iteye.com/blog/746718
泛型dao 即:不写重复的dao 。这个技术 能让 dao层 和 service层 不写一行代码。外国都用这个泛型DAO了 中国还是一个类一个dao的写,我生气就写了这个文章了。 在本文中,我将为您展示如何避免再三地重复 DAO 代码
再次打造SSH1整合下的通用泛型DAO+分页,基于HibernateTemplate,欢迎大家指正 - DAO - Java - JavaEye论坛_files
Hibernate泛型DAO及使用方法.
DAo.hibernate3不是泛型的通用DAo我在网上找了好多都是泛型的,需要继承才能用,本人比较懒,找了好久才找到了这么个,不需要继承可以直接用的hibernate dao
NULL 博文链接:https://zhaoshijie.iteye.com/blog/982232