@ -10,7 +10,6 @@ import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.bean.ListPager ;
import cn.estsh.i3plus.pojo.base.common.Pager ;
import cn.estsh.i3plus.pojo.base.common.PagerHelper ;
import cn.estsh.i3plus.pojo.base.jpa.dao.BaseRepository ;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack ;
import cn.estsh.i3plus.pojo.platform.bean.DataSeparatorMessage ;
import cn.estsh.i3plus.pojo.platform.bean.DataSeparatorRule ;
@ -23,8 +22,11 @@ import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLStatement ;
import com.alibaba.druid.sql.visitor.ExportParameterizedOutputVisitor ;
import com.alibaba.druid.util.JdbcConstants ;
import com.alibaba.fastjson.JSON ;
import com.google.common.base.Strings ;
import lombok.extern.slf4j.Slf4j ;
import org.springframework.beans.factory.annotation.Autowired ;
import org.springframework.dao.DuplicateKeyException ;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate ;
import org.springframework.stereotype.Service ;
@ -32,6 +34,7 @@ import javax.annotation.Resource;
import java.util.HashMap ;
import java.util.List ;
import java.util.Map ;
import java.util.Objects ;
/ * *
* @Description :
@ -41,6 +44,7 @@ import java.util.Map;
* @Modify :
* * /
@Service
@Slf4j
public class DataSeparatorServiceImpl implements IDataSeparatorService {
@Resource ( name = CommonConstWords . IMPP_REDIS_RES )
@ -56,28 +60,28 @@ public class DataSeparatorServiceImpl implements IDataSeparatorService {
private SeparatorDataUtil separatorDataUtil ;
@Override
public void doSeparate ( BaseRepository baseRepository , DataSeparatorMessage msg ) {
//获取数据
Long id = msg . getId ( ) ;
Object bean = baseRepository . getById ( id ) ;
public void doSeparate ( DataSeparatorMessage msg ) {
//获取数据来源数据源
CoreJdbcTemplate srcJdbcTemplate = coreJdbcTemplateConfig . getCoreJdbcTemplate ( msg . getSrcDataSourceId ( ) ) ;
//获取目的地的数据源
CoreJdbcTemplate coreJdbcTemplate = coreJdbcTemplateConfig . getCoreJdbcTemplate ( msg . getDestDataSourceId ( ) ) ;
CoreJdbcTemplate destJdbcTemplate = coreJdbcTemplateConfig . getCoreJdbcTemplate ( msg . getDestDataSourceId ( ) ) ;
//迁移数据
try {
execute ( bean, msg , core JdbcTemplate) ;
execute ( msg, srcJdbcTemplate , dest JdbcTemplate) ;
} catch ( Exception e ) {
throw ImppExceptionBuilder . newInstance ( ) . setErrorDetail ( e . getMessage ( ) + ":separate data failed" ) . build ( ) ;
}
//删除原数据
baseRepository . deleteById ( id ) ;
// baseRepository.deleteById(id);
}
@Override
public boolean addRule ( DataSeparatorRule msg ) {
ConvertBean . saveOrUpdate ( msg , AuthUtil . getSessionUser ( ) . getUserName ( ) ) ;
DataSeparatorRule rule = dataSeparatorRepository . insert ( msg ) ;
String redisKey = CommonConstWords . RES_DATA_SEPARATOR + ":" + rule . get RefBeanName ( ) . toUpperCase ( ) ;
String redisKey = CommonConstWords . RES_DATA_SEPARATOR + ":" + rule . get TableNameSrc ( ) . toUpperCase ( ) ;
redisRes . putObject ( redisKey , rule , - 1 ) ;
return true ;
}
@ -85,7 +89,7 @@ public class DataSeparatorServiceImpl implements IDataSeparatorService {
@Override
public boolean deleteRule ( Long id ) {
DataSeparatorRule rule = dataSeparatorRepository . getById ( id ) ;
String redisKey = CommonConstWords . RES_DATA_SEPARATOR + rule . get RefBeanName ( ) . toUpperCase ( ) ;
String redisKey = CommonConstWords . RES_DATA_SEPARATOR + rule . get TableNameSrc ( ) . toUpperCase ( ) ;
dataSeparatorRepository . deleteWeaklyById ( id , AuthUtil . getSessionUser ( ) . getUserName ( ) ) ;
redisRes . deleteKey ( redisKey ) ;
return true ;
@ -95,7 +99,7 @@ public class DataSeparatorServiceImpl implements IDataSeparatorService {
public boolean update ( DataSeparatorRule msg ) {
ConvertBean . saveOrUpdate ( msg , AuthUtil . getSessionUser ( ) . getUserName ( ) ) ;
dataSeparatorRepository . update ( msg ) ;
String redisKey = CommonConstWords . RES_DATA_SEPARATOR + ":" + msg . get RefBeanName ( ) . toUpperCase ( ) ;
String redisKey = CommonConstWords . RES_DATA_SEPARATOR + ":" + msg . get TableNameSrc ( ) . toUpperCase ( ) ;
redisRes . putObject ( redisKey , msg , - 1 ) ;
return true ;
}
@ -104,12 +108,26 @@ public class DataSeparatorServiceImpl implements IDataSeparatorService {
public ListPager < DataSeparatorRule > query ( DataSeparatorRule rule , Pager pager ) {
DdlPackBean ddlPackBean = DdlPackBean . getDdlPackBean ( rule . getOrganizeCode ( ) ) ;
if ( Strings . isNullOrEmpty ( rule . get RefBeanName ( ) ) ) {
DdlPreparedPack . getString LeftLikerPack( rule . getRefBeanName ( ) , "refBeanName ", ddlPackBean ) ;
if ( ! Strings . isNullOrEmpty ( rule . get TableNameSrc ( ) ) ) {
DdlPreparedPack . getString RightLikerPack( rule . getTableNameSrc ( ) , "tableNameSrc ", ddlPackBean ) ;
}
if ( Strings . isNullOrEmpty ( rule . getRuleColumn ( ) ) ) {
DdlPreparedPack . getStringLeftLikerPack ( rule . getRuleColumn ( ) , "ruleColumn" , ddlPackBean ) ;
if ( ! Strings . isNullOrEmpty ( rule . getRuleColumn ( ) ) ) {
DdlPreparedPack . getStringRightLikerPack ( rule . getRuleColumn ( ) , "ruleColumn" , ddlPackBean ) ;
}
if ( ! Strings . isNullOrEmpty ( rule . getRule ( ) ) ) {
DdlPreparedPack . getStringRightLikerPack ( rule . getRule ( ) , "rule" , ddlPackBean ) ;
}
if ( ! Objects . isNull ( rule . getDestDataSourceId ( ) ) ) {
DdlPreparedPack . getNumEqualPack ( rule . getDestDataSourceId ( ) , "destDataSourceId" , ddlPackBean ) ;
}
if ( ! Objects . isNull ( rule . getDestDataSourceId ( ) ) ) {
DdlPreparedPack . getNumEqualPack ( rule . getSrcDataSourceId ( ) , "srcDataSourceId" , ddlPackBean ) ;
}
if ( ! Strings . isNullOrEmpty ( rule . getTableNameDest ( ) ) ) {
DdlPreparedPack . getStringRightLikerPack ( rule . getTableNameDest ( ) , "tableNameDest" , ddlPackBean ) ;
}
if ( ! Strings . isNullOrEmpty ( rule . getSeparator ( ) ) ) {
DdlPreparedPack . getStringEqualPack ( rule . getSeparator ( ) , "separator" , ddlPackBean ) ;
}
pager = PagerHelper . getPager ( pager , dataSeparatorRepository . findByHqlWhereCount ( ddlPackBean ) ) ;
@ -120,17 +138,25 @@ public class DataSeparatorServiceImpl implements IDataSeparatorService {
public void separatorRedisInit ( ) {
//启动加载所有的数据到redis中
List < DataSeparatorRule > list = dataSeparatorRepository . list ( ) ;
list . forEach ( item - > {
String refBeanName = item . getRefBeanName ( ) . toUpperCase ( ) ;
String redisKey = CommonConstWords . RES_DATA_SEPARATOR + refBeanName ;
redisRes . putObject ( redisKey , item , - 1 ) ;
} ) ;
if ( list . size ( ) > 0 ) {
list . forEach ( item - > {
String refBeanName = item . getTableNameSrc ( ) . toUpperCase ( ) ;
String redisKey = CommonConstWords . RES_DATA_SEPARATOR + refBeanName ;
redisRes . putObject ( redisKey , item , - 1 ) ;
} ) ;
}
}
private void execute ( Object bean , DataSeparatorMessage msg , CoreJdbcTemplate coreJdbcTemplate ) throws Exception {
String insertSql = separatorDataUtil . packSql ( bean , msg . getDestTableName ( ) ) ;
NamedParameterJdbcTemplate jdbcTemplate = coreJdbcTemplate . getNamedParameterJdbcTemplate ( ) ;
private void execute ( DataSeparatorMessage msg , CoreJdbcTemplate srcJdbcTemplate , CoreJdbcTemplate descJdbcTemplate ) throws Exception {
//1.查询数据
String selectSql = "select * from " + msg . getSrcTableName ( ) + " where id = " + msg . getId ( ) ;
HashMap < String , Object > paramMap = new HashMap < > ( 64 ) ;
Map < String , Object > resultMap = srcJdbcTemplate . getNamedParameterJdbcTemplate ( ) . getJdbcTemplate ( ) . queryForMap ( selectSql ) ;
paramMap . putAll ( resultMap ) ;
//2.迁移数据
String insertSql = separatorDataUtil . packInsertSql ( paramMap , msg . getDestTableName ( ) ) ;
NamedParameterJdbcTemplate jdbcTemplate = descJdbcTemplate . getNamedParameterJdbcTemplate ( ) ;
boolean isSqlServer = isMSSQLSERVER ( jdbcTemplate ) ;
DbType dbType ;
if ( isSqlServer ) {
@ -138,11 +164,22 @@ public class DataSeparatorServiceImpl implements IDataSeparatorService {
} else {
dbType = JdbcConstants . MYSQL ;
}
Map < String , Object > resultMap = parseSQL ( insertSql , dbType ) ;
String preparedSql = resultMap . get ( "preparedSql" ) . toString ( ) ;
Map < String , Object > tempResult = parseSQL ( insertSql , dbType ) ;
String preparedSql = tempResult . get ( "preparedSql" ) . toString ( ) ;
@SuppressWarnings ( "unchecked" )
List < Object > parameters = ( List < Object > ) resultMap . get ( "parameters" ) ;
jdbcTemplate . getJdbcTemplate ( ) . update ( preparedSql , parameters . toArray ( ) ) ;
List < Object > parameters = ( List < Object > ) tempResult . get ( "parameters" ) ;
try {
jdbcTemplate . getJdbcTemplate ( ) . update ( preparedSql , parameters . toArray ( ) ) ;
} catch ( DuplicateKeyException e ) {
log . info ( "迁移数据已经保存到目标库中,数据为:{}" , JSON . toJSONString ( resultMap ) ) ;
//3.删除原数据
String deleteSql = "delete from " + msg . getSrcTableName ( ) + " where id = :id " ;
srcJdbcTemplate . getNamedParameterJdbcTemplate ( ) . update ( deleteSql , paramMap ) ;
}
//4.删除原数据
String deleteSql = "delete from " + msg . getSrcTableName ( ) + " where id = :id " ;
srcJdbcTemplate . getNamedParameterJdbcTemplate ( ) . update ( deleteSql , paramMap ) ;
}