Java 如何使用hibernate在spring boot中调用MySQL存储过程?
我已经在MySQL存储过程中编写了一些逻辑。我正在使用带有hibernate的spring boot。我有一个带有IN-OUT参数的登录过程。从我的登录过程中,我想将消息传递给用户。但我不知道如何在Spring boot中调用存储过程。我的密码是贝娄Java 如何使用hibernate在spring boot中调用MySQL存储过程?,java,mysql,spring,hibernate,stored-procedures,Java,Mysql,Spring,Hibernate,Stored Procedures,我已经在MySQL存储过程中编写了一些逻辑。我正在使用带有hibernate的spring boot。我有一个带有IN-OUT参数的登录过程。从我的登录过程中,我想将消息传递给用户。但我不知道如何在Spring boot中调用存储过程。我的密码是贝娄 我的登录程序是 CREATE PROCEDURE login(IN in_user_id varchar(100), IN in_password varchar(100),
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", 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
}
@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>{
}
public interface LoginRepository扩展了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
之后,您可以尝试使用此方法从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);
}
import java.util.HashMap;
导入java.util.Map;
导入oracle.jdbc.driver.OracleTypes;
导入org.springframework.jdbc.core.jdbc模板;
导入org.springframework.jdbc.core.SqlOutParameter;
导入org.springframework.jdbc.core.SqlParameter;
导入org.springframework.jdbc.core.simple.SimpleJdbcCall;
公共类MainApplicationMethod
{
公共静态void main(字符串[]args)引发异常{
JdbcTemplate JdbcTemplate=新JdbcTemplate();
SimpleJdbcCall jdbcCall=新的SimpleJdbcCall(jdbcTemplate).withProcedureName(“procedureName”);
addDeclaredParameter(新的SqlParameter(“parameter1”,OracleTypes.VARCHAR));
addDeclaredParameter(新的SqlOutParameter(“outParam1”,OracleTypes.VARCHAR));
字符串值=null;
Map callParams=new HashMap();
callParams.put(“参数1”,值);
Map outputMap=jdbcCall.execute(callParams);
}
}试试这个简单的解决方案,我使用Spring boot和Sql Server- 在您的存储库中 1) 无参数
@Query(value=“{call yourSpName()}”,nativeQuery=true)
List methodName()代码>
2) 带参数
@Query(value=“{call yourSpName(:param1)}”,nativeQuery=true)
列表方法名称(@Param(“param1”)长param1)代码>这对我使用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);
SimpleJdbcCall jdbcCall=新的SimpleJdbcCall(jdbcTemplate).WithProcedureRename(“您的过程名称”);
Map inParamMap=新的HashMap();
put(“过程的输入”,输入的值);
SqlParameterSource in=新映射SqlParameterSource(inParamMap);
Map call=jdbcCall.execute(in);
我尝试过这个,但它对我不起作用。不知何故,我总是将null
作为OutputParameterValue。我已经在这上面贴了一些东西。也许你能帮我解决这个问题?