MyBatis学习笔记(二):OGNL表达式

来源:互联网 发布:上海知而行 编辑:程序博客网 时间:2024/06/03 16:34

OGNL表达式

OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法。Struts2中使用OGNL表达式作为POJO到视图数据显示的绑定(后台返回User对象,在界面可使用${user.name}取出名称),MyBatis使用OGNL表达式作为在mapper文件中参数的映射(select元素parameterType=“User”,使用#{user.name}可设置参数)。所以我们了解一下OGNL表达式是很有必要的。OGNL表达式上手特别简单,OGNL表达式jar包可以去网上下载,下边事例是用了MyBatis中自带的OGNL表达式API。

http://www.codeweblog.com/%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%BC%95%E6%93%8Eognl/

这么文章介绍了具体如何使用OGNL表达式。

有些时候说再多不如看代码理解的快

package com.zhangxy.myBatis.ognl;import java.io.Serializable;public class User implements Serializable {public static final long serialVersionUID = 1L;public User() {}public User(long id, String name) {this.id = id;this.name = name;}private long id;private String name;public long getId() {return id;}public void setId(long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public static Long getUID() {return serialVersionUID;}@Overridepublic String toString() {return "id->"+id+"|name->"+name;}}

下面是我使用OGNL表达式的代码事例。

package com.zhangxy.myBatis.ognl;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import org.apache.ibatis.ognl.Ognl;import org.apache.ibatis.ognl.OgnlException;public class TestOgnl1 {public static void main(String[] args) throws OgnlException {t2();}public static void t2() throws OgnlException {User user = new User();user.setId(1000);user.setName("zhangxy");Map<String, String> ognlContext = new HashMap<String, String>();ognlContext.put("id", "2000");ognlContext.put("name", "HIG");Object value = null;String expression = "";// expression = "name!=null && name!=''";expression = "name!=null and name!=''";value = Ognl.getValue(Ognl.parseExpression(expression), user);System.out.println("逻辑判断" + expression + ",值->" + value);expression = "name";value = "ABC";Ognl.setValue(Ognl.parseExpression(expression), user, value);System.out.println("设置对象属性" + expression + ",值<-" + value);expression = "name";value = Ognl.getValue(Ognl.parseExpression(expression), user);System.out.println("读取对象属性" + expression + "->" + value);expression = "setName('EFG')";value = "EFG";Ognl.getValue(Ognl.parseExpression(expression), user);System.out.println("调用" + expression + "方法,传递name参数<-" + value);expression = "getName()";value = Ognl.getValue(Ognl.parseExpression(expression), user);System.out.println("调用" + expression + "方法->" + value);expression = "@com.zhangxy.myBatis.ognl.User@serialVersionUID";value = Ognl.getValue(Ognl.parseExpression(expression), null);System.out.println("调用" + expression + "静态变量->" + value);expression = "@com.zhangxy.myBatis.ognl.User@getUID()";value = Ognl.getValue(Ognl.parseExpression(expression), null);System.out.println("调用" + expression + "静态方法->" + value);expression = "@com.zhangxy.myBatis.ognl.User@getUID()";value = Ognl.getValue(Ognl.parseExpression(expression), null);System.out.println("调用" + expression + "静态方法->" + value);value = Ognl.getValue("new com.zhangxy.myBatis.ognl.User(#id,#name)", ognlContext, new Object());System.out.println("new User根据ognl上下文中的值->" + value);value = Ognl.getValue("{'a','b','c'}", null);System.out.println("构建一个List->" + value + ",取出index为1的元素->" + Ognl.getValue("[1]", value));expression = "#{'a':'A','b':'B','c':'B'}";value = Ognl.getValue(expression, null);System.out.println("构建一个Map->" + value + ",取出key b对应的valu->" + Ognl.getValue("['b']", value));expression = "size()+1";value = Ognl.getValue(expression, value);System.out.println(expression + "->" + value);// #this表示对当前对象的引用,谁调用()内的表达式#this就是谁,这里是数组length属性的值// expression="length.(#this+1).(#this+10)";// #root表示根对象,这里是数组expression = "length.(#this+1).(#this+10).(#root.length)";value = Ognl.getValue(expression, new String[] { "a", "b", "b" });System.out.println(expression + "->" + value);// 投影与选择List<User> userList = new ArrayList<User>();userList.add(user);expression = "#root.{id}";value = Ognl.getValue(expression, userList);System.out.println("投影:获取collection中元素对象的id属性值,并形成一个list,list元素为id值->" + value);// ?选择满足条件的所有元素// ^ 选择满足条件的第一个元素// $ 选择满足条件的最后一个元素expression = "#root.{? #this.id==1000}";value = Ognl.getValue(expression, userList);System.out.println("选择:获取collection中元素对象的id属性值==1000,并形成一个list,list元素为User->" + value);}}

测试结果:

逻辑判断name!=null and name!='',值->true设置对象属性name,值<-ABC读取对象属性name->ABC调用setName('EFG')方法,传递name参数<-EFG调用getName()方法->EFG调用@com.zhangxy.myBatis.ognl.User@serialVersionUID静态变量->1调用@com.zhangxy.myBatis.ognl.User@getUID()静态方法->1调用@com.zhangxy.myBatis.ognl.User@getUID()静态方法->1new User根据ognl上下文中的值->id->2000|name->HIG构建一个List->[a, b, c],取出index为1的元素->b构建一个Map->{a=A, b=B, c=B},取出key b对应的valu->Bsize()+1->4length.(#this+1).(#this+10).(#root.length)->3投影:获取collection中元素对象的id属性值,并形成一个list,list元素为id值->[1000]选择:获取collection中元素对象的id属性值==1000,并形成一个list,list元素为User->[id->1000|name->EFG]


原创粉丝点击