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

标签 java mysql spring hibernate stored-procedures

我在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. 在我的登录 Controller 中,我想调用我的过程,以便我可以将我的用户转发到仪表板。如果用户输入错误的用户 ID 或密码,我想显示来自过程的消息。我在我的登录 Controller 中使用了以下代码

    @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. 我用过repository,但是这里没有写任何东西。我已经使用了下面的存储库......

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

最佳答案

您可以使用 javax.persistence.StoredProcedureQuery 调用存储过程。你甚至不需要在你的实体上声明任何东西。
我建议将过程调用逻辑移至服务,然后从您的 Controller 调用服务方法。

例如:

@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
    }
}

然后,在注入(inject) LoginService 后,您可以从 Controller 调用此方法。

关于java - 如何使用hibernate在spring boot中调用MySQL存储过程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48281009/

相关文章:

java - 使用java中嵌入的neo4j进行查询

java - Ant - 设置 ClassPath 对于批量测试不起作用

java - 基于垂直搜索栏调整图像大小?

mysql - Django:保存到数据库 connundrun

mysql - 如何使用特定格式插入当前日期时间

Java JRadioButton

php - 跳过不符合 Mysql 排序排名所需值的行中的排名?

java - 有没有办法在不使用 Spring-MVC 的情况下使用 spring-data-rest 编写一个 rest Controller 来上传文件?

java - 使用命令行参数将值注入(inject)spring

spring - 如何使用 Spring Rest 和 PagingAndSortingRepository 返回 400 响应