Beispiel #1
0
  private String makeSQL(T t, String[] fields, String[] values) throws SqlCreateException {
    Class<?> clazz = t.getClass();
    String table = ORMConfigBeanUtil.getTable(clazz);
    ReflectUtil ru = new ReflectUtil(t);
    String[] columns = ORMConfigBeanUtil.getColumns(clazz, fields);
    String idColumn = ORMConfigBeanUtil.getIdColumn(clazz);
    String idField = ORMConfigBeanUtil.getIdField(clazz);
    Method idGetter = ru.getGetter(idField);
    if (idGetter == null) throw new SqlCreateException("can not find id getter.");

    StringBuilder condition = new StringBuilder();
    try {
      condition.append(idColumn).append(" = '").append(idGetter.invoke(t)).append("'");
    } catch (Exception e) {
      throw new SqlCreateException(idGetter + " invoke exception " + e.toString());
    }
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < columns.length; ++i) {
      String column = columns[i];
      if (sb.length() > 0) sb.append(", ");

      sb.append(column).append(" = '");
      sb.append(values[i]).append("'");
    }

    return String.format("UPDATE %s SET %s WHERE %s ;", table, sb.toString(), condition);
  }
  private Sql makeSQL(T t, String[] fields, Object[] values) throws SqlCreateException {
    Sql sql = new Sql();
    Class<?> clazz = t.getClass();
    String table = ORMConfigBeanUtil.getTable(clazz, false);
    ReflectUtil ru = new ReflectUtil(t);
    String[] columns = ORMConfigBeanUtil.getColumns(clazz, fields);
    String idColumn = ORMConfigBeanUtil.getIdColumn(clazz);
    String idField = ORMConfigBeanUtil.getIdField(clazz);
    Method idGetter = ru.getGetter(idField);
    if (idGetter == null) throw new SqlCreateException("can not find id getter.");
    Object idValue = null;
    try {
      idValue = idGetter.invoke(t);
    } catch (Exception e) {
      throw new SqlCreateException(idGetter + " invoke exception " + e.toString(), e);
    }
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < columns.length; ++i) {
      String column = columns[i];
      if (sb.length() > 0) sb.append(", ");

      //			sb.append(column).append(" = '").append(values[i]).append("'");
      sb.append(column).append(" = ?");
      sql.args.add(values[i]);
    }
    //		String condition = new StringBuilder().append(idColumn).append(" =
    // ").append("'").append(idValue).append("'").toString();
    String condition = new StringBuilder().append(idColumn).append(" = ? ").toString();
    sql.args.add(idValue);
    sql.sql = String.format("UPDATE %s SET %s WHERE %s ;", table, sb.toString(), condition);

    return sql;
  }
  // IOC,注入对象到pojo
  private void injectIocBean() throws Exception {
    fields = ru.getFields();
    if (fields == null) return;

    for (Field f : fields) {
      Class<?> type = f.getType();

      Ioc ioc = f.getAnnotation(Ioc.class);
      if (ioc == null) continue;
      String beanId = "";
      if (ioc.value().trim().length() == 0) beanId = type.getSimpleName();
      else beanId = CommonUtil.parsePropValue(ioc.value());

      Method setter = ru.getSetter(f.getName());
      if (setter == null) continue;

      setter.invoke(this.actionObject, IOC.getBean(beanId));
    }
  }
  /** 一对多级联更新 */
  public void update(long newIdVal) {
    if (newIdVal <= 0 || this.fields == null || this.fields.size() == 0) return;
    if (this.idVal == null || "0".equals(this.idVal) || "".equals(this.idVal)) {
      return;
    } else if (DAOFactory.getSelectDAO(dsName).selectOne(t, this.idField) == null) {
      // 检查一下当前对象的ID是否存在于数据库
      return;
    }
    // "update {table} set {idCol} = {newIdVal} where {idCol} = {idVal}
    // ; update {relTable} set {fromCol} = {newIdVal} where {fromCol} = {idVal}"
    String format = "update %s set %s = %s where %s = %s ;";
    for (Field f : fields) {
      Method tarGetter = ru.getGetter(f.getName());
      if (tarGetter == null) continue;

      ManyToMany ann = tarGetter.getAnnotation(ManyToMany.class);
      if (ann == null) {
        ann = f.getAnnotation(ManyToMany.class);
        if (ann == null) continue;
      }

      JoinTable join = tarGetter.getAnnotation(JoinTable.class);
      if (join == null) {
        join = f.getAnnotation(JoinTable.class);
        if (join == null) continue;
      }

      JoinColumn[] froms = join.joinColumns();
      if (froms == null || froms.length == 0) continue;

      // 第三方关系表
      String relTable = join.name();
      // 主类在第三方关系表中的字段名
      String from = froms[0].name();

      try {
        // "update {table} set {idCol} = {newIdVal} where {idCol} = {idVal}
        // ; update {relTable} set {fromCol} = {newIdVal} where {fromCol} = {idVal}"
        final String sql1 = String.format(format, table, idColumn, newIdVal, idColumn, idVal);
        final String sql2 = String.format(format, relTable, from, newIdVal, from, idVal);
        Transaction.execute(
            new Trans() {

              @Override
              public void run(Object... args) throws Exception {
                DAOFactory.getUpdateDAO(dsName).updateBySQL(sql1);
                DAOFactory.getUpdateDAO(dsName).updateBySQL(sql2);
              }
            });

      } catch (Exception e) {
        throw new DAOException("", e);
      }
    }
  }
  public void init(Object t, List<Field> fields) throws DAOException {
    this.t = t;
    this.fields = fields;
    this.ru = new ReflectUtil(this.t);
    this.table = ORMConfigBeanUtil.getTable(this.t.getClass(), true);
    // 主类的ID属性名
    this.idField = ORMConfigBeanUtil.getIdField(this.t.getClass());
    this.idSetter = ru.getSetter(idField);
    if (this.idSetter == null) throw new DAOException("can not get idSetter.", null);

    this.idGetter = ru.getGetter(idField);
    if (this.idGetter == null) throw new DAOException("can not get idGetter.", null);

    this.idColumn = ORMConfigBeanUtil.getIdColumn(this.t.getClass());

    try {
      Object _idVal = idGetter.invoke(this.t);
      this.idVal = _idVal == null ? null : String.valueOf(_idVal);
    } catch (Exception e) {
      throw new DAOException(idGetter + " invoke exception ", e);
    }
  }
  /**
   * handle action class
   *
   * @param clsName
   * @throws Exception
   */
  public boolean handleClass(String clsName) {

    // log.debug("handleClass -> " + clsName);

    Class<?> cls = null;
    try {
      cls = Class.forName(clsName);

      if (cls == null) return false;

      String simpleName = cls.getSimpleName();
      Controller controlAnn = cls.getAnnotation(Controller.class);
      if (controlAnn == null
          && !simpleName.endsWith("Controller")
          && !simpleName.endsWith("Action")
          && !simpleName.endsWith("Control")) return false;

      String moduleName =
          CommonUtil.toLowCaseFirst(simpleName.replace("Controller", "").replace("Control", ""));
      if (simpleName.endsWith("Action")) {
        moduleName = "";
      }

      Object obj = null;
      try {
        if (cls.getAnnotation(Singleton.class) != null) {
          obj = SingleBeanCache.get(cls.getName());
          if (obj == null) {
            obj = cls.newInstance();
            SingleBeanCache.add(cls.getName(), obj);
          }
        } else obj = cls.newInstance();

      } catch (Error er) {
        // er.printStackTrace();
        log.debug("the action class new instance failued -> " + clsName + " | " + er.toString());
        return false;
      } catch (Exception e) {
        // e.printStackTrace();
        log.warn("the action class new instance failued -> " + clsName + " | " + e.toString());
        return false;
      }

      ReflectUtil ru = new ReflectUtil(obj);
      Method[] ms = ru.getMethods();
      if (ms == null) return false;

      // 扫描方法的注解信息
      for (Method m : ms) {
        if (m.getModifiers() != 1) continue;

        Path path = m.getAnnotation(Path.class);

        if (path == null) {
          String methodName = m.getName();
          Method getter = ru.getGetter(methodName.replace("get", ""));
          Method setter = ru.getSetter(methodName.replace("set", ""));
          // 默认下setter和getter不作为action方法
          if (getter != null || setter != null) continue;
        }

        handleActionConfigInfo(ru, cls, m, moduleName);
      }
    } catch (Error e) {
      return false;
    } catch (Exception e) {
      return false;
    }

    return true;
  }
 @Test
 public void test() throws Exception {
   ReflectUtil ru = new ReflectUtil(PetControl.class);
   new ActionAnnotationConfig()
       .handleActionConfigInfo(ru, PetControl.class, ru.getMethod("doHelloWorld"), "pets");
 }
  /**
   * 多对多级联查询 1.当主对象没有包含任何一个关联对象时,默认查询所有与之关联的对象 2.当主对象中包含了关联对象时(含有其id值),则只查询这些关联的对象
   *
   * @param <T>
   * @throws InvocationTargetException
   * @throws IllegalAccessException
   * @throws IllegalArgumentException
   */
  public void select() throws DAOException {
    if (this.fields == null || this.fields.size() == 0) return;
    // select %s from {tarTable} where {referencedColumn} in (select {to} from {relTable} where
    // {from} = {idVal})
    String format = "SELECT %s FROM %s WHERE %s IN (SELECT %s FROM %s WHERE %s = ?) ";
    if (idVal == null || "0".equals(idVal) || "".equals(idVal)) return;

    for (Field f : fields) {
      Method tarGetter = ru.getGetter(f.getName());
      if (tarGetter == null) continue;

      ManyToMany ann = tarGetter.getAnnotation(ManyToMany.class);
      if (ann == null) {
        ann = f.getAnnotation(ManyToMany.class);
        if (ann == null) continue;
      }

      JoinTable join = tarGetter.getAnnotation(JoinTable.class);
      if (join == null) {
        join = f.getAnnotation(JoinTable.class);
        if (join == null) continue;
      }

      JoinColumn[] froms = join.joinColumns();
      if (froms == null || froms.length == 0) continue;

      JoinColumn[] tos = join.inverseJoinColumns();
      if (tos == null || tos.length == 0) continue;

      // 多对多关系目标Class
      Class<?> tarClass = ann.targetEntity();
      if (void.class.isAssignableFrom(tarClass)) {
        tarClass = ClassUtil.getGenericType(f);
      }

      String tarTable = ORMConfigBeanUtil.getTable(tarClass, true);
      // 目标类对应的数据库表Id字段
      String referencedColumn = tos[0].referencedColumnName();
      if (referencedColumn == null || referencedColumn.trim().length() == 0)
        referencedColumn = ORMConfigBeanUtil.getIdColumn(tarClass);

      // 目标类在第三方关系表中的字段名
      String to = tos[0].name();

      // 第三方关系表
      String relTable = join.name();

      // 主类在第三方关系表中的字段名
      String from = froms[0].name();

      try {
        List<?> tarList = null;
        tarList = (List<?>) tarGetter.invoke(t);

        if (tarList != null && tarList.size() > 0) {
          for (int i = 0; i < tarList.size(); i++) {
            Object tarObj = tarList.get(i);
            ReflectUtil tarRu = new ReflectUtil(tarObj);
            String tarIdField = ORMConfigBeanUtil.getIdField(tarClass);
            Method tarIdGetter = tarRu.getGetter(tarIdField);
            Object tarIdValObj = tarIdGetter.invoke(tarObj);
            if (tarIdValObj == null) continue;
            String tarIdVal = String.valueOf(tarIdValObj);
            // 查询 select %s from {tarTable} where {tarIdColumn} = {tarIdVal}
            tarObj =
                DAOFactory.getSelectDAO(dsName)
                    .selectOne(tarClass, new String[] {tarIdField}, new String[] {tarIdVal});
          }
        } else {
          String sql =
              String.format(
                  format,
                  ORMConfigBeanUtil.getSelectAllColumn(tarClass),
                  tarTable,
                  referencedColumn,
                  to,
                  relTable,
                  from);
          // 从数据库中取出与当前主对象id关联的所有目标对象,
          tarList = DAOFactory.getSelectDAO(dsName).selectBySQL(tarClass, sql, idVal);
        }

        // 并注入到当前主对象的属性中
        Method tarSetter = ru.getSetter(f.getName());

        tarSetter.invoke(t, tarList);
      } catch (Exception e) {
        e.printStackTrace();
        throw new DAOException("", e);
      }
    }
  }
  /**
   * 多对多级联删除 1.如果主对象不存在与数据库,不处理 2.否则,检查当前主对象中的关联对象,如果关联对象为空,则删除所有与主对象有关的关联关系。
   * 3.如果当前主对象中含有关联对象,则删除这些关联对象与主对象的关系 4.不会删除主对象
   */
  public void delete() throws DAOException {
    if (this.fields == null || this.fields.size() == 0) return;

    // "delete from {relTable} WHERE {from} = {idVal} ;"
    String format = "delete from %s WHERE %s = ? ";
    if (idVal == null || "0".equals(idVal) || "".equals(idVal)) return;
    else if (DAOFactory.getSelectDAO(dsName).selectOne(t, this.idField) == null) return;

    for (Field f : fields) {
      Method tarGetter = ru.getGetter(f.getName());
      if (tarGetter == null) continue;

      ManyToMany ann = tarGetter.getAnnotation(ManyToMany.class);
      if (ann == null) {
        ann = f.getAnnotation(ManyToMany.class);
        if (ann == null) continue;
      }

      JoinTable join = tarGetter.getAnnotation(JoinTable.class);
      if (join == null) {
        join = f.getAnnotation(JoinTable.class);
        if (join == null) continue;
      }

      JoinColumn[] froms = join.joinColumns();
      if (froms == null || froms.length == 0) continue;

      JoinColumn[] tos = join.inverseJoinColumns();
      if (tos == null || tos.length == 0) continue;

      String relTable = join.name();
      String from = froms[0].name();

      List<?> tarList = null;

      try {
        tarList = (List<?>) tarGetter.invoke(t);
      } catch (Exception e) {
        throw new DAOException(tarGetter + " invoke exception ", e);
      }

      if (tarList == null || tarList.size() == 0) {
        String sql = String.format(format, relTable, from);
        // 删除所有关联记录
        DAOFactory.getUpdateDAO(dsName).updateBySQLWithArgs(sql, idVal);
      } else {
        // 删除指定关联的记录
        String to = tos[0].name();
        Class<?> tarClass = ann.targetEntity();
        if (void.class.isAssignableFrom(tarClass)) {
          tarClass = ClassUtil.getGenericType(f);
        }

        // "delete from {relTable} where {from} = {idVal} and to = {toVal}"
        String _format = "delete from %s where %s = ? and %s = ?";
        for (int i = 0; i < tarList.size(); i++) {
          Object tarObj = tarList.get(i);
          if (tarObj == null) continue;
          ReflectUtil tarRu = new ReflectUtil(tarObj);
          String tarIdField = ORMConfigBeanUtil.getIdField(tarClass);
          Method tarIdGetter = tarRu.getGetter(tarIdField);
          Object toValObj = null;

          try {
            toValObj = tarIdGetter.invoke(tarObj);
          } catch (Exception e) {
            throw new DAOException(tarIdGetter + "invoke exception ", e);
          }

          if (toValObj == null) continue;

          String toVal = String.valueOf(toValObj);
          if (DAOFactory.getSelectDAO(dsName)
                  .selectOne(tarClass, new String[] {tarIdField}, new String[] {toVal})
              == null) continue;

          String _sql = String.format(_format, relTable, from, to);
          DAOFactory.getUpdateDAO(dsName).updateBySQLWithArgs(_sql, idVal, toVal);
        }
      }
    }
  }
  private Sql makeSQL(T t) throws SqlCreateException {
    Sql sql = new Sql();
    Class<?> clazz = t.getClass();
    String table;
    String[] columns;
    String[] fields;
    Object[] values = null;
    String idColumn;
    String idField;
    Object idValue = null;
    HashMap<String, Object> map = null;
    if (Map.class.isAssignableFrom(clazz)) {
      map = (HashMap) t;
      table = (String) map.get("table");
      idColumn = (String) map.get("idColumn");
      idField = idColumn;
      idValue = map.get("idValue");
      columns = (String[]) map.get("columns");
      fields = columns;
      values = (Object[]) map.get("values");
    } else {
      table = ORMConfigBeanUtil.getTable(clazz, false);
      columns = ORMConfigBeanUtil.getColumns(clazz);
      fields = ORMConfigBeanUtil.getFields(clazz);
      idColumn = ORMConfigBeanUtil.getIdColumn(clazz);
      idField = ORMConfigBeanUtil.getIdField(clazz);
    }

    StringBuilder valuesSb = new StringBuilder();
    ReflectUtil ru = new ReflectUtil(t);
    try {
      if (map == null) {
        Method idGetter = ru.getGetter(idField);
        if (idGetter == null) throw new SqlCreateException("can not find id getter");
        idValue = idGetter.invoke(t);
      }

      for (int i = 0; i < columns.length; i++) {
        String column = columns[i];
        String field = fields[i];
        Object value = null;
        // id 字段不允许
        if (idColumn != null && idColumn.equalsIgnoreCase(column)) continue;

        if (map != null && values != null) {
          value = values[i];
        } else {
          Method getter = ru.getGetter(field);
          if (getter == null) continue;

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

          if (ClassUtil.isPojo(_value.getClass())) {
            Field f = ru.getField(field);
            OneToOne oneAnn = getter.getAnnotation(OneToOne.class);
            if (oneAnn == null) oneAnn = f.getAnnotation(OneToOne.class);

            ManyToOne manyToOneAnn = null;
            if (oneAnn == null) {
              manyToOneAnn = getter.getAnnotation(ManyToOne.class);
              if (manyToOneAnn == null) manyToOneAnn = f.getAnnotation(ManyToOne.class);
            }

            if (oneAnn != null || manyToOneAnn != null) {
              JoinColumn joinColAnn = getter.getAnnotation(JoinColumn.class);
              if (joinColAnn == null) joinColAnn = f.getAnnotation(JoinColumn.class);

              if (joinColAnn != null && joinColAnn.referencedColumnName().trim().length() > 0) {
                String refCol = joinColAnn.referencedColumnName();
                String refField = ORMConfigBeanUtil.getField(_value.getClass(), refCol);
                ReflectUtil tarRu = new ReflectUtil(_value);
                Method tarFKGetter = tarRu.getGetter(refField);
                value = tarFKGetter.invoke(_value);
              } else {
                ReflectUtil tarRu = new ReflectUtil(_value);
                String tarFKField = ORMConfigBeanUtil.getIdField(_value.getClass());
                if (tarFKField != null) {
                  Method tarFKGetter = tarRu.getGetter(tarFKField);
                  value = tarFKGetter.invoke(_value);
                }
              }
            }
            if (value == null) continue;
          } else value = _value;
        }

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

        //				valuesSb.append(column).append(" = '").append(value).append("'");
        valuesSb.append(column).append(" = ? ");
        sql.args.add(value);
      }
    } catch (Exception e) {
      throw new SqlCreateException("" + e.toString(), e);
    }

    //		String condition = new StringBuilder().append(idColumn).append(" =
    // ").append("'").append(idValue).append("'").toString();
    String condition = new StringBuilder().append(idColumn).append(" = ? ").toString();
    sql.args.add(idValue);
    sql.sql = String.format("UPDATE %s SET %s WHERE %s ;", table, valuesSb, condition);
    return sql;
  }
  private Sql makeSQL(T t, String[] fields) throws SqlCreateException {
    Sql sql = new Sql();
    Class<?> clazz = t.getClass();
    // if fields is empty
    if (fields == null || fields.length == 0) {
      fields = ORMConfigBeanUtil.getFields(clazz);
    }
    String table = ORMConfigBeanUtil.getTable(clazz, false);
    StringBuilder values = new StringBuilder();
    ReflectUtil ru = new ReflectUtil(t);
    String[] columns = ORMConfigBeanUtil.getColumns(clazz, fields);
    String idColumn = ORMConfigBeanUtil.getIdColumn(clazz);
    String idField = ORMConfigBeanUtil.getIdField(clazz);
    Method idGetter = ru.getGetter(idField);
    if (idGetter == null) throw new SqlCreateException("can not find id getter.");
    Object idValue = null;
    try {
      idValue = idGetter.invoke(t);
    } catch (Exception e) {
      throw new SqlCreateException(idGetter + " invoke exception " + e.toString(), e);
    }

    for (int i = 0; i < fields.length; i++) {
      String field = fields[i];
      String column = columns[i];
      Method getter = ru.getGetter(field);
      if (getter == null) continue;

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

        Object value = null;

        if (ClassUtil.isPojo(_value.getClass())) {
          Field f = ru.getField(field);
          OneToOne oneAnn = getter.getAnnotation(OneToOne.class);
          if (oneAnn == null) oneAnn = f.getAnnotation(OneToOne.class);

          ManyToOne manyToOneAnn = null;
          if (oneAnn == null) {
            manyToOneAnn = getter.getAnnotation(ManyToOne.class);
            if (manyToOneAnn == null) manyToOneAnn = f.getAnnotation(ManyToOne.class);
          }

          if (oneAnn != null || manyToOneAnn != null) {
            JoinColumn joinColAnn = getter.getAnnotation(JoinColumn.class);
            if (joinColAnn == null) joinColAnn = f.getAnnotation(JoinColumn.class);

            if (joinColAnn != null && joinColAnn.referencedColumnName().trim().length() > 0) {
              String refCol = joinColAnn.referencedColumnName();
              String refField = ORMConfigBeanUtil.getField(_value.getClass(), refCol);
              ReflectUtil tarRu = new ReflectUtil(_value);
              Method tarFKGetter = tarRu.getGetter(refField);
              value = tarFKGetter.invoke(_value);
            } else {
              ReflectUtil tarRu = new ReflectUtil(_value);
              String tarFKField = ORMConfigBeanUtil.getIdField(_value.getClass());
              if (tarFKField != null) {
                Method tarFKGetter = tarRu.getGetter(tarFKField);
                value = tarFKGetter.invoke(_value);
              }
            }
          }

          if (value == null) continue;

        } else {
          value = _value;
        }

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

        //				values.append(column).append(" = '").append(value).append("'");
        values.append(column).append(" = ? ");
        sql.args.add(value);
      } catch (Exception e) {
        throw new SqlCreateException(idGetter + " invoke exception " + e.toString(), e);
      }
    }

    //		String condition = new StringBuilder().append(idColumn).append(" =
    // ").append("'").append(idValue).append("'").toString();
    String condition = new StringBuilder().append(idColumn).append(" = ? ").toString();
    sql.args.add(idValue);
    sql.sql = String.format("UPDATE %s SET %s WHERE %s ;", table, values, condition);
    return sql;
  }
