All Downloads are FREE. Search and download functionalities are using the official Maven repository.

me.wuwenbin.modules.sql.util.SQLBuilderUtils Maven / Gradle / Ivy

There is a newer version: 1.11.0.RELEASE
Show newest version
package me.wuwenbin.modules.sql.util;


import me.wuwenbin.modules.sql.annotation.MappedSuper;
import me.wuwenbin.modules.sql.annotation.SQLColumn;
import me.wuwenbin.modules.sql.annotation.SQLTable;
import me.wuwenbin.modules.sql.annotation.not.NotInsert;
import me.wuwenbin.modules.sql.annotation.not.NotSelect;
import me.wuwenbin.modules.sql.annotation.not.NotUpdate;
import me.wuwenbin.modules.sql.constant.Router;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Vector;
import java.util.stream.Collectors;


/**
 * some methods of sql building
 * 

* Created by wuwenbin on 2017/1/9. */ public class SQLBuilderUtils { private static final String SINGLE_SPACE = " "; private static final String DOUBLE_SPACE = " "; private static final String AND = "AND"; private static final String ANDSPACE = "AND "; private static final String COMMA = ","; private static final String COMMASPACE = ", "; /** * 最后生成sql时候,做一些字符串处理 * * @param sql to transfer * @return {@link String} */ public static String dealSQL(String sql) { sql = sql.replace(", FROM ", " FROM ").replace(", FROM ", " FROM "); sql = sql.replace(", WHERE ", " WHERE ").replace(", WHERE ", " WHERE "); sql = sql.replace(", )", ")"); sql = sql.replace(DOUBLE_SPACE, SINGLE_SPACE); if (sql.endsWith(AND)) { sql = sql.substring(0, sql.length() - 3); } if (sql.endsWith(ANDSPACE)) { sql = sql.substring(0, sql.length() - 4); } if (sql.endsWith(COMMA)) { sql = sql.substring(0, sql.length() - 1); } if (sql.endsWith(COMMASPACE)) { sql = sql.substring(0, sql.length() - 2); } return sql; } /** * bean上是否存在@SQLTable * * @param beanClass the obj of sql building * @return {@link Boolean} */ public static boolean SQLTableIsExist(Class beanClass) { return beanClass.isAnnotationPresent(SQLTable.class); } /** * 检查字段上的routers是否是方法参数中指定的 * * @param filedRouters 字段上的routers * @param paramRouters 方法参数中的routers * @return {@link Boolean} */ public static boolean fieldRoutersInParamRouters(int[] filedRouters, int[] paramRouters) { List paramRouterList = new ArrayList<>(); for (int paramRouter : paramRouters) { paramRouterList.add(paramRouter); } for (int filedRouter : filedRouters) { if (paramRouterList.contains(filedRouter)) { return true; } } return false; } /** * 获取类中所有字段包括父类的protected字段 * * @param clazz * @return */ public static Field[] getAllFieldsExceptObject(Class clazz) { List fields = new Vector<>(); Class tempClass = clazz; while (tempClass != Object.class) { fields.addAll(Arrays.asList(tempClass.getDeclaredFields())); tempClass = tempClass.getSuperclass(); while (!isMappedSuperClass(tempClass)) { if (tempClass == Object.class) { break; } tempClass = tempClass.getSuperclass(); } } Field[] newField = new Field[fields.size()]; for (int i = 0; i < fields.size(); i++) { Field field = fields.get(i); newField[i] = field; } return newField; } /** * routers条件判断是否为不为空 * * @param routers * @return */ public static boolean routerIsNotEmpty(int... routers) { return routers != null && routers.length > 0; } /** * 判断是否需要把父类的字段也一起囊括 * * @param clazz * @return */ private static boolean isMappedSuperClass(Class clazz) { return clazz.isAnnotationPresent(MappedSuper.class) && clazz.getAnnotation(MappedSuper.class).value(); } /** * 判断类中属性字段是否有含有不能select的 * * @param fields * @return */ public static boolean hasNoSelectField(Field[] fields) { for (Field field : fields) { if (!canBeSelect(field)) { return true; } } return false; } /** * 判断类中属性字段是否有含有不能insert的 * * @param fields * @return */ public static boolean hasNoInsertField(Field[] fields) { for (Field field : fields) { if (!canBeInsert(field)) { return true; } } return false; } /** * 判断类中属性字段是否有含有不能update的 * * @param fields * @return */ public static boolean hasNoUpdateField(Field[] fields) { for (Field field : fields) { if (!canBeUpdate(field)) { return true; } } return false; } /** * 判断当前列是否可以被select * * @param field * @return */ public static boolean canBeSelect(Field field) { return !field.isAnnotationPresent(NotSelect.class) && (!field.isAnnotationPresent(SQLColumn.class) || field.getAnnotation(SQLColumn.class).select()); } /** * 判断当前列是否可以被insert * * @param field * @return */ public static boolean canBeInsert(Field field) { return !field.isAnnotationPresent(NotInsert.class) && (!field.isAnnotationPresent(SQLColumn.class) || field.getAnnotation(SQLColumn.class).insert()); } /** * 判断当前列是否可以被update * * @param field * @return */ public static boolean canBeUpdate(Field field) { return !field.isAnnotationPresent(NotUpdate.class) && (!field.isAnnotationPresent(SQLColumn.class) || field.getAnnotation(SQLColumn.class).update()); } /** * 获取当前列上的router集合 * 有注解并且有声明router的话,返回此字段,没有则是返回默认的 * * @param field * @return */ public static int[] getRouterInField(Field field) { if (field.isAnnotationPresent(SQLColumn.class)) { return field.getAnnotation(SQLColumn.class).routers(); } else { return new int[]{Router.DEFAULT}; } } /** * 根据router获取Field数组对象. * 其实就是获取所有的Field然后根据router来过滤下 */ public static List getFieldsByRouters(Class clazz, int... routers) { Field[] fields = getAllFieldsExceptObject(clazz); return Arrays.stream(fields).filter(f -> { if (f.isAnnotationPresent(SQLColumn.class)) { int[] fieldRouters = f.getAnnotation(SQLColumn.class).routers(); return fieldRoutersInParamRouters(fieldRouters, routers); } else { return fieldRoutersInParamRouters(new int[]{Router.DEFAULT}, routers); } }).collect(Collectors.toList()); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy