ibatis传递的参数只能是一个,你上面的SQL可以写成:
<select id="getBrno" parameterClass="java.lang.String" resultMap="bctlResult">
         select brno,brname from bctl where $sql$
</select>然后再java中拼写出后面的SQL语句,再传递进取.String sql= " brno like"+ b +"and pigday" = p;b和p都是变量。brList = sqlMap.queryForList("CR.getBrno", sql);

解决方案 »

  1.   

    谢谢rickhunterchen(千山鸟飞绝)。不过这样写是不是有些牵强啊,而且好像不符合iBATIS本意啊。我想知道这种情况下,ibatis推荐如何解决,是不是只能通过parameterMap了。
      

  2.   

    我们开发一般都是这样写,至于ibatis怎么建议就不清楚了。
    只要方便就可以了。至于你要用parameterMap,那么你先得在pojo中定义这两个变量。
    然后再在程序中set这两个变量。
      

  3.   

    你也可以参考下面的例子;Map类型输入参数
    假如没必要写一个Java Bean作为参数,而要传入的参数又不只一个时,可以使用Map类(如HashMap,TreeMap等)作为参数对象。例如:
    <statement id=”insertProduct” parameterClass=”java.util.Map”>
    select * from PRODUCT
    where PRD_CAT_ID = #catId#
    and PRD_CODE = #code#
    </statement>
    可以注意到mapped statement的形式完全没有区别!上面的例子中,如果把Map对象作为输入参数去调用mapped statement,Map对象必须包含键值“catId”和“code”。键值引用的对象必须是合适的类型,以上面的例子来说,必须是Integer和String。Result Map(参见以下章节)也支持使用Map类型作为结果参数。要获得更多信息,请参见“Result Map”和“使用SQL Map API编程”部分。
    Map类型也可以使用别名。例如,可以用“map”来代替“java.util.Map”。这些别名参见下面的“支持Parameter Map和Result Map的数据类型”表格。
      

  4.   

    我原来是这么写的:
    <parameterMap id="bpParam" class="bp">
          <parameter property="brno" />
          <parameter property="sdate" />
    </parameterMap>
    <select id="getFafangN" parameterClass="bpParam" resultClass="java.lang.Double">
             select brno,brname from bctl where brno like #value#
    </select>bp文件如下
    public class Bp{    private String brno;
        private String sdate;
        private String pig;    public Bp(String brno, String sdate){
             this.brno = brno;
             this.sdate = sdate;
        }     public String getBrno(){
             return brno;
        }
        public void setBrno(String brno){
            this.brno = brno;
        }    public String getSdate(){
             return sdate;
        }
        public void setSdate(String sdate){
              this.sdate = sdate;
       }
      
        public String getPig(){
             return pig;
        }
        public void setPig(String pig){
              this.pig = pig;
       }}
    而业务逻辑是这样的:
    tmpvalue9 = (Double)sqlMap.queryForObject("CR.getFafangN", new Bp(tmpbrno, tmpyear));
    这样得出的结果好像不对。
      

  5.   

    我刚学ibatis,还不大明白Parameter Map,不过仍然要感谢rickhunterchen(千山鸟飞绝)。大家使用ibatis开发的时候都是象rickhunterchen(千山鸟飞绝)那样吗,我说的是当输入参数超过一个的时候,就构造一个字符串传进去
    String sql= " brno like"+ b +"and pigday" = p;?我觉得使用ibatis有一点就是,当数据库改变时,只需要改动SqlMap.xml文件就可以了,假如象rickhunterchen(千山鸟飞绝)那样用的话,还得重新编译文件。不知道我理解的对不对?
      

  6.   

    上面写的有点错误,应该是这样的:
    <select id="getFafangN" parameterClass="bpParam" resultClass="java.lang.Double">
             select brno,brname from bctl where brno like ? and pigday = ?
    </select>
      

  7.   

    很简单啊,你可以给你要传入的可能参数构造一个pojo,然后输入参数是parameterClass="pojoName"即可;或者在程序中构造一个Map,在Itatis配置文件中按照Map的key取出value即可,不过就像你说的,如果查询条件变化的时候仍然要改变程序。所以建议使用第一种。
      

  8.   

    parameterMap和parameterClass都是完全可以的。
    我开发的时候用parameterMap,不过千山说得方法也是完全可行的,对于preparedstatement存储池也木问题。没什么推荐做法,框架不是核心,不过就是个协助组件,怎么用全在于你。
    hibernate3 比 hibernate2还不是改掉了一些臭毛病?
      

  9.   

    to:rickhunterchen(千山鸟飞绝) 
    ibatis传递的参数只能是一个,你上面的SQL可以写成:
    <select id="getBrno" parameterClass="java.lang.String" resultMap="bctlResult">
             select brno,brname from bctl where $sql$
    </select>然后再java中拼写出后面的SQL语句,再传递进取.String sql= " brno like"+ b +"and pigday" = p;b和p都是变量。brList = sqlMap.queryForList("CR.getBrno", sql);我以前也如同你这样写过,但是在加载该xml文件的时候就会报错:
    Caused by: java.sql.SQLException: ORA-00936: 缺少表达式请问你这样测试过吗?thx
      

  10.   

    先帮你顶一下 ^_^
    然后问个问题:
    你得到brList后如何处理呢?
    我是初学的 
    我得到这个sqlMap.queryForList的结果后想显示在JSP的logic:iterate中 但是不知道怎么搞
    还请楼主和大家 指点一二啊 先谢谢了
      

  11.   

    ^_^今天刚好google一个东西,看到这个问题,好长时间不来csdn,回答一下,并非挖f.使用拼字符串的方法可以,但是这样一来就违背了代码结构清晰的目的。我是这么实现的:
    <parameterMap id="myParam" class="java.util.HashMap">
        <parameter property="intParm"/>
        <parameter property="strParm"/>
    </parameterMap>
    <select id="testQuery" parameterMap="myParm" resultClass="XXX">
        <![CDATA[
    select * from table1 where col1 = ? and col2 = ? 
        ]]>
    </select>
    ------------------------------------------------
    调用方法:
    String resource = "com/…/SqlMapConfig.xml";
    Reader reader = Resources.getResourceAsReader(resource);
    SqlMapClient c = SqlMapClientBuilder.buildSqlMapClient(reader);
    XXX b = new XXX();
    try{
    c.startTransaction();
    HashMap hmParam = new HashMap();
    hmParam.put("intParm", new Integer(99));
    hmParam.put("strParm", "abc");
    c.queryForObject("testQuery", hmParam, b);
    c.commitTransaction();
    }
    catch(SQLException e){e.printStackTrace();}
    finally{
    try{c.endTransaction();}catch(SQLException e1){}
    }不需要拼字符串,也不需要POJO支持。
    这么久不结贴,也不知道楼主会不会看呢-_-!
      

  12.   

    CSDN白痴的排版!这是无语了……