数据源管理|动态权限校验,表结构和数据迁移流程

  

本文源码:   GitHub·点这里| |   GitEE·点这里

  

     1、场景描述

  

如果经常接触数据开发,会有这样一个场景,服务一提供一个数据源,假设称为动态数据源,需要读取该数据源下的数据,服务B提供一个数据源,假设称为动态数据源B,需要写入数据到该数据源。这个场景通常描述为数据同步,或者数据搬运。

  

     3、JDBC基础API

  
      <李>
声明   

Java中JDBC下执行数据库操作的一个重要接口,在已经建立数据库连接的基础上,向数据库发送要执行的SQL语句。

  
      <李> PreparedStatement
  

继承声明接口,且实现SQL预编译,可以提高批量处理效率。常应用于批量数据写入场景。

  
      <李> ResultSet
  

存储JDBC查询结果集的对象,ResultSet接口提供从当前行检索列值的方法。

  

     1、数据源管理

  

提供一个数据源管理的工厂,当前场景下主要管理一个读库即数据源,和一个写库即数据源B,数据源连接验证通过,放入容器中。

  <前>   <代码类=" lang-java "> @ component   公开课ConnectionFactory {   私人Map<波动;字符串,Connection>,connectionMap=new HashMap<的在();   @   私人JdbcConfig JdbcConfig;   @PostConstruct   公共空间init () {   ConnectionEntity阅读=new ConnectionEntity (   “MySql”、“jdbc: MySql://localhost: 3306/data_read”、“user01”,“123”);   如果(jdbcConfig.getConnection(读)!=null) {   connectionMap.put (JdbcConstant.READ jdbcConfig.getConnection(读));   }   ConnectionEntity写=new ConnectionEntity (   “MySql”、“jdbc: MySql://localhost: 3306/data_write”、“user01”,“123”);   如果(jdbcConfig.getConnection(写)!=null) {   connectionMap.put (JdbcConstant.WRITE jdbcConfig.getConnection(写));   }   }   公共连接getByKey(最终字符串键){   返回connectionMap.get(关键);   }   }      

公共类BaseSql {   公共静态字符串READ_SQL=" SELECT * FROM % s限制1”;   公共静态字符串WRITE_SQL="插入% s(从% s SELECT * 1=0)”;   公共静态字符串CREATE_SQL=跋允敬唇ū? s”;   公共静态字符串SELECT_SQL=癝ELECT * FROM % s”;   公共静态字符串COUNT_SQL=" SELECT COUNT (1) countNum % s”;   公共静态字符串PAGE_SQL=" SELECT * FROM % s限制% s, % s”;   公共静态字符串STRUCT_SQL () {   StringBuffer sql=new StringBuffer ();   sql。追加(“选择”);   sql。追加(COLUMN_NAME”);   sql。追加(“IS_NULLABLE,”);   sql。追加(“COLUMN_TYPE,”);   sql。追加(“COLUMN_KEY,”);   sql。追加(“COLUMN_COMMENT”);   sql。追加(“的”);   sql。追加(“information_schema。列”);   sql。追加(“”);   sql。追加(table_schema=' % s ');   sql。追加(和table_name=' % s ');   返回String.valueOf (sql);   }   }      

  <强> SQL参数拼接

  

根据SQL模板中缺失的参数,进行动态补全,生成完成SQL语句。

  <前>   <代码类=" lang-java ">公共类BuildSql {/* *   *读权限SQL   */buildReadSql公共静态字符串(字符串表){   字符串readSql=零;   如果(StringUtils.isNotEmpty(表)){   readSql=String.format (BaseSql。READ_SQL表);   }   返回readSql;   }/* *   *读权限SQL   */buildWriteSql公共静态字符串(字符串表){   字符串writeSql=零;   如果(StringUtils.isNotEmpty(表)){   writeSql=String.format (BaseSql。WRITE_SQL、表、表);   }   返回writeSql;   }/* *   *表创建SQL   */buildStructSql公共静态字符串(字符串表){   字符串structSql=零;   如果(StringUtils.isNotEmpty(表)){   structSql=String.format (BaseSql。CREATE_SQL表);   }   返回structSql;   }/* *   *表结构的SQL   */buildTableSql公共静态字符串(字符串模式,字符串表){   字符串structSql=零;   如果(StringUtils.isNotEmpty(表)){   structSql=String.format (BaseSql.STRUCT_SQL()模式,表);   }   返回structSql;   }/* *   *全表查询SQL   */buildSelectSql公共静态字符串(字符串表){   字符串selectSql=零;   如果(StringUtils.isNotEmpty(表)){   selectSql=String.format (BaseSql.SELECT_SQL、表);   }   返回selectSql;   }/* *   *总数查询SQL   */buildCountSql公共静态字符串(字符串表){   字符串countSql=零;   如果(StringUtils.isNotEmpty(表)){   countSql=String.format (BaseSql.COUNT_SQL、表);   }   返回countSql;   }/* *   *分页查询SQL   */buildPageSql公共静态字符串(字符串表,int抵消,int大小){   字符串pageSql=零;   如果(StringUtils.isNotEmpty(表)){   pageSql=String.format (BaseSql.PAGE_SQL、表、抵消、大小);   }   返回pageSql;   }   }   

数据源管理|动态权限校验,表结构和数据迁移流程