@@ -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() { | |||
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("mapper2.ftl", dbName);//无同步代码版本 | |||
// CGHelper cgHelper = new CGHelper("mapper_sync.ftl", dbName);//有同步代码版本 | |||
tableList.forEach(item -> { | |||
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) | |||
public class TestCodeGenerator { | |||
// 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"; | |||
/** | |||
* 生成所有 | |||
@@ -20,6 +22,8 @@ private String dbname="psbd-dev"; | |||
public void generatorAll() { | |||
readme(); | |||
mapper(); | |||
mapperSync(); | |||
javaSync(); | |||
// service(); | |||
service2(); | |||
// serviceImpl(); | |||
@@ -54,6 +58,18 @@ private String dbname="psbd-dev"; | |||
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 生成 | |||
*/ | |||