当前位置: 首页 > 面试题库 >

如何使用休眠在Spring Boot中调用MySQL存储过程?

季华茂
2023-03-14
问题内容

我已经在 MySQL存储过程 e中编写了一些逻辑。我正在将 spring boot与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;
  1. 我用过像
        @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
      }
  1. 在我的登录控制器中,我想调用我的过程,以便可以将我的用户转发到仪表板。如果用户输入了错误的用户名或密码,我想显示过程中的消息。我在登录控制器中使用了波纹管代码
        @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";
    }
  1. 我已经使用了存储库,但是这里没有写任何东西。我已经用过波纹管了..

       public interface LoginRepository  extends CrudRepository<LoginModel, Integer>{
    

    }


问题答案:

您可以使用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
    }
}

然后,您可以在注入之后从Controller调用此方法LoginService



 类似资料:
  • 问题内容: 我在使用hibernate和MySQL时遇到了一些问题。我一直在读书,但我变得更加困惑,所以我想你可以帮助我理解下一步该怎么做。 我有一个MySQL数据库,在其中添加了此存储过程(感谢Stack Overflow的人们) 我读过某个地方,使用hibernate模式调用函数和过程将非常相似。然后,我发现(巧合地也在StackOverflow中)使用Hibernate从我的Java应用程序

  • 问题内容: 我可以使用Hibernate条件来调用存储过程吗? 问题答案: 请参阅参考文档中的使用存储过程进行查询。 映射的查询这样来称呼。 映射查询可以返回实体。

  • 问题内容: 我在任何地方都找不到此答案,但是可以从MySQL中的另一个存储过程调用存储过程吗?我想找回标识值,并在父存储过程中使用它。我们不能再使用FUNCTIONS! 问题答案: 参数应该可以帮助您将值返回给调用过程。基于此,解决方案必须是这样的。

  • 我阅读了如何在JPA中调用mysql存储过程 调用存储过程jpa 但是我的程序api没有输出passe! 如何在spring数据jpa中调用它并返回结果 Java实体 我的回购 还有我的测试 out p6间谍通话没问题!但在日志中 16:26:30[INFO][main] [] [] LocalContainerEntityManagerFactoryBean:初始化的JPA EntityMana

  • 问题内容: 我试图使用Hibernate从Java调用Oracle9i DB中的遗留存储函数。该函数的声明如下: 经过几次失败的尝试和广泛的谷歌搜索之后,我在Hibernate论坛上发现了该线程,该线程建议了如下映射: 我执行它的代码是 结果日志是 任何提示我在做什么错?还是调用此存储函数的更好方法? 更新: 尝试@axtavt的建议时,出现以下错误: 该函数确实进行了大量的插入/更新,因此我想运