mybatis 可以执行mybatis 存储过程 out吗

存储过程与视图的比较--并且在mybatis中的实现过程 - 简书
存储过程与视图的比较--并且在mybatis中的实现过程
雇员基本信息表
雇员薪水信息表
两张表的联立视图查询:
创建视图的sql语句:
t_employee_info.employee_name,
t_employee_info.employee_age,
t_employee_info.employee_address,
t_salary_info.salary_id,
t_salary_info.time,
t_salary_info.money,
t_employee_info.employee_id
t_employee_info
INNER JOIN t_salary_info ON t_salary_info.employee_id = t_employee_info.employee_id
t_salary_info.money DESC
查询效果图
创建存储过程的sql语句:
#Routine body goes here...
t_employee_info.employee_name,
t_employee_info.employee_age,
t_employee_info.employee_address,
t_employee_info.employee_id,
t_salary_info.salary_id,
t_salary_info.time,
t_salary_info.money
FROM t_employee_info INNER JOIN t_salary_info
ON t_salary_info.employee_id = t_employee_info.employee_id
where t_employee_info.employee_id=employee_id
t_salary_info.money DESC limit 10;
存储过程employee_salary_function的创建效果图
mybatis的mapper.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.jm.dao.TEmployeeSalaryMapper"&
&resultMap id="BaseResultMap" type="com.jm.model.TEmployeeSalary"&
&result column="employee_id" property="employeeId" jdbcType="BIGINT" /&
&result column="employee_name" property="employeeName" jdbcType="VARCHAR" /&
&result column="employee_age" property="employeeAge" jdbcType="INTEGER" /&
&result column="employee_address" property="employeeAddress" jdbcType="VARCHAR" /&
&result column="salary_id" property="salaryId" jdbcType="BIGINT" /&
&result column="time" property="time" jdbcType="BIGINT" /&
&result column="money" property="money" jdbcType="BIGINT" /&
&/resultMap&
&!-- 调用存储过程查询 --&
&select id="loadByEmployeeId" parameterType="Long" statementType="CALLABLE" resultMap="BaseResultMap"&
{call employee_salary_function(#{employeeId,jdbcType=BIGINT,mode=IN})}
&!-- 调用视图查询 --&
&select id="loadByEmployeeIdView" resultMap="BaseResultMap"&
select * from v_employee_salary where employee_id=#{employeeId,jdbcType=BIGINT}
public class TEmployeeSalary {
private Long employeeId;
private String employeeN
private Integer employeeA
private String employeeA
private Long salaryId;
public String toString(){
return "employeeId:"+employeeId+", "+"employeeName:"+employeeName+", "+"employeeAge:"+employeeAge+", "+"employeeAddress:"+employeeAddress+", "+
"salaryId:"+salaryId+", "+"time:"+time+", "+"money:"+money+"-----------";
public Long getEmployeeId() {
return employeeId;
public void setEmployeeId(Long employeeId) {
this.employeeId = employeeId;
public String getEmployeeName() {
return employeeN
public void setEmployeeName(String employeeName) {
this.employeeName = employeeN
public Integer getEmployeeAge() {
return employeeA
public void setEmployeeAge(Integer employeeAge) {
this.employeeAge = employeeA
public String getEmployeeAddress() {
return employeeA
public void setEmployeeAddress(String employeeAddress) {
this.employeeAddress = employeeA
public Long getSalaryId() {
return salaryId;
public void setSalaryId(Long salaryId) {
this.salaryId = salaryId;
public Long getTime() {
public void setTime(Long time) {
this.time =
public Long getMoney() {
public void setMoney(Long money) {
this.money =
import java.util.L
import org.apache.ibatis.annotations.P
import com.jm.model.TEmployeeS
public interface TEmployeeSalaryMapper {
* loadByEmployeeId:根据雇员的id获取他的工资情况,存储过程的调用
* @author JM
下午11:17:54
* @param id
* List&TEmployeeSalary&
public List&TEmployeeSalary& loadByEmployeeId(@Param("employeeId")Long id);
* loadByEmployeeIdView:根据雇员的id获取他的工资情况,视图的调用
* @author JM
下午11:40:36
* @param id
* List&TEmployeeSalary&
public List&TEmployeeSalary& loadByEmployeeIdView(@Param("employeeId")Long id);
以上就是使用mybatis,调用视图查询以及存储过程的实现代码。许多情况下,对数据库进行多表查询可以使用视图进行联系多表,但是不建议使用视图进行查询(因为不可以输入参数,每次查询都需要全部查出来然后在挑选出符合条件的数据,这样大大拖慢了查询的速度),调用存储过程进行多表查询的好处就是先进性筛选然后在返回数据,这样的查询速度在数据量很大的情况下快的不是一星半点。虽然存储过程的使用可以大大提高查询速率,但是对于频繁操作的表本人强烈建议添加索引,这样效率更高。首先感谢网络上以为朋友。其实我不认识。看到他的博客才做出来。
/blog/1669879 他的地址。下面的是我一些简单拓展的
存储过程都是一样的,只是根据自己的喜好,可以用MAP或者JAVABEAN传递参数。
-- --------------------------------------------------------------------------------
-- Routine DDL
-- Note: comments before and after the routine body will not be stored by the server
-- --------------------------------------------------------------------------------
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `selectCount`(
IN pcsId int,
IN drId int,
IN partnerId int,
IN customerId int,
OUT pcsCount int,
OUT drCount int
select count(md.id) into @pcsC from mdm_device md
left join mdm_device_security mds on mds.device_id = md.id
where mds.device_rooted = pcsId
and md.partner_id = partnerId and md.customer_id = customerId;
set pcsCount = @pcsC;
select count(md.id) into @drC from mdm_device md
where md.managed_status = drId and
DATE_SUB(CURDATE(), INTERVAL 7 DAY) &= date(md.un_manage_date)
and md.partner_id = partnerId and md.customer_id = customerId;
set drCount = @drC;
1.java调用传入MAP。获取通过MAP获取。
1.1 mapper文件写法
&parameterMap type="map" id="homeVO"&
&parameter property="pcsId" jdbcType="INTEGER" mode="IN"/&
&parameter property="drId" jdbcType="INTEGER" mode="IN"/&
&parameter property="partnerId" jdbcType="INTEGER" mode="IN"/&
&parameter property="customerId" jdbcType="INTEGER" mode="IN"/&
&parameter property="pcsCount" jdbcType="INTEGER" mode="OUT"/&
&parameter property="drCount" jdbcType="INTEGER" mode="OUT"/&
&/parameterMap&
&select id="selectForHome" parameterMap="homeVO"
statementType="CALLABLE"&
{call selectCount(
?,?,?,?,?,?
1.2 java调用写法
public StringselectHomeCount(HomeVO home) throws Exception {
Map&String, Object& map = new HashMap&String, Object&();
map.put("pscId", 0);
map.put("drId", 1);
map.put("partnerId", 25);
map.put("customerId", 50);
map.put("isolation", 1);
selectOne("Mapper.selectForHome", map);
System.out.println(map.get("pcsCount"));
return map.get("drCount");
2.java调用传入javaBean。返回值通过javaBean属性获取
2.1 通过javabean传递参数
mapper写法
&parameterMap type="com.polysaas.mdm.device.entity.HomeVO" id="home"&
&parameter property="pcsId" jdbcType="INTEGER" mode="IN"/&
&parameter property="drId" jdbcType="INTEGER" mode="IN"/&
&parameter property="partnerId" jdbcType="INTEGER" mode="IN"/&
&parameter property="customerId" jdbcType="INTEGER" mode="IN"/&
&parameter property="pcsCount" jdbcType="INTEGER" mode="OUT"/&
&parameter property="drCount" jdbcType="INTEGER" mode="OUT"/&
&/parameterMap&
javaBean可以通过两种来进行映射
&resultMap type="com.polysaas.mdm.device.entity.HomeVO" id="home"&
&result column="partnerId" property="partnerId" jdbcType="INTEGER"/&
&result column="customerId" property="customerId" jdbcType="INTEGER" /&
&result column="pcsId" property="pcsId" jdbcType="INTEGER" /&
&result column="drId" property="drId" jdbcType="INTEGER" /&
&result column="pcsCount" property="pcsCount" jdbcType="INTEGER" /&
&result column="drCount" property="drCount" jdbcType="INTEGER" /&
&/resultMap&
&select id="selectForHome2" parameterType="com.polysaas.mdm.device.entity.HomeVO"
statementType="CALLABLE"&
{call selectCount(
#{pcsId,jdbcType=INTEGER, mode=IN},
#{drId, jdbcType=INTEGER,mode=IN},
#{partnerId, jdbcType=INTEGER,mode=IN},
#{customerId, jdbcType=INTEGER,mode=IN},
#{pcsCount, jdbcType=INTEGER,mode=OUT},
#{drCount, jdbcType=INTEGER,mode=OUT}
2.2 通过javabean传递参数
java调用写法
public HomeVO selectHomeCount(HomeVO home) throws Exception {
HomeVO vo = new HomeVO();
vo.setPcsId(0);
vo.setDrId(0);
vo.setPartnerId(25);
vo.setCustomerId(50);
vo.setPcsCount(0);
vo.setDrCount(0);
selectOne("com.polysaas.mdm.device.mapper.MdmDeviceMapper.selectForHome2", vo);
遇到异常很多。。记得的写下
1.通过javaBean的时候,#{pcsId, mode=IN, javaType=INTEGER},javaType这个属性是必须的。
2.使用javaBean传递。输出参数不需要初始值。个人喜好并建议使用javaBean,因为定义更清晰,封装性。
3.map可以用占位符问号,javaBean不可以。
会有异常 No value specified for parameter 1
说不认识某个参数。。可能是没有创建存储过程,这个发生在多个库的时候
这个可能是事务控制只读。。我是因为存储过程有set 语句,而方法叫做selectAaaa()。
浏览 15615
论坛回复 /
(0 / 7815)
浏览: 419763 次
来自: 天津
麻烦问一下 3.0
MatrixToImageWriter
/mongodb/s ...
选择安装Sql Server2000简体中文个人版之后并没有出 ...
是64位的win7系统不?我运行这就有问题了mybatis调用存储过程_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
mybatis调用存储过程
你可能喜欢中国领先的IT技术网站
51CTO旗下网站
Mybatis调用Oracle存储过程的方法介绍
本文主要介绍Mybatis调用Oracle存储过程的方法,这是自己通过网上的资料整合跑通的代码,希望能帮助到大家。
作者:小白-白白来源:| 11:48
1:调用无参数的存储过程。
创建存储过程:
Mapper.xml 配置:经测试其他标签(update、insert、select)也可以。
Mapper.java
MapperTest.java 测试
2:有参数的存储过程调用:
2.1存储过程的创建:
2.2Mapper.xml 的配置:
2.3Mapper.java
2.4MapperTest.java 测试
控制台输出:
3:存储过程的结果集调用。
3.1创建存储过程:
3.2 Mapper.xml 配置
配置 resultMap结果集字段
mybatis里就稍微有些不同了,此时jdbcType就是CURSOR,javaType则是ResultSet了,这里还可以把结果转成resultMap了,如下所示
3.3 Mapper.java
3.4 MapperTest.java 测试&
【编辑推荐】【责任编辑: TEL:(010)】
大家都在看猜你喜欢
头条热点头条热点头条
24H热文一周话题本月最赞
讲师:416332人学习过
讲师:125792人学习过
讲师:252497人学习过
精选博文论坛热帖下载排行
本书专门根据SUN官方的SCSA for Solaris 9&10考试大纲撰写而成,全面覆盖了SCSA for Solaris 9/10的认证考点,除此之外本书还有大量的非考...
订阅51CTO邮刊

我要回帖

更多关于 mybatis 写存储过程 的文章

 

随机推荐