数据库
首页 > 数据库> > mybatis xml里的sql使用ognl表达式,调用类里方法的时候

mybatis xml里的sql使用ognl表达式,调用类里方法的时候

作者:互联网

从官网copy:  

OGNL调用方法的方式与 Java 的方式略有不同,因为 OGNL是被解释的并且必须在运行时选择正确的方法,除了提供的实际参数之外没有额外的类型信息。OGNL总是选择它可以找到的最具体的方法,其类型与提供的参数匹配;如果有两个或多个同样具体且与给定参数匹配的方法,则将任意选择其中一个。

特别是,空参数匹配所有非原始类型,因此最有可能导致调用意外的方法。

请注意,方法的参数由逗号分隔,因此除非将逗号括在括号中,否则不能使用逗号运算符.

 

调用类方法的时候,格式为:${@类的全路径@方法名(args)}

 

那如果是简单的方法,如,没有参数,和一两个参数就比较好解决。

那如果是集合或者数组呢?

我定义了一个这样的类的方法来处理:

public class Handle{

 public static String handle(String ... args){
   ...   
 }


}

我的xml原本是这么写的:

select 
*,${@com.zkj.utils.Handle@handle("1","2")} from t_user
      where username like '%${namePart}%'

但是这样不行,提示参数不匹配,需要将参数转为数组才行。

那这里就很奇怪了,如果我这样做,是可以的:

select *,${@com.zkj.utils.Handle@handle(@java.util.Arrays@asList("'1'","'2'"))} from t_user
      where username like '%${namePart}%'

就是说,如果改写handle里面的参数,将参数类型改为list,则可以成功执行。

但是,这里asList里面的参数,依然是T... args这样的类型的,都是这种格式,我定义的却不能成功。

 

由于项目里别的地方也用了这个方法,为了防止对其他人进行干扰,所以我又定义了一个split方法:

public static String[] split(String arg){
   return arg.split(",");  
}

那这样就可以这么用:

select *,${@com.zkj.utils.Handle@handle(@com.zkj.utils.Handle@split("'1','2'"))} from t_user
        where username like '%${namePart}%'

 

这样就可以解决这个问题了。

那有人问我,能不能直接定义数组,传过去呢?

我之前试了好多次,如:new String[]{"1","2"}, new java.lang.String[]{"1","2"},{"1","2"},["1","2"]

  所有的这些格式,都提示格式或者语法有误。

 

如果读者有更简单的方式,还请告诉我,谢谢

 

 

标签:xml,handle,String,参数,split,sql,ognl,Handle,方法
来源: https://www.cnblogs.com/zkj1204/p/16409051.html