Package cn.org.zeronote.orm.dao.parser

Source Code of cn.org.zeronote.orm.dao.parser.SqlDelGenerator

/**
*
*/
package cn.org.zeronote.orm.dao.parser;

import java.lang.reflect.Field;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import cn.org.zeronote.orm.ORMAutoAssemble;
import cn.org.zeronote.orm.ORMColumn;
import cn.org.zeronote.orm.ORMHash;
import cn.org.zeronote.orm.ORMTable;

/**
* UPDATE sql 语句生成器
* @author <a href='mailto:lizheng8318@gmail.com'>lizheng</a>
*
*/
public class SqlDelGenerator implements Generator {

  private Class<?> pojoClazz;
  private Map<String, Object> delArgs;
 
  private String sql;
  private Object[] args;
 
 
  /**
   * 条件删除,无需自己创建删除对象
   * @param pojoType
   * @param args
   */
  public SqlDelGenerator(Class<?> pojoType, Map<String, Object> args) {
    this.pojoClazz = pojoType;
    this.delArgs = args;
  }
 
  /**
   * 主键删除
   * @param pojoClazz
   * @throws IllegalAccessException
   * @throws IllegalArgumentException
   */
  public SqlDelGenerator(Object pojo, boolean usePhysicalPk) throws IllegalArgumentException, IllegalAccessException {
    this.pojoClazz = pojo.getClass();
    this.delArgs = fieldArgsMap(pojo, usePhysicalPk);
  }
 
  /**
   * 主键删除
   * @param pojoType
   * @param pkVal
   * @param usePhysicalPk
   * @throws IllegalAccessException
   * @throws InstantiationException
   */
  public SqlDelGenerator(Class<?> pojoType, Object pkVal, boolean usePhysicalPk) throws InstantiationException, IllegalAccessException {
    this.pojoClazz = pojoType;
    this.delArgs = fieldArgsMap(pojoType, pkVal, usePhysicalPk);
  }

  /**
   * 拼装删除参数
   * @param pojoType
   * @param pkVal
   * @param usePhysicalPk
   * @return
   * @throws IllegalArgumentException
   * @throws IllegalAccessException
   */
  private Map<String, Object> fieldArgsMap(Class<?> pojoType, Object pkVal, boolean usePhysicalPk) throws IllegalArgumentException, IllegalAccessException {
    Map<String, Object> delArgs = new HashMap<String, Object>();
    Field[] fields = pojoType.getDeclaredFields();
    for (Field f : fields) {
      ORMColumn ormc = f.getAnnotation(ORMColumn.class);
      if (ormc != null) {
        if (usePhysicalPk) {
          if (ormc.physicalPkFld()) {
            f.setAccessible(true);
            delArgs.put(f.getName(), pkVal);
          }
        } else {
          if (ormc.LogicPkFld()) {
            f.setAccessible(true);
            delArgs.put(f.getName(), pkVal);
          }
        }
       
      }
    }
    return delArgs;
  }
 
  /**
   * 拼装删除参数
   * @param pojo
   * @param usePhysicalPk
   * @return
   * @throws IllegalArgumentException
   * @throws IllegalAccessException
   */
  private Map<String, Object> fieldArgsMap(Object pojo, boolean usePhysicalPk) throws IllegalArgumentException, IllegalAccessException {
    Map<String, Object> delArgs = new HashMap<String, Object>();
    Field[] fields = pojo.getClass().getDeclaredFields();
    for (Field f : fields) {
      ORMColumn ormc = f.getAnnotation(ORMColumn.class);
      if (ormc != null) {
        if (usePhysicalPk) {
          if (ormc.physicalPkFld()) {
            f.setAccessible(true);
            delArgs.put(f.getName(), f.get(pojo));
          }
        } else {
          if (ormc.LogicPkFld()) {
            f.setAccessible(true);
            delArgs.put(f.getName(), f.get(pojo));
          }
        }
       
      }
    }
    return delArgs;
  }
 
  /**
   * 生成SQL
   * @throws IllegalAccessException
   * @throws IllegalArgumentException
   * @throws SQLException
   * @throws SecurityException
   * @throws NoSuchFieldException
   */
  private void generate() throws IllegalArgumentException, IllegalAccessException, SQLException, NoSuchFieldException, SecurityException {
    // TABLE
    ORMAutoAssemble ormaa = pojoClazz.getAnnotation(ORMAutoAssemble.class);
    if (ormaa == null) {
      throw new IllegalAccessException("It not a ORMAutoAssemble Class!");
    }
   
    ORMTable ormTable = pojoClazz.getAnnotation(ORMTable.class);
    if (ormTable == null) {
      throw new IllegalAccessException("It not a ORMTable Class!");
    }
   
    ORMHash ormHashTable = pojoClazz.getAnnotation(ORMHash.class);
   
    String tableName = null;
    if (ormHashTable == null) {
      tableName = ormTable.tableName();
    } else {
      String hashKey = this.pojoClazz.getDeclaredField(ormHashTable.hashRefColumn()).getName();
      long hashCol = Long.valueOf(String.valueOf(this.delArgs.get(hashKey)));
      tableName = DBUtils.getInstance().findHashTableName(ormHashTable, ormTable, hashCol);
    }
   
    generate(tableName);
  }
 
  /**
   * 生成主键依赖的
   * @param tableName
   * @throws IllegalAccessException
   * @throws IllegalArgumentException
   * @throws SQLException
   */
  private void generate(String tableName) throws IllegalArgumentException, IllegalAccessException, SQLException {
    StringBuilder del = new StringBuilder("DELETE FROM ");
    List<Object> params = new ArrayList<Object>();
   
    del.append(tableName).append(" ");
    // DELETE-WHERE
    Field[] fields = pojoClazz.getDeclaredFields();
   
    // WHERE
    if (delArgs != null && !delArgs.isEmpty()) {
      del.append("WHERE ");
      for (String pk : delArgs.keySet()) {
        for (Field field : fields) {
          field.setAccessible(true);
          ORMColumn ormc = field.getAnnotation(ORMColumn.class);
          if (ormc != null && field.getName().equalsIgnoreCase(pk)) {
            // 是主键,作为条件
            del.append(ormc.value()).append("=? AND ");
            Object val = delArgs.get(pk);
            params.add(val);
          }
        }
      }
      del.replace(del.length() - 4, del.length(), " ");
    } else {
      // 主键为空
      throw new SQLException("del args key is null!");
    }
    this.sql = del.toString();
   
    // params
    args = params.toArray();
  }
 
  /**
   * @return the sql
   * @throws IllegalAccessException
   * @throws IllegalArgumentException
   * @throws SQLException
   * @throws SecurityException
   * @throws NoSuchFieldException
   */
  public String getSql() throws IllegalArgumentException, IllegalAccessException, SQLException, NoSuchFieldException, SecurityException {
    if (sql == null) {
      generate();
    }
    return sql;
  }

  /**
   * @return the args
   * @throws IllegalAccessException
   * @throws IllegalArgumentException
   * @throws SQLException
   * @throws SecurityException
   * @throws NoSuchFieldException
   */
  public Object[] getArgs() throws IllegalArgumentException, IllegalAccessException, SQLException, NoSuchFieldException, SecurityException {
    if (args == null) {
      generate();
    }
    return args;
  }

}
TOP

Related Classes of cn.org.zeronote.orm.dao.parser.SqlDelGenerator

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.