一、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类型)传入
/* 映射文件 */
✿ 关于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作为上下文对象(简单类型)传入 /* 映射文件 */
二、EL 表达式 ${ }
1、语法:${属性名}
2、OGNL 表达式的作用:通过 ${属性名} 直接获取属性值,属性的内容。
三、在MyBatis中,OGNL 表达式 #{} 和 EL 表达式 ${} 的异同
1、sql语句分别使用#{} 和 ${}的实际情况:
(1)使用 #{}:
select id, username, password from client where username = ? and password = ?;
PreparedStatement.setString(1, "小明");
PreparedStatement.setString(2,"1");
(2)使用 ${}:
select id, username, password from client where username = "小明" and password = "1";
★ 2、# 和 $ 的异同:
-
相同:都可以获取对象的信息。
-
不同:
使用# 传递的参数,会先转成占位符?,再通过设置占位符参数的方式设置值【会给值用单引号引起来】,不会导致sql注入问题,比较安全。
使用$ 传递的参数,直接把解析出来的数据作为sql语句的一部分。可能会出现sql注入安全问题,比较不安全。