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);

猜你喜欢

转载自www.cnblogs.com/yuxiaoxu/p/12222773.html