SQLExpress.java 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. package com.kym.jdbc.express;
  2. import com.kym.DbUtil;
  3. import com.kym.jdbc.OBuilder;
  4. import com.kym.jdbc.annotations.DBF;
  5. import com.kym.jdbc.annotations.Entity;
  6. import com.kym.jdbc.template.JdbcHelper;
  7. import java.lang.reflect.Array;
  8. import java.lang.reflect.Field;
  9. import java.lang.reflect.Type;
  10. import java.math.BigDecimal;
  11. import java.sql.Timestamp;
  12. import java.util.Date;
  13. import java.util.List;
  14. /**
  15. * sql表达式构造
  16. * <p>
  17. * mysql\oracle\postgresql\sqlserver\db2\h2\sqlite\人大金仓\达梦\
  18. * </p>
  19. */
  20. public interface SQLExpress<T> {
  21. T toSQL();
  22. default String getComma() {
  23. return "\"";
  24. }
  25. boolean strict = false;
  26. default void appendValue(StringBuilder sbr, Type type, Object value, List<Object> parameters) {
  27. sbr.append("?").append(",");
  28. parameters.add(value);
  29. }
  30. default void appendValue(StringBuilder sbr, Object value, List<Object> parameters) {
  31. sbr.append(" ? ");
  32. parameters.add(value);
  33. }
  34. default String getTableName(Class<?> clz, String tbName) {
  35. if (clz.isAnnotationPresent(Entity.class)) {
  36. Entity entity = clz.getAnnotation(Entity.class);
  37. if (!DbUtil.isEmptyOrNull(entity.tbName())) {
  38. return DbUtil.getColumnName(entity.tbName());
  39. }
  40. } else if (clz.getSuperclass().isAnnotationPresent(Entity.class)) {
  41. Class<?> superClz = clz.getSuperclass();
  42. Entity entity = superClz.getAnnotation(Entity.class);
  43. if (!DbUtil.isEmptyOrNull(entity.tbName())) {
  44. return DbUtil.getColumnName(entity.tbName());
  45. }
  46. }
  47. if (tbName.endsWith("Info")) {
  48. tbName = tbName.substring(0, tbName.length() - 4);
  49. }
  50. return JdbcHelper.tbPrefix + DbUtil.getColumnName(tbName);
  51. }
  52. default String getTableName(Entity anno) {
  53. String tbName = anno.tbName();
  54. if (!DbUtil.isEmptyOrNull(tbName)) {
  55. return DbUtil.getColumnName(tbName);
  56. }
  57. Class<?> clz = anno.clz();
  58. /* if (tbName.endsWith("Info")) {
  59. tbName = tbName.substring(0, tbName.length() - 4);
  60. }*/
  61. return JdbcHelper.tbPrefix + DbUtil.getColumnName(clz.getSimpleName());
  62. }
  63. /**
  64. * whereSql拼接,需要注意json类型处理
  65. *
  66. * @param whereSql
  67. * @param val
  68. * @param tbAlias
  69. * @param parameters
  70. * @return
  71. */
  72. default String appendWhereSql(String whereSql, List<Object> val, String tbAlias, List<Object> parameters) {
  73. // parameters.addAll(val);
  74. if (!DbUtil.isEmptyOrNull(whereSql)) {
  75. if (!DbUtil.isEmptyOrNull(val)) {
  76. if (whereSql.contains("?")) {
  77. String regex = "\\?";
  78. for (Object o : val) {
  79. if (o.getClass() == String.class) {
  80. whereSql = whereSql.replaceFirst(regex, "'" + DbUtil.injectDefend(o.toString()) + "'");
  81. } else if (o.getClass() == Date.class) {
  82. whereSql = whereSql.replaceFirst(regex, "'" + (new Timestamp(((Date) o).getTime())) + "'");
  83. } else {
  84. whereSql = whereSql.replaceFirst(regex, DbUtil.injectDefend(o.toString()));
  85. }
  86. }
  87. while (whereSql.contains("?")) {
  88. for (Object o : val) {
  89. if (o.getClass() == String.class) {
  90. whereSql = whereSql.replaceFirst(regex, "'" + DbUtil.injectDefend(o.toString()) + "'");
  91. } else if (o.getClass() == Date.class) {
  92. whereSql = whereSql.replaceFirst(regex, "'" + (new Timestamp(((Date) o).getTime())) + "'");
  93. } else {
  94. whereSql = whereSql.replaceFirst(regex, DbUtil.injectDefend(o.toString()));
  95. }
  96. }
  97. }
  98. } else {
  99. if (val.size() == 1 && val.get(0) instanceof Boolean) {
  100. if (!(Boolean) val.get(0)) {
  101. return null;
  102. }
  103. }
  104. }
  105. }
  106. String[] splits = whereSql.split(" AND ");
  107. boolean containsComma = false;
  108. if (splits.length > 1) {
  109. StringBuilder sbd = new StringBuilder();
  110. for (int i = 0; i < splits.length; i++) {
  111. if (splits[i].startsWith("(")) {
  112. containsComma = true;
  113. sbd.append("(");
  114. if (!DbUtil.isEmptyOrNull(tbAlias)) {
  115. sbd.append(tbAlias).append(".");
  116. }
  117. sbd.append(splits[i].trim().substring(1));
  118. } else {
  119. if (!DbUtil.isEmptyOrNull(tbAlias)) {
  120. sbd.append(tbAlias).append(".");
  121. }
  122. sbd.append(splits[i].trim());
  123. }
  124. if (i != splits.length - 1) {
  125. sbd.append(" AND ");
  126. }
  127. }
  128. whereSql = sbd.toString();
  129. }
  130. String[] splits1 = whereSql.split(" OR ");
  131. if (splits1.length > 1) {
  132. StringBuilder sbd = new StringBuilder();
  133. for (int i = 0; i < splits1.length; i++) {
  134. if (splits1[i].startsWith("(")) {
  135. if (!containsComma) {
  136. sbd.append("(");
  137. if (!DbUtil.isEmptyOrNull(tbAlias)) {
  138. sbd.append(tbAlias).append(".");
  139. }
  140. sbd.append(splits1[i].trim().substring(1));
  141. }
  142. } else {
  143. if (!DbUtil.isEmptyOrNull(tbAlias)) {
  144. sbd.append(tbAlias).append(".");
  145. }
  146. sbd.append(splits1[i].trim());
  147. }
  148. if (i != splits1.length - 1) {
  149. sbd.append(" OR ");
  150. }
  151. }
  152. whereSql = sbd.toString();
  153. }
  154. }
  155. return whereSql;
  156. }
  157. /**
  158. * 拼接Builder 条件
  159. */
  160. default void appendBuilderWhere(StringBuilder sbr, OBuilder.Where wh, String tbAlias, List<Object> parameters) {
  161. if (DbUtil.isEmptyOrNull(wh.sql)) {
  162. if (!DbUtil.isEmptyOrNull(tbAlias)) {
  163. sbr.append(tbAlias).append(".");
  164. }
  165. sbr.append(getComma()).append(DbUtil.getColumnName(wh.key)).append(getComma()).append(" ").append(wh.op);
  166. String op = wh.op;
  167. Object value = wh.value;
  168. if ("in".equals(op.trim()) || "not in".equals(op.trim())) {
  169. sbr.append("(");
  170. for (int i = 0; i < Array.getLength(value); i++) {
  171. Object v = Array.get(value, i);
  172. sbr.append("?");
  173. parameters.add(v);
  174. /* if (v.getClass() == String.class) {
  175. sbr.append("'").append(DbUtil.injectDefend(v.toString())).append("'");
  176. } else {
  177. sbr.append(v);
  178. }*/
  179. if (i != Array.getLength(value) - 1) {
  180. sbr.append(",");
  181. }
  182. }
  183. sbr.append(")");
  184. } else {
  185. //转换取值方式
  186. sbr.append("?");
  187. parameters.add(value);
  188. /* if (value.getClass() == String.class) {
  189. sbr.append("'").append(value).append("'");
  190. } else if (wh.value.getClass() == Date.class) {
  191. sbr.append("'").append(new Timestamp(((Date) value).getTime())).append("'");
  192. } else {
  193. // sbr.append(value);
  194. }*/
  195. }
  196. } else {
  197. //别名判断
  198. sbr.append(" (");
  199. sbr.append(appendWhereSql(wh.sql, wh.sqlValues, tbAlias, parameters));
  200. sbr.append(") ");
  201. }
  202. }
  203. /**
  204. * 校验字段的值
  205. */
  206. default void checkFieldValue(Field field, Object value, boolean insertCheck) {
  207. if (!field.isAnnotationPresent(DBF.class)) {
  208. return;
  209. }
  210. DBF dbf = field.getAnnotation(DBF.class);
  211. //插入SQL校验必填
  212. if (insertCheck) {
  213. if (dbf.required() && DbUtil.isEmptyOrNull(value)) {
  214. throw new IllegalArgumentException("【" + dbf.comment() + "】取值不能为空");
  215. }
  216. }
  217. int min = dbf.min();
  218. int max = dbf.max();
  219. if (dbf.min() > 0) {
  220. if (value instanceof Integer || value instanceof Short || value instanceof Double || value instanceof Long) {
  221. if (BigDecimal.valueOf(min).compareTo(new BigDecimal(String.valueOf(value))) > 0) {
  222. throw new IllegalArgumentException("【" + dbf.comment() + "】最小值为" + min);
  223. }
  224. if (max > 0 && BigDecimal.valueOf(max).compareTo(new BigDecimal(value.toString())) < 0) {
  225. throw new IllegalArgumentException("【" + dbf.comment() + "】最大值为" + max);
  226. }
  227. } else if (value instanceof String || value instanceof Character) {
  228. if (!DbUtil.isEmptyOrNull(value)) {
  229. int length = value.toString().length();
  230. if (min > length) {
  231. throw new IllegalArgumentException("【" + dbf.comment() + "】最小长度为" + min);
  232. }
  233. if (max > 0 && max < length) {
  234. throw new IllegalArgumentException("【" + dbf.comment() + "】最大长度为" + max);
  235. }
  236. }
  237. }
  238. }
  239. }
  240. }