mybatis 存储过程

  MyBatis还能对存储过程进行完全支持,这节开始学习存储过程。在讲解之前,我们需要对存储过程有一个基本的认识,首先存储过程是数据库的一个概念,它是数据库预先编译好,放在数据库内存中的一个程序片段,所以具备性能高,可重复使用的特性。它定义了3种类型的参数:输入参数、输出参数、输入输出参数。
  •输入参数,是外界给的存储过程参数,在Java互联网中,也就是互联网系统给它的参数。
  •输出参数,是存储过程经过计算返回给程序的结果参数。
  •输入输出参数,是一开始作为参数传递给存储过程,而存储过程修改后将其返回的参数,比如那些商品的库存就是这样的。
  对于返回结果而言,一些常用的简易类型,比如整形、字符型OUT或者INOUT参数是Java程序比较好处理的,而存储过程还可能返回游标类型的参数,这需要我们处理,不过在MyBatis中,这些都可以轻松完成。

IN和OUT参数存储过程

  先讨论IN和OUT参数的基本用法,这里使用的是Oracle数据库,它对存储过程有着较好的支持,下面先定义一个场景。
  根据角色名称进行模糊查询其总数,然后把总数和查询日期返回给调用者。为此先建一个简单的存储过程,在Oracle的命令行输入存储过程,如代码清单的代码。

CREATE OR REPLACE
PROCEDURE count_role (
    p_role_name IN VARCHAR,
    count_total out INT,
    exec_date out DATE
) IS
BEGIN
    SELECT COUNT (*) INTO count_total
    FROM "t_role"
    WHERE "role_name" LIKE ‘%‘ || p_role_name || ‘%‘ ;
    SELECT SYSDATE INTO exec_date FROM dual;
END ;
public class PdCountRoleParams {
    private String roleName;
    private int total;
    private Date execDate;
}
    <select id="countRole" parameterType="com.xc.pojo.procedures.PdCountRoleParams" statementType="CALLABLE">
        {call count_role(#{roleName, mode=IN, jdbcType=VARCHAR},
                         #{total, mode=OUT, jdbcType=INTEGER},
                         #{execDate, mode=OUT, jdbcType=DATE})}
    </select>

•指定statemetType为CALLABLE,说明它是在使用存储过程,如果不这样声明那么这段代码将会抛出异常。
•定义了parameterType为PdCountRoleParams参数。
•在调度存储过程中放入参数对应的属性,并且在属性上通过mode设置了其输入或者输出参数,指定对应的jdbcType,这样MyBatis就会使用对应的typeHandler去处理对应的类型转换。

PdCountRoleParams params = new PdCountRoleParams();SqlSession sqlSession = null;try {

    sqlSession = SqlSessionFactoryUtils.openSqlSession();    RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);    params.setRoleName("法师");    roleMapper.countRole(params);    System.out.println(params.getRoleName());    System.out.println(params.getTotal());    System.out.println(params.getExecDate());

} catch (Exception e) {    e.printStackTrace();} finally {    if (sqlSession != null) {        sqlSession.close();    }}

原文地址:https://www.cnblogs.com/ooo0/p/10951871.html

时间: 2024-10-09 01:01:28

mybatis 存储过程的相关文章

MyBatis学习之简单增删改查操作、MyBatis存储过程、MyBatis分页、MyBatis一对一、MyBatis一对多

一.用到的实体类如下: Student.java [html] view plaincopy package com.company.entity; import java.io.Serializable; import java.util.Date; public class Student implements Serializable{ private static final long serialVersionUID = 1L; private int id; private Stri

mybatis 存储过程调用

接口 UserInfoMapper.java xml   UserInfoMapper.xml 如何关联 <?xml version="1.0" encoding="GBK" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <

mybatis 存储过程的写法

(注意事项: 在使用游标的时候,不能在游标声明之前,使用crud) 存储过程示例 CREATE DEFINER=`root`@`::1` PROCEDURE `earnings_proceduce`(out result varchar(100)) label:BEGIN #收益记录的分配 # 基本参数的定义 # 总金额 DECLARE _total_money BIGINT DEFAULT 0; # 发放配置占比 DECLARE _deduct BIGINT; # 待发放金额 DECLARE

Mybaits(14)存储过程

一.MyBatis存储过程调用 1.创建存储过程 CREATE PROCEDURE save_user_info ( OUT id INTEGER, IN user_name VARCHAR ( 20 ), IN real_name VARCHAR ( 20 ), IN sex VARCHAR ( 20 ), IN moble VARCHAR ( 20 ), IN email VARCHAR ( 20 ), IN note VARCHAR ( 20 ) ) BEGIN INSERT INTO t

mybatis-sqlsource2

2. SqlSource org.apache.ibatis.mapping.SqlSource ,SQL 来源接口.它代表从 Mapper XML 或方法注解上,读取的一条 SQL 内容.代码如下: // SqlSource.java /** * Represents the content of a mapped statement read from an XML file or an annotation. * It creates the SQL that will be passed

MyBatis入门学习教程-调用存储过程

一.提出需求 查询得到男性或女性的数量, 如果传入的是0就女性否则是男性 二.准备数据库表和存储过程 1 create table p_user( 2 id int primary key auto_increment, 3 name varchar(10), 4 sex char(2) 5 ); 6 7 insert into p_user(name,sex) values('A',"男"); 8 insert into p_user(name,sex) values('B',&qu

mybatis调用存储过程

最近在研究mybatis调用存储过程,发表一下自己的学习心得 其中最好用的就是通过map传值,结果还用这个map接收,因为map是一个非常强大的东西,有时候存储过程要操作多张表. 比如说:往多张表插入数据,用JavaBean的方式就很难做到,参数对应多个实体类不好解决,用map就能完美的解决这个问题. Map<String, Object> map=new HashMap<String, Object>把需要的参数往里面一放,就能很容易解决问题 dao层(dao接口),在dao接口

MyBatis学习总结(六)——调用存储过程(转载)

孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(六)--调用存储过程 一.提出需求 查询得到男性或女性的数量, 如果传入的是0就女性否则是男性 二.准备数据库表和存储过程 1 create table p_user( 2 id int primary key auto_increment, 3 name varchar(10), 4 sex char(2) 5 ); 6 7 insert into p_user(name,sex) values('A',"男");

mybatis调用oracle存储过程

存储过程在小公司用的不多,但是如果业务比较复杂或者性能要求比较苛刻的时候存储过程就派上用场了,ibatis的前期的一些版本貌似不支持存储过程因此我选择了mybatis来做实验. 1.无输入和输出参数的存储过程 我写了一个比较简单的,需要注意的是Oracle无参存储过程不能写括号 CREATE OR REPLACE Procedure cascadeoperation As Begin  Delete From teacher Where id=1;  Update studentdetail S