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;
}
}