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

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;
	}

	@Override
	public 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()静态方法->1
new User根据ognl上下文中的值->id->2000|name->HIG
构建一个List->[a, b, c],取出index为1的元素->b
构建一个Map->{a=A, b=B, c=B},取出key b对应的valu->B
size()+1->4
length.(#this+1).(#this+10).(#root.length)->3
投影:获取collection中元素对象的id属性值,并形成一个list,list元素为id值->[1000]
选择:获取collection中元素对象的id属性值==1000,并形成一个list,list元素为User->[id->1000|name->EFG]


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值