OGNL 表达式

一.  OGNL表达式

  • OGNL:(Object-Graph Navigation Language 对象-图形导航语言)
  • OGNL 表达式的作用:可以存取对象的属性和调用对象的方法,通过OGNL 表达式可以迭代获取对象的结构图
  • 语法:#{ }
  • #{ }: 是指上下文(环境)对象
  • OGNL 表达式获取属性举例:
对象user:{id:10,name:小王,age:18};   
若上下文(环境)的对象是user,通过#{ }可以直接获取到对象的属性值  
#{id}   ==>  user.getId()
#{name} ==>  user.getName()
#{age}  ==>  user.getAge()

OGNL 在mybatis框架中的应用:

User实体类:

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class User {
    //用户Id
    private Integer id;
    //用户名
    private String username;
    //用户密码
    private String password;
    //姓名
    private String name;
    //年龄
    private Integer age;

}

UserMapper映射文件:

<select id="findCondition" parameterType="java.util.Map" resultType="cn.cjc.pojo.User">
        SELECT id,username,password,name,age FROM tb_user
        WHERE
        name LIKE CONCAT('%', #{name}, '%')
        AND age = #{age}
</select>

UserMapperTest测试类:

@SpringBootTest
public class UserMapperTest {

    @Autowired
    private UserMapper userMapper;

    /**
     * 条件查询
     * @throws Exception
     */
    @Test
    public void findConditionTest() throws Exception {
        List<User> users = userMapper.findCondition("张", 18);
        for (User user : users) {
            System.out.println(user);
        }
    }
}

 关于OGNL 的上下文对象类型【获取属性值】:

  1.  javaBean对象,例如上面的User,则 OGNL 表达式格式必须为 #{属性名}
  2. map 对象,OGNL 表达式格式为 #{key}
  3. 简单类型对象(基本类型、String类型),OGNL 表达式格式为 #{随便写,不过一般写得见名知意,增加代码的阅读性}

二. EL 表达式 ${ }

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

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

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

  • 使用 #{ }:
<!-- 映射文件 ---> 
<select id="findCondition" parameterType="java.util.Map" resultType="cn.cjc.pojo.User">
        SELECT id,username,password,name,age FROM tb_user
        WHERE
        name LIKE CONCAT('%', #{name}, '%')
        AND age = #{age}
</select>
 
 <!-- #{} 的实际作用:现在转成?的占位符,然后再把值设置进去【假设外界传入的值name="张",age=18】 -->
 SELECT id,username,password,name,age FROM tb_user WHERE name LIKE CONCAT('%', ?, '%') AND age = ? 
PreparedStatement.setString(1, "张");
PreparedStatement.setString(2,18);

  • 使用 ${ }:
<!-- 映射文件 --->
<select id="findCondition" parameterType="java.util.Map" resultType="cn.cjc.pojo.User">
        SELECT id,username,password,name,age FROM tb_user
        WHERE
        name LIKE CONCAT('%', #{name}, '%')
        AND age = #{age}
</select>
 
 <!-- ${} 的实际作用:直接把值设置进去【假设外界传入的值name="张",age=18】 -->
SELECT id,username,password,name,age FROM tb_user 
        WHERE name LIKE CONCAT('%', '张', '%')
        AND age = 18;

  2. #{ } 和 ${ } 的异同:

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

(2)#{ }

  • 执行SQL时,会将#{ }替换为?,生成预编译SQL,会自动设置参数值,防止SQL注入       
  • 使用时机:参数传递,都使用#{ }

(3)${ }

  • 拼接SQL。直接将参数拼接在SQL语句中,存在SQL注入问题
  • 使用时机:如果对表名、列表进行动态设置时使用

(4)#{ } 只能操作跟数据字表字段相关的列值,跟列值无关的只能用${ }

(5)#{ } 底层使用的是PreparedStatement,${ } 底层使用的是 Statement

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值