论坛首页 Java企业应用论坛

又一个DynamicDao

浏览 3949 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-05-14   最后修改:2009-01-20
DAO

模型如下:

@Entity
public class Topic {
	@Id
	@GeneratedValue
	private int id;
	private String title;
	private Date createdAt;
        .......
}

 

   用法如下:

public interface TopicDao {
	@Find
	Topic find(int id);

	@Find(load = true)
	Topic load(int id);

	@Save
	void save(Topic topic);

	@Delete
	void delete(Topic topic);

	@Query("from Topic where title like ?")
	List<Topic> findByTitle(String title);

	@Query("from Topic")
	List<Topic> findAll(@FirstResult int firstResult, @MaxResults	int maxResults);

	@Query("from Topic where id = ?")
	boolean isExist(int id);

	@Query(value = "delete from Topic where createdAt < ?", update = true)
	int deleteByCreatedAt(Date createdAt);

	@Query("select count(*) from Topic")
	long count();
}

 

然后在配置文件中增加如下代码:

<bean id="topicDao" class="com.dynamicDao.DynamicDaoFactoryBean"
		p:daoInterface="com.dynamicDao.dao.TopicDao">

 

   发表时间:2008-05-14  
没看出来dynamic在哪?就是自己实现了一套Criteria,而且GenericDao都继承Session了,等于把Session整个都暴露给调用dao的人了,那还要dao干虾米?直接访问session不就完了,不明白这个dynamic dao的设是什么目的。
0 请登录后投票
   发表时间:2008-05-14   最后修改:2009-02-09
Norther 写道
没看出来dynamic在哪?就是自己实现了一套Criteria,而且GenericDao都继承Session了,等于把Session整个都暴露给调用dao的人了,那还要dao干螃蟹?直接访问session不就完了,不明白这个dynamic dao的设是什么目的。


已更新!

0 请登录后投票
   发表时间:2008-05-14  

实现Query Annotation的主要代码如下:

public class AnnotationQueryInterceptor extends AbstractMethodInterceptor{

	public Object invoke(MethodInvocation mi) throws Throwable {
		Query query = mi.getMethod().getAnnotation(Query.class); 
		if(null != query){
			if(Collection.class.isAssignableFrom(mi.getMethod().getReturnType())){
				return super.genericDao.findByHsql(query.value(), mi.getArguments());
			}
			else{
				return super.genericDao.findFirstByHsql(query.value(), mi.getArguments());
			}
		}
		return mi.proceed();
	}
}
 
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Query {
	String value() default "";
}

 最后在GenericDaoFactoryBean的方法initInternalAdvices() 中加入addAdvice(new AnnotationQueryInterceptor())即可;

	void initInternalAdvices() {
		addAdvice(new SessionInterceptor());
		addAdvice(new SimpleCriteriaInterceptor());
		addAdvice(new TypedSessionInterceptor());
		addAdvice(new DynamicFinderInterceptor());
		addAdvice(new AnnotationQueryInterceptor());
	} 
 

要扩展其他接口,如ActiveRecord中的find_or_create_by等功能也比较简单。

 

0 请登录后投票
   发表时间:2008-05-14  
呵呵,老大你写的东东,不错。我学习了(刚刚一新手哈!)
不过,要是再写一点注释就更好了!仍有很多东东没懂。不过慢慢研究了!
不过呢,也谢谢了!
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics