Spring Boot显示获取连接及多结果集输出表值类型

Posted yuxiaoxu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Boot显示获取连接及多结果集输出表值类型相关的知识,希望对你有一定的参考价值。

        Spring Boot框架比较方便地进行数据源的管理,结合MyBatis常规的查询、存储过程都可以简单地配置实现。很多业务场景,需要进行更为复杂的处理,因此需要将框架内的连接池里的连接取出使用,使用完了再放回去。

@Controller

public class …… {

    public Logger LOGGER = LoggerFactory.getLogger(this.getClass());

    private DataSource dataSource;

    @Autowired

    public void setDataSource(DataSource dataSource) {

        this.dataSource = dataSource;

}

//针对动态数据源获取实例所需要的数据源,而不是顶层的。

    private DataSource getCurrentDataSource(DataSource dataSource) {

        if(dataSource instanceof DynamicRoutingDataSource) {

            DynamicRoutingDataSource dyncDs = (DynamicRoutingDataSource) dataSource;

            return dyncDs.getDataSource("sqlserver");

        }

        return dataSource;

    }

    //释放连接

private void closeConnection(Connection conn, DataSource dataSource) 

{

        if(conn == null) {

            return;

        }

        if(dataSource instanceof DruidDataSource) {

            DruidDataSource dds = (DruidDataSource) dataSource;

            dds.discardConnection(conn);

        } else {

            DataSourceUtils.releaseConnection(conn, dataSource);

        }

    }

 

本示例配置文件application.yml

spring: 

  datasource:

    dynamic:

      primary: sqlserver #设置默认的数据源或者数据源组,默认值即为master

      datasource:

        sqlserver:

直接注入的是第一层的,而实际需要使用的是第二层的。    

       现在使用的是SQL Server,需要针对该数据库进行存储过程多个结果集的获取以及传值类型的批量操作。传值类型需要使用Microsoft JDBC Driver 6.0版本。

       Connection conn=null;

       DataSource ds = null;

ds = getCurrentDataSource(dataSource);

   conn=DataSourceUtils.getConnection(ds).unwrap(SQLServerConnection.class);

       ……

       closeConnection(conn, ds);

       使用如果结果集,如果之前对输出参数获取,会造成结果集关闭。因此需要将所有结果集获取完后再对输出参数进行获取处理。这一点不如.net方便。

ResultSet checkRs = null;

SQLServerCallableStatement statement = null;

SQLServerDataTable ExcelDataTable=null;

ExcelDataTable=new SQLServerDataTable();

ExcelDataTable.addColumnMetadata(列名, java.sql.Types…);

……

ExcelDataTable.addRow(列1数据,列2数据……); 

 

try {

    statement = (SQLServerCallableStatement) conn.prepareCall("{call ssp_monthlyarchivement_check(?,?,?)}");

statement.setStructured(1, "dbo.ImportPeopleList", ExcelDataTable);//表值类型

    statement.registerOutParameter(2, Types.BIGINT); //输出参数

    statement.registerOutParameter(3, Types.NVARCHAR, 1000);//输出参数

    checkRs=statement.executeQuery();

……

       if(statement.getMoreResults())//获取下一结果集

    {

        checkRs = statement.getResultSet();

       }

    long ErrCode = statement.getLong(2); //最后获取输出参数

    String ErrText = statement.getNString(3);

以上是关于Spring Boot显示获取连接及多结果集输出表值类型的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 基础快速构建项目,在浏览器和后台显示输出结果

MySQL单表的CRUD及多表查询

kettle 表输入 对结果集进行操作

Spring Boot 异步结果集已关闭

springMVC怎么把结果集写入Excel并导出

Spring Boot中调用@Async注解的异步方法并获取返回值