OGNL 表达式

OGNL 表达式一 OGNL 表达式 Object Graph Navigation Language 对象 图形导航语言 1 语法 2 OGNL 表达式的作用 可以存取对象的属性和调用对象的方法 通过 OGNL 表达式可以迭代获取对象的结构图 3 是指上下文 环境 对象 4 OGNL

大家好,我是讯享网,很高兴认识大家。

一、OGNL 表达式

(Object-Graph Navigation Language 对象-图形导航语言)

1、语法:#{ }
2、OGNL 表达式的作用:可以存取对象的属性和调用对象的方法,通过OGNL 表达式可以迭代获取对象的结构图
3、#{ }: 是指上下文(环境)对象
4、 OGNL 表达式获取属性举例:

对象person:{ 
   id:10,age:18,name:小明}; 若上下文(环境)的对象是person,通过#{ 
    } 可以直接获取到对象的属性值 #{ 
   id} 相当于 perosn.getId() #{ 
   age} 相当于 person.getAge() #{ 
   name} 相当于 person.getName() 

讯享网
OGNL 在mybatis框架中的应用:
讯享网/* User 类*/ @Data public class User { 
    private Long id; private String name; private BigDecimal salary; } /* 测试类 */ User user = new User(); user.setId(2L); SqlSession session = factory.openSession(); //4、进行数据库操作(CRUD) User user = session.selectOne("com.shan.hello.UserMapper.get", user);//将user作为上下文对象(javaBean类型)传入 /* 映射文件 */ <select id="get" parameterType="java.lang.Long" resultType="com.shan.hello.User"> select * from t_user where id = #{ 
   id} //上下文是javaBean类型,OGNL 表达式格式必须为 #{属性名}  </select> 
✿ 关于OGNL 的上下文对象类型【获取属性值】:

(1)javaBean对象,例如上面的User,则 OGNL 表达式格式必须为 #{属性名}

(2)map 对象,OGNL 表达式格式为 #{key}

(3)简单类型对象(基本类型、String类型),OGNL 表达式格式为 #{随便写,不过一般写得见名知意,增加代码的阅读性}

简单类型举例子:


讯享网

/* 测试类 */ SqlSession session = factory.openSession(); //4、进行数据库操作(CRUD) User user = session.selectOne("com.shan.hello.UserMapper.get", 2L);//将2L作为上下文对象(简单类型)传入 /* 映射文件 */ <select id="get" parameterType="java.lang.Long" resultType="com.shan.hello.User"> select * from t_user where id = #{ 
   id} //上下文是javaBean类型,OGNL 表达式格式可以写成#{aa},不过增强代码阅读性也会写成#{id} </select> 

二、EL 表达式 ${ }

1、语法:${属性名}

2、OGNL 表达式的作用:通过 ${属性名} 直接获取属性值,属性的内容。

三、在MyBatis中,OGNL 表达式 #{} 和 EL 表达式 ${} 的异同

1、sql语句分别使用#{} 和 ${}的实际情况:

(1)使用 #{}:
讯享网<!-- 映射文件 ---> <select id="login" resultType="Client"> select id, username, password from client where username = #{ 
   username} and password = #{ 
   password} ; </select> <!-- #{ 
   } 的实际作用:现在转成?的占位符,然后再把值设置进去【假设外界传入的值username="小明",password="1"--> select id, username, password from client where username = ? and password = ?; PreparedStatement.setString(1, "小明"); PreparedStatement.setString(2,"1"); 
(2)使用 ${}:
<!-- 映射文件 ---> <select id="login" resultType="Client"> select id, username, password from client where username = ${ 
   username} and password = ${ 
   password} ; </select> <!-- ${ 
   } 的实际作用:直接把值设置进去【假设外界传入的值username="小明",password="1"--> select id, username, password from client where username = "小明" and password = "1"; 

★ 2、# 和 $ 的异同:

相同:都可以获取对象的信息。

不同:

  • 使用# 传递的参数,会先转成占位符?,再通过设置占位符参数的方式设置值【会给值用单引号引起来】,不会导致sql注入问题,比较安全。
  • 使用$ 传递的参数,直接把解析出来的数据作为sql语句的一部分。可能会出现sql注入安全问题,比较不安全。
小讯
上一篇 2025-03-05 07:04
下一篇 2025-01-17 15:16

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/13503.html