Class SQLUtils

java.lang.Object
com.pugwoo.dbhelper.sql.SQLUtils

public class SQLUtils extends Object
SQL解析工具类
Author:
pugwoo 2017年3月16日 23:02:47
  • 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 - 是否只查询key
      isSelect1 - 是否只select 1,不查询实际字段;当该值为true时,selectOnlyKey无效。
      features - 将dbHelper的特性开关传入,用于处理生成的SQL
      postSql - 将postSql传入,目前仅用于确定select 1字段的附加computed字段是否加入
      Returns:
      返回拼凑返回的SQL
    • getSelectCountSQL

      public static String getSelectCountSQL(DatabaseTypeEnum databaseType, Class<?> clazz)
      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

      public static <T> String getDeleteSQL(DatabaseTypeEnum databaseType, T t, List<Object> values)
      获得硬删除SQL
    • getDeleteSqlByKeyField

      public static String getDeleteSqlByKeyField(DatabaseTypeEnum databaseType, Field keyField)
    • 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

      public static String genLimitSQL(DatabaseTypeEnum databaseType, Integer offset, Integer limit)
      拼凑limit字句。前面有空格。
      Parameters:
      offset - 可以为null
      limit - 不能为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

      public static boolean isContainsLimit(String postSql) throws net.sf.jsqlparser.JSQLParserException
      判断postSql是否包含了limit子句
      Parameters:
      postSql - 从where开始的子句
      Returns:
      是返回true,否返回false;如果解析异常返回false
      Throws:
      net.sf.jsqlparser.JSQLParserException
    • getColumnName

      public static String getColumnName(DatabaseTypeEnum databaseType, String columnName)