MyBatis调用Oracle存储过程

创建 USER_TAB

CREATE TABLE `user_tab` (
  `user_code` int(255) NOT NULL,
  `user_name` varchar(255) DEFAULT NULL,
  `sex` varchar(255) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `addr` varchar(255) DEFAULT NULL,
  `create_time` datetime DEFAULT NULL,
  PRIMARY KEY (`user_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

输出单值参数

存储过程

CREATE OR REPLACE PROCEDURE getUserNameByCode(code NUMBER,name OUT VARCHAR2)
AS
BEGIN
	SELECT user_name INTO name FROM user_tab WHERE user_code = code;
END;

实体类

@Data
public class User {
	private Integer userCode;
	private String userName;
	private String sex;
	private Integer age;
	private String addr;
	private Date createTime;
	private List<User> userinfo;
}

Dao层

@Mapper
public interface MainDao {
	void getUserNameByCode(User user);
}

MyBatis

<select id="getUserNameByCode" statementType="CALLABLE">
	{call getUserNameByCode(#{userCode},#{userName,mode=OUT,jdbcType=VARCHAR})}
</select>

输入参数 mode=IN,jdbcType=INTEGER 两个属性可不写,输出参数必须要写,且值要大写否则会出错。jdbcType与数据库数据类型的对应关系在文章末尾有链接。

Controller

@Resource
MainDao mainDao;

@RequestMapping("/getUserNameByCode")
public void getUserNameByCode(User user) {
	mainDao.getUserNameByCode(user);
	System.out.println(user);
}

访问 http://localhost:8080/getUserNameByCode?userCode=2022001 ,输出结果如下。

User(userCode=2022001, userName=胡桃, sex=null, age=null, addr=null, createTime=null, userinfo=null)

可以看出userName参数的值已经输出。

输出游标结果集

存储过程

CREATE OR REPLACE PROCEDURE getUserInfoByCode(code NUMBER,userinfo OUT SYS_REFCURSOR)
AS
BEGIN
	OPEN userinfo FOR SELECT * FROM user_tab WHERE user_code = code;
END;

SYS_REFCURSOR 用于返回结果集

Dao层

@Mapper
public interface MainDao {
	void getUserInfoByCode(User user);
}

MyBatis

<resultMap id="userMap" type="com.mp.entity.User"/>
<select id="getUserInfoByCode" statementType="CALLABLE">
	{call getUserInfoByCode(#{userCode},#{userinfo, mode=OUT, jdbcType=CURSOR, javaType=ResultSet, resultMap=userMap})}
</select>

javaType=ResultSet, resultMap=userMap 两个参数是返回结果集必须要写。resultMap=userMap 指定结果集每条记录的封装规则。表中若存在下划线字段,需要开启MyBatis下划线转驼峰式大小写或者在resultMap中配置规则。

MyBatis下划线转驼峰需要在配置文件 application.yml 里配置

mybatis:
  mapper-locations: classpath:/mapper/*.xml
  configuration:
    #映射下划线到驼峰式大小写
    map-underscore-to-camel-case: true

resultMap规则

<resultMap id="userMap" type="com.mp.entity.User">
	<id column="USER_CODE" property="userCode"/>
	<result column="USER_NAME" property="userName"/>
	<result column="CREATE_TIME" property="createTime"/>
</resultMap>

column 对应表字段,property 对应实体类属性。type 除了可以指定实体接收,还可以指定Map接收。

把type的类型改为 java.util.HashMap Dao层传入的参数改为Map类型即可。

Controller

@Resource
MainDao mainDao;

@RequestMapping("/getUserInfoByCode")
public void getUserInfoByCode(User user) {
	mainDao.getUserInfoByCode(user);
	System.out.println(user);
}

访问 http://localhost:8080/getUserInfoByCode?userCode=2022001 ,输出结果如下

User(userCode=2022001, userName=null, sex=null, age=null, addr=null, createTime=null, userinfo=[User(userCode=2022001, userName=胡桃, sex=女, age=18, addr=往生堂, createTime=Fri Mar 25 10:55:40 CST 2022, userinfo=null)])

可以看出userinfo参数的结果集已经输出。

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片