ibatis实战之使用内联参数--用#做占位符
----------
内联参数就是一种在已映射语句中添加查询条件的简单方式,你可以使用两个不同的方法来设置内联参数。
第一个方法是使用散列(#)符号。以下的例子就使用#符号传递进一个简单的内联参数,以通过accountId值来获取一个唯一的Account bean:
<select accountId, username, password, firstName, lastName, address1, address2, city, state, postalCode, country from Account where accountId = #value# </select>
上面这条已映射语句中的字符串#value#是一个占位符,用于告诉ibatis你将传递一个简单参数,ibatis在执行该已映射语句之前会使用此参数来设置SQL。该已映射语句可以用如下方式调用:
account = (Account)sqlMap.queryForObject("Account.getByIdValue",new Integer(1));
下面花一点时间来看一下ibatis框架是如何处理该语句的。首先,ibatis将查找名为Account.getByIdValue的已映射语句,并把#value#占位符变换为一个预备语句参数,见如下代码的最后一行:
select accountId,
username,
password,
firstName,
lastName,
address1,
address2,
city,
state,
postalCode,
country
from Account
where accountId = ?
然后,ibatis将这个参数的值设置为1,并执行该预备语句。最后,ibatis接收该结果行,把它映射到一个java对象,并返回这个对象。尽管看上去这可能像是很底层的信息,但理解此处究竟发生了什么是非常重要的。有关ibatis最觉见的问题之一就是:“如何在WHERE子句中使用LIKE?”通过上面这条语句,你就可以很容易地明白:为何输入的参数必须具有通配符,以及为何它们不能被轻易地插入到SQL语句中。对于这个难题,有3种可能的解决方案:
1.在所传入的参数中使用SQL通配符。
2.要搜索内容的文本必须是能够被参数化的SQL表达式的一部分。例如:'%'||#value#||'%'
3.改为使用替代语法(用$作占位符)