我们在数据库中进行复杂的操作时会用到存储过程,在数据库中存储过程是可被外部挪用的一种数据对象,可以用来封装复杂的sql逻辑,那么我们在Spring Data JPA中是若何挪用存储过程的呢?这就需要我们今天要讲的@Procedure注解了。
起首我们来看一下@Procedure注解的源码,经由过程源码可以进修JPA对存储过程的撑持。下图中value暗示数据库里面存储过程的名称,procedureName也是数据库里面存储过程的名称。
接下来我们在数据库中建立一个存储过程,这个存储过程有两个参数,别离是输入和输出。
CREATE DEFINER=`root`@`localhost` PROCEDURE `pluslinout`(IN arg int, OUT res int)
BEGIN
SELECT(arg + 10) into res;
END
我们还可以建立有一个只有输入的存储过程,如下所示:
CREATE DEFINER=`root`@`localhost` PROCEDURE `pluslin`(IN arg int)
BEGIN
SELECT(arg + 10) into arg;
END
存储过程的挪用,在UserRepository中,利用@Procedure(name="pluslin")和@Procedure(name="pluslinout")去挪用存储过程。
在User实体类中存储过程需要利用@NamedStoredProcedureQueries注解,将存储过程绑心猿意马到JPA的数据库表中,procedureName是存储过程的名字,name是JPA中存储过程的名字,写当作一致即可。@StoredProcedureParameter注解指心猿意马存储过程中利用的IN/OUT参数。
@NamedStoredProcedureQueries({
@NamedStoredProcedureQuery(name = "pluslin", procedureName = "pluslin", parameters = {
@StoredProcedureParameter(mode = ParameterMode.IN, name = "arg", type = Integer.class) }),
@NamedStoredProcedureQuery(name = "pluslinout", procedureName = "pluslinout", parameters = {
@StoredProcedureParameter(mode = ParameterMode.IN, name = "arg", type = Integer.class),
@StoredProcedureParameter(mode = ParameterMode.OUT, name = "res", type = Integer.class) }) })
最后在单位测试中测试这两个挪用存储过程的方式,测试的方式如下图所示,测试的成果不再展示了,可以自行操练。
0 篇文章
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!