【问题标题】:how to call MySQL stored procedure in spring boot using hibernate?如何使用hibernate在spring boot中调用MySQL存储过程?
【发布时间】:2018-06-25 03:32:34
【问题描述】:

我在 MySQL 存储过程e 中编写了一些逻辑。我正在使用 spring boot with hibernate。我有一个带有 IN OUT 参数的登录程序。从我的登录过程中,我想将消息传递给用户。但我不知道如何在 Spring Boot 中调用存储过程。我的代码如下..

  1. 我的登录程序是

    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;
    
  2. 我用过像

    这样的实体类
    @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
      }
    
  3. 在我的登录控制器中,我想调用我的程序,以便我可以将我的用户转发到仪表板。如果用户输入错误的用户 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";
    }
    
  4. 我使用了存储库,但它没有在这里写任何东西。我已经像下面这样使用了存储库..

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

【问题讨论】:

    标签: java mysql spring hibernate stored-procedures


    【解决方案1】:

    您可以使用 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 之后,您可以从 Controller 调用此方法。

    【讨论】:

    • 我试过了,但它对我不起作用。不知何故,我总是将null 作为输出参数值。我已经在此发布了一些内容。也许你可以帮我解决这个问题? stackoverflow.com/questions/57527592/…
    【解决方案2】:

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

    1) 无参数

    @Query(value = "{call yourSpName()}", nativeQuery = true) List<Map<String, Object>> methodName();

    2) 带参数

    @Query(value = "{call yourSpName(:param1)}", nativeQuery = true) List<Map<String, Object>> methodName(@Param("param1")Long param1);

    【讨论】:

      【解决方案3】:

      你可以试试这个方法从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);
      }
      

      }

      【讨论】:

        【解决方案4】:

        这适用于我使用 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);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-03-20
          • 2012-12-30
          • 1970-01-01
          • 1970-01-01
          • 2011-06-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多