学习MyBatis必知必会~ OGNL 表达式和EL 表达式

Posted 一乐乐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习MyBatis必知必会~ OGNL 表达式和EL 表达式相关的知识,希望对你有一定的参考价值。


一、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注入安全问题,比较不安全。

以上是关于学习MyBatis必知必会~ OGNL 表达式和EL 表达式的主要内容,如果未能解决你的问题,请参考以下文章

学习MyBatis必知必会~注解开发动态SQL

学习MyBatis必知必会~准备工作:了解框架三层架构ORM思想

《MySQL必知必会学习笔记》:正则表达式

《正则表达式必知必会》读书笔记

mysql必知必会学习笔记

python表达式操作符学习python必知必会