利用spring AOP和Annotation来简化DAO实现(一)

2014-11-24 11:07:20 · 作者: · 浏览: 3
通常在 数据库DAO层的查询中,我们会定义一个DAO接口,而在实现中我们只是拼接查询参数并且指定一个ibatis的sqlmap中的sqlid进行查询,
Dao的实现很类似,而且非常简单,其实可以简化这种的实现,不需要这些实现代码,下面我们通过annotation机制来简化这块的实现。
比如
[java]
public class TestDaoImpl extends SqlMapClientDaoSupport implements TestDao {
@Override
public int updateBrandOfferStatusByBrandMemberId(Long brandMemberId, String operator, String status) {
Map map = new HashMap();
map.put("brandMemberId", brandMemberId);
map.put("operator", operator);
map.put("status", status);
return this.getSqlMapClientTemplate().update("BRANDOFFER.UPDATE-BRANDOFFER-BY-BRANDMEMBERID", map);
}
@Override
public List queryOfferIdsByBrandMemberId(Long brandMemberId, Integer start, Integer end) {
Map map = new HashMap();
map.put("brandMemberId", brandMemberId);
map.put("start", start);
map.put("end", end);
return this.getSqlMapClientTemplate().queryForList("BRANDOFFER.SELECT-OFFERIDLIST-BY-BRANDMEMBERID", map);
}
......
}
首先,我们使用建立一个spring的工程,依赖如下:
[java]
< xml version="1.0" encoding="UTF-8" >
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
4.0.0
mySpringWeb
springDemo
jar
1.0.0-SNAPSHOT
Started with Laurel
org.springframework
spring-context
3.2.0.RELEASE
springsource-repo
SpringSource Repository
http://repo.springsource.org/release
我们定义两个annotation
DAO是用来加在DAO接口的方法上的annotaion,可以通过name指定ibatis中的sql id,这个annotation可以添加type之类的参数,可以用来指定dao查询的类型,inserti,update,query,delete等类型。
[java]
package mySpringWeb;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Target({ ElementType.METHOD, ElementType.TYPE})
public @interface Dao {
String name() default "[defaultMethod]";
}
DaoPara
package mySpringWeb;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.LOCAL_VARIABLE, ElementType.PARAMETER})
public @interface DaoParam {
String name() default "paramName";
}
然后定义一个DAO接口,里面有一个方法,
[java]
package mySpringWeb;
import java.util.List;
public interface MyDao {
@Dao(name="MyDaoAnnotataion")
public List query(@DaoParam(name="param1")String param1, @DaoParam(name="param2")int param2);
}
我们写一个空的DAO实现类,
[java]
package mySpringWeb;
import java.util.List;
public class MyDaoImpl implements MyDao{
@Override
public List query(@DaoParam(n