栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

spring-boot配置Sharding分库分表时如果查询指定库表结构

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

spring-boot配置Sharding分库分表时如果查询指定库表结构

        在使用sharding插件时,有时我们需要动态获取指定表的字段,类型等数据结构。但是在直接使用sql语句查询时sharding插件会将查询sql 转换错误。此时我们该怎么办呢。

      思路:

       第一步 :获取shardind数据源

        第二步:获取数据库链接信息

       第三补:重建数据源链接

       第四部: 关闭链接

不废话直接上代码:

private List getColumns(SqlDbDataVo SqlDbDataVo){
   
    Connection con =null;
    ResultSet rs =null;
    Connection connection =null;
    List data = new ArrayList<>();
    try {
        // 获取该服务链接的sharding数据源
        ShardingDataSource shardingDataSource = (ShardingDataSource) ApplicationContextConfig.getBean("dataSource");
        if(shardingDataSource == null)  return  null;
        connection =  shardingDataSource.getConnection();
        if(connection == null)  return  null;
       // 获取多数据源
        Map dataA = shardingDataSource.getDataSourceMap();
        // 轮询获取指定目标库表  这里测试直接全部轮询了
        for(String key : dataA.keySet()){
            DruidDataSource d = (DruidDataSource) dataA.get(key);
            Class.forName(d.getDriverClassName());
            con = DriverManager.getConnection(d.getUrl(), d.getUsername(), d.getPassword());
            if(!con.isClosed()) {//判断数据库是否链接成功
                //3、创建Statement对象
                Statement st = con.createStatement();
                //4、执行sql语句
                StringBuffer sql = new StringBuffer(" SELECt COLUMN_NAME, DATA_TYPE,COLUMN_COMMENT FROM   information_schema.Columns WHERe table_schema = '"+SqlDbDataVo.getTableSchema()+"'");
                sql.append(" AND TABLE_NAME ='"+SqlDbDataVo.getTableName()+"' ");
                if(SqlDbDataVo.getType() == 1 ){
                    sql.append(" AND DATA_TYPE !='datetime' AND COLUMN_NAME !='deleted'");
                }
                if(SqlDbDataVo.getType() == 2 ){
                    sql.append(" AND DATA_TYPE ='datetime' ");
                }
                sql.append(" AND COLUMN_NAME != '"+SqlDbDataVo.getFiled()+"'");
                try {
                    rs = st.executeQuery(sql.toString());//查询之后返回结果集
                    //5、打印出结果
                    while (rs.next()) {
                        data.add(new SqlColumnData(rs.getString("COLUMN_NAME"), rs.getString("DATA_TYPE"), rs.getString("COLUMN_COMMENT")));
                    }
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }finally {
        try {
            if (rs != null) rs.close();//关闭资源
            if (con != null) con.close();//关闭数据库
            if (connection != null) connection.close();//关闭数据库
        }catch (Exception e){
             e.printStackTrace();
        }
    }
    return data;
}
@Data
public class SqlColumnData {
    @TableField("COLUMN_NAME")
    private String columnName;
    @TableField("DATA_TYPE")
    private String dataType;
    @TableField("COLUMN_COMMENT")
    private String columnComment;

    public SqlColumnData() {

    }

    public SqlColumnData(String columnName, String dataType, String columnComment) {
        this.columnName = columnName;
        this.dataType = dataType;
        this.columnComment = columnComment;
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/667186.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号