Package org.nutz.dao.impl.sql

Source Code of org.nutz.dao.impl.sql.NutStatement

package org.nutz.dao.impl.sql;

import java.util.List;

import org.nutz.castor.Castors;
import org.nutz.dao.Sqls;
import org.nutz.dao.entity.Entity;
import org.nutz.dao.sql.DaoStatement;
import org.nutz.dao.sql.SqlContext;
import org.nutz.dao.sql.SqlType;
import org.nutz.lang.Strings;

public abstract class NutStatement implements DaoStatement {

  private Entity<?> entity;

  private SqlContext context;

  private SqlType sqlType;

  public NutStatement() {
    this.context = new SqlContext();
  }

  public Entity<?> getEntity() {
    return entity;
  }

  public DaoStatement setEntity(Entity<?> entity) {
    this.entity = entity;
    return this;
  }

  public SqlContext getContext() {
    return context;
  }

  public void setContext(SqlContext context) {
    this.context = context;
  }

  public SqlType getSqlType() {
    return sqlType;
  }

  public DaoStatement setSqlType(SqlType sqlType) {
    this.sqlType = sqlType;
    return this;
  }

  public Object getResult() {
    return context.getResult();
  }

  // TODO 是不是太暴力了涅~~~ --> 不是一般的暴力!!
  @SuppressWarnings("unchecked")
  public <T> List<T> getList(Class<T> classOfT) {
    return (List<T>) getResult();//TODO 考虑先遍历转换一次
  }

  public <T> T getObject(Class<T> classOfT) {
    return Castors.me().castTo(getResult(), classOfT);
  }

  public int getInt() {
    Integer i = getObject(Integer.class);
    if(i == null)
      return 0;//TODO 是不是应该抛出异常呢?
    return i;//TODO 怪怪的,如果getObject返回null,这里就NPE了 by zozoh
             // 因为自动解包的原因,by wendal
  }

  public String getString() {
    return getObject(String.class);
  }

  public int getUpdateCount() {
    return context.getUpdateCount();
  }

  public String toString() {
    String sql = this.toPreparedStatement();
    StringBuilder sb = new StringBuilder(sql);

    // 准备打印参数表
    Object[][] mtrx = this.getParamMatrix();
    if (null != mtrx && mtrx.length > 0 && mtrx[0].length > 0) {
      // 计算每列最大宽度,以及获取列参数的内容
      int[] maxes = new int[mtrx[0].length];
      String[][] sss = new String[mtrx.length][mtrx[0].length];
      for (int row = 0; row < mtrx.length; row++)
        for (int col = 0; col < mtrx[0].length; col++) {
          String s = Strings.sNull(Castors.me().castToString(mtrx[row][col]), "NULL");
          maxes[col] = Math.max(maxes[col], s.length());
          sss[row][col] = s;
        }
      // 输出表头
      sb.append("\n    |");
      for (int i = 0; i < mtrx[0].length; i++) {
        sb.append(' ');
        sb.append(Strings.alignRight("" + (i + 1), maxes[i], ' '));
        sb.append(" |");
      }
      // 输出分隔线
      sb.append("\n    |");
      for (int i = 0; i < mtrx[0].length; i++) {
        sb.append('-');
        sb.append(Strings.dup('-', maxes[i]));
        sb.append("-|");
      }

      // 输出内容到字符串缓冲区
      for (int row = 0; row < mtrx.length; row++) {
        sb.append("\n    |");
        for (int col = 0; col < mtrx[0].length; col++) {
          sb.append(' ');
          sb.append(Strings.alignLeft(sss[row][col], maxes[col], ' '));
          sb.append(" |");
        }
      }

      // 输出可执行的 SQL 语句, TODO 格式非常不好看!!如果要复制SQL,很麻烦!!!
      sb.append("\n  For example:> \"");
      sb.append(toStatement(mtrx, sql));
      sb.append('"');
    }

    return sb.toString();
  }

  protected String toStatement(Object[][] mtrx, String sql) {
    StringBuilder sb = new StringBuilder();
    String[] ss = sql.split("[?]");
    int i;
    for (i = 0; i < mtrx[0].length; i++) {
      sb.append(ss[i]);
      sb.append(Sqls.formatFieldValue(mtrx[0][i]));
    }
    if (i < ss.length)
      sb.append(ss[i]);

    return sb.toString();
  }
}
TOP

Related Classes of org.nutz.dao.impl.sql.NutStatement

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.