mardi 4 janvier 2011

Spring Dao avec Annotations

l'objectif et d'avoir des requêtes sql sous forme d'annotations.

l'annotation qui représente la requête

package com.springdao.stereotype;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
public @interface Query {
    String name();
    String query();
}

l'annotation qui représente la liste des d'annotations Query

package com.springdao.stereotype;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented

public @interface Queries {
    Query[] value();
}

la classe dao.

package com.springdao.dao.impl;



@Queries({
    @Query(name="SELECT_USER_FROM_ID",query="Select * From User Where userId = ?"),
    @Query(name="DELETE_USER",query="DELETE User Where docId = ? and userId = ?"),
    @Query(name="SELECT_All_USER",query="Select * From User"),
})   
public class UserDaoJdbcImpl implements IUserDaoJdbc {

    @Autowired @Qualifier("genericDao")
    private IGenericDao<User> dao;
    @Autowired @Qualifier ("sqlParser")
    private SqlParser sqlParser; 

    public List<User> getRedacteurs(int docId) {
        String sql = sqlParser.getSQL("user","SELECT_USER_FROM_ID");
        return new ArrayList<User>(dao.findAll(sql,
                    new UserMapper(), new Object[]{docId}));
    }
   public int removeRedacteur(String userId, int docId) {
        Object[] fields = {
            docId,
            userId
        };
       String sql = sqlParser.getSQL("user", "DELETE_USER");
        return dao.saveOrUpdate(sql,fields );
    }
   public List<User> getAllUsers() {
         String sql = sqlParser.getSQL("user", "SELECT_All_USER");
         return new ArrayList<User>( dao.findAll(sql, new UserMapper()) );
    }
    ....
}

remarquez ici que sqlParser, récupère le contenu des annotations.

Pour récupérer le contenu des annotation on peut utilisé  post-processeur de Bean qui est appelé pendant le processus de création de tout Bean. L’interface BeanPostProcessor contient deux méthodes, appelées respectivement avant et après les méthodes d’initialisation des Beans. Les méthodes d’initialisation correspondent à des méthodes paramétrées par l’utilisateur et appelées après l’injection des propriétés des Beans.

@Component("sqlParser")
public class SqlAnnotationImpl implements BeanPostProcessor, SqlParser {

    private Map<String, Map<String, String>> sqlAnnotation = new HashMap<String, Map<String, String>>();
   
   
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName)
            throws BeansException {
       
        Class<?> clazz  = bean.getClass();
        if(clazz.isAnnotationPresent(Queries.class)){
            Queries queries = clazz.getAnnotation(Queries.class);
            Query[] ListQuery    = queries.value();
            for(int i = 0 ; i < ListQuery.length ; i++ ){
                Query query = ListQuery[i];
                Map<String, String> sqlData = new HashMap<String, String>();
                sqlData.put( query.name(), query.query());
                sqlAnnotation.put(beanName, sqlData);
            }
        }
        return bean;
    }

    @Override
    public Object postProcessBeforeInitialization(Object bean, String arg1)
            throws BeansException {
        return bean;
    }

    @Override
    public String getSQL(String name, String sqlKey) {
        String sql = "";
         if(sqlAnnotation.containsKey(name)){     
            Map<String, String> sqlData = sqlAnnotation.get(name);
            if(sqlData.containsKey(sqlKey)){
                sql = sqlData.get(sqlKey);
            }
        }
        return sql;
    }

}


- fichier  de contexte spring : application-context-dao.xml

<beans ...>
   <!--    
    <context:annotation-config />
    <context:component-scan  base-package="com.springdao.dao" />
   -->   
    <!-- ou  -->
    <bean id="sqlParser" class="com.springdao.dao.sqlparser.impl.SqlAnnotationImpl" />
    <bean id="userDao" class="com.springdao.dao.impl.UserDaoJdbcImpl " />

    ....
</beans>

Aucun commentaire:

Enregistrer un commentaire