打印

[java] IBATIS 与 mysql 存储过程

俺这个半路出家的和尚,不懂spring 如何配置,不懂 ibatis 如何配置,也不懂 strut 如何配置,就是照着以存在的程序做点小程序。
今天有个应用,大概是说:如果不存在对应的记录,就插入一条,如果存在就 更新一下。
Oracle 里,可以有 MERGE INTO ... 来写,但是MySQL里,就不知道怎么弄了。
于是想到了存储过程,
但是执行后,出错了!
烦请各路大侠出手帮个忙。谢谢。



IBATIS 版本:2.0.7
MySql 版本:5.1.22
JDBC : mysql-connector-java-5.1.5-bin

存储过程定义:
复制内容到剪贴板
代码:
CREATE PROCEDURE P_PUB_COMMISSION_I_U (IN IN_PUB_ID INT , IN IN_COMMISSION_TYPE INT, IN IN_REV_SHARE_RATE DOUBLE, IN IN_CPM DOUBLE)
BEGIN
    DECLARE N INT;
    SELECT COUNT(1) INTO N FROM pub_commission WHERE PUB_ID = IN_PUB_ID;
    IF(N > 0) THEN
        UPDATE pub_commission SET
            COMMISSION_TYPE = IN_COMMISSION_TYPE,
            REV_SHARE_RATE = IN_REV_SHARE_RATE,
            CPM = IN_CPM
        WHERE PUB_ID = IN_PUB_ID;
    ELSE
        INSERT pub_commission
            (PUB_ID,COMMISSION_TYPE,REV_SHARE_RATE,CPM) VALUES
            (IN_PUB_ID , IN_COMMISSION_TYPE , IN_REV_SHARE_RATE , IN_CPM );
    END IF;
END;
SQLMap定义:
复制内容到剪贴板
代码:
  <parameterMap id="addOrUpdatePubCommissionParameterMap" class="java.util.Map">
      <parameter property="pubId" jdbcType="INTEGER" javaType="java.lang.Integer" mode="IN" />
      <parameter property="commissionType" jdbcType="INTEGER" javaType="java.lang.Integer" mode="IN" />
      <parameter property="revShareRate" jdbcType="DOUBLE" javaType="java.lang.Double" mode="IN" />
      <parameter property="cpm" jdbcType="DOUBLE" javaType="java.lang.Double" mode="IN" />
  </parameterMap>
  <procedure id="addOrUpdatePubCommission" parameterMap="addOrUpdatePubCommissionParameterMap">
      {CALL P_PUB_COMMISSION_I_U( ? , ? , ? , ? )}
  </procedure>
Java 调用:
复制内容到剪贴板
代码:
    public void addOrUpdatePubCommission(PubForm pubForm) {
        PubCommissionVO vo = pubForm.getPubBO().getPubCommissionVO();
        Map map = new HashMap(4);
        map.put("pubId",vo.getPubId());
        map.put("commissionType",vo.getCommissionType());
        map.put("revShareRate",vo.getRevShareRate());
        map.put("cpm",vo.getCpm());
        pubDAO.addOrUpdatePubCommission(map);
    }
}
运行提示错误:
复制内容到剪贴板
代码:
SqlMapClient operation; uncategorized SQLException for SQL []; SQL state [S1C00]; error code [0];   
--- The error occurred in cms/module/pub/dao/map/pubDAO.xml.  
--- The error occurred while executing query procedure.  
--- Check the {CALL P_PUB_COMMISSION_I_U( ? , ? , ? , ? )}.  
--- Check the SQL Statement (preparation failed).  
--- Cause: java.sql.SQLException: Callable statments not supported.; nested exception is com.ibatis.common.jdbc.exception.NestedSQLException:   
--- The error occurred in cms/module/pub/dao/map/pubDAO.xml.  
--- The error occurred while executing query procedure.  
--- Check the {CALL P_PUB_COMMISSION_I_U( ? , ? , ? , ? )}.  
--- Check the SQL Statement (preparation failed).  
--- Cause: java.sql.SQLException: Callable statments not supported.
我向往我美丽的梦,但是美丽的太遥远。。。

TOP

UP一下,
各位大侠们,吃完饭,
总该有时间了吧!
我向往我美丽的梦,但是美丽的太遥远。。。

TOP

用过 hibernate,但 ibatis 没用过, 不过既然使用 ORM, 这个存储过程应该是多余的吧?
修行的魔法师

TOP

什么是ORM ?
目前我换种方法解决了。
但是要多出一步。
我向往我美丽的梦,但是美丽的太遥远。。。

TOP

插入空值时会这样,呵呵,看到的有些晚,我想楼主早就解决了吧.
我就简单的解释下ORM吧;
数据库中的关系表可以看作一种数据结构,而面向对象语言中的类也可以看作一种数据结构,对数据库表的操作过于烦琐,所以要把他转化成对类对像的操作(这样比较简单),
对应关系
表  对应   类
行  对应   类对象
列  对应   类的字段
做下广告,可以参考下http://bbs.blueidea.com/viewthre ... p%3Bfilter%3Ddigest 10楼
江湖恶汉

TOP

根据你的需求直接写java类,你所描述的是属于业务逻辑范畴啊,不要把问题搞复杂化。
http://www.javaedu.com有新变化了...

TOP