Package com.pugwoo.dbhelper.sql
Class SQLUtils
java.lang.Object
com.pugwoo.dbhelper.sql.SQLUtils
SQL解析工具类
- Author:
- pugwoo 2017年3月16日 23:02:47
-
Nested Class Summary
Nested Classes -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionstatic StringautoSetSoftDeleted(DatabaseTypeEnum databaseType, String whereSql, Class<?> clazz) static StringautoSetSoftDeleted(DatabaseTypeEnum databaseType, String whereSql, Class<?> clazz, String extraWhere) 自动为【最后】where sql字句加上软删除查询字段。 说明:不支持virtualTable虚拟表。static StringgenLimitSQL(DatabaseTypeEnum databaseType, Integer offset, Integer limit) 拼凑limit字句。前面有空格。static <T> SQLUtils.BatchUpdateResultDTOgetBatchUpdateSQL(DatabaseTypeEnum databaseType, Collection<T> list, List<Object> values, Field casVersionColumn, Field keyColumn, List<Field> notKeyColumns, Class<?> clazz) 生成批量update的sqlstatic StringgetColumnName(DatabaseTypeEnum databaseType, String columnName) static StringgetComputedColumn(DatabaseTypeEnum databaseType, Column column, Map<FeatureEnum, Boolean> features) 拿到computed SQL在特性开关的情况下的返回值。说明:调用此方法请确保计算列是非空的。static <T> StringgetCustomDeleteSQL(DatabaseTypeEnum databaseType, Class<T> clazz, String postSql) 获得自定义删除SQL,给物理删除的static <T> StringgetCustomSoftDeleteSQL(DatabaseTypeEnum databaseType, Class<T> clazz, String postSql, Field softDelete) static <T> StringgetCustomUpdateSQL(DatabaseTypeEnum databaseType, T t, List<Object> values, String setSql) 获得自定义更新的sqlstatic <T> StringgetDeleteSQL(DatabaseTypeEnum databaseType, T t, List<Object> values) 获得硬删除SQLstatic StringgetDeleteSqlByKeyField(DatabaseTypeEnum databaseType, Field keyField) static <T> StringgetInsertSQL(DatabaseTypeEnum databaseType, T t, List<Object> values, boolean isWithNullValue) 生成insert语句insert into (...) values (?,?,?),将值放到values中。static InsertSQLForBatchDTOgetInsertSQLForBatch(DatabaseTypeEnum databaseType, String tableName, Collection<Map<String, Object>> list, List<Object> values) 生成insert语句insert into (...) values (?,?,?),将值放到values中。static InsertSQLForBatchDTOgetInsertSQLForBatch(DatabaseTypeEnum databaseType, String tableName, List<String> cols, Collection<Object[]> list, List<Object> values) 生成insert语句insert into (...) values (?,?,?),将值放到values中。static <T> InsertSQLForBatchDTOgetInsertSQLForBatch(DatabaseTypeEnum databaseType, Collection<T> list, List<Object> values) 生成insert语句insert into (...) values (?,?,?),将值放到values中。static StringgetInsertSQLForBatchForJDBCTemplate(DatabaseTypeEnum databaseType, String tableName, Collection<Map<String, Object>> list, List<Object[]> values) 生成insert语句insert into (...) values (?,?,?),将值放到values中。 说明:这种方式是交给jdbc驱动来处理批量插入。static StringgetInsertSQLForBatchForJDBCTemplate(DatabaseTypeEnum databaseType, String tableName, List<String> cols) 生成insert语句insert into (...) values (?,?,?),将值放到values中。 说明:这种方式是交给jdbc驱动来处理批量插入。static <T> StringgetInsertSQLForBatchForJDBCTemplate(DatabaseTypeEnum databaseType, Collection<T> list, List<Object[]> values) 生成insert语句insert into (...) values (?,?,?),将值放到values中。 说明:这种方式是交给jdbc驱动来处理批量插入。static <T> StringgetKeysWhereSQL(DatabaseTypeEnum databaseType, T t, List<Object> keyValues) 获得主键where子句,包含where关键字。会自动处理软删除条件static StringgetKeysWhereSQLWithoutSoftDelete(DatabaseTypeEnum databaseType, Class<?> clazz) 获得主键where子句,包含where关键字static StringgetSelectCountSQL(DatabaseTypeEnum databaseType, Class<?> clazz) select count(1) from t_table, 不包含where子句及以后的语句static StringgetSelectSQL(DatabaseTypeEnum databaseType, Class<?> clazz, boolean selectOnlyKey, boolean isSelect1, Map<FeatureEnum, Boolean> features, String postSql) select 字段 from t_table, 不包含where子句及以后的语句static <T> StringgetSoftDeleteSQL(DatabaseTypeEnum databaseType, T t, Column softDeleteColumn, List<Object> values) 获得软删除SQLstatic <T> StringgetUpdateAllSQL(DatabaseTypeEnum databaseType, Class<T> clazz, String setSql, String whereSql, String extraWhereSql) 获得批量更新sqlstatic <T> StringgetUpdateSQL(DatabaseTypeEnum databaseType, T t, List<Object> values, boolean withNull, String postSql) 生成update语句static StringinsertWhereAndExpression(DatabaseTypeEnum databaseType, String whereSql, String condExpression) 往where sql里面插入AND关系的表达式。 例如:whereSql为 where a!=3 or a!=2 limit 1 condExpress为 deleted=0 那么返回:where (deleted=0 and (a!=3 or a!=2)) limit 1static booleanisContainsLimit(String postSql) 判断postSql是否包含了limit子句static StringremoveLimitAndAddOrder(DatabaseTypeEnum databaseType, String whereSql, boolean autoAddOrderForPagination, Class<?> clazz) 移除whereSql中的limit子句;检查并加上order by子句
-
Constructor Details
-
SQLUtils
public SQLUtils()
-
-
Method Details
-
getSelectSQL
public static String getSelectSQL(DatabaseTypeEnum databaseType, Class<?> clazz, boolean selectOnlyKey, boolean isSelect1, Map<FeatureEnum, Boolean> features, String postSql) select 字段 from t_table, 不包含where子句及以后的语句- Parameters:
clazz- 注解了Table的类selectOnlyKey- 是否只查询keyisSelect1- 是否只select 1,不查询实际字段;当该值为true时,selectOnlyKey无效。features- 将dbHelper的特性开关传入,用于处理生成的SQLpostSql- 将postSql传入,目前仅用于确定select 1字段的附加computed字段是否加入- Returns:
- 返回拼凑返回的SQL
-
getSelectCountSQL
select count(1) from t_table, 不包含where子句及以后的语句- Parameters:
clazz- 注解了Table的表- Returns:
- 生成的SQL
-
getKeysWhereSQL
public static <T> String getKeysWhereSQL(DatabaseTypeEnum databaseType, T t, List<Object> keyValues) throws NoKeyColumnAnnotationException, NullKeyValueException 获得主键where子句,包含where关键字。会自动处理软删除条件- Parameters:
t- 注解了Table的类的对象keyValues- 返回传入sql的参数,如果提供list则写入- Returns:
- 返回值前面会带空格,以确保安全。
- Throws:
NoKeyColumnAnnotationException- 当t的类没有注解任何isKey=true的列时抛出NullKeyValueException- 当t中的主键都是null时抛出
-
getKeysWhereSQLWithoutSoftDelete
public static String getKeysWhereSQLWithoutSoftDelete(DatabaseTypeEnum databaseType, Class<?> clazz) throws NoKeyColumnAnnotationException 获得主键where子句,包含where关键字- Parameters:
clazz- 注解了Table的类- Throws:
NoKeyColumnAnnotationException- 当没有注解isKey=1的列时抛出
-
getInsertSQL
public static <T> String getInsertSQL(DatabaseTypeEnum databaseType, T t, List<Object> values, boolean isWithNullValue) 生成insert语句insert into (...) values (?,?,?),将值放到values中。- Parameters:
t- 注解了Table的对象values- 必须,要插入的参数值isWithNullValue- 标记是否将null字段放到insert语句中- Returns:
- 生成的SQL
-
getInsertSQLForBatch
public static <T> InsertSQLForBatchDTO getInsertSQLForBatch(DatabaseTypeEnum databaseType, Collection<T> list, List<Object> values) 生成insert语句insert into (...) values (?,?,?),将值放到values中。- Parameters:
list- 要插入的数据,非空values- 返回的参数列表- Returns:
- 插入的SQL
-
getInsertSQLForBatch
public static InsertSQLForBatchDTO getInsertSQLForBatch(DatabaseTypeEnum databaseType, String tableName, Collection<Map<String, Object>> list, List<Object> values) 生成insert语句insert into (...) values (?,?,?),将值放到values中。- Parameters:
list- 要插入的数据,非空values- 返回的参数列表- Returns:
- 插入的SQL
-
getInsertSQLForBatch
public static InsertSQLForBatchDTO getInsertSQLForBatch(DatabaseTypeEnum databaseType, String tableName, List<String> cols, Collection<Object[]> list, List<Object> values) 生成insert语句insert into (...) values (?,?,?),将值放到values中。- Parameters:
values- 返回的参数列表- Returns:
- 插入的SQL
-
getInsertSQLForBatchForJDBCTemplate
public static <T> String getInsertSQLForBatchForJDBCTemplate(DatabaseTypeEnum databaseType, Collection<T> list, List<Object[]> values) 生成insert语句insert into (...) values (?,?,?),将值放到values中。 说明:这种方式是交给jdbc驱动来处理批量插入。- Parameters:
list- 要插入的数据,非空values- 返回的参数列表- Returns:
- 插入的SQL
-
getInsertSQLForBatchForJDBCTemplate
public static String getInsertSQLForBatchForJDBCTemplate(DatabaseTypeEnum databaseType, String tableName, Collection<Map<String, Object>> list, List<Object[]> values) 生成insert语句insert into (...) values (?,?,?),将值放到values中。 说明:这种方式是交给jdbc驱动来处理批量插入。- Parameters:
tableName- 要插入的表名list- 列和数据的集合values- 返回的参数列表- Returns:
- 插入的SQL
-
getInsertSQLForBatchForJDBCTemplate
public static String getInsertSQLForBatchForJDBCTemplate(DatabaseTypeEnum databaseType, String tableName, List<String> cols) 生成insert语句insert into (...) values (?,?,?),将值放到values中。 说明:这种方式是交给jdbc驱动来处理批量插入。- Parameters:
tableName- 要插入的表名cols- 列和列表- Returns:
- 插入的SQL
-
getBatchUpdateSQL
public static <T> SQLUtils.BatchUpdateResultDTO getBatchUpdateSQL(DatabaseTypeEnum databaseType, Collection<T> list, List<Object> values, Field casVersionColumn, Field keyColumn, List<Field> notKeyColumns, Class<?> clazz) 生成批量update的sql- Parameters:
list- 要更新的对象values- sql中对应的参数casVersionColumn- cas版本号列,如果为null则表示没有keyColumn- 主键列,目前的主键列只有一列,在外层调用时限制了notKeyColumns- 非主键列- Returns:
- 批量update的sql;如果返回空字符串表示不需要更新,且应该当成功处理
-
getUpdateSQL
public static <T> String getUpdateSQL(DatabaseTypeEnum databaseType, T t, List<Object> values, boolean withNull, String postSql) 生成update语句- Parameters:
t- 注解了Table的对象values- 要更新的值withNull- 是否更新null值postSql- 附带的where子句- Returns:
- 返回值为null表示不需要更新操作,这个是这个方法特别之处
-
getUpdateAllSQL
public static <T> String getUpdateAllSQL(DatabaseTypeEnum databaseType, Class<T> clazz, String setSql, String whereSql, String extraWhereSql) 获得批量更新sql- Parameters:
clazz- 注解了Table的类setSql- update的set子句whereSql- 附带的where子句extraWhereSql- 会放在最后,以满足update子select语句的要求- Returns:
- 生成的SQL
-
getCustomUpdateSQL
public static <T> String getCustomUpdateSQL(DatabaseTypeEnum databaseType, T t, List<Object> values, String setSql) 获得自定义更新的sql- Parameters:
t- 注解了Table的对象values- 要update的参数值setSql- set子句SQL- Returns:
- 生成的SQL
-
getSoftDeleteSQL
public static <T> String getSoftDeleteSQL(DatabaseTypeEnum databaseType, T t, Column softDeleteColumn, List<Object> values) 获得软删除SQL- Parameters:
t- 注解了Table的对象values- 要传回给调用方的更新值- Returns:
- 生成的SQL
-
getCustomDeleteSQL
public static <T> String getCustomDeleteSQL(DatabaseTypeEnum databaseType, Class<T> clazz, String postSql) 获得自定义删除SQL,给物理删除的 -
getCustomSoftDeleteSQL
public static <T> String getCustomSoftDeleteSQL(DatabaseTypeEnum databaseType, Class<T> clazz, String postSql, Field softDelete) -
getDeleteSQL
获得硬删除SQL -
getDeleteSqlByKeyField
-
insertWhereAndExpression
public static String insertWhereAndExpression(DatabaseTypeEnum databaseType, String whereSql, String condExpression) throws net.sf.jsqlparser.JSQLParserException 往where sql里面插入AND关系的表达式。 例如:whereSql为 where a!=3 or a!=2 limit 1 condExpress为 deleted=0 那么返回:where (deleted=0 and (a!=3 or a!=2)) limit 1- Parameters:
whereSql- 从where起的sql子句,如果有where必须带上where关键字。condExpression- 例如a=? 不带where或and关键字。- Returns:
- 注意返回字符串前面没有空格
- Throws:
net.sf.jsqlparser.JSQLParserException- SQL解析错误时抛出
-
autoSetSoftDeleted
public static String autoSetSoftDeleted(DatabaseTypeEnum databaseType, String whereSql, Class<?> clazz) -
removeLimitAndAddOrder
public static String removeLimitAndAddOrder(DatabaseTypeEnum databaseType, String whereSql, boolean autoAddOrderForPagination, Class<?> clazz) 移除whereSql中的limit子句;检查并加上order by子句 -
autoSetSoftDeleted
public static String autoSetSoftDeleted(DatabaseTypeEnum databaseType, String whereSql, Class<?> clazz, String extraWhere) 自动为【最后】where sql字句加上软删除查询字段。 说明:不支持virtualTable虚拟表。- Parameters:
whereSql- 如果有where条件的,【必须】带上where关键字;如果是group by或空的字符串或null都可以clazz- 要操作的DO类extraWhere- 附带的where语句,会加进去,不能带where关键字,仅能是where的条件字句,该子句会放到最后- Returns:
- 无论如何前面会加空格,更安全
-
genLimitSQL
拼凑limit字句。前面有空格。- Parameters:
offset- 可以为nulllimit- 不能为null- Returns:
- 生成的SQL
-
getComputedColumn
public static String getComputedColumn(DatabaseTypeEnum databaseType, Column column, Map<FeatureEnum, Boolean> features) 拿到computed SQL在特性开关的情况下的返回值。说明:调用此方法请确保计算列是非空的。- Parameters:
column- 列注解features- 特性开关map- Returns:
- 返回计算列的结果SQL
-
isContainsLimit
判断postSql是否包含了limit子句- Parameters:
postSql- 从where开始的子句- Returns:
- 是返回true,否返回false;如果解析异常返回false
- Throws:
net.sf.jsqlparser.JSQLParserException
-
getColumnName
-