myBatis动态sql中
1.基础OGNL表达式
使用规则:
- 运算符
+ - * / %
or and eq neq lt lte gt gte in not in
- 构造一个对象
new java.util.ArrayList()
- 对象的属性的访问:
对象名.属性名
- 成员方法的调用:
对象名.方法()
- 静态方法/变量 的调用:
@包名.类名@方法()
@包名.类名@变量
@java.lang.Math@PI
@java.util.UUID@randomUUID()
- 集合的伪属性
- Map, List & Set
size
: The size of the collectionisEmpty
: Evaluates totrue
if the collection is empty
- list、set
iterator
: Evalutes to anIterator
over theList
.
- Map
keys
: Evalutes to aSet
of all keys in theMap
values
: Evaluates to aCollection
of all values in theMap
- Iterator
next
: Evalutes to the next object from the IteratorhasNext
: Evaluates to true if there is a next object available from the Iterator
- Enumeration
next
: Evalutes to the next object from the EnumerationhasNext
: Evaluates to true if there is a next object available from the EnumerationnextElement
: Synonym for nexthasMoreElements
: Synonym for hasNext
- Map, List & Set
2.if标签
用于判断
if标签中test属性是必须的,作为判断条件,因为我设置的传递进来的参数是Map,所以在test条件时可以直接使用Key值传递
List<Employee> getByMap(Map<String,Object> map);
<select id="getByMap" resultType="employee">
select * from private.employee where 1=1
<if test="id!=null">
and id=#{id}
</if>
</select>
3. where标签
用于去除sql语句后面的不必要的and
上面if标签的查询限制条件是必须在前面加where 1=1
来保证当条件不传递时语句的完整性,而where标签可以解决这样的问题
<select id="getByMap" resultType="employee">
select * from private.employee
<where>
<if test="id!=null">
and id=#{id}
</if>
</where>
</select>
发送的sql语句对比:
3. set标签
用于去除sql语句后面不必要的,
针对修改时,当最后一项参数传递完,需要在最后加id=#{id}
来防止前面的逗号造成语句错误
<update id="getByMap" parameterType="employee">
update private.employee set
<if test="id!=null">
id=#{id},
</if>
<if test="name!=null">
name=#{name},
</if>
id=#{id}
where id=#{id}
</update>
修改为:
<update id="getByMap" parameterType="employee">
update private.employee set
<set>
<if test="id!=null">
id=#{id},
</if>
<if test="name!=null">
name=#{name},
</if>
</set>
where id=#{id}
</update>
但是当条件都不传递时,会造成语句错误,所以要防止错误,需要在前面加条件保持语句完整
<update id="getByMap" parameterType="employee">
update private.employee set
<set>
id=#{id},
<if test="id!=null">
id=#{id},
</if>
<if test="name!=null">
name=#{name},
</if>
</set>
where id=#{id}
</update>
4.trim标签
用于整合where和set标签,可以指定语句前面增加的内容
和去除语句最前面和最后的符号和字符
<select id="getByMap" resultType="employee">
select * from private.employee
<trim prefix="where" suffixOverrides="and | or">
<if test="id!=null">
id=#{id} or
</if>
<if test="name!=null">
name=#{name} and
</if>
</trim>
</select>
prefix 用于在语句前面增加字段,suffixOverrides用于删除语句后面的字段
5.choose标签
选择特定的条件
根据子标签when进行选择,当第一个条件成立时就直接返回第一个条件的值,否则往后进行判断
<select id="getByMap" resultType="employee">
select * from private.employee
<where>
<choose>
<when test="name !=null">
name like #{name}
</when>
<when test="id !=null">
id = #{id}
</when>
</choose>
</where>
</select>
6. foreach标签
用于遍历循环
<select id="getByList" resultType="employee">
select * from private.employee
<if test="list != null">
<foreach collection="list" item="i" open="where id in (" close=")" separator=",">
#{i}
</foreach>
</if>
</select>
传递的参数列表不能为空
- collection表示传递进来的参数类型,
- item表示定义的变量名,
- open表示已什么开始,
- close表示以什么结束,
- separator表示传递时各个item变量之间的分隔符
7. bind标签
用来将一个变量进行预处理,例如给一个字符前后拼接%
<bind name ="likeName" value = " '%' +name+'%' "></bind>
,后面就可以使用likeName变量进行语句查询
<select id="getByName" resultType="employee">
<bind name="likeName" value="'%'+name+'%'"></bind>
select * from private.employee
where name like #{likeName}
</select>
8.sql标签
用于公共信息的分离提取
<sql id="abc">
*
</sql>
<select id="getByList" resultType="employee">
select <include refid="abc"/> from private.employee
<foreach collection="list" item="i" open="where id in (" close=")" separator=",">
#{i}
</foreach>
</select>
将常用的信息提取到sql标签中,然后使用时用include标签引用