All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.nutz.dao.impl.sql.NutStatement Maven / Gradle / Ivy

Go to download

Nutz, which is a collections of lightweight frameworks, each of them can be used independently

There is a newer version: 1.r.72
Show newest version
package org.nutz.dao.impl.sql;

import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.lang.reflect.Array;
import java.sql.Blob;
import java.sql.Clob;
import java.sql.SQLException;
import java.util.Arrays;
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.dao.util.Daos;
import org.nutz.dao.util.blob.SimpleBlob;
import org.nutz.dao.util.blob.SimpleClob;
import org.nutz.lang.Strings;

public abstract class NutStatement implements DaoStatement {

    private Entity entity;

    private SqlContext context;

    private SqlType sqlType;
    
    private boolean forceExecQuery;
    
    public NutStatement() {
        this.context = new SqlContext();
    }

    public boolean isSelect() {
        return SqlType.SELECT == sqlType;
    }

    public boolean isUpdate() {
        return SqlType.UPDATE == sqlType;
    }

    public boolean isDelete() {
        return SqlType.DELETE == sqlType;
    }

    public boolean isInsert() {
        return SqlType.INSERT == sqlType;
    }

    public boolean isCreate() {
        return SqlType.CREATE == sqlType;
    }

    public boolean isDrop() {
        return SqlType.DROP == sqlType;
    }

    public boolean isRun() {
        return SqlType.RUN == sqlType;
    }

    public boolean isAlter() {
        return SqlType.ALTER == sqlType;
    }
    
    public boolean isExec() {
    	return SqlType.EXEC == sqlType;
    }
    
    public boolean isCall() {
    	return SqlType.CALL == sqlType;
    }

    public boolean isOther() {
        return SqlType.OTHER == sqlType;
    }

    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  List getList(Class classOfT) {
        Object re = getResult();
        if (re == null)
            return null;
        if (re.getClass().isArray()) {
            return Arrays.asList((T[])re);
        }
        return (List) re;// TODO 考虑先遍历转换一次
    }

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

    public int getInt() {
        return getNumber().intValue();
    }
    
    public int getInt(int defaultValue) {
        Number re = getNumber();
        if (re == null)
            return defaultValue;
        return re.intValue();
    }

    public long getLong() {
        return getNumber().longValue();
    }
    public long getLong(long defaultValue) {
        Number re = getNumber();
        if (re == null)
            return defaultValue;
        return re.longValue();
    }

    public double getDouble() {
        return getNumber().doubleValue();
    }

    public double getDouble(double defaultValue) {
        Number re = getNumber();
        if (re == null)
            return defaultValue;
        return re.doubleValue();
    }

    public float getFloat() {
        return getNumber().floatValue();
    }

    public float getFloat(float defaultValue) {
        Number re = getNumber();
        if (re == null)
            return defaultValue;
        return re.floatValue();
    }

    public Number getNumber() {
    	return getObject(Number.class);
    }

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

    public boolean getBoolean() {
        return getObject(Boolean.class);
    }

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

    public String toString() {
        String sql = this.toPreparedStatement();
        StringBuilder sb = new StringBuilder(sql);
        // 准备打印参数表
        Object[][] mtrx = this.getParamMatrix();
        SqlFormat format = Daos.getSqlFormat().clone();
        if (null != mtrx && mtrx.length > 0 && mtrx[0].length > 0) {
            if (format.isPrintParam()) {
                // 计算每列最大宽度,以及获取列参数的内容
                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 = param2String(mtrx[row][col]);
                        maxes[col] = Math.max(maxes[col], s.length());
                        if (format.getParamLengthLimit() > 0 && maxes[col] > format.getParamLengthLimit())
                            maxes[col] = format.getParamLengthLimit();
                        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("-|");
                }

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

                if (maxRow != mtrx.length)
                    sb.append("\n -- Only display first " + maxRow + " lines , don't show the remaining record(count=" + mtrx.length + ")");
            } else {
                // 打印一下影响总行数
                sb.append("\n -- " + mtrx.length + " lines effected -- ");
                if (!format.isPrintExample())
                    sb.append(" set printExample=true if you wanna print executed sql");
            }
            if (format.isPrintExample()) {
                // 输出可执行的 SQL 语句, TODO 格式非常不好看!!如果要复制SQL,很麻烦!!!
                sb.append("\n  For example:> \"");
                sb.append(toExampleStatement(mtrx, sql));
                sb.append('"');
            }
        }
        return sb.toString();
    }

    protected String toExampleStatement(Object[][] mtrx, String sql) {
        StringBuilder sb = new StringBuilder();
        String[] ss = sql.split("[?]");
        int i = 0;
        if (mtrx.length > 0) {
            for (; i < mtrx[0].length; i++) {
                sb.append(ss[i]);
                Object obj = mtrx[0][i];
                if (obj != null) {
                    if (obj instanceof Blob) {
                        Blob blob = (Blob) obj;
                        obj = "Blob(" + blob.hashCode() + ")";
                    } else if (obj instanceof Clob) {
                        Clob clob = (Clob) obj;
                        obj = "Clob(" + clob.hashCode() + ")";
                    } else if (obj instanceof byte[] || obj instanceof char[]) {
                        if (Array.getLength(obj) > 10240)
                            obj = "*BigData[len=" + Array.getLength(obj) + "]";
                    } else if (obj instanceof InputStream) {
                        try {
                            obj = "*InputStream[len=" + ((InputStream) obj).available() + "]";
                        }
                        catch (IOException e) {}
                    } else if (obj instanceof Reader) {
                        obj = "*Reader@" + obj.hashCode();
                    }
                }
                sb.append(Sqls.formatFieldValue(obj));
            }
        }
        if (i < ss.length)
            sb.append(ss[i]);

        return sb.toString();
    }

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

    protected String param2String(Object obj) {
        if (obj == null)
            return "NULL";
        else {
            if (obj instanceof Blob) {
                Blob blob = (Blob) obj;
                if (blob instanceof SimpleBlob) {
                    try {
                        return "Blob(len=" + blob.length() + ")";
                    }
                    catch (SQLException e) {}// 不可能
                }
                return "Blob(hascode=" + blob.hashCode() + ")";
            } else if (obj instanceof Clob) {
                Clob clob = (Clob) obj;
                if (clob instanceof SimpleClob) {
                    try {
                        return "Clob(len=" + clob.length() + ")";
                    }
                    catch (SQLException e) {}// 不可能
                }
                return "Clob(" + clob.hashCode() + ")";
            } else if (obj instanceof byte[] || obj instanceof char[]) {
                if (Array.getLength(obj) > 10240)
                    return "*BigData[len=" + Array.getLength(obj) + "]";
            } else if (obj instanceof InputStream) {
                try {
                    obj = "*InputStream[len=" + ((InputStream) obj).available() + "]";
                }
                catch (IOException e) {}
            } else if (obj instanceof Reader) {
                obj = "*Reader@" + obj.hashCode();
            }
            return Castors.me().castToString(obj); // TODO 太长的话,应该截取一部分
        }
    }

    public void forceExecQuery() {
    	this.forceExecQuery = true;
    }
    
    public boolean isForceExecQuery() {
    	return forceExecQuery;
    }

    public String forPrint() {
        return super.toString();
    }
    
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy