Package org.eweb4j.orm.sql

Source Code of org.eweb4j.orm.sql.InsertSqlCreator

package org.eweb4j.orm.sql;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

import javax.persistence.OneToOne;

import org.eweb4j.orm.config.ORMConfigBeanUtil;
import org.eweb4j.util.ClassUtil;
import org.eweb4j.util.ReflectUtil;


/**
* 生成插入语句
*
* @author cfuture.aw
* @since v1.a.0
*/
public class InsertSqlCreator<T> {
  private T[] ts;

  public InsertSqlCreator(T... ts) {
    T[] tmp = null;
    if (ts != null && ts.length > 0) {
      tmp = ts.clone();
    }
    this.ts = tmp;
  }

  public String[] create() throws SqlCreateException {
    return this.create(null);
  }

  public String[] createByFields(String[] fields) throws SqlCreateException {
    return createByFieldsIsValues(new String[][] { fields }, null);
  }

  public String[] createByFieldsIsValues(String[][] fields, String[][] values)
      throws SqlCreateException {
    String[] sqls = new String[ts.length];
    for (int i = 0; i < ts.length; ++i) {
      T t = ts[i];
      ReflectUtil ru = new ReflectUtil(t);
      Class<?> clazz = t.getClass();
      String table = ORMConfigBeanUtil.getTable(clazz);
      StringBuilder columnSB = new StringBuilder();
      StringBuilder valueSB = new StringBuilder();
      for (int j = 0; j < fields[i].length; ++j) {
        String name = fields[i][j];
        Object _value = null;
        Object value = null;
        if (values == null) {
          Method getter = null;
          try {
            getter = ru.getGetter(name);
            if (getter == null)
              continue;

            _value = getter.invoke(t);
            if (_value == null)
              continue;

            if (ClassUtil.isPojo(_value.getClass())) {
              Field f = ru.getField(fields[i][j]);
              OneToOne oneAnn = getter
                  .getAnnotation(OneToOne.class);
              if (oneAnn == null)
                oneAnn = f.getAnnotation(OneToOne.class);
              if (oneAnn != null) {
                ReflectUtil tarRu = new ReflectUtil(_value);
                String tarFKField = ORMConfigBeanUtil
                    .getIdField(_value.getClass());

                Method tarFKGetter = tarRu
                    .getGetter(tarFKField);
                value = tarFKGetter.invoke(_value);
              }
            }

            if (value == null)
              value = _value;
          } catch (Exception e) {
            throw new SqlCreateException(getter
                + " invoke exception " + e.toString());
          }
        } else {
          value = values[i][j];
        }

        String column = ORMConfigBeanUtil.getColumn(clazz, name);
        if (valueSB.length() > 0) {
          columnSB.append(",");
          valueSB.append(",");
        }

        columnSB.append(column);
        valueSB.append("'").append(value).append("'");
      }

      sqls[i] = String.format("INSERT INTO %s(%s) VALUES(%s) ;", table,
          columnSB.toString(), valueSB.toString());
    }

    return sqls;
  }

  public static String createByColumnsIsValues(String table,
      String[] columns, String[] values) {
    String sql = null;
    StringBuilder columnSB = new StringBuilder();
    StringBuilder valueSB = new StringBuilder();
    for (int i = 0; i < columns.length; i++) {
      String column = columns[i];
      String value = values[i];

      if (valueSB.length() > 0) {
        columnSB.append(",");
        valueSB.append(",");
      }

      columnSB.append(column);
      valueSB.append("'").append(value).append("'");
    }

    sql = String.format("INSERT INTO %s(%s) VALUES(%s) ;", table,
        columnSB.toString(), valueSB.toString());

    return sql;
  }

  public String[] create(String condition) throws SqlCreateException {
    String[] sqls = new String[ts.length];
    for (int index = 0; index < ts.length; ++index) {
      String table = null;
      StringBuilder columnSB = new StringBuilder();
      StringBuilder valueSB = new StringBuilder();
      T t = ts[index];
      Class<?> clazz = t.getClass();
      table = ORMConfigBeanUtil.getTable(clazz);
      String[] fields = ORMConfigBeanUtil.getFields(clazz);
      String[] _columns = ORMConfigBeanUtil.getColumns(clazz);
      ReflectUtil ru = new ReflectUtil(t);
      for (int i = 0; i < _columns.length; i++) {
        String column = _columns[i];
        String name = fields[i];

        Method getter = ru.getGetter(name);
        if (getter == null)
          continue;

        Object _value = null;
        Object value = null;
        try {
          _value = getter.invoke(t);
          if (_value == null)
            continue;

          if (ClassUtil.isPojo(_value.getClass())) {
            Field f = ru.getField(name);
            OneToOne oneAnn = getter.getAnnotation(OneToOne.class);
            if (oneAnn == null)
              oneAnn = f.getAnnotation(OneToOne.class);
            if (oneAnn != null) {
              ReflectUtil tarRu = new ReflectUtil(_value);
              String tarFKField = ORMConfigBeanUtil
                  .getIdField(_value.getClass());

              Method tarFKGetter = tarRu.getGetter(tarFKField);
              value = tarFKGetter.invoke(_value);
            }
          }

          if (value == null)
            value = _value;

        } catch (Exception e) {
          throw new SqlCreateException(getter + " invoke exception "
              + e.toString());
        }

        String idColumn = ORMConfigBeanUtil.getIdColumn(t.getClass());
        // id 字段不允许插入表中
        if (idColumn != null && idColumn.equalsIgnoreCase(column))
          continue;

        if (columnSB.length() > 0)
          columnSB.append(",");

        columnSB.append(column);

        if (valueSB.length() > 0)
          valueSB.append(",");

        valueSB.append("'").append(value).append("'");

      }

      String format = "INSERT INTO ${table}(${columns}) VALUES(${values}) ${condition} ;";
      format = format.replace("${table}", table);
      format = format.replace("${columns}", columnSB.toString());
      format = format.replace("${values}", valueSB.toString());

      if (condition != null)
        format = format.replace("${condition}", " WHERE " + condition);
      else
        format = format.replace("${condition}", "");

      sqls[index] = format;
    }

    return sqls;
  }

  public T[] getTs() {
    T[] tmp = null;
    if (ts != null && ts.length > 0) {
      tmp = ts.clone();
    }
    return tmp;
  }

  public void setTs(T[] ts) {
    T[] tmp = null;
    if (ts != null && ts.length > 0) {
      tmp = ts.clone();
    }
    this.ts = tmp;
  }
}
TOP

Related Classes of org.eweb4j.orm.sql.InsertSqlCreator

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.