【问题标题】:How to call a stored procedure from Spring如何从 Spring 调用存储过程
【发布时间】:2018-04-23 02:22:52
【问题描述】:

spring如何通过存储过程向表中插入数据?

任何人都可以参考一个例子。我的存储过程有一些自动生成的值。

CREATE PROCEDURE [dbo].[usp_employee_insert]
    @full_name varchar(75),@gender varchar(6), @department varchar(25), _
    @position varchar(50),@salary float
AS
BEGIN
    INSERT INTO employees (full_name,gender,department,position,salary)
    VALUES  (@full_name,@gender,@department,@position,@salary)
END

【问题讨论】:

    标签: json spring spring-mvc spring-boot stored-procedures


    【解决方案1】:

    首先你应该添加一个EntityManager 来访问数据库:

    @PersistenceContext
    private EntityManager entityManager;
    

    另外你应该在你的类中添加StoredProcedureQuery接口,这样你可以使用多种方法与存储过程进行交互,例如registerStoredProcedureParametersetParameterexecute等其他人。

    假设您有一个Person 实体,具有存储过程中提到的属性,您可以以这个sn-p 代码为例:

    import javax.persistence.EntityManager;
    import javax.persistence.ParameterMode;
    import javax.persistence.PersistenceContext;
    import javax.persistence.StoredProcedureQuery;
    
    import org.springframework.stereotype.Service;
    
    import your.entity.package.Person;
    
    @Service
    public class StoredProcedureManagement {
    
        @PersistenceContext
        private EntityManager entityManager;
    
        public void callStoredProcedure(Person person) {
    
            // invoking your sp
            StoredProcedureQuery spInsert = entityManager.createStoredProcedureQuery("dbo.usp_employee_insert");
    
            // registring sp parameters
            spInsert.registerStoredProcedureParameter("full_name", String.class, ParameterMode.IN);
            spInsert.registerStoredProcedureParameter("gender", String.class, ParameterMode.IN);
            spInsert.registerStoredProcedureParameter("department", String.class, ParameterMode.IN);
            spInsert.registerStoredProcedureParameter("position", String.class, ParameterMode.IN);
            spInsert.registerStoredProcedureParameter("salary", Float.class, ParameterMode.IN);
    
            // setting the parameters
            spInsert.setParameter("full_name", person.getFullName());
            spInsert.setParameter("gender", person.getGender());
            spInsert.setParameter("department", person.getDepartment());
            spInsert.setParameter("position", person.getPosition());
            spInsert.setParameter("salary", person.getSalary());
    
            // executing the sp
            spInsert.execute();
    
        }
    }
    

    【讨论】:

      【解决方案2】:

      应该是这样的:

      public class UspEmployeeInsert extends StoredProcedure {
      
          private final String NAME = "usp_employee_insert";
      
          public UspEmployeeInsert(DataSource dataSource) {
      
              setDataSource(dataSource);
              setSql(NAME);
      
              declareParameter(new SqlParameter("full_name", Types.VARCHAR));
              declareParameter(new SqlParameter("gender", Types.VARCHAR));
              declareParameter(new SqlParameter("department", Types.DATE));
              declareParameter(new SqlParameter("position", Types.VARCHAR));
              declareParameter(new SqlParameter("salary", Types.FLOAT));
      
              compile();
          }
      
          public void execute(
              String fullName,
              String gender,
              Date deparment,
              String position,
              Float salary){
      
              final Map<String, Object> parameters = new HashMap<>(5);
              parameters.put("full_name", fullName);
              parameters.put("gender", gender);
              parameters.put("department", deparment);
              parameters.put("position", position);
              parameters.put("salary", salary);
      
              execute(parameters);
          }
      }
      

      或者你可以这样做:

      @Repository
      public class UspEmployeeRepository {
      
          private final String NAME = "usp_employee_insert";
          private final JdbcTemplate jdbcTemplate;
      
          @Autowired
          public UspEmployeeRepository(DataSource dataSource) {
      
              jdbcTemplate = new JdbcTemplate(dataSource);
          }
      
          public void insert(
              String fullName,
              String gender,
              Date deparment,
              String position,
              Float salary){
      
              jdbcTemplate.update(
                  "{ call usp_employee_insert(?,?,?,?,?) }",
                  fullName,gender,deparment,position,salary
              );
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-02
        • 1970-01-01
        • 2010-09-22
        • 1970-01-01
        • 1970-01-01
        • 2018-07-20
        相关资源
        最近更新 更多