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

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

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

您可以使用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中调用此方法。

您可以尝试使用此方法从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 callParams = new HashMap(); callParams.put("parameter1", value); Map outputMap = jdbcCall.execute(callParams); } 

}