@Override
    public <T> List<T> queryObjects(String queryId, Map<String, Object> condition) {
        if ( LOGGER.isLoggable(Level.FINE) ) {
            LOGGER.fine("start querying objects...: query id=" + queryId + ", condition=" + condition);
        }

        Connection connection = null;
        try {
            connection = connectionManager.getConnection();
            final SqlExpression sqlExpression = queryMap.get(queryId);
            boolean sqlExpressionRequired = sqlExpression == null;
            if ( sqlExpressionRequired ) {
                throw new DataAccessException(
                        "クエリIDにマッチするクエリが見つかりませんでした: クエリID=" + queryId);
            }

            final RowMapper rowMapper = rowMappers.get(sqlExpression.getStrategy());
            boolean rowMapperRequired = rowMapper == null;
            if ( rowMapperRequired ) {
                throw new DataAccessException(
                        "戦略に対応する行マッパが見つかりませんでした: 戦略=" + sqlExpression.getStrategy());
            }

            PreparedStatement preparedStatement = DataSourceUtil.createPreparedStatement(connection,
                    sqlExpression.getExpression());
            sqlExpression.setPlaceHolder(preparedStatement, condition);
            if ( LOGGER.isLoggable(Level.FINER) ) {
                LOGGER.finer(
                        "prepared statement created: sql expression=" + sqlExpression +
                        ", statement=" + preparedStatement);
            }

            final List targetObjects = new ArrayList();
            DataSourceUtil.executeQuery(preparedStatement, new RowHandler() {
                @Override
                public void handleRow(ResultSet resultSet) throws SQLException {
                    Object target = rowMapper.mapRow(resultSet, sqlExpression.getTarget());
                    targetObjects.add(target);

                    if ( LOGGER.isLoggable(Level.FINER) ) {
                        LOGGER.finer("new mapped object created: object=" + target);
                    }
                }
            });

            if ( LOGGER.isLoggable(Level.FINE) ) {
                LOGGER.fine("succeeded querying objects: query id=" + queryId +
                        ", condition=" + condition + ", mapped object count=" + targetObjects.size());
            }

            return targetObjects;
        } catch (Exception ex) {
            if ( LOGGER.isLoggable(Level.SEVERE) ) {
                LOGGER.log(Level.SEVERE,
                        "failed querying objects: query id=" + queryId +", condition=" + condition,
                        ex);
            }

            throw new DataAccessException("セレクトの実行に失敗しました。", ex);
        } finally {
            if ( connection != null ) {
                connectionManager.close(connection);
            }
        }
    }