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