介绍
中文名:对象图导航语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。这样可以更好的取得数据。主要是#、%和$这三个符号的使用。
为什么要学
他与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";
守则:
- 能用 #{} 不用${} 性能原因 sql注入问题
- 表名作变量必须用${} 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<String,Object> 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动态语句使用方式 **
见://www.greatytc.com/p/834ed62e1ec9