Ich habe in MySQL gespeicherte Prozeduren e geschrieben. Ich benutze spring boot mit hibernate . Ich habe eine Login-Prozedur mit IN OUT Parametern. Ich möchte die Nachricht von meinem Anmeldevorgang an den Benutzer weiterleiten. Aber ich weiß nicht, wie man gespeicherte Prozeduren in Spring Boot aufruft. Mein Code ist unten ..
Meine Login-Prozedur ist
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;
Ich habe Entity-Klasse wie verwendet
@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
}
In Mein Login-Controller möchte ich meine Prozedur aufrufen, damit ich meinen Benutzer an das Dashboard weiterleiten kann. Wenn der Benutzer eine falsche Benutzer-ID oder ein falsches Passwort eingibt, möchte ich eine Nachricht von der Prozedur anzeigen. Ich habe in meinem Login-Controller den folgenden Code verwendet
@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";
}
Ich habe Repository verwendet, aber hier wurde nichts geschrieben. Ich habe Repository wie unten verwendet ..
public interface LoginRepository extends CrudRepository<LoginModel, Integer>{
}
Sie können eine gespeicherte Prozedur mit javax.persistence.StoredProcedureQuery aufrufen. Sie müssen nicht einmal etwas über Ihre Entität deklarieren.
Ich würde vorschlagen, die Prozeduraufruflogik in einen Dienst zu verschieben und dann die Dienstmethode von Ihrem Controller aus aufzurufen.
Zum Beispiel:
@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
}
}
Anschließend können Sie diese Methode von Ihrem Controller aus aufrufen, nachdem Sie Ihre LoginService
eingefügt haben.
Mit dieser Methode können Sie eine Prozedur von Spring aus aufrufen
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);
}
}