当前位置:   article > 正文

mysql的过程调用_mysql过程中调用过程

mysql过程中调用过程

有参数的存储过程的调用.

没有参数的存储过程的调用就不写参数就行了

 

DELIMITER $$

USE `tensquare_article`$$

DROP PROCEDURE IF EXISTS `pro`$$

CREATE DEFINER=`root`@`%` PROCEDURE `pro`(OUT uname VARCHAR(50),OUT upwd VARCHAR(50),IN uid INT)
BEGIN
   SELECT NAME,state  INTO uname,upwd   FROM tb_channel WHERE id=1;
    END$$

DELIMITER ;

 

 

CALL pro(@uname,@upwd,5);
SELECT @uname,@upwd ;

 

存储过程的调用

https://www.cnblogs.com/abcwt112/p/5145870.html

上这方面的例子不是很多,研究了一下,列出几个调用的方法.

假如我们有一个mysql的存储过程

CREATE DEFINER=`root`@`localhost` PROCEDURE `plus1inout`(IN ARG INT, OUT res INT)
BEGIN 
    SET res = ARG + 1;
END

就是传入一个int参数,返回这个参数+1.

如果我们要调用这个存储过程的话.可以这么做.

 

标注entity

复制代码

package com.labofjet.entity;

import javax.persistence.Embedded;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.NamedStoredProcedureQueries;
import javax.persistence.NamedStoredProcedureQuery;
import javax.persistence.ParameterMode;
import javax.persistence.StoredProcedureParameter;

@Entity
@NamedStoredProcedureQueries({
        @NamedStoredProcedureQuery(name = "User.plus1", procedureName = "plus1inout", parameters = {
                @StoredProcedureParameter(mode = ParameterMode.IN, name = "arg", type = Integer.class),
                @StoredProcedureParameter(mode = ParameterMode.OUT, name = "res", type = Integer.class) }),
        @NamedStoredProcedureQuery(name = "User.mytest", procedureName = "mytest") })
public class A {
    @EmbeddedId
    APK id;

    String age;

    @Embedded
    AComponent acomponent;

    public AComponent getAcomponent() {
        return acomponent;
    }

    public void setAcomponent(AComponent acomponent) {
        this.acomponent = acomponent;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public APK getId() {
        return id;
    }

    public void setId(APK id) {
        this.id = id;
    }

    @Override
    public int hashCode() {
        // TODO Auto-generated method stub
        System.out.println("Ahash");
        return super.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        // TODO Auto-generated method stub
        System.out.println("Aequals");
        return super.equals(obj);
    }
}

复制代码

随便找一个entity就可以了如果有多个存储过程,可以用@NamedStoredProcedureQueries就像我上面一样.如果只有1个存储过程,可以用@NamedStoredProcedureQuery代替@NamedStoredProcedureQueries.

@StoredProcedureParameter 是用来标注存储过程的参数的..没啥特别的.只是要注意name和数据库里的参数名字一样.

@NamedStoredProcedureQuery里面procedureName 也要与数据库中存储过程的名字一样.而name可以自己取值,与数据库没有关系

 

标注repository的方法

复制代码

package com.labofjet.repository;

import java.util.List;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.query.Procedure;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import com.labofjet.entity.A;
import com.labofjet.entity.APK;

@Repository
public interface ARepository extends JpaRepository<A, APK>{
    
    @Procedure
    Integer plus1inout(Integer arg);
    
    @Procedure(name="plus1")
    Integer alias1(Integer arg);
    
    @Procedure(procedureName="plus1inout")
    Integer alias2(Integer arg);
    
    @Procedure(name="User.plus1")
    Integer alias3(@Param("arg")Integer argAlias);
    
    @Procedure
    Object[] mytest();
}

复制代码

entity A对应的repository里有多中方法都可以找到那个存储过程

    @Procedure
    Integer plus1inout(Integer arg);
    
    @Procedure(name="plus1")
    Integer alias1(Integer arg);
    
    @Procedure(procedureName="plus1inout")
    Integer alias2(Integer arg);
    
    @Procedure(name="User.plus1")
    Integer alias3(@Param("arg")Integer argAlias);

上面4个方法中只有

Integer alias1(Integer arg);

这个方法不行,其他3种方法都可以..其实我觉得alias1应该也是可以的...不知道是不是bug....

    @Procedure
    Integer plus1inout(Integer arg);

用上面这个方法的话方法名要与存储过程名一样.

    @Procedure(name="plus1")
    Integer alias1(Integer arg);

用alias1这个方法的话会报错.可以考虑改成alias3那种方法.为方法的参数增加@Param注解,就不会报错了.(我觉得这是个bug)

    @Procedure(procedureName="plus1inout")
    Integer alias2(Integer arg);

上面这种方法的话需要将procedure设置成数据库里存储过程的名字,好处与alias3一样,就是方法名随便自己取,相比plus1inout方法名只能固定,更灵活一些.

 

感觉以上3种可行的方法里第一种最简单..什么注解的属性都不用写..唯一要求的就是方法的名字与存储过程名字一样.

 

其他

感觉spring data jpa 调用存储过程还是比较简单的.但是如果存储过程返回一个结果集的话好像不能很好的处理..(看了很多参考.都没有什么好的解决办法..后续有新发现再更新)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/583906
推荐阅读
相关标签
  

闽ICP备14008679号