`
sbpya
  • 浏览: 610044 次
  • 性别: Icon_minigender_1
  • 来自: 杭州,长沙
社区版块
存档分类
最新评论

(原创)Ibatis2调用数据库存储过程的相关示例

阅读更多

第一种方式,传入一个参数(非自定义java类型),返回单个值:

 

oracle代码:

   

CREATE OR REPLACE PROCEDURE testPro(bidObjectId  NUMBER,projectId OUT NUMBER)
AS
BEGIN
       SELECT bo.project_id INTO projectId FROM bm_t_bid_object bo WHERE bo.bid_object_id = bidObjectId;
  END;

  

Ibatis配置:

     <parameterMap id="projectIdProc" class="java.util.Map">
        <parameter property="bidObjectId" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN" />
        <parameter property="result" jdbcType="VARCHAR" javaType="java.lang.String" mode="OUT"/>
    </parameterMap>

 

<procedure id="getProjectIdProc" parameterMap="projectIdProc">
        { call testPro(?,?) }
</procedure>

 

Java调用代码:

     public Long getProjectIdProc(Map map) throws Exception {
        this.getBaseDao().getSqlMapClientTemplate().queryForObject("getProjectIdProc",map);
        Long pId = Long.valueOf(map.get("result").toString());       
        return pId;
    }

 

Junit测试代码:基于org.springframework.test.AbstractDependencyInjectionSpringContextTests测试

      public void testGetProjectIdProc() {
        HashMap parameters = new HashMap();
        parameters.put("bidObjectId","900000000000000003");
        Object o = null;
        try {
            o = projectMgr.getProjectIdProc(parameters);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(o);
    }

 

第二种方式: 传入单个参数,返回游标结果集

 

oracle代码:

 

CREATE OR REPLACE PACKAGE myPage
AS
  TYPE myrctype IS REF CURSOR;
  PROCEDURE testListPro(projectId NUMBER,return_cursor OUT myrctype);
END;

 

CREATE OR REPLACE PACKAGE BODY myPage

AS
  PROCEDURE testListPro(projectId NUMBER,return_cursor OUT myrctype)
    IS
    sqlStr VARCHAR(200);
    BEGIN
      sqlStr := 'SELECT * FROM bm_t_bid_object bo WHERE bo.project_id =:p_id';
      OPEN return_cursor FOR sqlStr USING projectId;
    END testListPro;
END myPage;

 

Ibatis配置:

 

<resultMap id="bidObjectBasic" class="bidObject">
        <result property="id" column="BID_OBJECT_ID"/>
        <result property="objectNo" column="OBJECT_NO"/>
        <result property="objectName" column="OBJECT_NAME"/>
    </resultMap>

 

    <parameterMap id="bidObjectsProc" class="java.util.Map">
        <parameter property="projectId" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN" />
        <parameter property="result" jdbcType="ORACLECURSOR" javaType="java.sql.ResultSet" mode="OUT" resultMap="bidObjectBasic"/>
    </parameterMap>

 

    <procedure id="getBidObjectsProc" parameterMap="bidObjectsProc">
        { call MYPAGE.testListPro(?,?) }
    </procedure>

 

Java调用代码:

 

public List getBidObjectsProc(Map map) throws Exception {
        this.getBaseDao().getSqlMapClientTemplate().queryForList("getBidObjectsProc",map);
        List list = (ArrayList) map.get("result");
        return list;
    }

 

Junit测试代码:

public void testGetBidObjectsProc() {
        HashMap parameters = new HashMap();
        parameters.put("projectId","120000000000000004");
        List list = null;
        try {
            list = projectMgr.getBidObjectsProc(parameters);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("list.size() = " + list.size());
    }

 

 

第三种方式,传入一个List<Project> projects参数,返回游标

 

oracle代码:

 

CREATE OR REPLACE TYPE OPROJECT IS OBJECT
(
       pid NUMBER(18),
       pname NVARCHAR2(200),
       pno NVARCHAR2(100)
)

 

CREATE OR REPLACE TYPE MY_OPROJECT_TYPE AS TABLE OF OPROJECT

 

CREATE OR REPLACE PACKAGE mypageforList
AS
  TYPE myrctype IS REF CURSOR;
  PROCEDURE GETBIDOBJECTSBYPROJECTS(MY_OPROJECT IN MY_OPROJECT_TYPE,return_cursor OUT myrctype);
END mypageforList;

 

CREATE OR REPLACE PACKAGE BODY MYPAGEFORLIST AS
  PROCEDURE GETBIDOBJECTSBYPROJECTS(MY_OPROJECT   IN MY_OPROJECT_TYPE,
                                    RETURN_CURSOR OUT MYRCTYPE) IS
    PROJECTID_STRS VARCHAR2(200) := '';
    sqlstr VARCHAR2(200);
  BEGIN   
    FOR I IN 1 .. MY_OPROJECT.COUNT() LOOP
      PROJECTID_STRS := CONCAT(PROJECTID_STRS,CONCAT(to_char(MY_OPROJECT(I).PID),','));      
    END LOOP; 
        PROJECTID_STRS := SUBSTR(PROJECTID_STRS,1,(LENGTH(PROJECTID_STRS)-1));
     sqlstr := 'SELECT * FROM BM_T_BID_OBJECT BO
       WHERE BO.PROJECT_ID IN ('||PROJECTID_STRS||')';
    --OPEN return_cursor FOR SELECT * FROM bm_t_bid_object bo WHERE bo.project_id = MY_OPROJECT(2).pid;
    OPEN RETURN_CURSOR FOR sqlstr;
  END GETBIDOBJECTSBYPROJECTS;
END MYPAGEFORLIST;

 

Ibatis配置:

 

<parameterMap id="bidObjectsByProjectListProc" class="java.util.Map">
        <parameter property="projects" jdbcType="ARRAY" javaType="java.util.List" mode="IN" typeHandler="ProjectListHandler"/>
        <parameter property="result" jdbcType="ORACLECURSOR" javaType="java.sql.ResultSet" mode="OUT" resultMap="bidObjectBasic"/>
    </parameterMap>

    <procedure id="getBidObjectsByProjectListProc" parameterMap="bidObjectsByProjectListProc">
        { call mypageforList.GETBIDOBJECTSBYPROJECTS(?,?) }
    </procedure>

 

java代码:

 

public class ProjectListHandler implements TypeHandlerCallback {
    @Override
    public void setParameter(ParameterSetter parameterSetter, Object o) throws SQLException {
        Connection conn = null;
        try {
            if (null != o) {
                List<Project> list = (ArrayList<Project>) o;
                System.out.println("传入的java参数list长度为: = " + list.size());
                Class c = Class.forName("oracle.jdbc.OracleDriver");
                conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl", "powerbid_test", "powerbid_test");

                System.out.println("conn = " + conn);
                ARRAY array = getArray(conn, "OPROJECT", "MY_OPROJECT_TYPE", list);
                parameterSetter.setArray(array);
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (null != conn) {
                conn.close();
            }
        }
    }

    @Override
    public Object getResult(ResultGetter resultGetter) throws SQLException {
       //todo 如果返回的数据库类型要转换成某种特定的java类型,实现这个方法

        return null;
    }

    @Override
    public Object valueOf(String s) {
        return null;
    }

    private ARRAY getArray(Connection con, String OracleObj,
                           String Oraclelist, List listData) throws Exception {
        ARRAY array = null;

        if (listData != null && listData.size() > 0) {
            ArrayDescriptor desc = ArrayDescriptor.createDescriptor(Oraclelist, con);

            StructDescriptor structdesc = new StructDescriptor(OracleObj, con);
            STRUCT[] structs = new STRUCT[listData.size()];

            for (int i = 0; i < listData.size(); i++) {
                Object[] result = {((Project) listData.get(i)).getId().toString(),
                        ((Project) listData.get(i)).getProjectName(),
                        ((Project) listData.get(i)).getProjectNo()};

                structs[i] = new STRUCT(structdesc, con, result);
            }

            array = new ARRAY(desc, con, structs);
        }
        return array;
    }
}

 

public List getBidObjectsByProjectListProc(Map map) throws Exception {
        this.getBaseDao().getSqlMapClientTemplate().queryForList("getBidObjectsByProjectListProc",map);
        List list = (ArrayList) map.get("result");
        return list;

}

 

 

Junit测试代码:

 

public void testGetBidObjectsByProjectListProc() {
        List<Project> listinput = new ArrayList<Project>();
        Project p1 = new Project(900000000000000007l);
        Project p2 = new Project(900000000000000001l);
        Project p3 = new Project(900000000000000005l);
        listinput.add(p1);
        listinput.add(p2);
        listinput.add(p3);
        HashMap parameters = new HashMap();
        parameters.put("projects", listinput);
        List list = null;
        try {
            list = projectMgr.getBidObjectsByProjectListProc(parameters);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("list.size() = " + list.size());
    }

 

 

今天项目中遇到才去研究,现贴如此,希望对有同样需求的同行有所帮助。

分享到:
评论
4 楼 wuchunjiesp 2013-09-17  
总算解决了,THANK楼主,空值问题是TYPE里面参数类型定义问题,必须是NVARCHAR2才能解析出String类型的参数,哦也!很重要的
3 楼 wuchunjiesp 2013-09-16  
存储里面是这样的

FOR I IN 1..P_GOODSDIM_INSERT_LIST.COUNT() LOOP
               INSERT INTO AP_AWBGOODSDIM_T(
                     CAD_DIMID,
                     CAD_AWBID,
                     CAD_GOODSLENGTH,
                     CAD_GOODSWIDTH,
                     CAD_GOODSHEIGHT,
                     CAD_GOODSNUM
              )VALUES(
                     SYS_GUID(),
                     V_AWBID,
                     10,
                     10,
                     10,
                     TO_NUMBER(P_GOODSDIM_INSERT_LIST(I).cadDimId||10)
              );
              /*INSERT INTO AP_AWBGOODSDIM_T(
                     CAD_DIMID,
                     CAD_AWBID,
                     CAD_GOODSLENGTH,
                     CAD_GOODSWIDTH,
                     CAD_GOODSHEIGHT,
                     CAD_GOODSNUM
              )VALUES(
                     SYS_GUID(),
                     V_AWBID,
                     TO_NUMBER(P_GOODSDIM_INSERT_LIST(I).cadGoodsLength),
                     TO_NUMBER(P_GOODSDIM_INSERT_LIST(I).cadGoodsWidth),
                     TO_NUMBER(P_GOODSDIM_INSERT_LIST(I).cadGoodsHeight),
                     TO_NUMBER(P_GOODSDIM_INSERT_LIST(I).cadGoodsNum)
              );*/
              --dbms_output.put_line(P_GOODSDIM_INSERT_LIST(I).CAD_GOODSLENGTH);
          END LOOP;
2 楼 wuchunjiesp 2013-09-16  
请教一下:为什么我和你一样配置,到存储里面获取不到这个类型的值呢?值全是空的。。。跟版本有关系吗?
public void setParameter(ParameterSetter parametersetter, Object obj)
throws SQLException {
Connection conn = null;
try {
if (null != obj) {
List<ParamInVO> list = (ArrayList<ParamInVO>) obj;
Class c = Class.forName("oracle.jdbc.OracleDriver");
conn = DriverManager.getConnection(
"jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.4.129.36)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=10.4.129.38)(PORT=1521))(LOAD_BALANCE=yes)(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=orcl)))",
"apt_user", "apt_user");

ARRAY array = getArray(conn, "GOODSDIM_INFO_TYPE",
"GOODSDIM_INFO_TYPE_TABLE", list);
System.out.println(array);
parametersetter.setArray(array);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != conn) {
conn.close();
}
}

}
----------//ARRAY
private ARRAY getArray(Connection con, String OracleObj, String Oraclelist,
List listData) throws Exception {
ARRAY array = null;

if (listData != null && listData.size() > 0) {
ArrayDescriptor desc = ArrayDescriptor.createDescriptor(Oraclelist,con);

StructDescriptor structdesc = new StructDescriptor(OracleObj, con);
STRUCT[] structs = new STRUCT[listData.size()];

for (int i = 0; i < listData.size(); i++) {
Object[] result = {
((ParamInVO) listData.get(i)).getCadDimId(),
((ParamInVO) listData.get(i)).getCadAwbId(),
((ParamInVO) listData.get(i)).getCadGoodsLength(),
((ParamInVO) listData.get(i)).getCadGoodsWidth(),
((ParamInVO) listData.get(i)).getCadGoodsHeight(),
((ParamInVO) listData.get(i)).getCadGoodsNum()};

structs[i] = new STRUCT(structdesc, con, result);
}

array = new ARRAY(desc, con, structs);
}
return array;
}
------//java里面赋值
List<ParamInVO> listinput = new ArrayList<ParamInVO>();
//包装信息
List<Map<String,String>> listInsert = (List<Map<String,String>>) paramMap.get("listInsert");
for(Map<String,String> packageDtl : listInsert){
String cadGoodsnum = packageDtl.get("cadGoodsnum");
String cadGoodslength = packageDtl.get("cadGoodslength");
String cadGoodswidth = packageDtl.get("cadGoodswidth");
String cadGoodsheight = packageDtl.get("cadGoodsheight");
if((!"".equals(cadGoodsnum)) && (!"".equals(cadGoodslength)) && (!"".equals(cadGoodswidth)) && (!"".equals(cadGoodsheight))){
ParamInVO paramInVO = new ParamInVO();
//interLeaveManageDAO.doInsertInterPackage(packageDtl);
paramInVO.setCadDimId("1");
paramInVO.setCadAwbId("1");
paramInVO.setCadGoodsNum(cadGoodsnum);
paramInVO.setCadGoodsLength(cadGoodslength);
paramInVO.setCadGoodsWidth(cadGoodswidth);
paramInVO.setCadGoodsHeight(cadGoodsheight);
listinput.add(paramInVO);
}
}
paramMap.put("insertGoodsDim", listinput);
-----//
<parameter property="insertGoodsDim" jdbcType="ARRAY" javaType="java.util.List" typeHandler="com.neusoft.apt.common.filter.ArrayTypeHandlerIn" mode="IN" />

1 楼 sbpya 2010-03-11  
以上第三种方式中,ProjectListHandler配置给spring托管,在ibatis配置文件
直接引用spring配置的bean的id好像会报错,请各位指教

<bean id="projectListHandler" class="com.freshpower.bid.bm.plugin.ProjectListHandler" scope="singleton">
        <property name="basePDao">
            <ref bean="baseDao"/>
        </property>
    </bean>

<parameterMap id="bidObjectsByProjectListProc" class="java.util.Map">
        <parameter property="projects" jdbcType="ARRAY" javaType="java.util.List" mode="IN" typeHandler="projectListHandler"/>
        <parameter property="result" jdbcType="ORACLECURSOR" javaType="java.sql.ResultSet" mode="OUT" resultMap="bidObjectBasic"/>
    </parameterMap>

这样配置,红色部分报错,无法引用spring配置的bean,请问这里要如何修正呢?
这样做的主要目标只是想,在ProjectListHandler类中注入baseDao,通过basePDao.getConnection()可以直接拿到spring托管的连接,不用再Class.forName了

不要告诉我在ProjectListHandler可调用cxf.getBean("baseDao"),我个人分析,是不是projectListHandler还需要实现spring中某个接口才能作为一个spring的typeHander呢,类似调用org.springframework.orm.ibatis.support.ClobStringTypeHandler一样,请指教。

相关推荐

    ibatis调用oracle存储过程

    本文将深入解析ibatis如何与Oracle数据库中的存储过程进行交互,通过具体示例详解配置与实现步骤。 ### ibatis简介 ibatis,现称为MyBatis,是一个支持普通SQL查询、存储过程以及高级映射的优秀持久层框架。它消除...

    ibatis调用存储过程

    在Java开发中,iBATIS(现在被称为MyBatis)是一个流行的数据持久层框架,它允许开发者将SQL语句直接嵌入到Java代码中,从而简化数据库操作。...希望这个示例能帮助你更好地理解iBATIS调用存储过程的方法。

    ibatis调用存储过程介绍

    在Java开发中,使用iBATIS(现在称为MyBatis)作为持久层框架时,调用数据库的存储过程是一种常见的需求。本文将详细介绍如何使用iBATIS调用存储过程,并提供一个简单的示例来说明其过程。 首先,我们需要在数据库...

    Ibatis调用存储过程调用存储过程

    ### Ibatis调用存储过程详解 #### 一、引言 在实际的软件开发过程中,存储过程因其执行效率高及数据库级别的安全性等优点被广泛应用于各种业务场景之中。而对于使用Ibatis作为持久层框架的应用来说,如何有效地...

    IBatis查删改查与调用存储过程 mysql数据库

    "IBatis查删改查与调用存储过程 mysql数据库" 这个标题揭示了本文将深入探讨如何使用IBatis框架在MySQL数据库中执行基本的CRUD(创建、读取、更新、删除)操作,以及如何调用存储过程。IBatis是一个轻量级的Java持久...

    IBATIS连接多数据库参考文档

    在IT行业中,数据库连接是应用程序的核心部分,尤其是在使用ORM(对象关系映射)框架时,如IBATIS。本文档将深入探讨如何在IBATIS框架下连接和管理多个数据库,以便于在不同环境中灵活切换或同时操作多个数据源。 ...

    Ibatis调用Oracle存储过程返回自定义类型

    ### Ibatis调用Oracle存储过程返回自定义类型 在企业级应用开发中,尤其是在金融、保险等业务场景中,往往需要处理复杂的数据结构与逻辑。本文将深入探讨如何使用Ibatis框架来调用Oracle数据库中的存储过程,并实现...

    ibatis调用oracle的函数,存储过程的方法

    Ibatis,一个轻量级的Java持久层框架,提供了与数据库交互的能力,包括调用这些Oracle的函数和存储过程。本篇文章将详细介绍如何在Ibatis中调用Oracle的函数和存储过程。 首先,理解基本概念: 1. **Oracle函数**...

    ibatis数据库示例

    Ibatis,全称为MyBatis,是一个优秀...同时,对于标签中的"mysql",这意味着示例可能特别关注于MySQL数据库的使用,包括特定的数据类型、存储过程等特性。总的来说,这个示例是一个全面学习和实践Ibatis框架的好资源。

    ibatis调用oracle的函数,存储过程的方法 IN 和OUT /游标

    本篇文章将详细探讨如何在iBatis中调用Oracle的函数和存储过程,尤其是处理IN和OUT参数以及游标的场景。 首先,我们需要了解iBatis的基本工作原理。iBatis是一个SQL映射框架,它允许开发者将SQL语句写在XML配置文件...

    Ibatis+struts2.0+Spring2.5 示例

    在本示例中,Ibatis 将作为数据库操作的主要工具,处理增、删、改、查(CRUD)操作,并可能包括对存储过程的调用。 2. **Struts2.0**:Struts2 是一个基于MVC(Model-View-Controller)设计模式的Web应用框架。它...

    IBatis中的存储过程应用实例

    总结来说,IBatis允许我们在Java应用程序中方便地调用数据库的存储过程,通过Mapper配置文件定义参数映射,以及在实体类中封装输入和输出参数。这种方式既保留了存储过程的优点,又简化了与数据库的交互,提高了代码...

    struts2 存储过程

    在Struts2中,通过整合其他技术,如Hibernate或iBatis,可以方便地调用数据库的存储过程。存储过程是预编译的SQL语句集合,可以在数据库端执行复杂的业务逻辑,提高性能并降低网络流量。 本文将详细讲解如何在...

    ssi_struts2_spring_ibatis 增删改查分页

    标题中的"ssi_struts2_spring_ibatis"指的是一个基于Java技术栈的Web应用程序开发框架组合,主要包括Struts2、Spring和iBatis。这三个组件是企业级Java应用中的常见选择,它们各自承担着不同的职责。 1. **Struts2*...

    ibatis +mssql 执行增删改查 +存储过程

    在IT行业中,数据库操作是应用程序开发的关键环节,而Ibatis作为一个优秀的持久层框架,与Microsoft SQL Server(MSSQL)数据库结合,可以高效地实现数据的增、删、改、查(CRUD)操作,并且支持存储过程的调用。...

    iBatis教程与代码 mysql数据库

    iBatis是一个优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射。在本教程中,你将深入理解如何利用iBatis与MySQL数据库进行交互,提升你的软件开发技能。以下是对每个部分的详细解释: 1. **iBatis...

    asp.net MVC和IBatis.net整合demo数据库部分

    总之,这个示例项目为学习如何在ASP.NET MVC中集成Ibatis.net提供了一个实战平台,帮助开发者掌握如何在.NET环境中高效、灵活地进行数据库操作。通过分析和实践这个DEMO,你可以深入理解MVC架构和Ibatis.net的工作...

    struts2+spring+ibatis增删查改翻页代码示例

    在这个“struts2+spring+ibatis增删查改翻页代码示例”中,我们将深入探讨这三个框架如何协同实现数据管理的基本操作,并集成MySQL数据库和Tomcat web服务器。 首先,Struts2作为MVC(模型-视图-控制器)框架,主要...

    Ibatis+Oracle(含对应数据库sql) 源码

    在实践中,你可以期待找到如何创建Oracle数据库表的SQL脚本,如何配置Ibatis以连接Oracle,如何编写和执行SQL语句,以及如何在Java代码中调用这些操作的示例。 总的来说,这个资源将帮助学习者理解以下几个关键知识...

    Ibatis.net+ oracle 简单事例

    "IbatisTet" 可能是一个示例项目,展示了如何在VS2008中使用Ibatis.net 操作Oracle 数据库。该项目可能包含了必要的配置文件(如ibatis.config)、Mapper XML文件以及对应的.NET类,演示了CRUD(创建、读取、更新、...

Global site tag (gtag.js) - Google Analytics