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

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

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

import java.lang.reflect.Field;
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.ORMTable;

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

  /** orm fields cache*/
  private transient static Map<Class<?>, Map<Field, ORMColumn>> fieldsCache = new HashMap<Class<?>, Map<Field,ORMColumn>>();
  private transient byte[] synObj = new byte[0];
 
  /**ORM pojo class*/
  protected Class<?> pojoClazz;
  protected Map<String, Object[]> argsMap;
 
  protected String sql;
  protected Object[] args;
 
  /**
   *
   */
  public SqlSelGenerator() {
  }

  /**
   *
   * @param pojoClazz    pojo class
   * @param args      params
   */
  public SqlSelGenerator(Class<?> pojoClazz, Map<String, Object[]> args) {
    this.pojoClazz = pojoClazz;
    this.argsMap = args;
  }
 
 
 
  /**
   * 生成SQL
   * @throws IllegalAccessException  exception
   */
  protected void generateParam() throws IllegalAccessException {
    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!");
    }
   
    String tableName = ormTable.tableName();
    String[] orders = ormTable.order();
    List<Object> params = new ArrayList<Object>();
   
    this.sql = genSql(params, tableName, this.argsMap, orders);
   
    // params
    this.args = params.toArray();
  }
 
  /**
   * 生成sql
   * @param params    params
   * @param tableName    table name
   * @param argsMap    arg map
   * @param orders    order
   * @return the sql
   */
  protected String genSql(List<Object> params, String tableName, Map<String, Object[]> argsMap, String[] orders) {
    // params to param:params
    StringBuilder sql = new StringBuilder("SELECT ");
    // SELECT
    Field[] fields = pojoClazz.getDeclaredFields();
    for (Field field : fields) {
      field.setAccessible(true);
      ORMColumn ormc = getAnnotation(pojoClazz, field);
      if (ormc != null) {
        sql.append(ormc.value()).append(",");
      }
    }
    sql.replace(sql.length() - 1, sql.length(), " ");
    // FROM
    sql.append("FROM ").append(tableName).append(" ");
    // WHERE
    if (argsMap != null && argsMap.size() > 0) {
      sql.append("WHERE (");
      for (Field field : fields) {
        field.setAccessible(true);
        ORMColumn ormc = getAnnotation(pojoClazz, field);
        if (ormc != null) {
          Object[] val = argsMap.get(field.getName());
          if (val != null) {
            if (val.length > 1) {
              // 多参数
              sql.append("(");
              for (Object ovl : val) {
                sql.append(ormc.value()).append("=? OR ");
                Class<?> tc = field.getDeclaringClass();
                params.add(matchParam(ovl, tc));
              }
              sql.delete(sql.length() - 3, sql.length());
              sql.append(") AND ");
            } else {
              // 单参数
              sql.append(ormc.value()).append("=? AND ");
              Class<?> tc = field.getDeclaringClass();
              params.add(matchParam(val[0], tc));
            }
          }
        }
      }
      sql.replace(sql.length() - 5, sql.length(), ") ");
    }
   
    // ORDER
    if (orders != null && orders.length > 0) {
      sql.append("ORDER BY ");
      for (String order : orders) {
        sql.append(order).append(",");
      }
      sql.delete(sql.length() - 1, sql.length());
    }
   
    // return
    return sql.toString();
  }
 
  // 缓存annotation
  private ORMColumn getAnnotation(Class<?> clz, Field field) {
    Map<Field, ORMColumn> fs = fieldsCache.get(clz);
    if (fs == null) {
      // 加载
      synchronized (synObj) {
        fs = fieldsCache.get(clz);
        if (fs == null) {
          fs = new HashMap<Field, ORMColumn>();
          Field[] fields = pojoClazz.getDeclaredFields();
          for (Field f : fields) {
            f.setAccessible(true);
            ORMColumn ormc = f.getAnnotation(ORMColumn.class);
            fs.put(f, ormc);
          }
          fieldsCache.put(clz, fs);
        }
      }
    }
    return fs.get(field);
  }
 
  /**
   * 类型匹配转换
   * 如果val与给定的clz不匹配,则返回精确转换后的val
   * 转换原则:
   * String ->Number
   * Number -> String
   * @param val  val
   * @param clz  class
   * @return    the value obj
   */
  private Object matchParam(Object val, Class<?> clz) {
    if (val == null) {
      return val;
    }
    if (String.class.equals(clz)) {
      // 目标为String
      return val.toString();
    } else if (Integer.class.equals(clz) || int.class.equals(clz)) {
      // 目标int
      return val instanceof Integer ? val : Integer.parseInt(val.toString());
    } else if (Long.class.equals(clz) || long.class.equals(clz)) {
      // 目标long
      return val instanceof Long ? val : Long.parseLong(val.toString());
    } else if (Double.class.equals(clz) || double.class.equals(clz)) {
      // 目标Double
      return val instanceof Double ? val : Double.parseDouble(val.toString());
    } else if (Float.class.equals(clz) || float.class.equals(clz)) {
      // 目标Float
      return val instanceof Float ? val : Float.parseFloat(val.toString());
    } else {
      // 其它不转换
      return val;
    }
  }
 
  /**
   * 相关参数
   * @return  the args
   * @throws IllegalAccessException  exception
   */
  public Object[] getArgs() throws IllegalAccessException {
    if (args == null) {
      generateParam();
    }
    return args == null ? new Object[0] : args;
  }
 
  /**
   * Sql语句
   * @return the sql
   * @throws IllegalAccessException   exception
   */
  public String getSql() throws IllegalAccessException {
    if (sql == null) {
      generateParam();
    }
    return sql;
  }

  /**
   * @return the pojoClazz
   */
  public Class<?> getPojoClazz() {
    return pojoClazz;
  }

  /**
   * @param pojoClazz the pojoClazz to set
   */
  public void setPojoClazz(Class<?> pojoClazz) {
    this.pojoClazz = pojoClazz;
  }
}
TOP

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

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.