点滴记载,点滴进步,愿自己更上一层楼。
mybatis的bind元素可以执行一个表达式,创建一个变量。
可以用于模糊查询。
可以给特定参数加些特殊的业务前缀等等。
其实就是执行传入对象中的某个方法,进行特殊的业务处理。当然get set方法也是方法。
<select id="selectUseIf" parameterType="com.soft.test.model.DynamicTestModel" resultMap="userMap"> <if test="username != null and username neq ''">
<bind name="pattern" value="'%' + _parameter.getUsername() + '%'" />
</if>
select * from t_user
<where>
<if test="username != null and username neq ''">
username like #{pattern}
</if>
</where>
</select>
两个属性 name 创建的变量名称,
value 创建变量的值,包含可执行的表达式,执行一些特殊的操作。
其中的_parameter固定,代表的是传入对象,.getUsername() 传入对象中方法,
如果调用的是对象中的对象的某个方法,_parameter.getDynamicTest1Model().getString()
getDynamicTest1Model 对象中的get方法 获取对象,getString()对象中的对象中的方法。
需要注意:确保被调用的属性已经实例化了,否则会空指针异常。
加一层if判断最适合。
测试方法
private DynamicSqlDao dynamicSqlDao;测试结果:
@Test
public void dynamic() throws Exception {
dynamicSqlDao = new DynamicSqlDaoImpl();
DynamicTestModel user = new DynamicTestModel();
user.setUsername("xiao");
List<User> userList = dynamicSqlDao.dynamic(user);
System.out.println(userList);
}
DEBUG [main] - ==> Preparing: select * from t_user WHERE username like ?
DEBUG [main] - ==> Parameters: %xiao%(String)
上面说过bind里面的vlaue属性,可以执行的是一个对象的方法,对象必须实例化。下面演示一个自己的随便写的方法,通过bind调用
在model里面定义下面的方法,并在xml的bind里面使用。
public String handleUsername(){
String username = this.username;
return "%" + username + "%";
}
<select id="selectUseIf" parameterType="com.soft.test.model.DynamicTestModel" resultMap="userMap"> <if test="username != null and username neq ''"> <bind name="pattern" value=" _parameter.handleUsername() " /> </if> select * from t_user <where> <if test="username != null and username neq ''"> username like #{pattern} </if> </where> </select>测试结果:
DEBUG [main] - ==> Preparing: select * from t_user WHERE username like ?
DEBUG [main] - ==> Parameters: %xiaohon%(String)
也是可以执行的。
注意点就是可执行的方法的对象必须实例化,否则空指针。