概念
OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。这样可以更好的取得数据。
用法
Ognl表达式的用法与EL表达式的用法类似,作者这里就以它们作为对比进行简述:
EL表达式:
- 是JSP中所使用的表达式;写法:${属性名};
- 对变量的处理,采用的是字符串拼接的方式;
- 如:
select * from author where id=${value}
- 读取基本数据类型的值时,{}中只能写 value,不能填写其他值;
Ognl表达式:
-
是一种功能功能强大的表达式,可以存取对象的任意属性;写法:#{属性名};
-
对变量的处理,采用的是预编译的方式;
-
如:select * from author where id=#{id}
-
读取基本数据类型的值时,{}中可以使任意变量名;
-
作者这里将它们的区别简要做了一张表格,如下:
. | EL表达式 | Ognl表达式 |
---|---|---|
变量的处理 | 字符串拼接 | 预编译 |
基本数据类型 | ${value} | #{任意变量名} |
对象类型(pojo类型) | ${属性名} | #{属性名} |
. | ${对象属性.属性} | #{对象属性.属性} |
这里再通过一个案例来看看他们的区别:
需要注意的是:
- EL表达式:字符串拼接,接收到的内容不加任何修饰直接拼接在SQL中,可能引起SQL注入;
- Ognl表达式:预编译,读取表达式的值,通过preparedStatement的方式进行SQL语句的执行
实际应用中需要注意
- 通过对象的取值方法来获取数据,在写法上把get给省略了。
比如:我们获取用户的名称
类中的写法:user.gerUsername();
OGNL表达式写法:user.username
mybaits中为什么能直接写username,#{username},
因为在parameterType中已经提供了属性所属的类。