<select id="getOrder" parameterClass="java.util.Map" resultMap="orderMap">
<![CDATA[
select id,order_number,customer_id from t_order
]]>
<dynamic prepend="where">
<isNotEmpty prepend="and" property="p1">
(id = #p1#)
</isNotEmpty>
<!--
<isNotEqual prepend="and" property="p1" compareProperty="p1" compareValue="0">
(id = #p1#)
</isNotEqual>
-->
<isNotEmpty prepend="and" property="p2">
(order_number like #p2#)
</isNotEmpty>
</dynamic>
注意:这里是通过动态的方法加载查询条件,我这里验证了,动态加载支持map基本类型,如上面设置一个map,然后可以在动态配置文件中,得到map中各个键值所对应的值。
当然也可以用类类型,如parameterClass=“bean.order”等也是可以的。 </select>
测试例子:
package servlet;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Reader;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import bean.Order;
import bean.User;
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.engine.builder.xml.XmlSqlMapClientBuilder;
public class OperateIBatis extends HttpServlet {
private Logger logger = Logger.getLogger(OperateOrder.class);
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setCharacterEncoding("UTF-8");
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
XmlSqlMapClientBuilder xsmcb = new XmlSqlMapClientBuilder();
try {
Reader reader = Resources.getResourceAsReader("sql-map-config.xml");
SqlMapClient smc = xsmcb.buildSqlMap(reader);
smc.startTransaction();
Map<String,Object> map = new HashMap<String,Object>();
map.put("p2", "Insert123455789");
Order to = new Order();
to.setId(0);
to.setOrderNumber("%Insert123455789%");
Iterator<Order> i = (Iterator<Order>) smc.queryForList("bean.getOrder", map).iterator();
while(i.hasNext()){
out.println("<br>===========================================<br>");
Order o = i.next();
out.println(o.getOrderNumber() + ">>" + o.getCustomer().getName() + ">>" + o.getCustomer().getSex() + ">>" + o.getCustomer().getHomeAddress().getName());
}
smc.commitTransaction();
} catch (Exception e) {
logger.debug("读取IBatis配置文件失败",e);
}
}
}
运行结果:
2010-06-22 10:00:37,437 [http-8080-1] DEBUG [com.ibatis.common.jdbc.SimpleDataSource] - Created connection 6209433.
2010-06-22 10:00:37,437 [http-8080-1] DEBUG [java.sql.Connection] - {conn-100009} Connection
2010-06-22 10:00:37,437 [http-8080-1] DEBUG [java.sql.PreparedStatement] - {pstm-100010} PreparedStatement: select id,order_number,customer_id from t_order where (order_number like ?) 注意这一句。
2010-06-22 10:00:37,453 [http-8080-1] DEBUG [java.sql.PreparedStatement] - {pstm-100010} Parameters: [Insert123455789]
2010-06-22 10:00:37,453 [http-8080-1] DEBUG [java.sql.PreparedStatement] - {pstm-100010} Types: [java.lang.String]
2010-06-22 10:00:37,453 [http-8080-1] DEBUG [java.sql.ResultSet] - {rset-100011} ResultSet
动态加载的属性,可以查找dtd文档:
<!ELEMENT dynamic (#PCDATA | iterate | isParameterPresent | isNotParameterPresent | isEmpty | isNotEmpty | isNotNull | isNull | isNotEqual | isEqual | isGreaterThan | isGreaterEqual | isLessThan | isLessEqual | isPropertyAvailable | isNotPropertyAvailable)*>
<!ATTLIST dynamic
prepend CDATA #IMPLIED
>
<!ELEMENT isNotNull (#PCDATA | iterate | isParameterPresent | isNotParameterPresent | isEmpty | isNotEmpty | isNotNull | isNull | isNotEqual | isEqual | isGreaterThan | isGreaterEqual | isLessThan | isLessEqual | isPropertyAvailable | isNotPropertyAvailable)*>
<!ATTLIST isNotNull
prepend CDATA #IMPLIED
property CDATA #IMPLIED
>
<!ELEMENT isNull (#PCDATA | iterate | isParameterPresent | isNotParameterPresent | isEmpty | isNotEmpty | isNotNull | isNull | isNotEqual | isEqual | isGreaterThan | isGreaterEqual | isLessThan | isLessEqual | isPropertyAvailable | isNotPropertyAvailable)*>
<!ATTLIST isNull
prepend CDATA #IMPLIED
property CDATA #IMPLIED
>
<!ELEMENT isNotPropertyAvailable (#PCDATA | iterate | isParameterPresent | isNotParameterPresent | isEmpty | isNotEmpty | isNotNull | isNull | isNotEqual | isEqual | isGreaterThan | isGreaterEqual | isLessThan | isLessEqual | isPropertyAvailable | isNotPropertyAvailable)*>
<!ATTLIST isNotPropertyAvailable
prepend CDATA #IMPLIED
property CDATA #REQUIRED
>
<!ELEMENT isPropertyAvailable (#PCDATA | iterate | isParameterPresent | isNotParameterPresent | isEmpty | isNotEmpty | isNotNull | isNull | isNotEqual | isEqual | isGreaterThan | isGreaterEqual | isLessThan | isLessEqual | isPropertyAvailable | isNotPropertyAvailable)*>
<!ATTLIST isPropertyAvailable
prepend CDATA #IMPLIED
property CDATA #REQUIRED
>
<!ELEMENT isEqual (#PCDATA | iterate | isParameterPresent | isNotParameterPresent | isEmpty | isNotEmpty | isNotNull | isNull | isNotEqual | isEqual | isGreaterThan | isGreaterEqual | isLessThan | isLessEqual | isPropertyAvailable | isNotPropertyAvailable)*>
<!ATTLIST isEqual
prepend CDATA #IMPLIED
property CDATA #IMPLIED
compareProperty CDATA #IMPLIED
compareValue CDATA #IMPLIED
>
<!ELEMENT isNotEqual (#PCDATA | iterate | isParameterPresent | isNotParameterPresent | isEmpty | isNotEmpty | isNotNull | isNull | isNotEqual | isEqual | isGreaterThan | isGreaterEqual | isLessThan | isLessEqual | isPropertyAvailable | isNotPropertyAvailable)*>
<!ATTLIST isNotEqual
prepend CDATA #IMPLIED
property CDATA #IMPLIED
compareProperty CDATA #IMPLIED
compareValue CDATA #IMPLIED
>
<!ELEMENT isGreaterThan (#PCDATA | iterate | isParameterPresent | isNotParameterPresent | isEmpty | isNotEmpty | isNotNull | isNull | isNotEqual | isEqual | isGreaterThan | isGreaterEqual | isLessThan | isLessEqual | isPropertyAvailable | isNotPropertyAvailable)*>
<!ATTLIST isGreaterThan
prepend CDATA #IMPLIED
property CDATA #IMPLIED
compareProperty CDATA #IMPLIED
compareValue CDATA #IMPLIED
>
<!ELEMENT isGreaterEqual (#PCDATA | iterate | isParameterPresent | isNotParameterPresent | isEmpty | isNotEmpty | isNotNull | isNull | isNotEqual | isEqual | isGreaterThan | isGreaterEqual | isLessThan | isLessEqual | isPropertyAvailable | isNotPropertyAvailable)*>
<!ATTLIST isGreaterEqual
prepend CDATA #IMPLIED
property CDATA #IMPLIED
compareProperty CDATA #IMPLIED
compareValue CDATA #IMPLIED
>
<!ELEMENT isLessThan (#PCDATA | iterate | isParameterPresent | isNotParameterPresent | isEmpty | isNotEmpty | isNotNull | isNull | isNotEqual | isEqual | isGreaterThan | isGreaterEqual | isLessThan | isLessEqual | isPropertyAvailable | isNotPropertyAvailable)*>
<!ATTLIST isLessThan
prepend CDATA #IMPLIED
property CDATA #IMPLIED
compareProperty CDATA #IMPLIED
compareValue CDATA #IMPLIED
>
<!ELEMENT isLessEqual (#PCDATA | iterate | isParameterPresent | isNotParameterPresent | isEmpty | isNotEmpty | isNotNull | isNull | isNotEqual | isEqual | isGreaterThan | isGreaterEqual | isLessThan | isLessEqual | isPropertyAvailable | isNotPropertyAvailable)*>
<!ATTLIST isLessEqual
prepend CDATA #IMPLIED
property CDATA #IMPLIED
compareProperty CDATA #IMPLIED
compareValue CDATA #IMPLIED
>
<!ELEMENT isEmpty (#PCDATA | iterate | isParameterPresent | isNotParameterPresent | isEmpty | isNotEmpty | isNotNull | isNull | isNotEqual | isEqual | isGreaterThan | isGreaterEqual | isLessThan | isLessEqual | isPropertyAvailable | isNotPropertyAvailable)*>
<!ATTLIST isEmpty
prepend CDATA #IMPLIED
property CDATA #IMPLIED
>
<!ELEMENT isNotEmpty (#PCDATA | iterate | isParameterPresent | isNotParameterPresent | isEmpty | isNotEmpty | isNotNull | isNull | isNotEqual | isEqual | isGreaterThan | isGreaterEqual | isLessThan | isLessEqual | isPropertyAvailable | isNotPropertyAvailable)*>
<!ATTLIST isNotEmpty
prepend CDATA #IMPLIED
property CDATA #IMPLIED
>
<!ELEMENT isParameterPresent (#PCDATA | iterate | isParameterPresent | isNotParameterPresent | isEmpty | isNotEmpty | isNotNull | isNull | isNotEqual | isEqual | isGreaterThan | isGreaterEqual | isLessThan | isLessEqual | isPropertyAvailable | isNotPropertyAvailable)*>
<!ATTLIST isParameterPresent
prepend CDATA #IMPLIED
>
<!ELEMENT isNotParameterPresent (#PCDATA | iterate | isParameterPresent | isNotParameterPresent | isEmpty | isNotEmpty | isNotNull | isNull | isNotEqual | isEqual | isGreaterThan | isGreaterEqual | isLessThan | isLessEqual | isPropertyAvailable | isNotPropertyAvailable)*>
<!ATTLIST isNotParameterPresent
prepend CDATA #IMPLIED
>
<!ELEMENT iterate (#PCDATA | iterate | isParameterPresent | isNotParameterPresent | isEmpty | isNotEmpty | isNotNull | isNull | isNotEqual | isEqual | isGreaterThan | isGreaterEqual | isLessThan | isLessEqual | isPropertyAvailable | isNotPropertyAvailable)*>
<!ATTLIST iterate
prepend CDATA #IMPLIED
property CDATA #IMPLIED
open CDATA #IMPLIED
close CDATA #IMPLIED
conjunction CDATA #IMPLIED
>