gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 07:12:23 26 4
gpt4 key购买 nike

我在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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com