随笔 - 832  文章 - 2  评论 - 31  阅读 - 167万

Spring Data JPA存储过程的使用

我们在数据库中进行复杂的操作时会用到存储过程,在数据库中存储过程是可被外部调用的一种数据对象,可以用来封装复杂的sql逻辑,那么我们在Spring Data JPA中是如何调用存储过程的呢?这就需要我们今天要讲的@Procedure注解了

1、首先我们来看一下@Procedure注解的源码,通过源码可以学***A对存储过程的支持。下图中value表示数据库里面存储过程的名称,procedureName也是数据库里面存储过程的名称。

 

 

 

2、接下来我们在数据库中创建一个存储过程,这个存储过程有两个参数,分别是输入和输出。

CREATE  PROCEDURE `procinout`(IN arg int, OUT res int)
BEGIN
SELECT(arg + 10) into res;
END

我们还可以创建有一个只有输入的存储过程,如下所示:

CREATE  PROCEDURE `procin`(IN arg int)
BEGIN
SELECT(arg + 10) into arg;
END

3、存储过程的调用,在UserRepository中,使用@Procedure(name="procinout")和@Procedure(name="procin")去调用存储过程。

复制代码
package cn.zh.dao;

import cn.zh.domain.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.query.Procedure;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository  extends JpaRepository<User,Long> ,JpaSpecificationExecutor<User> {
     @Procedure(name = "procinout")
    int procInOut(@Param("arg") Integer arg);

     @Procedure(procedureName = "procin")
     void procIn(@Param("arg") Integer arg);



}
复制代码

4、在User实体类中存储过程需要使用@NamedStoredProcedureQueries注解,将存储过程绑定到JPA的数据库表中,procedureName是存储过程的名字,name是JPA中存储过程的名字,写成一致即可。@StoredProcedureParameter注解指定存储过程中使用的IN、/OUT参数。

 

 

 

 

 

 

复制代码
package cn.zh.domain;

import javax.persistence.*;

@Entity
@NamedStoredProcedureQueries(
        {@NamedStoredProcedureQuery(name = "procinout",
             procedureName = "procinout",
             parameters={
                   @StoredProcedureParameter(mode=ParameterMode.IN,name="arg",type=Integer.class),
                   @StoredProcedureParameter(mode=ParameterMode.OUT,name="res",type=Integer.class)
               })
           ,@NamedStoredProcedureQuery(name="procin",
                procedureName="procin",
                parameters = {
                   @StoredProcedureParameter(mode=ParameterMode.IN,type=Integer.class,name="arg")})})
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)//自动增递
    private Long id;
    private String name;
    private String email;


    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", email='" + email + '\'' +
                '}';
    }
}
复制代码

controller类:

复制代码
package cn.zh.controller;

import cn.zh.dao.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RequestMapping("/user")
@RestController
public class UserController {
    @Autowired
    private UserRepository userRepository;

    @RequestMapping("/procInOut")
  public Integer proceInOut(Integer arg){
      return userRepository.procInOut(arg);
  }


  @RequestMapping("/procIn")
  public void proceIn(Integer arg){
        userRepository.procIn(arg);
  }


}
复制代码

 

 

posted on   小破孩楼主  阅读(1642)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
历史上的今天:
2020-02-09 Nginx的防盗链技能
2020-02-09 通过Nginx和Nginx Plus阻止DDoS攻击
2020-02-09 nginx通过配置防止DDoS攻击
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示