一. 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 的上下文对象类型【获取属性值】:
- javaBean对象,例如上面的User,则 OGNL 表达式格式必须为 #{属性名}
- map 对象,OGNL 表达式格式为 #{key}
- 简单类型对象(基本类型、String类型),OGNL 表达式格式为 #{随便写,不过一般写得见名知意,增加代码的阅读性}
二. EL 表达式 ${ }
- 语法:${属性名}
- OGNL 表达式的作用:通过 ${属性名} 直接获取属性值,属性的内容。
三. 在MyBatis中,OGNL 表达式 #{ } 和 EL 表达式 ${ } 的异同
-
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