/******************************************************************************* * Copyright (c) 2013 hangum. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Lesser Public License v2.1 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html * * Contributors: * hangum - initial API and implementation ******************************************************************************/ package com.hangum.tadpole.importexport.core.utils; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.log4j.Logger; import com.hangum.tadpole.engine.manager.TadpoleSQLManager; import com.hangum.tadpole.engine.query.dao.system.UserDBDAO; import com.hangum.tadpole.engine.sql.util.PartQueryUtil; import com.hangum.tadpole.engine.sql.util.resultset.ResultSetUtils; import com.ibatis.sqlmap.client.SqlMapClient; /** * sql query util * * @author hangum */ public class SQLQueryUtil { /** * Logger for this class */ private static final Logger logger = Logger.getLogger(SQLQueryUtil.class); private int DATA_COUNT = 3000; private UserDBDAO userDB; private String requestQuery; /** query HashMap -- table 컬럼의 정보 다음과 같습니다. <column index, Data> */ private Map<Integer, String> mapColumns = null; /** query 의 결과 -- table의 데이터는 다음과 같습니다. <column index, Data> */ private List<HashMap<Integer, Object>> tableDataList = new ArrayList<HashMap<Integer, Object>>(); /** 데이터의 데이터 타입 */ private HashMap<Integer, String> tableDataTypeList = new HashMap<Integer, String>(); /** 처음한번은 반듯이 동작해야 하므로 */ private boolean isFirst = true; private int startPoint = 0; public SQLQueryUtil(UserDBDAO userDB, String requestQuery) { this.userDB = userDB; this.requestQuery = requestQuery; this.isFirst = true; this.startPoint = 0; } public void nextQuery() throws Exception { runSQLSelect(); } /** * 테이블에 쿼리를 실행합니다. */ private void runSQLSelect() throws Exception { tableDataTypeList.clear(); tableDataList.clear(); String thisTimeQuery = PartQueryUtil.makeSelect(userDB, requestQuery, startPoint, DATA_COUNT); ResultSet rs = null; java.sql.Connection javaConn = null; try { javaConn = TadpoleSQLManager.getConnection(userDB); PreparedStatement stmt = null; stmt = javaConn.prepareStatement(thisTimeQuery); rs = stmt.executeQuery();//Query( selText ); // table column의 정보 ResultSetMetaData rsm = rs.getMetaData(); int columnCount = rsm.getColumnCount(); for(int i=0; i<rsm.getColumnCount(); i++) { tableDataTypeList.put(i, rsm.getColumnClassName(i+1)); } // rs set의 데이터 정 tableDataList = new ArrayList<HashMap<Integer, Object>>(); HashMap<Integer, Object> tmpRs = null; mapColumns = ResultSetUtils.getColumnName(rs); while(rs.next()) { tmpRs = new HashMap<Integer, Object>(); for(int i=0;i<columnCount+1; i++) { try { tmpRs.put(i, rs.getObject(i+1)); } catch(Exception e) { tmpRs.put(i, ""); } } tableDataList.add(tmpRs); } } finally { try { if(rs != null) rs.close(); } catch(Exception e) {} try { if(javaConn != null) javaConn.close(); } catch(Exception e){} } } public boolean hasNext() { if(isFirst) { isFirst = false; } else { startPoint = startPoint + DATA_COUNT; if(tableDataList.size() < DATA_COUNT) return false; } return true; } public Map<Integer, String> getMapColumns() { return mapColumns; } public List<HashMap<Integer, Object>> getTableDataList() { return tableDataList; } public HashMap<Integer, String> getTableDataTypeList() { return tableDataTypeList; } }