OGNL表达式

介绍

中文名:对象图导航语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。这样可以更好的取得数据。主要是#、%和$这三个符号的使用。

为什么要学

他与mybatis有关,mybatis在如下两个地方应用到了 ognl表达式

动态SQL表达式中
${param}参数中

使用

动态传递参数
select * from user where name = #{name};
select * from user where name = ${name};

#和$的区别

#{ }:解析为一个 JDBC 预编译语句(prepared statement)的参数标记符。
会动态解析为占位符

select * from user where name = ?;

${ }: 仅仅为一个纯碎的 string 替换,在动态 SQL 解析阶段将会进行变量替换。
如 传递参数为“jack”

select * from user where name = "Jack";

守则:

  1. 能用 #{} 不用${} 性能原因 sql注入问题
  2. 表名作变量必须用${} sql占位符进行变量替换时会加上单引号 sql中表名不能有单引号

sql动态语句例子

mybatis注释方式中动态语句中update函数

public String update(TPersonInfo person){
        return new SQL(){
            {
                UPDATE("T_PERSON_INFO");
                if(person.getName() != null){
                    SET("name=#{name}");
                }
                if(person.getAge() != null){
                    SET("age=#{age}");
                }
                WHERE("id=#{id}");
            }
        }.toString();
    }

select函数

public String select(Map map){
        return new SQL(){
            {
                SELECT("*");
                FROM("T_PERSON_INFO");
                
                StringBuilder whereClause = new StringBuilder();
                if(map.get("name") != null){
                    whereClause.append(" and name like '%").append(map.get("name")).append("%' ");
                }
                if(map.get("age") != null){
                    whereClause.append(" and age = ").append(map.get("age"));
                }
                if(!"".equals(whereClause.toString())){
                    WHERE(whereClause.toString().replaceFirst("and", ""));
                }
            }
        }.toString();
    }

**项目总结-mapper动态语句使用方式 **
见:https://www.jianshu.com/p/834ed62e1ec9

你可能感兴趣的:(OGNL表达式)