为什么会有动态sql的出现?
如果采用JDBC进行处理,需要根据条件是否取值进行SQL语句的拼接,一般情况下是使用StringBuilder类及其append方法实现,还是有些繁琐的。如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL语句的痛苦。例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。 MyBatis在简化操作方法提出了动态SQL功能,将使用Java代码拼接SQL语句,改变为在XML映射文件中截止标签拼接SQL语句。相比而言,大大减少了代码量,更灵活、高度可配置、利于后期维护 MyBatis中动态SQL是编写在mapper.xml中的,其语法和JSTL类似,但是却是基于强大的OGNL表达式实现的。
简单的创建一个pojo实例对象,通过实例的结构查询MySQL数据库中的数据。
public class People {
private int id; //id
private String name;//姓名
private String address;//家庭地址
}
1、if标签
通过if处理用户多变的查询条件,mapper映射文件通过if进行判断参数的属性是否为null。
<if>
标签的test属性值为OGNL(对象导航图语言)表达式,通过对象属性名可以快速获取到对象属性值。
<select id="selectIf" resultType="People">
select * from people where 1=1
<if test="name!=null">
and name=#{
name}
</if>
<if test="address!=null">
and address=#{
address}
</if>
</select>
注:
name!=null : OGNL 表达式,直接写属性名可以获取到属性值。不需要添加${}或#{}
name=#{name} 中name是SQL的列名。#{name}是MyBatis获取参数对象属性值的写法(之前学习的)。
where 1=1 中1=1是为了保证SQL语法的正确性。如果if成立没有1=1最后的SQL就是where and name=xxx 这种写法是不对的。