模仿Warp Dynamic Finder的Hibernate Dynamic Dao

[复制链接]
查看11 | 回复1 | 2007-10-20 08:38:44 | 显示全部楼层 |阅读模式
看了Robbin前两天发的那帖,Warp framework - 一个相当有前途的Java轻量级Web开发框架(http://www.javaeye.com/topic/168780),让人眼前一亮,特别是基于annotation的warp-dynamic-finder部分给人印象非常深刻,利用它,80%情况下Dao的实现不用去写了,只要定义个interface,加几个annotation轻松搞定,自己就着手实现了一个,基于spring的HibernateDaoSupport,其用法也很简单,如下:
Java代码
public interface StudentDao {
@Save
Long save(Student student);
@Delete
void delete(Student student);
@Get
Student get(Long id);
@Query("from Student as s where s.name = ? and s.age = ?")
Student getByNameAndAge(String name, Integer age);//根据参数出现的次序绑定
@Query("from Student as s where s.age > :age")
List getStudentsAgeMoreThan(

@Parameter(name = "age") Integer age);//name绑定
@Query("from Student as s where s.name like ?")
Student getStudentNameLike(

@Like(matchMode = MatchMode.START) String name);//支持like
@Query(value = "delete Student where name = ?", executeUpdate = true)
int deleteStudentByName(String name);//批量更新
@Query("from Student as s order by s.id desc")
@Conditions({
@Condition("s.name = ?"), //动态条件添加,如果第一个参数不为null,该条件会被插入query string
@Condition("s.age = ?")
})
Student query(String name, Integer age);
}
public interface StudentDao {

@Save

Long save(Student student);

@Delete

void delete(Student student);

@Get

Student get(Long id);

@Query("from Student as s where s.name = ? and s.age = ?")

Student getByNameAndAge(String name, Integer age);//根据参数出现的次序绑定

@Query("from Student as s where s.age > :age")

List getStudentsAgeMoreThan(

@Parameter(name = "age") Integer age);//name绑定

@Query("from Student as s where s.name like ?")

Student getStudentNameLike(

@Like(matchMode = MatchMode.START) String name);//支持like

@Query(value = "delete Student where name = ?", executeUpdate = true)

int deleteStudentByName(String name);//批量更新

@Query("from Student as s order by s.id desc")

@Conditions({

@Condition("s.name = ?"), //动态条件添加,如果第一个参数不为null,该条件会被插入query string

@Condition("s.age = ?")

})

Student query(String name, Integer age);
}

这样一个Dao就定义OK了,非常容易,有两种使用方式,一种是利用AutoInjectDynamicDaoBeanPostProcessor,在spring中的bean初始化好之后,找到有InjectDao标注的方法就,利用动态代理生成StudentDao的代理实现并注入:
Xml代码










Java代码
public class StudentService {
private StudentDao studentDao;
@InjectDao//会被注入StudentDao动态代理实现
public void setStudentDao(StudentDao studentDao) {
this.studentDao = studentDao;
}
public class StudentService {

private StudentDao studentDao;

@InjectDao//会被注入StudentDao动态代理实现

public void setStudentDao(StudentDao studentDao) {

this.studentDao = studentDao;

}

还有另一种方式是基于FactoryBean的DynamicDaoProxy,并自己指定要实现的Dao接口,如下:
Xml代码






回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
count(case when aaa='555' then aaa end) from .....
这样的什么方法处理
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行