Package com.founder.fix.fixflow.core.impl.db

Source Code of com.founder.fix.fixflow.core.impl.db.SqlCommand

/**
* Copyright 1996-2013 Founder International Co.,Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*      http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* @author kenshin
*/
package com.founder.fix.fixflow.core.impl.db;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.founder.fix.fixflow.core.exception.FixFlowException;
import com.founder.fix.fixflow.core.impl.log.LogFactory;

public class SqlCommand {
 
   private static com.founder.fix.fixflow.core.impl.log.DebugLog debugLog = LogFactory.getDebugLog(SqlCommand.class);

  Connection conn;

  public SqlCommand(Connection conn) {
    this.conn = conn;
  }

  /**
   * 取得原始连接
   *
   * @return
   */
  public Connection getConnect() {
    return conn;
  }

  /**
   * 取得查询的单值
   *
   * @param sql
   * @param data
   * @return
   * @throws DAOException
   */
  public Object queryForValue(String sql, List<Object> data) throws FixFlowException {
    String resultStr = new String();
    PreparedStatement pstmt=null;
    ResultSet rs=null;
    try {
      pstmt = conn.prepareStatement(sql);
      debugLog.debug("FixFlow引擎数据持久化语句: " +sql);
      debugLog.debug("参数: " +data);
      if (null != data && data.size() > 0) {
        for (int i = 0; i < data.size(); i++) {
          data.set(i, transformSqlType(data.get(i)));
          pstmt.setObject(i + 1, data.get(i));
        }
      }
      rs = pstmt.executeQuery();
      if (rs.next()) {

        resultStr = rs.getString(1);

      }
    } catch (SQLException e) {
      throw new FixFlowException("查询错误:" + e.getMessage(), e);
    }
    finally
    {
      try {
        pstmt.close();
        if(rs != null){
        rs.close();}
      } catch (SQLException e) {
        throw new FixFlowException("关闭游标失败",e);
      }
    }
    return resultStr;
  }

  /**
   * 取得查询的单值
   *
   * @param sql
   * @return
   * @throws DAOException
   */
  public Object queryForValue(String sql) throws FixFlowException {
    return queryForValue(sql, null);
  }

  /**
   * 以Map对象形式获取返回一个查询结果
   *
   * @param sql
   * @param data
   * @return Map<String, Object> 结果集
   * @throws DAOException
   */
  public Map<String, Object> queryForMap(String sql, Object[] data) throws FixFlowException {
    Map<String, Object> resultMap = new HashMap<String, Object>();
    ResultSet rs = null;
    PreparedStatement pstmt=null;
    try {
      pstmt = conn.prepareStatement(sql);
      debugLog.debug("FixFlow引擎数据持久化语句: " +sql);
      debugLog.debug("参数: " +sql);
      if (null != data && data.length > 0) {
        for (int i = 0; i < data.length; i++) {
          data[i] = transformSqlType(data[i]);

          if (data[i] == null) {
            pstmt.setNull(i + 1, Types.VARCHAR);
          } else {
            pstmt.setObject(i + 1, data[i]);
          }

          pstmt.setObject(i + 1, data[i]);
        }
      }
      rs = pstmt.executeQuery();
      ResultSetMetaData rsmd = rs.getMetaData();
     
      if (rs.next()) {

        for (int i = 1; i <= rsmd.getColumnCount(); i++) {
          if (rsmd.getColumnType(i) == 93) {
            if (rs.getTimestamp(i) != null) {
              resultMap.put(rsmd.getColumnLabel(i), new Date(rs.getTimestamp(i).getTime()));
            }

          } else {
            if (rsmd.getColumnType(i) == 2004) {
              resultMap.put(rsmd.getColumnLabel(i), rs.getBytes(i));

            } else {
              resultMap.put(rsmd.getColumnLabel(i), rs.getObject(i));
            }
       
          }
        }
      }
    } catch (SQLException e) {
      throw new FixFlowException("查询错误:" + e.getMessage(), e);
    }
   
    finally
    {
      try {
        pstmt.close();
        if(rs != null){
        rs.close();}
      } catch (SQLException e) {
        throw new FixFlowException("关闭游标失败",e);
      }
    }
    return resultMap;
  }

  /**
   * 以Map对象形式获取返回一个查询结果
   *
   * @param sql
   * @return Map<String, Object> 结果集
   * @throws DAOException
   */
  public Map<String, Object> queryForMap(String sql) throws FixFlowException {
    return queryForMap(sql, null);
  }

  /*
   * public List<Map<String, Object>> queryForList(String sql, Object[] data)
   * throws FixFlowException { List<Map<String, Object>> resultList = new
   * ArrayList<Map<String, Object>>(); try { PreparedStatement pstmt =
   * conn.prepareStatement(sql); if(null != data && data.length > 0) { for(int
   * i = 0; i < data.length; i++) { data[i]=transformSqlType(data[i]);
   * pstmt.setObject(i+1, data[i]); } } ResultSet rs = pstmt.executeQuery();
   * ResultSetMetaData rsmd = rs.getMetaData(); while(rs.next()) { Map<String,
   * Object> row = new HashMap<String, Object>(); for(int i = 1; i <=
   * rsmd.getColumnCount(); i++) { row.put(rsmd.getColumnLabel(i),
   * rs.getObject(i)); } resultList.add(row); } } catch (SQLException e) {
   * throw new FixFlowException("查询错误:"+e.getMessage(),e); } return
   * resultList; }
   */

  /**
   * 以List对象形式返回查询一组结果
   *
   * @param sql
   * @param data
   * @return List<Map<String, Object>> 结果集
   * @throws DAOException
   */
  public List<Map<String, Object>> queryForList(String sql, List<Object> data) throws FixFlowException {
    List<Map<String, Object>> resultList = new ArrayList<Map<String, Object>>();
    ResultSet rs = null;
    PreparedStatement pstmt=null;
    try {
      pstmt = conn.prepareStatement(sql);
      debugLog.debug("FixFlow引擎数据持久化语句: " +sql);
      debugLog.debug("参数:"+data);
      if (null != data && data.size() > 0) {
        for (int i = 0; i < data.size(); i++) {

          Object returnObj = transformSqlType(data.get(i));
          if (returnObj == null) {
            pstmt.setNull(i + 1, Types.VARCHAR);
          } else {
            data.set(i, returnObj);
            pstmt.setObject(i + 1, data.get(i));
          }

        }
      }
      rs = pstmt.executeQuery();
      ResultSetMetaData rsmd = rs.getMetaData();
      while (rs.next()) {
        Map<String, Object> row = new HashMap<String, Object>();
        for (int i = 1; i <= rsmd.getColumnCount(); i++) {
          if (rsmd.getColumnType(i) == 93) {
            if (rs.getTimestamp(i) != null) {
              row.put(rsmd.getColumnLabel(i), new Date(rs.getTimestamp(i).getTime()));
            }

          } else {
            if (rsmd.getColumnType(i) == 2004) {
              row.put(rsmd.getColumnLabel(i), rs.getBytes(i));

            } else {
              row.put(rsmd.getColumnLabel(i), rs.getObject(i));
            }
          }

        }
        resultList.add(row);
      }
    } catch (SQLException e) {
      throw new FixFlowException("查询错误:" + e.getMessage(), e);
    }
    finally
    {
      try {
        pstmt.close();
        if(rs != null){
          rs.close();
        }
      } catch (SQLException e) {
        throw new FixFlowException("关闭游标失败",e);
      }
    }
    return resultList;
  }

  /**
   * 以List对象形式返回查询一组结果
   *
   * @param sql
   * @return List<Map<String, Object>> 结果集
   * @throws DAOException
   */
  public List<Map<String, Object>> queryForList(String sql) throws FixFlowException {
    return queryForList(sql, null);
  }

  /**
   * 执行查询
   *
   * @param sql
   * @throws DAOException
   */
  public void execute(String sql) throws FixFlowException {
    Statement stmt=null;
    try {
      stmt = conn.createStatement();
      debugLog.debug("FixFlow引擎数据持久化语句: " +sql);
      stmt.execute(sql);
      
     
    } catch (SQLException e) {
      throw new FixFlowException("查询错误:" + e.getMessage(), e);
    }
    finally
    {
      try {
        stmt.close();
      } catch (SQLException e) {
        throw new FixFlowException("关闭游标失败",e);
      }
    }
  }

  /**
   * 执行查询
   *
   * @param sql
   * @param data
   * @throws DAOException
   */
  public void execute(String sql, Object[] data) throws FixFlowException {
    PreparedStatement pstmt=null;
    try {
      pstmt = conn.prepareStatement(sql);
      debugLog.debug("FixFlow引擎数据持久化语句: " +sql);
      debugLog.debug("参数: "+ Arrays.asList(data));
      if (null != data && data.length > 0) {
        for (int i = 0; i < data.length; i++) {
          data[i] = transformSqlType(data[i]);

          Object returnObj = data[i];
          if (returnObj == null) {
            pstmt.setNull(i + 1, Types.VARCHAR);
          } else {
            pstmt.setObject(i + 1, returnObj);
          }

        }
      }
      pstmt.execute();
    } catch (SQLException e) {
      throw new FixFlowException("查询错误:" + e.getMessage(), e);
    }
    finally
    {
      try {
        pstmt.close();
      } catch (SQLException e) {
        throw new FixFlowException("关闭游标失败",e);
      }
    }
   
  }

  /**
   * 执行查询
   *
   * @param sql
   * @throws DAOException
   */
  public ResultSet query(String sql) throws FixFlowException {
    ResultSet result = null;
    Statement stmt=null;
    try {
      stmt = conn.createStatement();
      debugLog.debug("FixFlow引擎数据持久化语句: " +sql);
      result = stmt.executeQuery(sql);
     
    } catch (SQLException e) {
      throw new FixFlowException("查询错误:" + e.getMessage(), e);
    }
    finally
    {
      try {
        stmt.close();
        if(result != null){
        result.close();}
      } catch (SQLException e) {
        throw new FixFlowException("关闭游标失败",e);
      }
    }
    return result;
  }

  /**
   * 执行查询
   *
   * @param sql
   * @param data
   * @throws DAOException
   */
  public ResultSet query(String sql, Object[] data) throws FixFlowException {
    ResultSet result = null;
    PreparedStatement pstmt=null;
    try {
      pstmt = conn.prepareStatement(sql);
      debugLog.debug("FixFlow引擎数据持久化语句: " +sql);
      debugLog.debug("参数: "+ Arrays.asList(data));
      if (null != data && data.length > 0) {
        for (int i = 0; i < data.length; i++) {

          data[i] = transformSqlType(data[i]);
          Object returnObj = data[i];
          if (returnObj == null) {
            pstmt.setNull(i + 1, Types.VARCHAR);
          } else {
            pstmt.setObject(i + 1, returnObj);
          }

        }
      }
      result = pstmt.executeQuery(sql);
    } catch (SQLException e) {
      throw new FixFlowException("查询错误:" + e.getMessage(), e);
    }
    finally
    {
      try {
        pstmt.close();
        if(result!=null){
        result.close();}
      } catch (SQLException e) {
        throw new FixFlowException("关闭游标失败",e);
      }
    }
    return result;
  }

  /**
   * 将Map对象插入到数据表中
   *
   * @param tableName 要插入的数据表的名称
   * @param data 数据对象
   * @return 影响行数
   * @throws DAOException
   */
  public Integer insert(String tableName, Map<String, Object> data) throws FixFlowException {
   
   
    if (data.size() < 1) {
      throw new FixFlowException("插入错误: 无效的数据输入");
    }
    /* 构造插入查询语句 */
    StringBuffer querySql = new StringBuffer("INSERT INTO ");
    querySql.append(tableName);
    querySql.append(" ( ");

    Set<String> keys = data.keySet();
    for (Object key : keys.toArray()) {
      querySql.append((String) key);
      querySql.append(" , ");
    }

    querySql = new StringBuffer(querySql.substring(0, querySql.lastIndexOf(",")));
    querySql.append(" ) VALUES ( ");
    for (int i = 0; i < data.size(); i++) {
      querySql.append(" ? ,");
    }

    querySql = new StringBuffer(querySql.substring(0, querySql.lastIndexOf(",")));
    querySql.append(" )");
    /* 构造插入查询语句 完成 */

    Integer affectRow = 0;
    PreparedStatement pstmt=null;
    try {
      debugLog.debug("FixFlow引擎数据持久化语句: " +querySql.toString());
      debugLog.debug("参数: "+ data);
      pstmt = conn.prepareStatement(querySql.toString());
     
      Object[] keyArray = keys.toArray();
      for (int i = 0; i < keyArray.length; i++) {

        Object returnObj = transformSqlType(data.get((String) keyArray[i]));
        if (returnObj == null) {
          pstmt.setNull(i + 1, Types.VARCHAR);
        } else {
          pstmt.setObject(i + 1, returnObj);
        }

      }
      
      affectRow = pstmt.executeUpdate();
    } catch (SQLException e) {
      throw new FixFlowException("查询错误:" + e.getMessage(), e);
    }
    finally
    {
      try {
        pstmt.close();
      } catch (SQLException e) {
        throw new FixFlowException("关闭游标失败",e);
      }
    }
   
    return affectRow;
  }

  /**
   * 将Map对象更新到数据库中
   *
   * @param tableName 要更新的数据表
   * @param data 要更新的数据对象
   * @param sql Where查询条件子句
   * @return 影响行数
   * @throws DAOException
   */
  public Integer update(String tableName, Map<String, Object> data, String sql, Object[] sdata) throws FixFlowException {
    if (data.size() < 1) {
      throw new FixFlowException("插入错误: 无效的数据输入");
    }

    /* 构造插入查询语句 */
    StringBuffer querySql = new StringBuffer("UPDATE ");
    querySql.append(tableName);
    querySql.append(" SET ");
    Set<String> keys = data.keySet();
    for (Object key : keys.toArray()) {
      querySql.append((String) key);
      querySql.append(" = ? , ");
    }
    querySql = new StringBuffer(querySql.substring(0, querySql.lastIndexOf(",")));
    if (null != sql) {
      querySql.append(" WHERE ");
      querySql.append(sql);
    }
    /* 构造插入查询语句 */
    PreparedStatement pstmt=null;
    Integer affectRow = 0;
    try {
      debugLog.debug("FixFlow引擎数据持久化语句: " +querySql.toString());
      debugLog.debug("参数data: "+ data);
      debugLog.debug("参数sdata: "+ Arrays.asList(sdata));
      pstmt = conn.prepareStatement(querySql.toString());
      Object[] keyArray = keys.toArray();
      int j = 1;
      for (int i = 0; i < keyArray.length; i++) {

        Object returnObj = transformSqlType(data.get((String) keyArray[i]));
        if (returnObj == null) {
          pstmt.setNull(j++, Types.VARCHAR);
        } else {
          pstmt.setObject(j++, returnObj);
        }

      }
      if (null != sdata && sdata.length > 0) {
        for (int i = 0; i < sdata.length; i++) {

          Object returnObj = transformSqlType(sdata[i]);
          if (returnObj == null) {
            pstmt.setNull(j++, Types.VARCHAR);
          } else {
            pstmt.setObject(j++, returnObj);
          }

        }
      }
      affectRow = pstmt.executeUpdate();
    } catch (SQLException e) {
      throw new FixFlowException("查询错误:" + e.getMessage(), e);
    }
    finally
    {
      try {
        pstmt.close();
      } catch (SQLException e) {
        throw new FixFlowException("关闭游标失败",e);
      }
    }
    return affectRow;
  }

  /**
   * 将Map对象更新到数据库中
   *
   * @param tableName 要更新的数据表
   * @param data 要更新的数据对象
   * @return 影响行数
   * @throws DAOException
   */
  public Integer update(String tableName, Map<String, Object> data, String sql) throws FixFlowException {
    return update(tableName, data, sql, null);
  }

  /**
   * 将Map对象更新到数据库中
   *
   * @param tableName 要更新的数据表
   * @param data 要更新的数据对象
   * @return 影响行数
   * @throws DAOException
   */
  public Integer update(String tableName, Map<String, Object> data) throws FixFlowException {
    return update(tableName, data, null, null);
  }

  /**
   * 删除记录
   *
   * @param tableName 表名
   * @param sql WHERE查询子句
   * @param data 数据对象
   * @return
   * @throws DAOException
   */
  public Integer delete(String tableName, String sql, Object[] data) throws FixFlowException {
    StringBuffer querySql = new StringBuffer("DELETE FROM ");
    querySql.append(tableName);
    if (null != sql) {
      querySql.append(" WHERE ");
      querySql.append(sql);
    }
    Integer affectRow = 0;
    PreparedStatement pstmt=null;
    try {
      debugLog.debug("FixFlow引擎数据持久化语句: " +querySql.toString());
      debugLog.debug("参数: "+ Arrays.asList(data));
      pstmt = conn.prepareStatement(querySql.toString());
      if (data != null) {
        for (int i = 0; i < data.length; i++) {

          Object returnObj = transformSqlType(data[i]);
          if (returnObj == null) {
            pstmt.setNull(i + 1, Types.VARCHAR);
          } else {
            pstmt.setObject(i + 1, returnObj);
          }

        }
      }
      affectRow = pstmt.executeUpdate();
    } catch (SQLException e) {
      throw new FixFlowException("查询错误:" + e.getMessage(), e);
    }
    finally
    {
      try {
        pstmt.close();
      } catch (SQLException e) {
        throw new FixFlowException("关闭游标失败",e);
      }
    }
    return affectRow;
  }

  /**
   * 删除记录
   *
   * @param tableName 表名
   * @param sql WHERE查询子句
   * @return
   * @throws DAOException
   */
  public Integer delete(String tableName, String sql) throws FixFlowException {
    return delete(tableName, sql, null);
  }

  /**
   * 清空表
   *
   * @param tableName 表名
   * @return
   * @throws DAOException
   */
  public Integer delete(String tableName) throws FixFlowException {
    return delete(tableName, null, null);
  }

  /**
   * 设置事务级别
   *
   * @param level
   * @throws DAOException
   */
  public void startTransaction(Integer level) throws FixFlowException {
    try {
      conn.setTransactionIsolation(level);
    } catch (SQLException e) {
      throw new FixFlowException("事务错误:" + e.getMessage(), e);
    }
  }

  /**
   * 提交事务
   *
   * @throws DAOException
   */
  public void commit() throws FixFlowException {
    try {
      conn.commit();
    } catch (SQLException e) {
      throw new FixFlowException("事务错误:" + e.getMessage(), e);
    }
  }

  /**
   * 回滚事务
   *
   * @throws DAOException
   */
  public void rollback() throws FixFlowException {
    try {
      conn.rollback();
    } catch (SQLException e) {
      throw new FixFlowException("事务错误:" + e.getMessage(), e);
    }
  }

  /**
   * 将Java类型转换为数据库能接受的Sql类型
   *
   * @param object 数据对象
   * @return
   */
  private Object transformSqlType(Object object) {

    if (object == null) {
      return null;
    }

    if (object instanceof java.util.Date) {

      object = new java.sql.Timestamp(((java.util.Date) object).getTime());

    }

    return object;
  }

}
TOP

Related Classes of com.founder.fix.fixflow.core.impl.db.SqlCommand

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.