Beispiel #12
0
  private String makeSQL(T t, String[] fields) throws SqlCreateException {
    Class<?> clazz = t.getClass();
    String table = ORMConfigBeanUtil.getTable(clazz);
    StringBuilder condition = new StringBuilder();
    StringBuilder values = new StringBuilder();
    ReflectUtil ru = new ReflectUtil(t);
    String[] columns = ORMConfigBeanUtil.getColumns(clazz, fields);
    String idColumn = ORMConfigBeanUtil.getIdColumn(clazz);
    String idField = ORMConfigBeanUtil.getIdField(clazz);
    Method idGetter = ru.getGetter(idField);
    if (idGetter == null) throw new SqlCreateException("can not find id getter.");

    try {
      condition.append(idColumn).append(" = '").append(idGetter.invoke(t)).append("'");
    } catch (Exception e) {
      throw new SqlCreateException(idGetter + " invoke exception " + e.toString());
    }

    for (int i = 0; i < fields.length; i++) {
      String field = fields[i];
      String column = columns[i];
      Method getter = ru.getGetter(field);
      if (getter == null) continue;

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

        Object value = null;

        if (ClassUtil.isPojo(_value.getClass())) {
          Field f = ru.getField(field);
          OneToOne oneAnn = getter.getAnnotation(OneToOne.class);
          if (oneAnn == null) oneAnn = f.getAnnotation(OneToOne.class);

          ManyToOne manyToOneAnn = null;
          if (oneAnn == null) {
            manyToOneAnn = getter.getAnnotation(ManyToOne.class);
            if (manyToOneAnn == null) manyToOneAnn = f.getAnnotation(ManyToOne.class);
          }

          if (oneAnn != null || manyToOneAnn != 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;

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

        values.append(column).append(" = '").append(value).append("'");
      } catch (Exception e) {
        throw new SqlCreateException(idGetter + " invoke exception " + e.toString());
      }
    }

    return String.format("UPDATE %s SET %s WHERE %s ;", table, values, condition);
  }
  /** 多对一级联查询 1.获取当前idVal,然后作为条件查询出其外键值,接着通过其外键值查出主对象数据,注入到当前 */
  public void select() {
    if (this.fields == null || this.fields.size() == 0) return;
    if (idVal == null || "0".equals(idVal) || "".equals(idVal)) {
      return;
    }
    //		else if (DAOFactory.getSelectDAO(dsName).selectOne(t, this.idField) == null) {
    //			// 检查一下当前对象的ID是否存在于数据库
    //			return;
    //		}

    for (Field f : fields) {
      Method tarGetter = ru.getGetter(f.getName());
      if (tarGetter == null) continue;

      String fk = null;
      OneToOne ann = tarGetter.getAnnotation(OneToOne.class);
      if (ann == null) ann = f.getAnnotation(OneToOne.class);

      if (ann == null) {
        ManyToOne moAn = tarGetter.getAnnotation(ManyToOne.class);
        if (moAn == null) moAn = f.getAnnotation(ManyToOne.class);

        if (moAn == null) continue;
      }
      String refCol = null;
      JoinColumn joinCol = f.getAnnotation(JoinColumn.class);
      if (joinCol == null) joinCol = tarGetter.getAnnotation(JoinColumn.class);

      if (joinCol == null) fk = f.getName() + "_id";
      else {
        fk = joinCol.name();
        refCol = joinCol.referencedColumnName();
      }

      Class<?> tarClass = f.getType();

      if (refCol == null || refCol.trim().length() == 0)
        refCol = ORMConfigBeanUtil.getIdColumn(tarClass);

      String refField = ORMConfigBeanUtil.getField(tarClass, refCol);

      try {
        Object _tarObj = tarGetter.invoke(t);
        Object tarObj = null;
        boolean flag = false;
        if (_tarObj != null) {
          Method refFieldGetter = new ReflectUtil(_tarObj).getGetter(refField);
          if (refFieldGetter != null && refFieldGetter.invoke(_tarObj) != null)
            tarObj = DAOFactory.getSelectDAO(dsName).selectOne(_tarObj, refField);
          else flag = true;
        } else flag = true;

        if (flag) {
          // select * from {tarTable} where {referencedColumn} = (select {fk} from {table} where
          // {idColumn} = {idVal})
          String format = "select %s from %s where %s = (select %s from %s where %s = %s )";
          String tarTable = ORMConfigBeanUtil.getTable(tarClass, true);

          String sql =
              String.format(
                  format,
                  ORMConfigBeanUtil.getSelectAllColumn(tarClass),
                  tarTable,
                  refCol,
                  fk,
                  table,
                  idColumn,
                  idVal);
          List<?> tarList = DAOFactory.getSelectDAO(dsName).selectBySQL(tarClass, sql);
          if (tarList == null || tarList.size() == 0) continue;

          tarObj = tarList.get(0);
        }

        if (tarObj == null) continue;

        Method tarSetter = ru.getSetter(f.getName());
        tarSetter.invoke(t, tarObj);
      } catch (Exception e) {
        throw new DAOException("", e);
      }
    }
  }
  private void injectActionCxt2Pojo(ReflectUtil ru) throws Exception {
    HttpServletRequest req = this.context.getRequest();
    HttpServletResponse res = this.context.getResponse();
    PrintWriter out = this.context.getWriter();
    HttpSession session = this.context.getSession();
    ActionProp actionProp = this.context.getActionProp();
    QueryParams queryParams = this.context.getQueryParams();
    for (String n : ru.getFieldsName()) {
      Method m = ru.getSetter(n);
      if (m == null) continue;

      Class<?> clazz = m.getParameterTypes()[0];
      if (Context.class.isAssignableFrom(clazz)) {
        m.invoke(ru.getObject(), this.context);
      } else if (HttpServletRequest.class.isAssignableFrom(clazz)) {
        m.invoke(ru.getObject(), req);
      } else if (HttpServletResponse.class.isAssignableFrom(clazz)) {
        m.invoke(ru.getObject(), res);
      } else if (PrintWriter.class.isAssignableFrom(clazz)) {
        m.invoke(ru.getObject(), out);
      } else if (ServletOutputStream.class.isAssignableFrom(clazz)) {
        m.invoke(ru.getObject(), this.context.getOut());
      } else if (HttpSession.class.isAssignableFrom(clazz)) {
        m.invoke(ru.getObject(), session);
      } else if (ActionProp.class.isAssignableFrom(clazz)) {
        if (actionProp == null) actionProp = new ActionProp(clazz.getName());

        this.context.setActionProp(actionProp);
        m.invoke(ru.getObject(), actionProp);
      } else if (QueryParams.class.isAssignableFrom(clazz)) {
        m.invoke(ru.getObject(), queryParams);
      } else if (Validation.class.isAssignableFrom(clazz)) {
        m.invoke(ru.getObject(), this.context.getValidation());
      } else {
        /* 如果找不到注入的类型,则尝试从IOC容器获取 */
        Object obj = IOC.getBean(n);
        if (obj != null) m.invoke(ru.getObject(), obj);
      }
    }
  }
  private void handleResult() throws Exception {

    this.exeActionLog();

    if (retn == null) return;
    String baseUrl =
        (String) this.context.getServletContext().getAttribute(MVCConfigConstant.BASE_URL_KEY);
    if (File.class.isAssignableFrom(retn.getClass())) {
      File file = (File) retn;
      this.handleDownload(file);
      return;
    } else if (File[].class.isAssignableFrom(retn.getClass())) {
      File[] files = (File[]) retn;

      String fileName = CommonUtil.getNowTime("yyyyMMddHHmmss") + "_" + "download.zip";

      HttpServletResponse resp = this.context.getResponse();
      resp.reset();
      resp.setContentType("application/zip");
      resp.addHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");

      ServletOutputStream outputStream = resp.getOutputStream();
      ZipOutputStream zip = new ZipOutputStream(outputStream);

      for (File file : files) {
        byte[] b = new byte[1024];
        int len;
        zip.putNextEntry(new ZipEntry(file.getName()));
        FileInputStream fis = new FileInputStream(file);
        while ((len = fis.read(b)) != -1) {
          zip.write(b, 0, len);
        }

        fis.close();
      }

      zip.flush();
      zip.close();
      outputStream.flush();

      return;
    }

    if (!String.class.isAssignableFrom(retn.getClass())) {
      String mimeType = null;
      Produces prod = this.method.getAnnotation(Produces.class);
      if (prod != null && prod.value() != null && prod.value().length > 0)
        mimeType = prod.value()[0];

      if (mimeType == null || mimeType.trim().length() == 0)
        mimeType =
            this.context.getRequest().getParameter(MVCConfigConstant.HTTP_HEADER_ACCEPT_PARAM);

      if (mimeType == null || mimeType.trim().length() == 0) {
        String contentType = this.context.getRequest().getContentType();
        if (contentType != null) {
          this.context.getResponse().setContentType(contentType);
          mimeType = contentType.split(";")[0];
        }
      }

      if (this.context.getWriter() == null)
        this.context.setWriter(this.context.getResponse().getWriter());

      if (MIMEType.JSON.equals(mimeType) || "json".equalsIgnoreCase(mimeType)) {
        this.context.getResponse().setContentType(MIMEType.JSON);
        this.context.getWriter().print(CommonUtil.toJson(retn));
      } else if (MIMEType.XML.equals(mimeType) || "xml".equalsIgnoreCase(mimeType)) {
        Class<?> cls = retn.getClass();
        if (Collection.class.isAssignableFrom(cls)) {
          Class<?> _cls = ClassUtil.getPojoClass(this.method);
          if (_cls != null) cls = _cls;
        }

        XMLWriter writer = BeanXMLUtil.getBeanXMLWriter(retn);
        writer.setCheckStatck(true);
        writer.setSubNameAuto(true);
        writer.setClass(cls);
        writer.setRootElementName(null);
        this.context.getResponse().setContentType(MIMEType.XML);
        this.context.getWriter().print(writer.toXml());
      } else {
        this.context.getWriter().print("暂时不支持JSON 、XML以外的表述形式");
      }

      this.context.getWriter().flush();

      return;
    }

    List<String> produces = this.context.getActionConfigBean().getProduces();
    if (produces != null && produces.size() > 0)
      for (String produce : produces) {
        this.context.getResponse().setContentType(produce);
        break;
      }

    String re = String.valueOf(retn);

    for (Field f : fields) {
      Method getter = ru.getGetter(f.getName());
      if (getter == null) continue;

      String name = f.getName();
      if (this.context.getModel().containsKey(name)) continue;

      this.context.getModel().put(name, getter.invoke(actionObject));
    }

    this.context.getModel().put(MVCConfigConstant.BASE_URL_KEY, baseUrl);

    // 客户端重定向
    if (re.startsWith(RenderType.REDIRECT + ":")) {
      String url = re.substring((RenderType.REDIRECT + ":").length());
      String location = url;

      this.context.getResponse().sendRedirect(CommonUtil.replaceChinese2Utf8(location));

      return;
    } else if (re.startsWith(RenderType.ACTION + ":")) {
      String path = re.substring((RenderType.ACTION + ":").length());
      // ACTION 重定向
      handleActionRedirect(context, path, baseUrl);

      return;
    } else if (re.startsWith(RenderType.OUT + ":")) {
      String location = re.substring((RenderType.OUT + ":").length());
      this.context.getWriter().print(location);
      this.context.getWriter().flush();

      return;
    } else if (re.startsWith(RenderType.FORWARD + ":")) {
      String location = re.substring((RenderType.FORWARD + ":").length());
      HttpServletRequest request = this.context.getRequest();
      request.setAttribute(MVCConfigConstant.REQ_PARAM_MAP_NAME, this.context.getQueryParamMap());

      for (Iterator<Entry<String, Object>> it = this.context.getModel().entrySet().iterator();
          it.hasNext(); ) {
        Entry<String, Object> entry = it.next();
        request.setAttribute(entry.getKey(), entry.getValue());
      }

      // 服务端跳转
      request
          .getRequestDispatcher(MVCConfigConstant.FORWARD_BASE_PATH + "/" + location)
          .forward(request, this.context.getResponse());

      return;
    } else if (re.startsWith(RenderType.FREEMARKER + ":")) {
      String location = re.substring((RenderType.FREEMARKER + ":").length());
      // FreeMarker 渲染
      Configuration cfg = new Configuration();
      // 指定模板从何处加载的数据源,这里设置成一个文件目录。
      cfg.setDirectoryForTemplateLoading(
          new File(ConfigConstant.ROOT_PATH + MVCConfigConstant.FORWARD_BASE_PATH));
      // 指定模板如何检索数据模型
      cfg.setObjectWrapper(new DefaultObjectWrapper());
      cfg.setDefaultEncoding("utf-8");

      Template template = cfg.getTemplate(location);
      template.setEncoding("utf-8");

      template.process(this.context.getModel(), this.context.getWriter());

      return;
    } else if (re.startsWith(RenderType.VELOCITY + ":")) {
      String location = re.substring((RenderType.VELOCITY + ":").length());
      File viewsDir = new File(ConfigConstant.ROOT_PATH + MVCConfigConstant.FORWARD_BASE_PATH);
      // 初始化Velocity模板引擎
      Properties p = new Properties();
      p.setProperty("resource.loader", "file");
      p.setProperty(
          "file.resource.loader.class",
          "org.apache.velocity.runtime.resource.loader.FileResourceLoader");
      p.setProperty("file.resource.loader.path", viewsDir.getAbsolutePath());
      p.setProperty("file.resource.loader.cache", "true");
      p.setProperty("file.resource.loader.modificationCheckInterval", "2");
      p.setProperty("input.encoding", "utf-8");
      p.setProperty("output.encoding", "utf-8");
      VelocityEngine ve = new VelocityEngine(p);
      // Velocity获取模板文件,得到模板引用
      org.apache.velocity.Template t = ve.getTemplate(location);
      VelocityContext velocityCtx = new VelocityContext();
      for (Iterator<Entry<String, Object>> it = this.context.getModel().entrySet().iterator();
          it.hasNext(); ) {
        Entry<String, Object> e = it.next();
        velocityCtx.put(e.getKey(), e.getValue());
      }

      // 将环境变量和输出部分结合
      t.merge(velocityCtx, this.context.getWriter());
      this.context.getWriter().flush();
      return;
    } else {
      List<ResultConfigBean> results = this.context.getActionConfigBean().getResult();

      if (results == null || results.size() == 0) {
        this.context.getWriter().print(retn);
        this.context.getWriter().flush();
        return;
      }

      boolean isOut = true;
      for (ResultConfigBean r : results) {
        if (!"_props_".equals(r.getName()) && !r.getName().equals(re) && !"".equals(re)) {
          continue;
        }

        isOut = false;
        String type = r.getType();
        String location = r.getLocation();
        if (RenderType.REDIRECT.equalsIgnoreCase(type)) {
          this.context.getResponse().sendRedirect(CommonUtil.replaceChinese2Utf8(location));

          return;
        } else if (RenderType.FORWARD.equalsIgnoreCase(type)) {
          HttpServletRequest request = this.context.getRequest();
          request.setAttribute(
              MVCConfigConstant.REQ_PARAM_MAP_NAME, this.context.getQueryParamMap());

          fields = ru.getFields();
          if (fields == null) return;

          for (Iterator<Entry<String, Object>> it = this.context.getModel().entrySet().iterator();
              it.hasNext(); ) {
            Entry<String, Object> entry = it.next();
            request.setAttribute(entry.getKey(), entry.getValue());
          }
          // 服务端跳转
          request
              .getRequestDispatcher(MVCConfigConstant.FORWARD_BASE_PATH + location)
              .forward(request, this.context.getResponse());

          return;
        } else if (RenderType.FREEMARKER.equalsIgnoreCase(type)) {
          // FreeMarker 渲染
          Configuration cfg = new Configuration();
          // 指定模板从何处加载的数据源,这里设置成一个文件目录。
          cfg.setDirectoryForTemplateLoading(
              new File(ConfigConstant.ROOT_PATH + MVCConfigConstant.FORWARD_BASE_PATH));
          // 指定模板如何检索数据模型
          cfg.setObjectWrapper(new DefaultObjectWrapper());
          cfg.setDefaultEncoding("utf-8");

          Template template = cfg.getTemplate(location);
          template.setEncoding("utf-8");

          template.process(this.context.getModel(), this.context.getWriter());

          return;
        } else if (RenderType.ACTION.equalsIgnoreCase(type)) {
          // ACTION 重定向
          handleActionRedirect(context, location, baseUrl);

          return;
        } else if (RenderType.OUT.equalsIgnoreCase(type) || location.trim().length() == 0) {
          this.context.getWriter().print(location);
          this.context.getWriter().flush();

          return;
        }
      }

      if (isOut) {
        this.context.getWriter().print(retn);
        this.context.getWriter().flush();
      }
    }
  }
  /**
   * 执行Action
   *
   * @throws Exception
   */
  public void execute() throws Exception {
    // 实例化pojo
    initPojo();

    // IOC注入对象到pojo中
    injectIocBean();

    // 注入框架mvc action 上下文环境
    this.injectActionCxt2Pojo(this.ru);

    if (IAction.class.isAssignableFrom(this.actionObject.getClass())) {
      // struts2风格
      IAction action = (IAction) actionObject;
      action.init(this.context);
      retn = action.execute();
      // 对Action执行返回结果的处理
      this.handleResult();

      return;
    }

    String methodName = this.context.getActionConfigBean().getMethod();
    Method[] methods = ru.getMethods(methodName);
    if (methods == null || methods.length == 0) return;

    method = this.getFirstMethd(methods);
    if (method == null) return;

    // 执行验证器
    this.handleValidator();
    try {
      // upload validation
      this.validateUpload();

      // 注入mvc action 请求参数
      ParamUtil.injectParam(this.context, this.ru, null);

      /* 方法体内的前置拦截器执行  */
      Before before = method.getAnnotation(Before.class);
      if (before != null) {
        InterExecution before_interExe = new InterExecution("before", context);
        before_interExe.execute(before.value());
        if (before_interExe.getError() != null) {
          before_interExe.showErr();
          return;
        }
      }

      // execute the action method
      excuteMethod(methodName);

      /* 方法体内的后置拦截器执行  */
      After after = method.getAnnotation(After.class);
      if (after != null) {
        // 后置拦截器
        InterExecution after_interExe = new InterExecution("after", context);
        after_interExe.execute(after.value());
        if (after_interExe.getError() != null) {
          after_interExe.showErr();
          return;
        }
      }

      /* 外部配置的后置拦截器后执行 */
      InterExecution after_interExe = new InterExecution("after", this.context); // 7.后置拦截器
      if (after_interExe.findAndExecuteInter()) {
        after_interExe.showErr();
        return;
      }

      // 对Action执行返回结果的处理
      this.handleResult();
    } catch (Exception e) {
      throw e;
    }
  }