1. 初步认识一蛤OGNL
OGNL,Object Graph Navigation Language,是一种强大的表达式语言,网上搜索这个概念,多是和structs有关的。但是在mybatis中OGNL应用很广的。
2. 常用的标签
毕竟初学,简单地用了几次,根据自己实操和网上大佬介绍,大概以下几种标签比较常用:
- if
- where
- bind
- foreach
- choose
- when
- otherwise
- trim
通过这些标签都可以根据具体业务组合起来使用,但在本文中只作简单示例。
3. 应用案例
1. <where>、<if>的使用
本条语句的sql中,只要满足条件的sql都会拼接上去。
<!-- 使用where标签实现查询 -->
<select id="findStudentList1" resultType="Student"
parameterType="Student">
select * from student
<where>
<if test="id > 0">id=#{id}</if>
<if test="stu_name !=null and stu_name.length()>0">and stu_name=#{stu_name}</if>
<if test="age != null">and stu_age=#{age}</if>
</where>
</select>
2. <choose>、<when>、<otherwise>的使用
本条语句其实完全可以看成switch、case、default,按顺序执行下来,只要满足了一个条件,那么将sql拼接上去并直接跳出这条拼接语句,类似于break。
<!-- 用choose实现sql动态查询 -->
<select id="findStudentList2" resultType="Student" parameterType="Student" resultMap="age">
select * from student where
<choose>
<when test="id > 0">id=#{id}</when>
<when test="stu_name !=null and stu_name.length()>0">stu_name=#{stu_name}</when>
<when test="age > 0">stu_age=#{age}</when>
<otherwise></otherwise>
</choose>
</select>
3. <foreach>的使用
<foreach>多用于select xx from table where xxx in(---,---,---,),<foreach>的作用在于将传过来的值遍历到 in 的条件中。(下文中的<resultmap>可以忽略它,是我写的实体类和表字段不匹配的锅)
<!-- foreach实现in查询 -->
<select id="findStudentList3" parameterType="map" resultMap="age">
select * from student where id in
<foreach collection="stuList" index="ind" item="ite" open="(" separator="," close=")">
#{ite}
</foreach>
</select>
<resultMap id="age" type="Student">
<result column="stu_age" property="age" />
</resultMap>
值得注意的是这里有个坑,collection中能解析的只能是array(数组)或List,具体坑长什么样可以点击查看坑长啥样。
4. <trim>的使用
mybatis trim标签的使用 :
trim 属性:
prefix:前缀
suffix:后缀
prefixOverrides:忽略第一个指定分隔符
suffixOverrides:忽略最后一个分隔符
<!-- trim实现修改 -->
<update id="editStudent1" parameterType="Student">
update student
<trim prefix="set" suffixOverrides="," suffix="where id=#{id}">
<if test="stu_name !=null and stu_name.length()>0">stu_name=#{stu_name}</if>
<if test="age > 0">stu_age=#{age}</if>
</trim>
</update>
一条正常的update语句一般长这样:
update user set name = 'asd',age = 18,sex='man' where id = 1
而在mybatis的sql动态拼接的时候,只用先写update user
,后面的部分就需要拼接了;
- 首先前缀(prefix)为set先拼接上去,配置为
prefix="set"
;
这里有一点要知道,如果拼接的字段为第一条,那么前面不加and;如果拼接的字段为末条,那么最后不加“,”号,在set条件中不存在and,所以这个可以暂且不考虑,那么只用考虑“,”号。
-
所以其次就是拼接哪些字段需要修改,要去掉最后一条的“,”号,所以要忽略最后一个分隔符(suffixOverrides),配置为
suffixOverrides=","
-
最后就是后缀(suffix)加上判断条件where,配置为
suffix="where id=#{id}"
。
5. <bind>的使用
<bind>的使用一般用于模糊查询,主要就是将%和值绑到一起,用一个参数来表示它们,具体使用如下:
<!-- 用bind实现模糊查询 -->
<select id="findStudentList4" parameterType="map" resultType="Student">
<bind name="stu_name" value="'%'+stu_name+'%'" />
select * from student where stu_name like #{stu_name}
</select>
总结一下:
OGNL的使用远不止这么简单,因为demo中没有什么业务,所以会给没接触真正项目的人一种简单的错觉。OGNL中的暗坑不少,一定要仔细,遇到坑也别消极,这才是一个码农的基本素质。
网友评论