Mybatis调用程序包或者存储过程

mybatis的mapper.xml文件里面可以写各种各样的SQL,其中CRUD标签中有一个属性那就是statementType,它有三个值:
1、STATEMENT:直接操作sql,不进行预编译,获取数据:$—Statement 

实现动态传入表名、列名:sql里的属有变量取值都改成${xxxx},而不是#{xxx}

	<selete id="dbCode" parameterType="java.util.Map" statementType="STATEMENT">  
		select * from ${table}  where name = '${userName}'  and sex = ${sex}
	</selete>

2、PREPARED:预处理,参数,进行预编译,获取数据:#—–PreparedStatement:默认 (这个就不举例了)

3、CALLABLE:执行存储过程————CallableStatement 

这里以调用程序包为例子:
1,编写一个调用程序包的参数实体

public class WmsDjMtlProcessExt {
    private String pUser;
    private BigDecimal pOrganizationId;
    private String pMtlNumber;
    private String xReturnStatus;
    private String xReturnMessage;
    private String xMtlStatus;
	//省略get和set方法
}

2,编写好mapper和mapper.xml

@Repository
public interface WmsDjMtlProcessExtMapper {

    void resolveDjMtlProcess(WmsDjMtlProcessExt wmsDjMtlProcessExt);
}

mode 属性允许你指定 IN,OUT 或 INOUT 参数。如果参数为 OUT 或 INOUT,参数对象属性的真实值将会被改变,就像你在获取输出参数时所期望的那样。如果 mode 为 OUT(或 INOUT),而且 jdbcType 为 CURSOR(也就是 Oracle 的 REFCURSOR),你必须指定一个 resultMap 来映射结果集到参数类型。要注意这里的 javaType 属性是可选的,如果左边的空白是 jdbcType 的 CURSOR 类型,它会自动地被设置为结果集。
#{xMtlStatus, mode=OUT, jdbcType=CURSOR, javaType=ResultSet, resultMap=xxMap}
如果是结构体,但是当注册 out 参数时你必须告诉它语句类型名称。比如(再次提示,在实际中要像这样不能换行)
#{middleInitial, mode=OUT, jdbcType=STRUCT, jdbcTypeName=MY_TYPE, resultMap=xxMap}
注意:调用的时候参数的位置不能颠倒,要和数据库中的位置保持一致,比如数据库中的程序包:

CREATE OR REPLACE PACKAGE wms_dj_mtl_process_pkg AS

  PROCEDURE main(x_return_status   OUT NOCOPY VARCHAR2,
                 x_return_message  OUT NOCOPY VARCHAR2,
                 x_mtl_status      OUT NOCOPY VARCHAR2,
                 p_user            IN varchar2,
                 p_organization_id IN NUMBER,
                 p_mtl_number      IN VARCHAR2);
END wms_dj_mtl_process_pkg;

那么xml中应该是这样:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yun.demo.WmsDjMtlProcessExtMapper">

    <select id="resolveDjMtlProcess"
            parameterType="com.yun.demo.extentity.WmsDjMtlProcessExt"
            statementType="CALLABLE">
        {CALL wms_dj_mtl_process_pkg.main(
                #{xReturnStatus,mode=OUT,jdbcType=VARCHAR},
                #{xReturnMessage,mode=OUT,jdbcType=VARCHAR},
                #{xMtlStatus,mode=OUT,jdbcType=VARCHAR},
                #{pUser,mode=IN},
                #{pOrganizationId,mode=IN},
                #{pMtlNumber,mode=IN})}
    </select>

</mapper>

3,然后就来调用程序包

public interface WmsDjMtlProcessService {
    String completeWipProcess();

}
@Service
public class WmsDjMtlProcessServiceImpl implements WmsDjMtlProcessService {
    @Autowired
    private WmsDjMtlProcessExtMapper wmsDjMtlProcessExtMapper;

    @Override
    public String completeWipProcess() {

        //定义调用存储过程的对象
        WmsDjMtlProcessExt mtlExt = new WmsDjMtlProcessExt();
        mtlExt.setpUser("system");
        mtlExt.setpOrganizationId(new BigDecimal("1"));
        mtlExt.setpMtlNumber("1101");

        //调用存储过程获取返回状态码和返回值
        wmsDjMtlProcessExtMapper.resolveDjMtlProcess(mtlExt);
        String xReturnStatus = mtlExt.getxReturnStatus();
        String xReturnMessage = mtlExt.getxReturnMessage();
		
		return xReturnStatus + ":" +xReturnMessage;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值