在Mybatis的动态SQL和${}形式的参数中都用到了OGNL表达式。
<if test="userEmail != null or userEmail == '1'">
</if>
<if test="userEmail != null and userEmail != ''">
</if>
<if test="userEmail == null and userEmail == ''">
</if>
<if test="userEmail != null and userEmail != ''">
</if>
<if test="age lt 10">
</if>
<if test="list != null and list.size() > 0 ">
#{userEmail,jdbcType=VARCHAR},
</if>
<!-- 多接口参数的查询方法(@Param + javaBean方式) -->
<select id="selectByUserIdAndEnabledUseBean" resultMap="BaseResultMap">
select r.id, r.role_name, r.enabled, r.create_by, r.create_time,
u.user_name as "user.userName", u.user_email as "user.userEmail"
from sys_user u
inner join sys_user_role ur on u.id = ur.user_id
inner join sys_role r on ur.role_id = r.id
where u.id = #{user.id} and r.enabled = #{role.enabled}
</select>
<bind name="name" value="@ex.mybatis.rbac.mapper.UserMaperTest@setName()"/>
<bind name="name" value="@ex.mybatis.rbac.mapper.UserMaperTest@NAME"/>
下面这两处地方在MyBatis中处理的时候都是使用OGNL处理的。
<select id="xxx" ...>
select id,name,... from country
<where>
<if test="name != null and name != ''">
name like concat('%', #{name}, '%')
</if>
</where>
</select>
上面代码中test的值会使用OGNL计算结果。
<select id="xxx" ...>
select id,name,... from country
<bind name="nameLike" value="'%' + name + '%'"/>
<where>
<if test="name != null and name != ''">
name like '${nameLike}'
</if>
</where>
</select>
这里的value值会使用OGNL计算。
注:对 在通用Mapper中支持一种UUID的主键,在通用Mapper中的实现就是使用了标签,这个标签调用了一个静态方法,大概方法如下: 这种方式虽然能自动调用静态方法,但是没法回写对应的属性值,因此使用时需要注意。 上面like的例子中使用下面这种方式最简单 这里注意写的是${‘%’ + name + ‘%’},而不是%${name}%,这两种方式的结果一样,但是处理过程不一样。 在MyBatis中处理${}的时候,只是使用OGNL计算这个结果值,然后替换SQL中对应的${xxx},OGNL处理的只是${这里的表达式}。 这里表达式可以是OGNL支持的所有表达式,可以写的很复杂,可以调用静态方法返回值,也可以调用静态的属性值。 分表这个功能是通用Mapper中的新功能,允许在运行的时候指定一个表名,通过指定的表名对表进行操作。这个功能实现就是使用了OGNL。 首先并不是所有的表都需要该功能,因此定义了一个接口,当参数(接口方法只有实体类一个参数)对象继承该接口的时候,就允许使用动态表名。 然后在XML中写表名的时候使用: 由于我需要判断_parameter是否继承了IDynamicTableName接口,简单的写法已经无法实现,所以使用了静态方法,这两个方法如下: 根据 另外注意XML判断中有一个dynamicTableName,这个参数是根据getDynamicTableName方法得到的,MyBatis使用属性对应的getter方法来获取值,不是根据field来获取值。<bind name="username_bind" value='@java.util.UUID@randomUUID().toString().replace("-", "")' />
${param}参数中
<select id="xxx" ...>
select id,name,... from country
<where>
<if test="name != null and name != ''">
name like '${'%' + name + '%'}'
</if>
</where>
</select>
示例1:查询多个父级的所有的子级组织
<select id="selectAllSubDeptByDeptIds" resultType="long">
SELECT
d.id
FROM
dept d
INNER JOIN(
SELECT * FROM (
(SELECT @ids :=
<!--将集合deptList使用 逗号 拼接起来, 此处使用foreach会查不出结果, 即使是使用了replace去掉了空格的情况下-->
'${@org.springframework.util.StringUtils@collectionToCommaDelimitedString(deptIdList)}'
) a
, (SELECT @ids AS _ids ,
(SELECT @ids := GROUP_CONCAT(id) FROM dept WHERE FIND_IN_SET(parent_id, @ids)) AS cids
FROM
dept d
WHERE
@ids IS NOT NULL AND d.is_del = 0
) b
)
) T ON FIND_IN_SET(d.id, T.cids)
WHERE
d.is_del = 0
</select>
示例2:查询未被邀请的组织
<select id="selectNoInvitedDepts" resultType="com.anbao.train.data.dto.dept.DeptTreeDto">
SELECT
d.id,
d.name,
d.parent_id,
d.hospital_area_id
FROM
dept d
WHERE
d.hospital_area_id = #{hospitalAreaId}
AND d.merchant_code = #{merchantCode}
<if test="deptIds != null and deptIds.size() != 0">
AND NOT FIND_IN_SET(d.id,
(SELECT
group_concat( _ids )
FROM
(
( SELECT @ids :=
'${@org.springframework.util.StringUtils@collectionToCommaDelimitedString(deptIds)}'
) a,
(
SELECT
@ids AS _ids,
(
SELECT
@ids := GROUP_CONCAT( id )
FROM
dept
WHERE
FIND_IN_SET( parent_id, @ids )) AS cids
FROM
dept
WHERE
@ids IS NOT NULL
) b
)
)
)
</if>
</select>
示例3:删除多个父级所有的子级组织
<delete id="deleteCourseInvitationSubDepts">
DELETE
FROM
course_invitation ci
WHERE
ci.course_id = #{courseId}
AND FIND_IN_SET (ci.dept_id,
(
SELECT
group_concat( cids )
FROM (
( SELECT @ids :=
'${@org.springframework.util.StringUtils@collectionToCommaDelimitedString(deptIdList)}'
) a,
(SELECT
@ids AS _ids,
(SELECT
@ids := GROUP_CONCAT( id )
FROM
dept
WHERE
FIND_IN_SET( parent_id, @ids )
) AS cids
FROM
dept
WHERE
@ids IS NOT NULL
) b
)
)
)
</delete>
示例4:使用OGNL实现单表的分表功能
public interface IDynamicTableName {
/**
* 获取动态表名 - 只要有返回值,不是null和'',就会用返回值作为表名
*
* @return
*/
String getDynamicTableName();
}
<if test="@tk.mybatis.mapper.util.OGNL@isDynamicParameter(_parameter)
and dynamicTableName != null
and dynamicTableName != ''">
${dynamicTableName}
</if>
<if test="@tk.mybatis.mapper.util.OGNL@isNotDynamicParameter(_parameter)
or dynamicTableName == null
or dynamicTableName == ''">
defaultTableName
</if>
/**
* 判断参数是否支持动态表名
*
* @param parameter
* @return true支持,false不支持
*/
public static boolean isDynamicParameter(Object parameter) {
if (parameter != null && parameter instanceof IDynamicTableName) {
return true;
}
return false;
}
/**
* 判断参数是否b支持动态表名
*
* @param parameter
* @return true不支持,false支持
*/
public static boolean isNotDynamicParameter(Object parameter) {
return !isDynamicParameter(parameter);
}