`
lohasle
  • 浏览: 254932 次
社区版块
存档分类
最新评论

mybatis调用存储过程

阅读更多
看了下mybatis源码,有调用存储过程的例子,整理下。

参数形式:
create procedure sptest.adder(in addend1 integer, in addend2 integer, out theSum integer)
begin atomic
  set theSum = addend1 + addend2; 
end
go


 <parameterMap type="map" id="testParameterMap">
    <parameter property="addend1" jdbcType="INTEGER" mode="IN"/>
    <parameter property="addend2" jdbcType="INTEGER" mode="IN"/>
    <parameter property="sum" jdbcType="INTEGER" mode="OUT"/>
  </parameterMap>
<update id="adderWithParameterMap" parameterMap="testParameterMap" statementType="CALLABLE">
    {call sptest.adder(?, ?, ?)}
  </update>

 public void testAdderAsUpdateWithParameterMap() {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try {
            Map<String, Object> parms = new HashMap<String, Object>();
            parms.put("addend1", 3);
            parms.put("addend2", 4);
            
            SPMapper spMapper = sqlSession.getMapper(SPMapper.class);
            
            spMapper.adderWithParameterMap(parms);
            assertEquals(7, parms.get("sum"));
            
            parms = new HashMap<String, Object>();
            parms.put("addend1", 2);
            parms.put("addend2", 3);
            spMapper.adderWithParameterMap(parms);
            assertEquals(5, parms.get("sum"));
            
        } finally {
            sqlSession.close();
        }


带输入输出参数的存储过程:
sql代码:
create procedure sptest.getnames(in lowestId int, out totalrows integer)
reads sql data
dynamic result sets 1
BEGIN ATOMIC
  declare cur cursor for select * from sptest.names where id >= lowestId;
  select count(*) into totalrows from sptest.names where id >= lowestId;
  open cur;
END
go



  <select id="getNamesAndItems" statementType="CALLABLE"
      <select id="getNames" parameterType="java.util.Map" statementType="CALLABLE"
    resultMap="nameResult">
    {call sptest.getnames(
      #{lowestId,jdbcType=INTEGER,mode=IN},
      #{totalRows,jdbcType=INTEGER,mode=OUT})}
  </select>
  </select>


 public void testCallWithResultSet2_a1() {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try {
            SPMapper spMapper = sqlSession.getMapper(SPMapper.class);
            
            Map<String, Object> parms = new HashMap<String, Object>();
            parms.put("lowestId", 1);
            List<Name> names = spMapper.getNamesAnnotated(parms);
            assertEquals(3, names.size());
            assertEquals(3, parms.get("totalRows"));
        } finally {
            sqlSession.close();
        }
    }



返回多个结果集
sql代码:
create procedure sptest.getnamesanditems()
reads sql data
dynamic result sets 2
BEGIN ATOMIC
  declare cur1 cursor for select * from sptest.names;
  declare cur2 cursor for select * from sptest.items;
  open cur1;
  open cur2;
END
go



<resultMap type="org.apache.ibatis.submitted.sptests.Name" id="nameResult">
    <result column="ID" property="id"/>
    <result column="FIRST_NAME" property="firstName"/>
    <result column="LAST_NAME" property="lastName"/>
  </resultMap>

  <resultMap type="org.apache.ibatis.submitted.sptests.Item" id="itemResult">
    <result column="ID" property="id"/>
    <result column="ITEM" property="item"/>
  </resultMap>

  <select id="getNamesAndItems" statementType="CALLABLE"
    resultMap="nameResult,itemResult">
    {call sptest.getnamesanditems()}
  </select>


@Test
    public void testGetNamesAndItems() throws SQLException {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try {
            SPMapper spMapper = sqlSession.getMapper(SPMapper.class);
            
            List<List<?>> results = spMapper.getNamesAndItems();
            assertEquals(2, results.size());
            assertEquals(4, results.get(0).size());
            assertEquals(3, results.get(1).size());
        } finally {
            sqlSession.close();
        }
    }

注意:

上面就是几种常用的了。
1 sqlserver oracle sqlserver返回结果集是可以不要out参数的。如果sql中用的是select出结果,不需要配置out参数。多个结果集/结果集可以配置resultMap 来返回LIST,主要是调用selectList方法会自动把结果集加入到list中去的。
2 sql有返回值 用select标签
3 注意sql参数和mybatis参数的对应关系,这个这里就不讲了。
4 注意参数个数

我遇到的异常:

参数不匹配的原因,因为sqlserver 中我是直接返回select临时表结果,不需要配置存储过程输出参数。
list中的内容形式:


吐槽:
感觉网上的内容都一样,没有区别和针对性,还是要看看源码例子。
还有什么问题大家一起探讨啊。
时间晚了,明早还得上班,有些东西可能没说到,希望大家给点实际开发过程中的问题,给点意见。

  • 大小: 32.4 KB
  • 大小: 6.4 KB
6
5
分享到:
评论
9 楼 liyonghui160com 2015-06-04  
能否给个例子 sqlserver的调不通啊
8 楼 abc382410124 2015-04-09  
存储过程要占用数据库本身的计算资源,数据库本身增删改查已经够累了,为什么要用存储过程而不用业务sql,能不能给个接地气的原因
7 楼 ccm1273936998 2014-11-14  
[b][/b]
6 楼 ddnzero 2013-05-09  
lohasle 写道
ddnzero 写道
大哥能上个源码么? 上面的感觉不完全啊能上传个附件或发我邮箱么? ddnzero@126.com

上面的是Mybatis官方测试的代码。你是用的什么数据库哦。



试过了我是mysql 5.5 这个例子的存储过程有些问题,编译不过.换5.5的写法就好了.
declare cur1 cursor for select * from sptest.names; 
  declare cur2 cursor for select * from sptest.items; 
  open cur1; 
  open cur2; 
这个好像不行,直接select * from table;就能返回结果集,还可以返回多个结果集.
5 楼 lohasle 2013-05-01  
ddnzero 写道
大哥能上个源码么? 上面的感觉不完全啊能上传个附件或发我邮箱么? ddnzero@126.com

上面的是Mybatis官方测试的代码。你是用的什么数据库哦。
4 楼 ddnzero 2013-04-28  
大哥能上个源码么? 上面的感觉不完全啊能上传个附件或发我邮箱么? ddnzero@126.com
3 楼 HeartArea 2012-09-03  
2 楼 lohasle 2012-09-03  
Sev7en_jun 写道
这么简单的sql有必要搞存储过程吗,逻辑复杂点的sql,你用这种方式调用存储过程能行吗???

这些都是官方的列子哦
1 楼 Sev7en_jun 2012-09-03  
这么简单的sql有必要搞存储过程吗,逻辑复杂点的sql,你用这种方式调用存储过程能行吗???

相关推荐

    mybatis调用存储过程源码

    这个提供的"mybatis调用存储过程源码"压缩包,包含了一个完整的MyBatis调用存储过程的示例,解压后可以直接运行,帮助开发者理解如何在实际项目中实现这一功能。详细注释可以帮助初学者更好地理解和学习这一过程。...

    MyBatis调用存储过程

    MyBatis作为一款流行的Java持久层框架,提供了调用存储过程的功能。下面将详细介绍如何在MyBatis中配置和使用存储过程。 ### 1. 配置MyBatis XML映射文件 在MyBatis的映射文件(mapper.xml)中,我们需要为存储...

    lanlan2017#JavaReadingNotes#10.3 MyBatis调用存储过程 10.3.3根据id查询数据返回对

    title: 10.3 MyBatis调用存储过程 10.3.3根据id查询数据返回对象10.3 MyBatis调用存储过程 10.3.3根据id查询数据返回对

    spring mybatis 调用oracle存储过程

    在Spring和MyBatis的集成中,通过MyBatis的SqlSession对象可以调用存储过程。Oracle存储过程是一组预编译的SQL语句,可以在数据库服务器端执行,提供更好的性能和安全性。 1. **无返回值的存储过程**: 当存储过程...

    springboot整合mybatis调用oracle存储过程

    至此,我们就完成了Spring Boot整合MyBatis调用Oracle存储过程并处理游标返回数据的过程。在实际开发中,可以根据需求调整存储过程的逻辑和结果处理方式,以满足各种复杂业务场景。注意,对于大数据量的查询,使用...

    Mybatis调用Oracle存储过程的方法图文详解

    在Mapper.java文件中,需要定义一个调用存储过程的方法。例如: ```java public interface OracleMapper { void procNoParam(); } ``` 在MapperTest.java文件中,可以编写测试代码来调用存储过程。例如: ```java ...

    MyBatis调用MYSQL存储过程

    MyBatis调用MYSQL存储过程 返回多行 引用的包: asm-3.1.jar cglib-2.2.jar commons-logging-1.1.1.jar log4j-1.2.13.jar mybatis-3.0.4.jar mysql-connector-java-5.1.13.jar slf4j-api-1.5.8.jar slf4j-log4j12-...

    springboot mybatis 动态调用oracle存储过程,通过存储过程名称,就能动态调用存储过程、java动态调用or

    能不能写个动态的业务,只输入存储过程名称,自动获取存储过程参数,并且参数的数据从前台传递过来...只根据输入不同的存储过程名称、参数内容,自动调用不同的存储过程。 已经使用在多个项目中 全开源项目 请放心下载

    mybatis调用存储过程的实例代码

    MyBatis调用存储过程的实例代码 MyBatis是一个基于Java的持久层框架,提供了对数据库的访问和操作。存储过程是一种编译好的SQL语句,能够实现复杂的业务逻辑。下面是一个关于MyBatis调用存储过程的实例代码,通过这...

    Mybatis调用MySQL存储过程的简单实现

    调用存储过程则使用`CALL`关键字: ```sql CALL sp_name([参数列表]); ``` 删除存储过程的命令是`DROP PROCEDURE`,需要注意的是,不能在一个存储过程中删除另一个存储过程。 MyBatis调用MySQL存储过程的实现通常...

    spring mvc + mybatis 调用mysql 存储过程

    这里,我们将使用MyBatis的SqlSession对象,通过Mapper接口来调用存储过程。 1. 配置MyBatis: 在Spring MVC项目中,你需要配置MyBatis与Spring的整合,这通常涉及到`mybatis-config.xml`,`sqlSessionFactory`和`...

    mybatis调用orclae存储过程

    然后,在对应的Mapper XML文件(`EmployeeMapper.xml`)中,编写调用存储过程的SQL语句: ```xml {call INSERT_EMPLOYEE(#{employeeId, mode=IN, jdbcType=NUMERIC}, #{firstName, mode=IN, jdbcType=VARCHAR}...

    Mybatis调用PostgreSQL存储过程实现数组入参传递

    当与PostgreSQL数据库配合使用时,可能会遇到需要调用存储过程或自定义函数的情况,特别是当这些函数接收数组作为参数时。本篇文章将详细介绍如何在MyBatis中调用PostgreSQL存储过程,尤其是如何处理数组类型的入参...

    mybatis调用储存过程

    在调用存储过程时,我们需要利用MyBatis提供的API和配置机制来实现。 1. **配置MyBatis**:在`mybatis-config.xml`配置文件中,你需要添加数据库连接信息,例如数据源、驱动类等。同时,也需要将你的Mapper接口文件...

    JAVA通过MyBatis调用MySql存储过程和函数doc文档合集整理.zip

    - 调用存储过程和函数可能涉及多条SQL语句,MyBatis的事务管理机制能确保操作的原子性。 - 可以手动控制事务,如在Service层开启和提交,或使用Spring的声明式事务管理。 7. **性能优化** - 合理设计存储过程和...

    mybatis调用mysql存储过程

    注意`statementType="CALLABLE"`表明这是一个调用存储过程的语句,而`#{}`是MyBatis的占位符,用于传递参数。 4. **调用存储过程**: 在Java代码中,通过SqlSession对象的`selectOne`或`execute`方法来调用Mapper...

    Java调用存储过程--传入集合参数

    ### Java调用存储过程——传入集合参数:深入解析与实践 #### 核心知识点概览 在Java应用中,调用数据库存储过程时,往往需要处理复杂的参数传递,特别是当参数为集合类型时,这一过程变得更加具有挑战性。本文将...

Global site tag (gtag.js) - Google Analytics