加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 04:41:41 所属栏目:Java 来源:网络整理
导读:我在 MySQL存储过程中写了一些逻辑.我正在使用带有hibernate的spring boot.我有一个IN OUT参数的登录程序.从我的登录程序,我想传递给用户的消息.但我不知道如何在Spring启动时调用存储过程.我的代码如下: 我的登录程序是 CREATE PROCEDURE login(IN in_user
我在 MySQL存储过程中写了一些逻辑.我正在使用带有hibernate的spring boot.我有一个IN OUT参数的登录程序.从我的登录程序,我想传递给用户的消息.但我不知道如何在Spring启动时调用存储过程.我的代码如下:

>我的登录程序是

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",@StoredProcedureParameter( name = "out_code",type = Integer.class,mode = ParameterMode.OUT),@StoredProcedureParameter( name = "out_message",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>{


 }

解决方法

您可以使用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,ParameterMode.IN);
        query.registerStoredProcedureParameter(3,Integer.class,ParameterMode.OUT);
        query.registerStoredProcedureParameter(4,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中调用此方法.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读