从春季启动使用参数中的Java对象列表调用Oracle过程

时间:2019-05-01 03:33:30

标签: spring spring-boot jpa plsql spring-data-jpa

因此,我们有一个需求,即我们需要通过使用Spring Boot传递参数中的Java对象的自定义列表来调用Oracle存储过程,我进行了一些研究,但没有得到正确的实现,这是Spring Boot的初学者。因此任何帮助和参考实施都会有很大帮助。

我们需要做的是创建一个微服务,该服务将从mongo dB转换中获取一些记录,然后加载到Oracle dB,但是调用将是Oracle存储过程,我们能够完成所有mongo部分和Oracle连接并使用简单的in参数调用Oracle存储过程,但是我们的要求是通过传递Java对象类型列表来调用此存储过程。那就是我们被困住的地方

1 个答案:

答案 0 :(得分:0)

1)创建一个数据库Config bean类,您可以在其中存储所有与数据库(Oracle)相关的属性

DatabaseConfigClass

@Configuration
public class DataBaseConfig {
  private static final Log LOGGER = LogFactory.getLog(DataBaseConfig.class);
  @Autowired
  private Environment environment;
  @Bean(name = "jdbcTemplate")
  public JdbcTemplate jdbcTemplate() throws SQLException {
  OracleDataSource dataSource = new OracleDataSource();

  String url = environment.getProperty("spring.db.jdbc.url");
  String userName = environment.getProperty("spring.db.username");
  String password = environment.getProperty("spring.db.password");
  String driver = environment.getProperty("spring.db.driver-classname");

  dataSource.setUser(userName);
  dataSource.setPassword(password);
  dataSource.setURL(url);
  dataSource.setDriverType(driver);
  return new JdbcTemplate(dataSource);
   }
 }

2)有很多方法可以调用存储过程。最好的方法之一是使用简单的jdbc调用

ServiceClass

public class getOrders(ApprovalAction approvalActionObj){

  List<Orders> orderList= approvalActionObj.getApprovalQsType();

  SimpleJdbcCall jdbcCall = new 
  SimpleJdbcCall(jdbcTemplate).withProcedureName("XX_PROCEDURE")
 .withCatalogName("XX_PACKAGE").withoutProcedureColumnMetaDataAccess()
 .declareParameters(
  new SqlParameter("P_ORDER_ROLLUP", Types.ARRAY,"ALG_ORDER_TAB"),
  new SqlOutParameter("O_ERROR_MESSAGE", Types.NUMBER));


  Object[][] orderArray = new Object[ordersList.size()][2];   

  for(int actionIndex = 0; actionIndex < ordersList.size(); actionIndex++) 
  {

  ordersArray[actionIndex][0] = orderList.get(actionIndex).getId();
  ordersArray[actionIndex][1] = orderList.get(actionIndex).getType();
  }
  Map<String, Object> orderResult=jdbcCall.execute(new 
  MapSqlParameterSource().addValue("P_ORDER_ROLLUP", new 
  SqlArrayValue(orderArray)));

  Integer errorMsg = (String) orderResult.get("O_ERROR_MESSAGE"); 
  }

注意:在您的情况下,您可以将所有自定义对象作为数组传递。