spring - 使用 Java 对象列表调用 Oracle 过程,作为 Spring Boot 的参数
问题描述
所以我们有一个要求,我们需要通过使用 Spring Boot 传递 Java 对象的自定义列表作为参数来调用 Oracle 存储过程,我做了一些研究,但无法正确实现它,Spring Boot 的初学者,所以任何帮助和参考实现会有很大帮助。
我们需要做的是创建一个微服务,它会从 mongo dB 转换中获取一些记录,然后加载到 Oracle dB,但是调用将是一个 Oracle 存储过程,我们能够完成所有 mongo 部分和 Oracle 连接和使用简单的 in 参数调用 Oracle 存储过程,但我们的要求是通过传递 Java 对象类型列表来调用此存储过程。那就是我们卡住的地方
解决方案
1)创建一个数据库配置bean类,您可以在其中存储所有与数据库(Oracle)相关的属性
数据库配置类
@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 调用
服务类
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");
}
注意:在您的情况下,您可以将所有自定义对象作为数组传递。
推荐阅读
- cmd - 复制目录内容
- python - 为什么 numpy 可以保存和加载与 numpy 数组不同的对象
- wordpress - WooCommerce 订阅 - 初始付款操作
- python - 尝试通过更改变量来更新列表
- java - 从 Firebase 数据库中检索对 String 不起作用,但它可以在很长时间内起作用
- python - 在 python 中使用 zip 函数
- java - 在一个数组中,是否至少有一个比另一个数组中的所有其他数字大的数字?
- objective-c - 点击时UITableViewCell高度问题
- shell - 如果前一行模式匹配,则附加到当前行
- java - Java Generic 不推断类型