@@ -0,0 +1,67 @@ | |||||
package com.qmrz.generator; | |||||
import com.qmrz.exception.ABException; | |||||
import com.qmrz.service.TableService; | |||||
import com.qmrz.utils.CGHelper; | |||||
import com.qmrz.utils.Fn; | |||||
import com.qmrz.utils.SpringContextUtil; | |||||
import java.util.ArrayList; | |||||
import java.util.List; | |||||
import java.util.Map; | |||||
import java.util.stream.Collectors; | |||||
/** | |||||
* Mapper生成 | |||||
*/ | |||||
public class JavaSyncGenerator { | |||||
private TableService tableService; | |||||
private String dbName; | |||||
public JavaSyncGenerator(String dbName) { | |||||
tableService = SpringContextUtil.getBean(TableService.class); | |||||
this.dbName = dbName; | |||||
} | |||||
public void generator() { | |||||
List<Map> tableList = tableService.getTableList(dbName); | |||||
List<Map> columnList = tableService.getColumnList(dbName); | |||||
Map<String, List<Map>> result = columnList.stream().collect(Collectors.groupingBy(map -> Fn.toString(map.get("table_name")), Collectors.toList())); | |||||
// CGHelper cgHelper = new CGHelper("mapper2.ftl", dbName);//无同步代码版本 | |||||
CGHelper cgHelper = new CGHelper("java_sync.ftl", dbName);//有同步代码版本 | |||||
tableList.forEach(item -> { | |||||
String table_name = item.get("table_name").toString(); | |||||
String table_name2 = Fn.firstUpperCase(table_name); | |||||
List<Map> tmpColumnList = result.get(table_name); | |||||
StringBuilder primaryKeyName = new StringBuilder(); | |||||
tmpColumnList.stream().filter(i -> { | |||||
if ("PRI".equals(Fn.toString(i.get("column_key")))) { | |||||
primaryKeyName.append(Fn.toString(i.get("column_name"))); | |||||
return true; | |||||
} | |||||
return false; | |||||
}).findFirst(); | |||||
if (primaryKeyName.length() == 0) { | |||||
throw new ABException("表 " + table_name + " 没有主键"); | |||||
} | |||||
tmpColumnList = tmpColumnList.stream() | |||||
.filter(i -> | |||||
!"syscreatetime".equals(Fn.toString(i.get("column_name"))) | |||||
&& !"sysupdatetime".equals(Fn.toString(i.get("column_name"))) | |||||
).collect(Collectors.toList()); | |||||
item.put("columnList", tmpColumnList); | |||||
item.put("dbname", dbName); | |||||
item.put("table_name2", table_name2);//首字母大写 | |||||
item.put("primaryKeyName", primaryKeyName.toString()); | |||||
cgHelper.generator("java_sync", table_name2 + "Sync.java", item); | |||||
}); | |||||
} | |||||
} |
@@ -26,13 +26,13 @@ public class MapperGenerator { | |||||
} | } | ||||
public void generator() { | public void generator() { | ||||
List<Map> tableList = tableService.getTableList(dbName); | List<Map> tableList = tableService.getTableList(dbName); | ||||
List<Map> columnList = tableService.getColumnList(dbName); | List<Map> columnList = tableService.getColumnList(dbName); | ||||
Map<String, List<Map>> result = columnList.stream().collect(Collectors.groupingBy(map -> Fn.toString(map.get("table_name")), Collectors.toList())); | Map<String, List<Map>> result = columnList.stream().collect(Collectors.groupingBy(map -> Fn.toString(map.get("table_name")), Collectors.toList())); | ||||
CGHelper cgHelper = new CGHelper("mapper2.ftl", dbName); | |||||
CGHelper cgHelper = new CGHelper("mapper2.ftl", dbName);//无同步代码版本 | |||||
// CGHelper cgHelper = new CGHelper("mapper_sync.ftl", dbName);//有同步代码版本 | |||||
tableList.forEach(item -> { | tableList.forEach(item -> { | ||||
String table_name = item.get("table_name").toString(); | String table_name = item.get("table_name").toString(); | ||||
@@ -0,0 +1,80 @@ | |||||
package com.qmrz.generator; | |||||
import com.qmrz.exception.ABException; | |||||
import com.qmrz.service.TableService; | |||||
import com.qmrz.utils.CGHelper; | |||||
import com.qmrz.utils.Fn; | |||||
import com.qmrz.utils.SpringContextUtil; | |||||
import java.util.ArrayList; | |||||
import java.util.List; | |||||
import java.util.Map; | |||||
import java.util.stream.Collectors; | |||||
/** | |||||
* Mapper生成 | |||||
*/ | |||||
public class MapperSyncGenerator { | |||||
private TableService tableService; | |||||
private String dbName; | |||||
public MapperSyncGenerator(String dbName) { | |||||
tableService = SpringContextUtil.getBean(TableService.class); | |||||
this.dbName = dbName; | |||||
} | |||||
public void generator() { | |||||
List<Map> tableList = tableService.getTableList(dbName); | |||||
List<Map> columnList = tableService.getColumnList(dbName); | |||||
Map<String, List<Map>> result = columnList.stream().collect(Collectors.groupingBy(map -> Fn.toString(map.get("table_name")), Collectors.toList())); | |||||
// CGHelper cgHelper = new CGHelper("mapper2.ftl", dbName);//无同步代码版本 | |||||
CGHelper cgHelper = new CGHelper("mapper_sync.ftl", dbName);//有同步代码版本 | |||||
tableList.forEach(item -> { | |||||
String table_name = item.get("table_name").toString(); | |||||
String table_name2 = Fn.firstUpperCase(table_name); | |||||
List<Map> tmpColumnList = result.get(table_name); | |||||
List<String> orderByList = new ArrayList<>(); | |||||
tmpColumnList.stream().filter(i -> { | |||||
String tmpColumnName = Fn.toString(i.get("column_name")); | |||||
if ("createdatetime".equals(tmpColumnName)) { | |||||
orderByList.add("t."+tmpColumnName + " desc"); | |||||
return true; | |||||
} | |||||
return false; | |||||
}).findFirst(); | |||||
StringBuilder primaryKeyName = new StringBuilder(); | |||||
tmpColumnList.stream().filter(i -> { | |||||
if ("PRI".equals(Fn.toString(i.get("column_key")))) { | |||||
orderByList.add("t."+Fn.toString(i.get("column_name")) + " desc"); | |||||
primaryKeyName.append(Fn.toString(i.get("column_name"))); | |||||
return true; | |||||
} | |||||
return false; | |||||
}).findFirst(); | |||||
if (primaryKeyName.length() == 0) { | |||||
throw new ABException("表 " + table_name + " 没有主键"); | |||||
} | |||||
String orderBy = ""; | |||||
if (orderByList.size() > 0) { | |||||
orderBy = "order by " + String.join(",", orderByList); | |||||
} | |||||
item.put("columnList", tmpColumnList); | |||||
item.put("dbname", dbName); | |||||
item.put("table_name2", table_name2);//首字母大写 | |||||
item.put("orderBy", orderBy); | |||||
item.put("primaryKeyName", primaryKeyName.toString()); | |||||
cgHelper.generator("mapper2", table_name2 + "Mapper.xml", item); | |||||
}); | |||||
} | |||||
} |
@@ -0,0 +1,211 @@ | |||||
package com.qmrz.service.outside.sync; | |||||
import com.alibaba.fastjson.JSONObject; | |||||
import com.qmrz.api.common.SpringContextUtil; | |||||
import com.qmrz.api.common.SysInfo; | |||||
import com.qmrz.service.outside.v2.BaseSyncV2; | |||||
import com.qmrz.service.outside.v2.SyncDTO; | |||||
import com.qmrz.utils.DateTimeUtil; | |||||
import java.util.ArrayList; | |||||
import java.util.HashMap; | |||||
import java.util.List; | |||||
import java.util.Map; | |||||
/** | |||||
* 同步 ${table_comment}(${table_name}) | |||||
*/ | |||||
public class ${table_name2}Sync extends BaseSyncV2 { | |||||
@Override | |||||
protected Map<String, String> getSyncFieldMapping() { | |||||
Map<String, String> fieldMapping = new HashMap<>(); | |||||
<#list columnList as item> | |||||
fieldMapping.put("${item.column_name}","${item.column_name}"); | |||||
</#list> | |||||
return fieldMapping; | |||||
} | |||||
/** | |||||
* 批量插入mapid | |||||
* | |||||
* @return | |||||
*/ | |||||
@Override | |||||
protected String insertMapID() { | |||||
return "${table_name2}Mapper.sync_batch_insert"; | |||||
} | |||||
/** | |||||
* 批量更新mapid | |||||
* | |||||
* @return | |||||
*/ | |||||
@Override | |||||
protected String updateMapID() { | |||||
return "${table_name2}Mapper.sync_batch_update"; | |||||
} | |||||
/** | |||||
* 批量删除mapid | |||||
* | |||||
* @return | |||||
*/ | |||||
@Override | |||||
protected String deleteMapID() { | |||||
return "${table_name2}Mapper.sync_batch_delete"; | |||||
} | |||||
/** | |||||
* 最大maxid,一个同步循环只从DB获取一次 | |||||
* | |||||
* @return | |||||
*/ | |||||
@Override | |||||
protected String maxidMapID() { | |||||
return "${table_name2}Mapper.sync_batch_select_maxid"; | |||||
} | |||||
/** | |||||
* 查询DB数据,用与api数据比对后的 增、改 | |||||
* | |||||
* @return | |||||
*/ | |||||
@Override | |||||
protected String selectDBMapID() { | |||||
return "${table_name2}Mapper.sync_batch_select"; | |||||
} | |||||
/** | |||||
* 查询DB数据,用与api数据比对后的 删除 | |||||
* | |||||
* @return | |||||
*/ | |||||
@Override | |||||
protected String selectDBPageMapID() { | |||||
return "${table_name2}Mapper.sync_batch_select_page"; | |||||
} | |||||
/** | |||||
* 表名 | |||||
* | |||||
* @return | |||||
*/ | |||||
@Override | |||||
protected String getTableName() { | |||||
return "${table_name}"; | |||||
} | |||||
@Override | |||||
protected String getPrimaryFieldName() { | |||||
return "${primaryKeyName}"; | |||||
} | |||||
/** | |||||
* api接口页码 | |||||
* | |||||
* @return | |||||
*/ | |||||
@Override | |||||
protected int getApiPageSize() { | |||||
return 1000; //不超过5000,单次api查询最多返回5000条 | |||||
} | |||||
/** | |||||
* 数据同步 api url | |||||
* | |||||
* @return | |||||
*/ | |||||
@Override | |||||
protected String getSyncUrl(SyncDTO syncDTO) { | |||||
SysInfo info = SpringContextUtil.getBean(SysInfo.class); | |||||
StringBuilder param = new StringBuilder() | |||||
.append("epid=" + info.getEpid()) | |||||
.append("&xzqhdm=" + info.getXzqhdm()) | |||||
.append("&tableName=" + this.getTableName()); | |||||
syncDTO.setSyncapiparam(param.toString()); | |||||
return this.getSyncDTO().getSyncapiurl(); | |||||
} | |||||
@Override | |||||
public boolean getOpenLimitAPI(){ | |||||
return true; | |||||
} | |||||
/** | |||||
* 查询时默认参数 | |||||
* | |||||
* @return | |||||
*/ | |||||
@Override | |||||
protected Map<String, Object> getDefaultSelectParamDB(SyncDTO syncDTO) { | |||||
return new HashMap<>(); | |||||
} | |||||
@Override | |||||
protected void insertAddField(Map<String, String> insertMap, JSONObject jsonObjectAPI) { | |||||
//insertMap.put("id", Fn.getUUID()); | |||||
jsonObjectAPI.put("syscreatetime", DateTimeUtil.currentStr()); | |||||
jsonObjectAPI.put("sysupdatetime", DateTimeUtil.currentStr()); | |||||
} | |||||
@Override | |||||
protected void updateAddField(Map<String, String> updateMap, JSONObject jsonObjectAPI) { | |||||
jsonObjectAPI.put("sysupdatetime", DateTimeUtil.currentStr()); | |||||
} | |||||
@Override | |||||
protected void getBeforeCheckRowAPI(Map<String, String> updateMap, JSONObject jsonObjectAPI) { | |||||
} | |||||
@Override | |||||
protected void getResetRowIDAPI(Map<String, Object> rowAPI, JSONObject jsonObjectAPI, SyncDTO syncDTO) { | |||||
} | |||||
@Override | |||||
protected List<String> apiReturnFieldByDelete() { | |||||
return new ArrayList<>(); | |||||
} | |||||
/** | |||||
* 是否开启增量模式同步 | |||||
* | |||||
* @return | |||||
*/ | |||||
@Override | |||||
protected boolean getIsOpenMaxIDModel() { | |||||
return false; | |||||
} | |||||
/** | |||||
* 默认maxid,若自增为数字时,可设为0。若字符串时,可以设置为空字符串 | |||||
* | |||||
* @return | |||||
*/ | |||||
@Override | |||||
protected String getDefaultMaxID() { | |||||
return "0"; | |||||
} | |||||
@Override | |||||
protected String setMaxID(String maxID) { | |||||
return maxID; | |||||
} | |||||
/** | |||||
* (开启子集同步时使用) | |||||
*/ | |||||
@Override | |||||
protected void syncSubInsertAndUpdate() { | |||||
} | |||||
/** | |||||
* (开启子集同步时使用) | |||||
* | |||||
* @param parentIDListDB 同步删除的数据范围(相对子集的父id集合) | |||||
*/ | |||||
@Override | |||||
protected void syncSubDelete(List<String> parentIDListDB) { | |||||
} | |||||
} |
@@ -0,0 +1,146 @@ | |||||
<?xml version="1.0" encoding="UTF-8"?> | |||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" | |||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> | |||||
<!-- | |||||
${table_name}(${table_comment}) | |||||
注意:分隔线以下 不增加业务,有新增自定义业务时加到分隔线上面 | |||||
--> | |||||
<mapper namespace="com.qmrz.domain.mapper.${table_name2}Mapper"> | |||||
<!-- 同步,查询DB数据,用与api数据比对后的 增、改 --> | |||||
<select id="sync_batch_select" resultType="Map" parameterType="Map"> | |||||
select <#list columnList as item>t.${item.column_name}<#if item_has_next>,</#if></#list> | |||||
from ${table_name} t | |||||
where t.${primaryKeyName} in( | |||||
<foreach collection="idlist" item="item" index="index" separator=","> | |||||
${"#"}{item} | |||||
</foreach> | |||||
) | |||||
</select> | |||||
<!-- 同步,用与api数据比对后的 删除(使用升序排序更合理) --> | |||||
<select id="sync_batch_select_page" resultType="Map" parameterType="Map"> | |||||
select ${primaryKeyName} from ${table_name} | |||||
where ${primaryKeyName} > ${"#"}{maxid} | |||||
order by ${primaryKeyName} asc limit ${"#"}{limit} | |||||
</select> | |||||
<!-- 同步批量插入 --> | |||||
<insert id="sync_batch_insert" parameterType="Map"> | |||||
insert into ${table_name}(<#list columnList as item>${item.column_name}<#if item_has_next>,</#if></#list>) | |||||
values | |||||
<foreach collection="list" item="item" index="index" separator=","> | |||||
(<#list columnList as item>${"#"}{item.${item.column_name}}<#if item_has_next>,</#if></#list>) | |||||
</foreach> | |||||
</insert> | |||||
<!-- 同步批量更新 --> | |||||
<update id="sync_batch_update" parameterType="List"> | |||||
<foreach collection="list" item="item" index="index" separator=";"> | |||||
update ${table_name} | |||||
<set> | |||||
<#list columnList as item> | |||||
<#if item.column_key?? && item.column_key!="PRI" && item.column_name!="syscreatetime"> | |||||
${item.column_name} = ${"#"}{item.${item.column_name}}, | |||||
</#if> | |||||
</#list> | |||||
</set> | |||||
where ${primaryKeyName}= ${"#"}{item.${primaryKeyName}} | |||||
</foreach> | |||||
</update> | |||||
<!-- 同步批量删除 --> | |||||
<delete id="sync_batch_delete" parameterType="List"> | |||||
delete from ${table_name} where ${primaryKeyName} in ( | |||||
<foreach collection="list" item="item" index="index" separator=","> | |||||
${"#"}{item} | |||||
</foreach> | |||||
) | |||||
</delete> | |||||
<!-- ========================= 分隔线以下为生成的通用代码 ========================= --> | |||||
<!-- | |||||
注意: | |||||
1、增加条件必须增加 _parameter.containsKey | |||||
2、修改字段手动更改此文件,不推荐重新生成后全部覆盖 | |||||
--> | |||||
<!-- 通用查询条件 --> | |||||
<sql id="common_where"> | |||||
<#list columnList as item> | |||||
<if test="_parameter.containsKey('where_${item.column_name}')">and t.${item.column_name} = ${"#"}{where_${item.column_name}}</if> | |||||
</#list> | |||||
<#list columnList as item> | |||||
<if test="_parameter.containsKey('like_${item.column_name}')">and t.${item.column_name} like concat('%',${"#"}{like_${item.column_name}},'%')</if> | |||||
</#list> | |||||
<if test="_parameter.containsKey('list_${primaryKeyName}')"> | |||||
and t.${primaryKeyName} in | |||||
<foreach collection="list_${primaryKeyName}" item="item" open="(" separator="," close=")"> | |||||
${"#"}{item} | |||||
</foreach> | |||||
</if> | |||||
</sql> | |||||
<!-- 通用查询记录 --> | |||||
<select id="selectList" resultType="java.util.LinkedHashMap"> | |||||
select <#list columnList as item>t.${item.column_name}<#if item_has_next>,</#if></#list> | |||||
from ${table_name} t | |||||
<where> | |||||
<include refid="common_where" /> | |||||
</where> | |||||
${orderBy} | |||||
<if test="_parameter.containsKey('__limit__')"> | |||||
<#noparse>limit #{__limit__}</#noparse> | |||||
</if> | |||||
</select> | |||||
<!-- 通用查询记录总数 --> | |||||
<select id="selectCount" resultType="Integer"> | |||||
select count(0) as cou from ${table_name} t | |||||
<where> | |||||
<include refid="common_where" /> | |||||
</where> | |||||
</select> | |||||
<!-- 通用插入数据 --> | |||||
<insert id="insert"> | |||||
insert into ${table_name}( | |||||
<trim suffixOverrides=","> | |||||
<#list columnList as item> | |||||
<if test="_parameter.containsKey('${item.column_name}')">${item.column_name},</if> | |||||
</#list> | |||||
</trim>) | |||||
values( | |||||
<trim suffixOverrides=","> | |||||
<#list columnList as item> | |||||
<if test="_parameter.containsKey('${item.column_name}')">${"#"}{${item.column_name}},</if> | |||||
</#list> | |||||
</trim> | |||||
) | |||||
</insert> | |||||
<!-- 通用更新数据 --> | |||||
<update id="update"> | |||||
update ${table_name} t | |||||
<set> | |||||
<#list columnList as item> | |||||
<#if item.column_key?? && item.column_key!="PRI" || item.column_name?? && item.column_name != "id"> | |||||
<if test="_parameter.containsKey('${item.column_name}')">t.${item.column_name} = ${"#"}{${item.column_name}},</if> | |||||
</#if> | |||||
</#list> | |||||
</set> | |||||
<where> | |||||
<include refid="common_where" /> | |||||
</where> | |||||
</update> | |||||
<!-- 通用删除记录 --> | |||||
<delete id="delete"> | |||||
delete t from ${table_name} t | |||||
<where> | |||||
<include refid="common_where" /> | |||||
</where> | |||||
</delete> | |||||
</mapper> |
@@ -11,7 +11,9 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; | |||||
@SpringBootTest(classes = CodeGenerator.class) | @SpringBootTest(classes = CodeGenerator.class) | ||||
public class TestCodeGenerator { | public class TestCodeGenerator { | ||||
// private String dbname="ga-dp-dev"; | // private String dbname="ga-dp-dev"; | ||||
private String dbname="psbd-dev"; | |||||
//private String dbname="qmrz"; | |||||
private String dbname="ga-lock-dev"; | |||||
// private String dbname="psbd-dev"; | |||||
// private String dbname="ga-hotelmanage-dev"; | // private String dbname="ga-hotelmanage-dev"; | ||||
/** | /** | ||||
* 生成所有 | * 生成所有 | ||||
@@ -20,6 +22,8 @@ private String dbname="psbd-dev"; | |||||
public void generatorAll() { | public void generatorAll() { | ||||
readme(); | readme(); | ||||
mapper(); | mapper(); | ||||
mapperSync(); | |||||
javaSync(); | |||||
// service(); | // service(); | ||||
service2(); | service2(); | ||||
// serviceImpl(); | // serviceImpl(); | ||||
@@ -54,6 +58,18 @@ private String dbname="psbd-dev"; | |||||
generator.generator(); | generator.generator(); | ||||
} | } | ||||
@Test | |||||
public void mapperSync() { | |||||
MapperSyncGenerator generator = new MapperSyncGenerator(dbname); | |||||
generator.generator(); | |||||
} | |||||
@Test | |||||
public void javaSync() { | |||||
JavaSyncGenerator generator = new JavaSyncGenerator(dbname); | |||||
generator.generator(); | |||||
} | |||||
/** | /** | ||||
* service 生成 | * service 生成 | ||||
*/ | */ | ||||