jfinal的一个ConditionInterceptor拦截器,封装查询条件,拦截器中动态拼...

在用jfinal的时候,做查询的时候,开始用的是传统的方式来拼装sql,后面考虑了可以参考springside里的propertyfilter方式,就写了个简单的,非常简单,只是实现了单表的查询,这个思路,有感兴趣的朋友可以一起完善和修改。

在前台 

<input name="LIKE_S_title" type="text"  value="${LIKE_S_title!}"/>

表示查询 tilte like 'value',这个value就是文本框输入的值

然后在controller里

@Before(ConditionInterceptor.class)
public void index() {
String sql=getAttr("sql");
setAttr("blogPage", Blog.dao.paginate(getParaToInt(0, 1), 10, "select *", sql));
render("blog.html");
}

是有的地方都可以这样,下次查询条件变化只需要修改前台页面的部分,其他地方都不要修改。

下面是拦截器代码

public class ConditionInterceptor extends PrototypeInterceptor {


private Controller c;

@Override
public void doIntercept(ActionInvocation ai) {
c=ai.getController();
//方便在controller获得sql
c.setAttr("sql", buildSql(ai));
c.keepPara();
ai.invoke();
}

/**

* @param ai
* @return 返回整个的查询sql
*/
public String buildSql(ActionInvocation ai){
Controller c=ai.getController();
Enumeration<String> ss=c.getParaNames();
String modelName=ai.getControllerKey().substring(1);
StringBuilder sql=new StringBuilder();
sql.append("from ").append(modelName).append(" where 1=1 ");
while(ss.hasMoreElements()){
String key=ss.nextElement();
sql.append(generateProperty(key,c));
}
return sql.toString();
}

/**
* 分析EQ_S_title 字符串,现在只是完成了单表的字符串形式的基本拼装,对日期等需要完善
* @param key
* @param c
* @return 返回拼装的sql片段
*/
public String generateProperty(String key,Controller c){
StringBuilder sql=new StringBuilder();
String []  property=key.split("_");
//格式不符合要求
if(property.length!=3){
return "";
}
//Machtype 
MatchType matchType=MatchType.valueOf(property[0]);
//字符
FieldType fieldType=FieldType.valueOf(property[1]);
//字段
String fileName=property[2];
//值
String value=c.getPara(key);
if(""!=value){
sql.append(" and "+fileName); 
//等于
if (MatchType.EQ.equals(matchType)){
if(FieldType.S.equals(fieldType)){
sql.append("= '"+value+"'");
}
else{
sql.append("="+value);
}
          
       }
sql.append(" and "+fileName); 
//不等于
if (MatchType.NE.equals(matchType)){
if(FieldType.S.equals(fieldType)){
sql.append("<> '"+value+"'");
}
else{
sql.append("<>"+value);
}
          
       } 
//大于
else if (MatchType.GT.equals(matchType)){
if(FieldType.S.equals(fieldType)){
sql.append("> '"+value+"'");
}
else{
sql.append(">"+value);
}
          
       }
//大于等于
else if (MatchType.GE.equals(matchType)){
if(FieldType.S.equals(fieldType)){
sql.append(">= '"+value+"'");
}
else{
sql.append(">="+value);
}
          
       }
//小等于
else if (MatchType.LE.equals(matchType)){
if(FieldType.S.equals(fieldType)){
sql.append("<= '"+value+"'");
}
else{
sql.append("<="+value);
}   
       }
//小于
else if (MatchType.LT.equals(matchType)){
if(FieldType.S.equals(fieldType)){
sql.append("< '"+value+"'");
}
else{
sql.append("<"+value);
}   
       }
//like
else if(MatchType.LIKE.equals(matchType)){
sql.append(" like '"+value+"'");
}
else if(MatchType.LIKEANYWHERE.equals(matchType)){
sql.append(" like '%"+value+"%'");
       }
else if(MatchType.LIKEEND.equals(matchType)){
sql.append(" like '"+value+"%'");
}
else if(MatchType.LIKESTART.equals(matchType)){
sql.append(" like '%"+value+"'");
}
}
return sql.toString();

}



}


下面是filter的类

public class PropertyFilter {


/**
* 属性类型
*
*/
public enum FieldType {
/**
* 字符串 String
*/
S,
/**
* long
*/
L,
/**
* int
*/
I,
/**
* double
*/
D,
/**
* boolean
*/
B,
/**
* date
*/
DT
}


/** 属性比较类型. */
public enum MatchType {
/**
* 等于
* */
EQ,
/**
* like 'value'
* */
LIKE,
/**
* like '%value'
* */
LIKESTART,
/**
* like 'value%'
* */
LIKEEND,
/**
* like '%value%'
* */
LIKEANYWHERE,
/**
* 小于
* */
LT,
/**
* 大于
* */
GT,
/**
* 小于等于
* */
LE,
/**
* 大于等于
*/
GE,
/**

* 在两者之间

*/
BETWEEN,
/**

* 不等于

*/
NE
}


}



你可能感兴趣的:(jfinal的一个ConditionInterceptor拦截器,封装查询条件,拦截器中动态拼...)