package com.taover.repository.jdbctemplate; import java.util.Collection; import java.util.List; import java.util.Map; import org.apache.shardingsphere.infra.hint.HintManager; import org.springframework.dao.DataAccessException; import org.springframework.jdbc.core.BatchPreparedStatementSetter; import org.springframework.jdbc.core.CallableStatementCallback; import org.springframework.jdbc.core.CallableStatementCreator; import org.springframework.jdbc.core.ConnectionCallback; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.ParameterizedPreparedStatementSetter; import org.springframework.jdbc.core.PreparedStatementCallback; import org.springframework.jdbc.core.PreparedStatementCreator; import org.springframework.jdbc.core.PreparedStatementSetter; import org.springframework.jdbc.core.ResultSetExtractor; import org.springframework.jdbc.core.RowCallbackHandler; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.SqlParameter; import org.springframework.jdbc.core.StatementCallback; import org.springframework.jdbc.support.KeyHolder; import org.springframework.jdbc.support.rowset.SqlRowSet; import com.taover.repository.shardingsphere.ShardingInfoEntity; import com.taover.repository.shardingsphere.ShardingSphereService; public class JdbcTemplateBroadcastImpl implements JdbcTemplateBroadcast { private JdbcTemplate jdbcTemplate; private ShardingSphereService shardingSphereService; public JdbcTemplateBroadcastImpl(JdbcTemplate jdbcTemplate, ShardingSphereService shardingSphereService) { this.jdbcTemplate = jdbcTemplate; this.shardingSphereService = shardingSphereService; } @Override public void loadShardingInfo(String[] broadcastTableNames) { List shardingInfo = this.shardingSphereService.getShardingInfoByTableNames(broadcastTableNames); if(shardingInfo == null || shardingInfo.isEmpty()) { return; } HintManager.clear(); HintManager instance = HintManager.getInstance(); for(ShardingInfoEntity item: shardingInfo) { instance.addTableShardingValue(item.getTableName(), item.getTableSuffix()); instance.addDatabaseShardingValue(item.getTableName(), item.getDsName()); } } @Override public void clearShardingInfo() { HintManager.clear(); } @Override public E execute(ConnectionCallback action, String[] broadcastTableNames) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); return this.jdbcTemplate.execute(action); }finally { this.clearShardingInfo(); } } @Override public E execute(StatementCallback action, String[] broadcastTableNames) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); return this.jdbcTemplate.execute(action); }finally { this.clearShardingInfo(); } } @Override public void execute(String sql, String[] broadcastTableNames) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); this.jdbcTemplate.execute(sql); }finally { this.clearShardingInfo(); } } @Override public E query(String sql, ResultSetExtractor rse, String[] broadcastTableNames) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); return this.jdbcTemplate.query(sql, rse); }finally { this.clearShardingInfo(); } } @Override public void query(String sql, RowCallbackHandler rch, String[] broadcastTableNames) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); this.jdbcTemplate.query(sql, rch); }finally { this.clearShardingInfo(); } } @Override public List query(String sql, RowMapper rowMapper, String[] broadcastTableNames) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); return this.jdbcTemplate.query(sql, rowMapper); }finally { this.clearShardingInfo(); } } @Override public E queryForObject(String sql, RowMapper rowMapper, String[] broadcastTableNames) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); return this.jdbcTemplate.queryForObject(sql, rowMapper); }finally { this.clearShardingInfo(); } } @Override public E queryForObject(String sql, Class requiredType, String[] broadcastTableNames) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); return this.jdbcTemplate.queryForObject(sql, requiredType); }finally { this.clearShardingInfo(); } } @Override public Map queryForMap(String sql, String[] broadcastTableNames) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); return this.jdbcTemplate.queryForMap(sql); }finally { this.clearShardingInfo(); } } @Override public List queryForList(String sql, Class elementType, String[] broadcastTableNames) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); return this.jdbcTemplate.queryForList(sql, elementType); }finally { this.clearShardingInfo(); } } @Override public List> queryForList(String sql, String[] broadcastTableNames) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); return this.jdbcTemplate.queryForList(sql); }finally { this.clearShardingInfo(); } } @Override public SqlRowSet queryForRowSet(String sql, String[] broadcastTableNames) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); return this.jdbcTemplate.queryForRowSet(sql); }finally { this.clearShardingInfo(); } } @Override public int update(String sql, String[] broadcastTableNames) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); return this.jdbcTemplate.update(sql); }finally { this.clearShardingInfo(); } } @Override public int[] batchUpdate(String[] broadcastTableNames, String... sql) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); return this.jdbcTemplate.batchUpdate(sql); }finally { this.clearShardingInfo(); } } @Override public E execute(PreparedStatementCreator psc, PreparedStatementCallback action, String[] broadcastTableNames) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); return this.jdbcTemplate.execute(psc, action); }finally { this.clearShardingInfo(); } } @Override public E execute(String sql, PreparedStatementCallback action, String[] broadcastTableNames) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); return this.jdbcTemplate.execute(sql, action); }finally { this.clearShardingInfo(); } } @Override public E query(PreparedStatementCreator psc, ResultSetExtractor rse, String[] broadcastTableNames) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); return this.jdbcTemplate.query(psc, rse); }finally { this.clearShardingInfo(); } } @Override public E query(String sql, PreparedStatementSetter pss, ResultSetExtractor rse, String[] broadcastTableNames) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); return this.jdbcTemplate.query(sql, pss, rse); }finally { this.clearShardingInfo(); } } @Override public E query(String sql, Object[] args, int[] argTypes, ResultSetExtractor rse, String[] broadcastTableNames) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); return this.jdbcTemplate.query(sql, args, argTypes, rse); }finally { this.clearShardingInfo(); } } @Override public E query(String sql, Object[] args, ResultSetExtractor rse, String[] broadcastTableNames) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); return this.jdbcTemplate.query(sql, args, rse); }finally { this.clearShardingInfo(); } } @Override public E query(String sql, ResultSetExtractor rse, String[] broadcastTableNames, Object... args) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); return this.jdbcTemplate.query(sql, rse, args); }finally { this.clearShardingInfo(); } } @Override public void query(PreparedStatementCreator psc, RowCallbackHandler rch, String[] broadcastTableNames) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); this.jdbcTemplate.query(psc, rch); }finally { this.clearShardingInfo(); } } @Override public void query(String sql, PreparedStatementSetter pss, RowCallbackHandler rch, String[] broadcastTableNames) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); this.jdbcTemplate.query(sql, pss, rch); }finally { this.clearShardingInfo(); } } @Override public void query(String sql, Object[] args, int[] argTypes, RowCallbackHandler rch, String[] broadcastTableNames) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); this.jdbcTemplate.query(sql, args, argTypes, rch); }finally { this.clearShardingInfo(); } } @Override public void query(String sql, Object[] args, RowCallbackHandler rch, String[] broadcastTableNames) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); this.jdbcTemplate.query(sql, args, rch); }finally { this.clearShardingInfo(); } } @Override public void query(String sql, RowCallbackHandler rch, String[] broadcastTableNames, Object... args) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); this.jdbcTemplate.query(sql, rch, args); }finally { this.clearShardingInfo(); } } @Override public List query(PreparedStatementCreator psc, RowMapper rowMapper, String[] broadcastTableNames) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); return this.jdbcTemplate.query(psc, rowMapper); }finally { this.clearShardingInfo(); } } @Override public List query(String sql, PreparedStatementSetter pss, RowMapper rowMapper, String[] broadcastTableNames) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); return this.jdbcTemplate.query(sql, pss, rowMapper); }finally { this.clearShardingInfo(); } } @Override public List query(String sql, Object[] args, int[] argTypes, RowMapper rowMapper, String[] broadcastTableNames) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); return this.jdbcTemplate.query(sql, args, argTypes, rowMapper); }finally { this.clearShardingInfo(); } } @Override public List query(String sql, Object[] args, RowMapper rowMapper, String[] broadcastTableNames) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); return this.jdbcTemplate.query(sql, args, rowMapper); }finally { this.clearShardingInfo(); } } @Override public List query(String sql, RowMapper rowMapper, String[] broadcastTableNames, Object... args) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); return this.jdbcTemplate.query(sql, rowMapper, args); }finally { this.clearShardingInfo(); } } @Override public E queryForObject(String sql, Object[] args, int[] argTypes, RowMapper rowMapper, String[] broadcastTableNames) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); return this.jdbcTemplate.queryForObject(sql, args, argTypes, rowMapper); }finally { this.clearShardingInfo(); } } @Override public E queryForObject(String sql, Object[] args, RowMapper rowMapper, String[] broadcastTableNames) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); return this.jdbcTemplate.queryForObject(sql, args, rowMapper); }finally { this.clearShardingInfo(); } } @Override public E queryForObject(String sql, RowMapper rowMapper, String[] broadcastTableNames, Object... args) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); return this.jdbcTemplate.queryForObject(sql, rowMapper, args); }finally { this.clearShardingInfo(); } } @Override public E queryForObject(String sql, Object[] args, int[] argTypes, Class requiredType, String[] broadcastTableNames) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); return this.jdbcTemplate.queryForObject(sql, args, argTypes, requiredType); }finally { this.clearShardingInfo(); } } @Override public E queryForObject(String sql, Object[] args, Class requiredType, String[] broadcastTableNames) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); return this.jdbcTemplate.queryForObject(sql, args, requiredType); }finally { this.clearShardingInfo(); } } @Override public E queryForObject(String sql, Class requiredType, String[] broadcastTableNames, Object... args) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); return this.jdbcTemplate.queryForObject(sql, requiredType, args); }finally { this.clearShardingInfo(); } } @Override public Map queryForMap(String sql, Object[] args, int[] argTypes, String[] broadcastTableNames) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); return this.jdbcTemplate.queryForMap(sql, args, argTypes); }finally { this.clearShardingInfo(); } } @Override public Map queryForMap(String sql, String[] broadcastTableNames, Object... args) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); return this.jdbcTemplate.queryForMap(sql, args); }finally { this.clearShardingInfo(); } } @Override public List queryForList(String sql, Object[] args, int[] argTypes, Class elementType, String[] broadcastTableNames) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); return this.jdbcTemplate.queryForList(sql, args, argTypes, elementType); }finally { this.clearShardingInfo(); } } @Override public List queryForList(String sql, Object[] args, Class elementType, String[] broadcastTableNames) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); return this.jdbcTemplate.queryForList(sql, args, elementType); }finally { this.clearShardingInfo(); } } @Override public List queryForList(String sql, Class elementType, String[] broadcastTableNames, Object... args) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); return this.jdbcTemplate.queryForList(sql, elementType, args); }finally { this.clearShardingInfo(); } } @Override public List> queryForList(String sql, Object[] args, int[] argTypes, String[] broadcastTableNames) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); return this.jdbcTemplate.queryForList(sql, args, argTypes); }finally { this.clearShardingInfo(); } } @Override public List> queryForList(String sql, String[] broadcastTableNames, Object... args) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); return this.jdbcTemplate.queryForList(sql, args); }finally { this.clearShardingInfo(); } } @Override public SqlRowSet queryForRowSet(String sql, Object[] args, int[] argTypes, String[] broadcastTableNames) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); return this.jdbcTemplate.queryForRowSet(sql, args, argTypes); }finally { this.clearShardingInfo(); } } @Override public SqlRowSet queryForRowSet(String sql, String[] broadcastTableNames, Object... args) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); return this.jdbcTemplate.queryForRowSet(sql, args); }finally { this.clearShardingInfo(); } } @Override public int update(PreparedStatementCreator psc, String[] broadcastTableNames) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); return this.jdbcTemplate.update(psc); }finally { this.clearShardingInfo(); } } @Override public int update(PreparedStatementCreator psc, KeyHolder generatedKeyHolder, String[] broadcastTableNames) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); return this.jdbcTemplate.update(psc, generatedKeyHolder); }finally { this.clearShardingInfo(); } } @Override public int update(String sql, PreparedStatementSetter pss, String[] broadcastTableNames) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); return this.jdbcTemplate.update(sql, pss); }finally { this.clearShardingInfo(); } } @Override public int update(String sql, Object[] args, int[] argTypes, String[] broadcastTableNames) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); return this.jdbcTemplate.update(sql, args, argTypes); }finally { this.clearShardingInfo(); } } @Override public int update(String sql, String[] broadcastTableNames, Object... args) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); return this.jdbcTemplate.update(sql, args); }finally { this.clearShardingInfo(); } } @Override public int[] batchUpdate(String sql, BatchPreparedStatementSetter pss, String[] broadcastTableNames) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); return this.jdbcTemplate.batchUpdate(sql, pss); }finally { this.clearShardingInfo(); } } @Override public int[] batchUpdate(String sql, List batchArgs, String[] broadcastTableNames) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); return this.jdbcTemplate.batchUpdate(sql, batchArgs); }finally { this.clearShardingInfo(); } } @Override public int[] batchUpdate(String sql, List batchArgs, int[] argTypes, String[] broadcastTableNames) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); return this.jdbcTemplate.batchUpdate(sql, batchArgs); }finally { this.clearShardingInfo(); } } @Override public int[][] batchUpdate(String sql, Collection batchArgs, int batchSize, ParameterizedPreparedStatementSetter pss, String[] broadcastTableNames) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); return this.jdbcTemplate.batchUpdate(sql, batchArgs, batchSize, pss); }finally { this.clearShardingInfo(); } } @Override public E execute(CallableStatementCreator csc, CallableStatementCallback action, String[] broadcastTableNames) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); return this.jdbcTemplate.execute(csc, action); }finally { this.clearShardingInfo(); } } @Override public E execute(String callString, CallableStatementCallback action, String[] broadcastTableNames) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); return this.jdbcTemplate.execute(callString, action); }finally { this.clearShardingInfo(); } } @Override public Map call(CallableStatementCreator csc, List declaredParameters, String[] broadcastTableNames) throws DataAccessException { try { this.loadShardingInfo(broadcastTableNames); return this.jdbcTemplate.call(csc, declaredParameters); }finally { this.clearShardingInfo(); } } }