因此,我们有一个需求,即我们需要通过使用Spring Boot传递参数中的Java对象的自定义列表来调用Oracle存储过程,我进行了一些研究,但没有得到正确的实现,这是Spring Boot的初学者。因此任何帮助和参考实施都会有很大帮助。
我们需要做的是创建一个微服务,该服务将从mongo dB转换中获取一些记录,然后加载到Oracle dB,但是调用将是Oracle存储过程,我们能够完成所有mongo部分和Oracle连接并使用简单的in参数调用Oracle存储过程,但是我们的要求是通过传递Java对象类型列表来调用此存储过程。那就是我们被困住的地方
答案 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");
}
注意:在您的情况下,您可以将所有自定义对象作为数组传递。