StandardlyMapper.java 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471
  1. package com.boman.system.mapper;
  2. import com.alibaba.fastjson.JSONArray;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.boman.common.core.utils.obj.ObjectUtils;
  5. import com.boman.system.common.FormDataConstant;
  6. import org.apache.commons.lang3.StringUtils;
  7. import org.apache.ibatis.annotations.*;
  8. import org.apache.ibatis.annotations.Param;
  9. import org.apache.ibatis.jdbc.SQL;
  10. import org.slf4j.Logger;
  11. import org.slf4j.LoggerFactory;
  12. import org.springframework.stereotype.Component;
  13. import java.util.*;
  14. import java.util.function.Consumer;
  15. /**
  16. * @author shiqian
  17. * @description
  18. * @date 2021年03月22日 11:36
  19. **/
  20. @Mapper
  21. @Component
  22. public interface StandardlyMapper {
  23. Logger LOGGER = LoggerFactory.getLogger(StandardlyMapper.class);
  24. @UpdateProvider(
  25. type = StandardlyMapper.SqlProvider.class,
  26. method = "update"
  27. )
  28. int updateById(@Param("tableName") String var1, @Param("model") JSONObject var2
  29. , @Param("pkName") String pkName, @Param("ids") Long[] ids);
  30. @UpdateProvider(
  31. type = StandardlyMapper.SqlProvider.class,
  32. method = "update"
  33. )
  34. int newUpdateById(@Param("tableName") String var1, @Param("model") long var2);
  35. @DeleteProvider(
  36. type = StandardlyMapper.SqlProvider.class,
  37. method = "delete"
  38. )
  39. int deleteByIds(@Param("tableName") String var1, @Param("ids") Long[] var2, @Param("pkName") String pkName);
  40. @Delete({"DELETE FROM ${tableName} where ID = #{id}"})
  41. int deleteById(@Param("tableName") String var1, @Param("id") long var2);
  42. @Select({"select * FROM ${tableName} where ID = #{id}"})
  43. JSONObject getById(@Param("tableName") String var1, @Param("id") long var2);
  44. @Select({"select ${columns} FROM ${tableName} where ID = #{id}"})
  45. JSONObject getColumnsById(@Param("tableName") String var1, @Param("columns") String var2, @Param("id") long var3);
  46. @InsertProvider(
  47. type = StandardlyMapper.SqlProvider.class,
  48. method = "insert"
  49. )
  50. int insert(@Param("tableName") String var1, @Param("model") JSONObject var2);
  51. @InsertProvider(
  52. type = StandardlyMapper.SqlProvider.class,
  53. method = "inserts"
  54. )
  55. int inserts(@Param("tableName") String var1, @Param("models") JSONObject[] var2, @Param("processor") Consumer<JSONObject> var3);
  56. @Select({"select count(1) FROM ${tableName} where ${column} = #{value} limit 1"})
  57. boolean exists(@Param("tableName") String var1, @Param("column") String var2, @Param("value") Object var3);
  58. @Select({"select count(1) FROM ${tableName} where ID = #{id} limit 1"})
  59. boolean existsById(@Param("tableName") String var1, @Param("id") long var2);
  60. @Select({"select count(1) FROM ${tableName} where id <> #{id} and ${column} = #{value} limit 1"})
  61. boolean existsWithoutId(@Param("tableName") String var1, @Param("id") long var2, @Param("column") String var4, @Param("value") Object var5);
  62. @UpdateProvider(
  63. type = StandardlyMapper.SqlProvider.class,
  64. method = "updates"
  65. )
  66. int updates(@Param("tableName") String var1, @Param("models") Collection<Object> var2, @Param("processor") Consumer<JSONObject> var3);
  67. @Select("select id from ${tableName} where ${akColumnName} = #{akColumnValue}")
  68. Long selectIdByAkColumn(@Param("tableName") String tableName, @Param("akColumnName") String akColumnName, @Param("akColumnValue") String akColumnValue);
  69. @Select("select max(${pkName}) from ${tableName}")
  70. Long selectMaxId(@Param("tableName") String tableName, @Param("pkName") String pkName);
  71. /**
  72. * 功能描述: 自定义查询,需要查询的字段和value都在condition中
  73. *
  74. * @param tableName tableName
  75. * @param condition condition
  76. * @param packCondition 封装好的查询条件
  77. * @param showData 需要查询的列
  78. * @param orderBy orderBy
  79. * @param limit 分页
  80. * @param offset 分页, 可以为null
  81. * @return java.util.List<com.alibaba.fastjson.JSONObject>
  82. */
  83. @SelectProvider(type = StandardlyMapper.SqlProvider.class, method = "selectByCondition")
  84. List<JSONObject> selectByCondition(@Param("tableName") String tableName
  85. , @Param("condition") JSONObject condition
  86. , @Param("packCondition") JSONObject packCondition
  87. , @Param("showData") JSONArray showData
  88. , @Param("orderBy") String orderBy
  89. , @Param("limit") int limit
  90. , @Param("offset") int offset);
  91. public static class SqlProvider {
  92. static final String[] READONLY_COLUMNS = new String[]{"OWNERID", "OWNERNAME", "OWNERENAME", "CREATIONDATE", "ID"};
  93. public SqlProvider() {
  94. }
  95. private static boolean isReadOnly(String column) {
  96. String[] var1 = READONLY_COLUMNS;
  97. int var2 = var1.length;
  98. for (int var3 = 0; var3 < var2; ++var3) {
  99. String readonlyColumn = var1[var3];
  100. if (readonlyColumn.equals(column)) {
  101. return true;
  102. }
  103. }
  104. return false;
  105. }
  106. private static boolean isNullOrEmpty(String str) {
  107. return str == null || str.length() == 0 || str.trim().length() == 0;
  108. }
  109. private static boolean isNullOrEmpty(JSONObject json) {
  110. return json == null || json.isEmpty();
  111. }
  112. private static void keyToUpper(JSONObject json) {
  113. String[] keys = new String[json.size()];
  114. json.keySet().toArray(keys);
  115. String[] var2 = keys;
  116. int var3 = keys.length;
  117. for (int var4 = 0; var4 < var3; ++var4) {
  118. String key = var2[var4];
  119. if (!key.equals(key.toUpperCase())) {
  120. json.put(key.toUpperCase(), json.get(key));
  121. json.remove(key);
  122. }
  123. }
  124. }
  125. public String update(Map<String, Object> para) {
  126. String tableName = (String) para.get("tableName");
  127. JSONObject model = (JSONObject) para.get("model");
  128. String pkName = (String) para.get("pkName");
  129. Long[] ids = (Long[]) para.get("ids");
  130. if (StringUtils.isBlank(tableName)) {
  131. throw new IllegalArgumentException("tableName 无效");
  132. } else if (!model.isEmpty()) {
  133. keyToUpper(model);
  134. SQL sql = new SQL();
  135. sql.UPDATE(tableName);
  136. // 拼装set
  137. model.forEach((key, value)->{
  138. if (!isReadOnly(key)) {
  139. // 此处需要对value加一个""
  140. sql.SET(key + " = \"" + value + "\"");
  141. }
  142. });
  143. // 拼装in
  144. StringBuilder inSql = new StringBuilder();
  145. for (int i = 0; i < ids.length; ++i) {
  146. inSql.append(String.format("#{ids[%d]}", i));
  147. inSql.append(",");
  148. }
  149. sql.WHERE(pkName + " in (" + inSql.toString());
  150. String wholeSql = StringUtils.substringBeforeLast(sql.toString(), ",") + "))";
  151. LOGGER.info("更改的sql语句为: {}", wholeSql);
  152. return wholeSql;
  153. } else {
  154. throw new IllegalArgumentException("model 无效");
  155. }
  156. }
  157. public String inserts(Map<String, Object> para) {
  158. String tableName = (String) para.get("tableName");
  159. JSONObject[] models = (JSONObject[]) ((JSONObject[]) para.get("models"));
  160. Consumer<JSONObject> processor = (Consumer) para.get("processor");
  161. if (isNullOrEmpty(tableName)) {
  162. throw new IllegalArgumentException("tableName 无效");
  163. } else if (models != null && models.length != 0) {
  164. Set<String> columns = new HashSet();
  165. for (int i = 0; i < models.length; ++i) {
  166. JSONObject model = models[i];
  167. if (model == null) {
  168. models[i] = model = new JSONObject();
  169. }
  170. if (processor != null) {
  171. processor.accept(model);
  172. }
  173. keyToUpper(model);
  174. columns.addAll(model.keySet());
  175. }
  176. StringBuffer sql = new StringBuffer();
  177. sql.append("INSERT INTO ");
  178. sql.append(tableName);
  179. sql.append("(");
  180. sql.append(String.join(",", columns));
  181. sql.append(") VALUES");
  182. for (int i = 0; i < models.length; ++i) {
  183. sql.append("(");
  184. for (Iterator var8 = columns.iterator(); var8.hasNext(); sql.append(",")) {
  185. String column = (String) var8.next();
  186. if (models[i].containsKey(column)) {
  187. sql.append(String.format("#{models[%d].%s}", i, column));
  188. } else {
  189. sql.append("default");
  190. }
  191. }
  192. sql.setCharAt(sql.length() - 1, ')');
  193. sql.append(",");
  194. }
  195. sql.deleteCharAt(sql.length() - 1);
  196. return sql.toString();
  197. } else {
  198. throw new IllegalArgumentException("model 无效");
  199. }
  200. }
  201. public String insert(Map<String, Object> para) {
  202. JSONObject model = (JSONObject) para.get("model");
  203. String tableName = (String) para.get("tableName");
  204. if (isNullOrEmpty(tableName)) {
  205. throw new IllegalArgumentException("tableName 无效");
  206. } else if (isNullOrEmpty(model)) {
  207. throw new IllegalArgumentException("model 无效");
  208. } else {
  209. SQL sql = new SQL();
  210. Set<String> keySet = model.keySet();
  211. sql.INSERT_INTO(tableName);
  212. for (int i = 0; i < model.size(); ++i) {
  213. String key = (String) keySet.toArray()[i];
  214. sql.VALUES(key, "#{model." + key + "}");
  215. }
  216. String sqlStr = sql.toString();
  217. LOGGER.info("新增的sql语句为: {}", sqlStr);
  218. return sqlStr;
  219. }
  220. }
  221. public String delete(Map<String, Object> para) {
  222. Long[] ids = (Long[]) para.get("ids");
  223. String tableName = (String) para.get("tableName");
  224. String pkName = (String) para.get("pkName");
  225. if (isNullOrEmpty(tableName)) {
  226. throw new IllegalArgumentException("tableName 无效");
  227. } else if (ids == null) {
  228. throw new IllegalArgumentException("ids 无效");
  229. } else if (ids.length == 0) {
  230. return "";
  231. } else if (ids.length == 1) {
  232. return "DELETE FROM " + tableName + " where " + pkName + " = #{ids[0]}";
  233. } else {
  234. StringBuffer sql = new StringBuffer();
  235. sql.append("DELETE FROM ");
  236. sql.append(tableName);
  237. sql.append(" WHERE ");
  238. sql.append(pkName + " in (");
  239. for (int i = 0; i < ids.length; ++i) {
  240. sql.append(String.format("#{ids[%d]}", i));
  241. sql.append(",");
  242. }
  243. sql.setCharAt(sql.length() - 1, ')');
  244. String sqlStr = sql.toString();
  245. LOGGER.info("删除的sql语句为: {}", sqlStr);
  246. return sqlStr;
  247. }
  248. }
  249. public String updates(Map<String, Object> para) {
  250. String tableName = (String) para.get("tableName");
  251. Collection<Object> models = (Collection) para.get("models");
  252. Consumer<JSONObject> processor = (Consumer) para.get("processor");
  253. Boolean first = true;
  254. if (isNullOrEmpty(tableName)) {
  255. throw new IllegalArgumentException("tableName 无效");
  256. } else if (models != null && models.size() != 0) {
  257. JSONObject columnall = new JSONObject(true);
  258. Iterator var7 = models.iterator();
  259. while (var7.hasNext()) {
  260. Object obj = var7.next();
  261. JSONObject columnpart = (JSONObject) obj;
  262. if (columnpart == null) {
  263. columnpart = new JSONObject(true);
  264. }
  265. if (processor != null) {
  266. processor.accept(columnpart);
  267. }
  268. keyToUpper(columnpart);
  269. columnall.putAll(columnpart);
  270. }
  271. JSONObject clonekeyobj = (JSONObject) columnall.clone();
  272. Set<String> keys = columnall.keySet();
  273. Iterator var19 = keys.iterator();
  274. while (var19.hasNext()) {
  275. String column = (String) var19.next();
  276. if (isReadOnly(column)) {
  277. clonekeyobj.remove(column);
  278. }
  279. }
  280. Set<String> firstkeys = clonekeyobj.keySet();
  281. StringBuffer sql = new StringBuffer("");
  282. sql.append("UPDATE ").append(tableName).append(" a");
  283. sql.append(" right join (");
  284. int i = -1;
  285. Iterator var12 = models.iterator();
  286. while (true) {
  287. while (var12.hasNext()) {
  288. Object obj = var12.next();
  289. ++i;
  290. JSONObject model = (JSONObject) obj;
  291. Iterator var15;
  292. String key;
  293. if (first.booleanValue()) {
  294. sql.append(" SELECT #{models[0].ID} `ID`,");
  295. var15 = firstkeys.iterator();
  296. while (var15.hasNext()) {
  297. key = (String) var15.next();
  298. if (model.get(key) == null) {
  299. model.put(key, (Object) null);
  300. }
  301. sql.append(String.format("#{models[%d].%s} ", i, key));
  302. sql.append("`").append(key).append("`").append(",");
  303. }
  304. sql.deleteCharAt(sql.length() - 1);
  305. if (models.size() > 0) {
  306. sql.append(" union all");
  307. }
  308. first = false;
  309. } else {
  310. sql.append(" SELECT ");
  311. sql.append(String.format("#{models[%d].%s} ", i, "ID")).append(",");
  312. var15 = firstkeys.iterator();
  313. while (var15.hasNext()) {
  314. key = (String) var15.next();
  315. if (model.get(key) == null) {
  316. model.put(key, (Object) null);
  317. }
  318. sql.append(String.format("#{models[%d].%s} ", i, key));
  319. sql.append(",");
  320. }
  321. sql.deleteCharAt(sql.length() - 1);
  322. if (i < models.size() - 1) {
  323. sql.append(" union all");
  324. }
  325. }
  326. }
  327. sql.append(") b on a.ID=b.ID ");
  328. sql.append(" SET ");
  329. var12 = firstkeys.iterator();
  330. while (var12.hasNext()) {
  331. String value = (String) var12.next();
  332. sql.append(" a.").append(value).append("=").append("IFNULL(b.").append(value).append(",").append("a.").append(value).append(")").append(",");
  333. }
  334. sql.deleteCharAt(sql.length() - 1);
  335. String sqlStr = sql.toString();
  336. LOGGER.info("更新的sql语句为: {}", sqlStr);
  337. return sqlStr;
  338. }
  339. } else {
  340. throw new IllegalArgumentException("model 无效");
  341. }
  342. }
  343. public String selectByCondition(Map<String, Object> para) {
  344. // JSONObject condition = (JSONObject) para.get("condition");
  345. JSONObject packCondition = (JSONObject) para.get("packCondition");
  346. String tableName = (String) para.get("tableName");
  347. String orderBy = (String) para.get("orderBy");
  348. int limit = (int) para.get("limit");
  349. int offset = (int) para.get("offset");
  350. JSONArray showData = (JSONArray) para.get("showData");
  351. StringBuilder wholeSql = new StringBuilder();
  352. wholeSql.append("select ");
  353. // showData
  354. StringBuilder showDataSql = new StringBuilder();
  355. for (Object columnObj : showData) {
  356. String columnName = (String) columnObj;
  357. showDataSql.append(columnName).append(", ");
  358. }
  359. wholeSql.append(StringUtils.substringBeforeLast(showDataSql.toString(), ","));
  360. wholeSql.append(" from ").append(tableName);
  361. wholeSql.append(" where ");
  362. // 条件
  363. StringBuilder conditionSql = new StringBuilder();
  364. for (Map.Entry<String, Object> entry : packCondition.entrySet()) {
  365. String key = entry.getKey();
  366. Object valueObj = entry.getValue();
  367. String valueStr = ((String) valueObj);
  368. String[] split = valueStr.split("_");
  369. String value = split[0];
  370. String type = split[1];
  371. conditionSql.append(key).append(covert(type, key, value)).append(" and ");
  372. }
  373. wholeSql.append(StringUtils.substringBeforeLast(conditionSql.toString(), " and"));
  374. wholeSql.append(" order by ").append(orderBy).append(" limit ").append(limit);
  375. if (ObjectUtils.isNotEmpty(offset)) {
  376. wholeSql.append(", ").append(offset);
  377. }
  378. String result = wholeSql.toString();
  379. LOGGER.info("查询拼出的sql语句为:{}", result);
  380. return result;
  381. }
  382. private String covert(String type, String key, String value) {
  383. switch (type) {
  384. case FormDataConstant.EQ:
  385. return " = " + ObjectUtils.escapeStr(value);
  386. case FormDataConstant.LIKE:
  387. return " like " + "concat('%', #{condition." + key + "}, '%')";
  388. default:
  389. throw new IllegalArgumentException("参数非法");
  390. }
  391. }
  392. }
  393. }