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

cn.dreampie.orm.dialect.DefaultDialect Maven / Gradle / Ivy

There is a newer version: 1.3.0.RELEASE
Show newest version
package cn.dreampie.orm.dialect;


import cn.dreampie.common.util.Joiner;

import java.math.BigDecimal;
import java.sql.Types;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


/**
 * 数据库	validationQuery
 * Oracle	select 1 from dual
 * DB2	select 1 from sysibm.sysdummy1
 * mysql	select 1
 * microsoft sql	select 1
 * hsqldb	select 1 from INFORMATION_SCHEMA.SYSTEM_USERS
 * postgresql	select version();
 * ingres	select 1
 * derby	select 1
 * H2	select 1
 */
public abstract class DefaultDialect implements Dialect {


  private static Map typeMappings = new HashMap() {{
    put(Types.INTEGER, Integer.class);
    put(Types.SMALLINT, Integer.class);
    put(Types.BIGINT, Long.class);
    put(Types.FLOAT, Float.class);
    put(Types.DOUBLE, Double.class);
    put(Types.DECIMAL, BigDecimal.class);
  }};
  protected final Pattern selectPattern = Pattern.compile("^\\s*SELECT\\s+",
      Pattern.CASE_INSENSITIVE);
  protected final Pattern orderPattern = Pattern.compile("\\s+ORDER\\s+BY\\s+",
      Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
  protected final Pattern groupPattern = Pattern.compile("\\s+GROUP\\s+BY\\s+",
      Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
  protected final Pattern havingPattern = Pattern.compile("\\s+HAVING\\s+",
      Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);

  protected final Pattern selectSinglePattern = Pattern.compile("^\\s*SELECT\\s+((COUNT)\\([\\s\\S]*\\)\\s*,?)+((\\s*)|(\\s+FROM[\\s\\S]*))?$",
      Pattern.CASE_INSENSITIVE);

  public Class getColumnType(int type) {
    return typeMappings.get(type);
  }

  /**
   * 获取别名
   *
   * @param alias 别名
   * @return String
   */
  protected String getAlias(String alias) {
    if (null != alias && !"".equals(alias.trim())) {
      alias = " " + alias;
    } else {
      alias = "";
    }
    return alias;
  }

  /**
   * 获取前缀
   *
   * @param alias   别名
   * @param columns 列
   * @return 列数组
   */
  protected String[] getPrefix(String alias, String... columns) {
    if (null != alias && !"".equals(alias.trim()) && columns.length > 0) {
      String[] newColumns = new String[columns.length];
      int i = 0;
      for (String column : columns) {
        if (column.contains(".")) {
          return columns;
        } else {
          newColumns[i] = alias + "." + column;
        }
        i++;
      }
      return newColumns;
    } else {
      return columns;
    }
  }

  /**
   * 拼接where条件
   *
   * @param where 条件
   * @return String
   */
  public String getWhere(String where) {
    if (!where.startsWith(" ")) {
      where = " " + where;
    }

    Matcher om = orderPattern.matcher(where);
    if (om.find()) {
      if (om.start() == 0) {
        return where;
      }
    }

    Matcher gm = groupPattern.matcher(where);
    if (gm.find()) {
      if (gm.start() == 0) {
        return where;
      }
    }

    Matcher hm = havingPattern.matcher(where);
    if (hm.find()) {
      if (hm.start() == 0) {
        return where;
      }
    }

    return " WHERE" + where;
  }

  public String select(String table) {
    return "SELECT * FROM " + table;
  }

  public String select(String table, String... columns) {
    if (columns == null || columns.length <= 0) return select(table);
    return "SELECT " + Joiner.on(", ").join(columns) + " FROM " + table;
  }


  public String select(String table, String alias, String where) {
    if (where == null || "".equals(where.trim())) return select(table);
    return "SELECT * FROM " + table + getAlias(alias) + getWhere(where);
  }

  public String select(String table, String alias, String where, String... columns) {
    if (where == null || "".equals(where.trim())) return select(table, columns);
    if (columns == null || columns.length <= 0) return select(table, alias, where);
    return "SELECT " + Joiner.on(", ").join(getPrefix(alias, columns)) + " FROM " + table + getAlias(alias) + getWhere(where);
  }

  protected void appendQuestions(StringBuilder sql, int count) {
    for (int i = 0; i < count; i++) {
      if (i == 0)
        sql.append("?");
      else
        sql.append(",?");
    }
  }

  public String insert(String table, String... columns) {
    StringBuilder sql = new StringBuilder().append("INSERT INTO ").append(table).append(" (");
    sql.append(Joiner.on(", ").join(columns));
    sql.append(") VALUES (");
    appendQuestions(sql, columns.length);
    sql.append(')');
    return sql.toString();
  }


  public String delete(String table) {
    return "DELETE FROM " + table;
  }


  public String delete(String table, String where) {
    if (where == null || "".equals(where.trim())) return delete(table);
    return "DELETE FROM " + table + getWhere(where);
  }


  public String update(String table, String... columns) {
    if (columns == null || columns.length <= 0) throw new NullPointerException("Could not found columns to update.");
    return "UPDATE " + table + " SET " + Joiner.on("=?, ").join(columns) + "=?";
  }

  public String update(String table, String alias, String where, String... columns) {
    if (where == null || "".equals(where.trim())) return update(table, columns);
    if (columns == null || columns.length <= 0) throw new NullPointerException("Could not found columns to update.");
    return "UPDATE " + table + getAlias(alias) + " SET " + Joiner.on("=?, ").join(getPrefix(alias, columns)) + "=?" + getWhere(where);
  }

  public String count(String table) {
    return "SELECT COUNT(*) FROM " + table;
  }


  public String count(String table, String alias, String where) {
    if (where == null || "".equals(where.trim())) return count(table);
    return "SELECT COUNT(*) FROM " + table + getAlias(alias) + getWhere(where);
  }

  public String countWith(String sql) {
    Matcher om = orderPattern.matcher(sql);
    if (om.find()) {
      int index = om.end();
      if (index > sql.lastIndexOf(")")) {
        sql = sql.substring(0, om.start());
      }
    }
    return "SELECT COUNT(*) FROM (" + sql + ") count_alias";
  }

  public String paginate(int pageNumber, int pageSize, String table) {
    return paginateWith(pageNumber, pageSize, select(table));
  }

  public String paginate(int pageNumber, int pageSize, String table, String... columns) {
    return paginateWith(pageNumber, pageSize, select(table, columns));
  }

  public String paginate(int pageNumber, int pageSize, String table, String alias, String where) {
    return paginateWith(pageNumber, pageSize, select(table, alias, where));
  }

  public String paginate(int pageNumber, int pageSize, String table, String alias, String where, String... columns) {
    return paginateWith(pageNumber, pageSize, select(table, alias, where, columns));
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy