package com.nfwork.dbfound.model.bean; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Types; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import com.nfwork.dbfound.core.Context; import com.nfwork.dbfound.db.dialect.SqlDialect; import com.nfwork.dbfound.exception.DBFoundPackageException; import com.nfwork.dbfound.util.DBUtil; import com.nfwork.dbfound.util.ParseUtil; /** * 批量从数据库查询数据,作为结果集 然后执行 * * @author John * */ public class BatchSql extends SqlEntity { private static final long serialVersionUID = 5145846152572625196L; private String cursor; private String sourcePath; @Override public void execute(Context context, Map<String, Param> params, String provideName) { List<Map> cursorValues = null; // 执行游标得到相应的值 if (cursor != null) { cursorValues = new ArrayList<Map>(); try { executeCursor(context, params, provideName, cursorValues); } catch (SQLException e) { throw new DBFoundPackageException( "游标sql执行异常:" + e.getMessage(), e); } } else { cursorValues = (List<Map>) context.getData(sourcePath); } if (cursorValues != null) { int i = 0; for (Map map : cursorValues) { for (Iterator iterator = map.entrySet().iterator(); iterator .hasNext();) { Map.Entry entry = (Map.Entry) iterator.next(); Param param = params.get(entry.getKey()); if (param != null) { param.setValue(entry.getValue()); param.setSourcePathHistory("cursorlist[" + i + "]"); } } i++; for (SqlEntity sql : sqlList) { sql.execute(context, params, provideName); } } } } /** * 执行cursor查询 将结果放到cursorValues * @param context * @param params * @param provideName * @param cursorValues * @throws SQLException */ public void executeCursor(Context context, Map<String, Param> params, String provideName, List<Map> cursorValues) throws SQLException { Connection conn = context.getConn(provideName); SqlDialect dialect = context.getConnDialect(provideName); // 2012年8月14日22:01:04 添加静态参数设置 cursor = ParseUtil.parse(cursor, params); // end 添加 String esql = getExecuteSql(cursor, params); // 方言处理 esql = dialect.parseSql(esql); PreparedStatement statement = conn.prepareStatement(esql); ResultSet dataset = null; try { // 参数设定 initParam(statement, cursor, params); dataset = statement.executeQuery(); ResultSetMetaData metaset = dataset.getMetaData(); // 得到元数据 int size = metaset.getColumnCount(); String colNames[] = new String[size + 1]; for (int i = 1; i < colNames.length; i++) { colNames[i] = metaset.getColumnLabel(i).toLowerCase(); } while (dataset.next()) { Map<String, Object> mapdata = new HashMap<String, Object>(); for (int i = 1; i <= size; i++) { String value = dataset.getString(i); String columnName = colNames[i]; int columnType = metaset.getColumnType(i); if (value == null) { mapdata.put(columnName, null); continue; } switch (columnType) { case Types.VARCHAR: mapdata.put(columnName, value); break; case Types.INTEGER: mapdata.put(columnName, dataset.getInt(i)); break; case Types.DOUBLE: if (value.endsWith(".0")) { mapdata.put(columnName, dataset.getLong(i)); } else { mapdata.put(columnName, dataset.getDouble(i)); } break; case Types.FLOAT: if (value.endsWith(".0")) { mapdata.put(columnName, dataset.getInt(i)); } else { mapdata.put(columnName, dataset.getFloat(i)); } break; case Types.DECIMAL: mapdata.put(columnName, dataset.getDouble(i)); break; case Types.NUMERIC: mapdata.put(columnName, dataset.getDouble(i)); break; case Types.VARBINARY: mapdata.put(columnName, dataset.getLong(i)); break; case Types.BIGINT: mapdata.put(columnName, dataset.getLong(i)); break; case Types.REAL: if (value.endsWith(".0") || value.indexOf(".") == -1) { mapdata.put(columnName, dataset.getInt(i)); } else { mapdata.put(columnName, dataset.getFloat(i)); } break; case Types.BLOB: break; //case Types.CLOB: break; //case Types.NCLOB:break; case Types.LONGVARBINARY: break; default: mapdata.put(columnName, value); } } cursorValues.add(mapdata); } } finally { DBUtil.closeResultSet(dataset); DBUtil.closeStatement(statement); log(esql, params); } } public String getCursor() { return cursor; } public void setCursor(String cursor) { this.cursor = cursor; } public String getSourcePath() { return sourcePath; } public void setSourcePath(String sourcePath) { this.sourcePath = sourcePath; } }