簡體   English   中英

如何使用hibernate在spring boot中調用MySQL存儲過程?

[英]how to call MySQL stored procedure in spring boot using hibernate?

我在MySQL 存儲過程中編寫了一些邏輯 e.我正在使用帶有 hibernate 的 spring boot 我有一個帶有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. 在我的登錄控制器中,我想調用我的程序,以便我可以將我的用戶轉發到儀表板。如果用戶輸入錯誤的用戶 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<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
    }
}

然后,在注入LoginService后,您可以從 Controller 調用此方法。

試試這個簡單的解決方案,我使用 Spring boot 和 Sql Server-在您的存儲庫中

1) 無參數

@Query(value = "{call yourSpName()}", nativeQuery = true) List<Map<String, Object>> methodName();

2) 帶參數

@Query(value = "{call yourSpName(:param1)}", nativeQuery = true) List<Map<String, Object>> methodName(@Param("param1")Long param1);

您可以嘗試使用此方法從 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<String, String> callParams = new HashMap<String, String>();
    callParams.put("parameter1", value);

    Map<String, Object> outputMap = jdbcCall.execute(callParams);
}

}

這對我使用 jdbctempate 有效

   SimpleJdbcCall jdbcCall =  new SimpleJdbcCall(jdbcTemplate).withProcedureName("your procedure name");

    Map<String, Object> inParamMap = new HashMap<>();

    inParamMap.put("input of your procedure", value of input);

    SqlParameterSource in = new MapSqlParameterSource(inParamMap);

    Map<String, Object> call = jdbcCall.execute(in);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM