本文源码: 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; } }