Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用hibernate在spring boot中调用MySQL存储过程?_Java_Mysql_Spring_Hibernate_Stored Procedures - Fatal编程技术网

Java 如何使用hibernate在spring boot中调用MySQL存储过程?

Java 如何使用hibernate在spring boot中调用MySQL存储过程?,java,mysql,spring,hibernate,stored-procedures,Java,Mysql,Spring,Hibernate,Stored Procedures,我已经在MySQL存储过程中编写了一些逻辑。我正在使用带有hibernate的spring boot。我有一个带有IN-OUT参数的登录过程。从我的登录过程中,我想将消息传递给用户。但我不知道如何在Spring boot中调用存储过程。我的密码是贝娄 我的登录程序是 CREATE PROCEDURE login(IN in_user_id varchar(100), IN in_password varchar(100),

我已经在MySQL存储过程中编写了一些逻辑。我正在使用带有hibernate的spring boot。我有一个带有IN-OUT参数的登录过程。从我的登录过程中,我想将消息传递给用户。但我不知道如何在Spring boot中调用存储过程。我的密码是贝娄

  • 我的登录程序是

    CREATE PROCEDURE login(IN  in_user_id    varchar(100),
                               IN  in_password   varchar(100),
                               OUT out_code      INT,
                               OUT out_message   varchar(100))
     BEGIN
        IF in_user_id IS NULL OR in_user_id = ''
         THEN
         SET out_code = 1;
         SET out_message = 'Please Enter Your First Name.';
       END IF;
     /*Logi Here*/
    
     END;
    
  • 我使用了实体类,比如

    @Entity
    @Table(name = "user")
     @NamedStoredProcedureQueries({
       @NamedStoredProcedureQuery(
       name = "do_login", 
       procedureName = "login", 
       resultClasses = { LoginModel.class },    
       parameters = { 
          @StoredProcedureParameter( name = " in_user_id",  type = String.class,  mode = ParameterMode.IN),
          @StoredProcedureParameter( name = "in_password",  type = String.class,  mode = ParameterMode.IN),
          @StoredProcedureParameter( name = "out_code",  type = Integer.class,  mode = ParameterMode.OUT), 
          @StoredProcedureParameter( name = "out_message",  type = String.class,  mode = ParameterMode.OUT)
    
         }),
    
     })
    
     public class LoginModel implements Serializable {
    
       @NotEmpty
       private String userid;
    
       @NotEmpty
       private String password;
    
      //Here is getter setter
      }
    
  • 在我的登录控制器中,我想调用我的过程,以便将我的用户转发到仪表板。如果用户输入了错误的用户id或密码,我想显示来自过程的消息。我在我的登录控制器中使用了下面的代码

    @RequestMapping(value = "/login", method = RequestMethod.POST)
     public String doLogin(@ModelAttribute("webLoginForm") @Valid LoginModel registrationModel,
        BindingResult bindingResult, Model model, Errors error) {
         if(error.hasErrors()) {
             return "login";
         }
    
       // Here I want to check My Procedure result & redirect to welcome page
       //return "redirect:/welcome";
    
      return "login";
    }
    
  • 我使用过存储库,但它没有在这里写任何东西。我用过下面的例子,比如

       public interface LoginRepository  extends CrudRepository<LoginModel, Integer>{
    
    
     }
    
    public interface LoginRepository扩展了CrudRepository{
    }
    

  • 可以使用javax.persistence.StoredProcedureQuery调用存储过程。您甚至不需要在实体上声明任何内容。
    我建议将过程调用逻辑移动到服务,然后从控制器调用服务方法

    例如:

    @Service
    public class LoginServiceImpl implements LoginService {
    
        @PersistenceContext
        private EntityManager entityManager;
    
        public Boolean checkUsernameAndPassword(String username, String password) {
    
            //"login" this is the name of your procedure
            StoredProcedureQuery query = entityManager.createStoredProcedureQuery("login"); 
    
            //Declare the parameters in the same order
            query.registerStoredProcedureParameter(1, String.class, ParameterMode.IN);
            query.registerStoredProcedureParameter(2, String.class, ParameterMode.IN);
            query.registerStoredProcedureParameter(3, Integer.class, ParameterMode.OUT);
            query.registerStoredProcedureParameter(4, String.class, ParameterMode.OUT);
    
            //Pass the parameter values
            query.setParameter(1, username);
            query.setParameter(2, password);
    
            //Execute query
            query.execute();
    
            //Get output parameters
            Integer outCode = (Integer) query.getOutputParameterValue(3);
            String outMessage = (String) query.getOutputParameterValue(4);
    
            return true; //enter your condition
        }
    }
    

    然后,您可以从控制器调用此方法,在注入
    LoginService

    之后,您可以尝试使用此方法从Spring调用过程

    import java.util.HashMap;
    import java.util.Map;
    import oracle.jdbc.driver.OracleTypes;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.jdbc.core.SqlOutParameter;
    import org.springframework.jdbc.core.SqlParameter;
    import org.springframework.jdbc.core.simple.SimpleJdbcCall;
    
    public class MainApplicationMethod 
    
    {
    
    public static void main(String[] args) throws Exception {
    
        JdbcTemplate jdbcTemplate = new JdbcTemplate();
    
        SimpleJdbcCall jdbcCall = new SimpleJdbcCall(jdbcTemplate).withProcedureName("procedureName");
        jdbcCall.addDeclaredParameter(new SqlParameter("parameter1", OracleTypes.VARCHAR));
        jdbcCall.addDeclaredParameter(new SqlOutParameter("outParam1",OracleTypes.VARCHAR));
        String value=null;
        Map<String, String> callParams = new HashMap<String, String>();
        callParams.put("parameter1", value);
    
        Map<String, Object> outputMap = jdbcCall.execute(callParams);
    }
    
    import java.util.HashMap;
    导入java.util.Map;
    导入oracle.jdbc.driver.OracleTypes;
    导入org.springframework.jdbc.core.jdbc模板;
    导入org.springframework.jdbc.core.SqlOutParameter;
    导入org.springframework.jdbc.core.SqlParameter;
    导入org.springframework.jdbc.core.simple.SimpleJdbcCall;
    公共类MainApplicationMethod
    {
    公共静态void main(字符串[]args)引发异常{
    JdbcTemplate JdbcTemplate=新JdbcTemplate();
    SimpleJdbcCall jdbcCall=新的SimpleJdbcCall(jdbcTemplate).withProcedureName(“procedureName”);
    addDeclaredParameter(新的SqlParameter(“parameter1”,OracleTypes.VARCHAR));
    addDeclaredParameter(新的SqlOutParameter(“outParam1”,OracleTypes.VARCHAR));
    字符串值=null;
    Map callParams=new HashMap();
    callParams.put(“参数1”,值);
    Map outputMap=jdbcCall.execute(callParams);
    }
    

    }

    试试这个简单的解决方案,我使用Spring boot和Sql Server- 在您的存储库中

    1) 无参数

    @Query(value=“{call yourSpName()}”,nativeQuery=true)
    List methodName()

    2) 带参数

    @Query(value=“{call yourSpName(:param1)}”,nativeQuery=true)
    
    列表方法名称(@Param(“param1”)长param1)

    这对我使用jdbctempate很有效

       SimpleJdbcCall jdbcCall =  new SimpleJdbcCall(jdbcTemplate).withProcedureName("your procedure name");
    
        Map<String, Object> inParamMap = new HashMap<>();
    
        inParamMap.put("input of your procedure", value of input);
    
        SqlParameterSource in = new MapSqlParameterSource(inParamMap);
    
        Map<String, Object> call = jdbcCall.execute(in);
    
    SimpleJdbcCall jdbcCall=新的SimpleJdbcCall(jdbcTemplate).WithProcedureRename(“您的过程名称”);
    Map inParamMap=新的HashMap();
    put(“过程的输入”,输入的值);
    SqlParameterSource in=新映射SqlParameterSource(inParamMap);
    Map call=jdbcCall.execute(in);
    
    我尝试过这个,但它对我不起作用。不知何故,我总是将
    null
    作为OutputParameterValue。我已经在这上面贴了一些东西。也许你能帮我解决这个问题?