MySQLストアドプロシージャ eにロジックを記述しました休止状態でのスプリングブートを使用しています。 IN OUTパラメータを使用したログイン手順があります。ログイン手順からメッセージをユーザーに渡したい。しかし、私はSpring Bootでストアドプロシージャを呼び出す方法がわかりません。私のコードは次のとおりです。
ログイン手順は
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
}
ログインコントローラーで、ユーザーをダッシュボードに転送できるように手順を呼び出します。ユーザーが間違ったユーザー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";
}
私はリポジトリを使用しましたが、ここには何も書きませんでした。以下のようなリポジトリを使用しています。
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
を注入した後、コントローラーからこのメソッドを呼び出すことができます。
この単純な解決策を試してください、私は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);
これは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);
このメソッドを試し、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);
}
}