Mybatis <bind>标签用法

本文介绍了MyBatis框架中&lt;bind&gt;标签的使用方法,通过实例展示了如何利用&lt;bind&gt;标签在SQL语句中创建变量并绑定到上下文中,解决不同数据库环境下函数调用的兼容性问题。同时,文章还演示了如何通过&lt;bind&gt;标签调用静态方法和打印入参信息,实现特殊功能。

<bind>标签可以使用ONGL(Object-Graph Navigation Language, 对象图形化导航语言)表达式创建一个变量并将其绑定到上下文中。如以下代码:

<if test="userName != null and userName != ''">
	and user_name like concat('%', #{userName} ,'%') 
</if>

由于不同的数据库,concat函数的用法不一样,Mysql的有3个参数,而oracle的只有2个。这就造成了这条SQL在不同环境中运行可能会出错。为了避免这种错误,可以用<bind>标签,如下:

<if test="userName != null and userName != ''">
	<bind name="nameLike" value="'%' + userName + '%'"/>
	and user_name like #{nameLike} 
</if>

<bind>标签的两个属性都是必选的,name为绑定到上下文的变量名,value为OGNL表达式。创建了<bind>标签的变量后,就可以在下面直接使用了。如下例子,先写一个静态方法,然后在Mapper.xml中调用该方法设置默认值:

package ex.mybatis.rbac.mapper;
public class BindTest {
	public static String setName() {
		return "test";
	}
}

Mapper.xml

<!-- 动态根据输入的用户名和id查询用户信息<choose>标签用法 -->
<select id="selectByIdOrName" resultMap="BaseResultMap">
	<!-- 使用<bind>标签调用的方法拿出来的默认值 -->
  	<bind name="name" value="@ex.mybatis.rbac.mapper.BindTest@setName()"/>
  	
    select id, user_name, user_password, user_email, create_time, user_info, head_img
    from sys_user
    <!-- 加上1=1是为了防止2个查询条件都为空的时候,SQL不会报错。学了where标签后可以去掉 -->
    where 1=1 
    <choose>
    	<when test="id != null">
    		and id = #{id}
    	</when>
    	<when test="userName != null and userName != ''">
    		and user_name like concat('%', #{userName} ,'%') 
    	</when>
    	<otherwise>
    		<!-- 当所有条件都空时,使用<bind>标签调用的方法拿出来的默认值 -->
    		and user_name=#{name}
    	</otherwise>
    </choose>
</select>

使用<bind>标签打印入参信息,如下:

  • 先定义静态方法print
package ex.mybatis.rbac.mapper;
public class BindTest {
	public static void print(Object param) {
		System.out.println(param);
	}
}
  • 在Mapper.xml中使用<bind>标签,调用该方法
<!-- <foreach>标签实现更新,参数为map -->
<update id="updateByMap">
  	<bind name="print" value="@ex.mybatis.rbac.mapper.BindTest@print(_parameter)"/>
	update sys_user 
	set 
	<foreach collection="_parameter" item="val" index="key" separator=",">
		${key} = #{val}
	</foreach>
	where id = #{id}
</update>
  • updateByMap参数打印结果
{user_email=test2@mybatis.ex, user_password=1111333, id=1001}

通过这种方式就能实现一些特殊的功能,上面的例子只是为了启发大家,不要乱用。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值