19

有什么方法可以得到 iBatis 的执行查询吗?我想将查询重用于 UNION 查询。

例如:

<sqlMap namespace="userSQLMap">
   <select id="getUser" resultClass="UserPackage.User">
        SELECT username,
               password 
        FROM table 
        WHERE id=#value#
   </select>
</sqlMap>

当我通过执行查询时

int id = 1
List<User> userList = queryDAO.executeForObjectList("userSQLMap.getUser",id)

我想得到SELECT username, password FROM table WHERE id=1

有什么办法可以得到查询吗?

谢谢。

4

6 回答 6

10

将此添加到您的 log4j.xml 文件中,您可以在控制台上看到输出。

<logger name="java.sql" additivity="false">
    <level value="debug" />
    <appender-ref ref="console" />
</logger>

您将看到正在传递的参数、正在执行的查询以及查询的输出。

于 2011-07-29T13:26:45.923 回答
10

显示这些信息是可能的。iBatis 使用了一些 Logging 框架,包括Log4J.
要在类路径中使用Log4J创建文件log4j.properties。您必须将下一行放入文件中,例如:

log4j.logger.com.ibatis=DEBUG
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG
    
log4j.logger.com.ibatis=DEBUG
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG

有关其他日志记录框架和详细信息,请参阅此链接

于 2010-06-15T15:14:50.303 回答
9

从您的 中获取Configuration对象SqlSessionFactory,然后:

MappedStatement ms = configuration.getMappedStatement("MyMappedStatementId");
BoundSql boundSql = ms.getBoundSql(parameters); // pass in parameters for the SQL statement
System.out.println("SQL" + boundSql.getSql());
于 2014-01-28T06:11:40.850 回答
3
    import java.util.Properties;
    import org.apache.ibatis.executor.Executor;
    import org.apache.ibatis.mapping.BoundSql;
    import org.apache.ibatis.mapping.MappedStatement;
    import org.apache.ibatis.mapping.MappedStatement.Builder;
    import org.apache.ibatis.mapping.SqlSource;
    import org.apache.ibatis.plugin.Interceptor;
    import org.apache.ibatis.plugin.Intercepts;
    import org.apache.ibatis.plugin.Invocation;
    import org.apache.ibatis.plugin.Plugin;
    import org.apache.ibatis.plugin.Signature;
    import org.apache.ibatis.session.ResultHandler;
    import org.apache.ibatis.session.RowBounds;

    import com.gm.common.orm.mybatis.dialect.Dialect;
    import com.gm.common.utils.PropertiesHelper;

    /**
     * 为Mybatis提供基于方言(Dialect)的分页查询的插件
     * 
     * 将拦截Executor.query()方法实现分页方言的插入.
     * 
     * 配置文件内容:
     * 
     * <pre>
     *  &lt;plugins>
     *  &lt;plugin interceptor="com.gm.common.orm.mybatis.plugin.OffsetLimitInterceptor">
     *      &lt;property name="dialectClass" value="com.gm.common.orm.mybatis.dialect.MySQLDialect"/>
     *  &lt;/plugin>
     * &lt;/plugins>
     * </pre>
     */

    @Intercepts({@Signature(type=Executor.class,method="query",args={MappedStatement.class,Object.class,RowBounds.class,ResultHandler.class})})
    public class OffsetLimitInterceptor implements  Interceptor {
        static int MAPPED_STATEMENT_INDEX = 0;
        static int PARAMETER_INDEX = 1;
        static int ROWBOUNDS_INDEX = 2;
        static int RESULT_HANDLER_INDEX = 3;

        Dialect dialect;

        public Object intercept(Invocation invocation) throws Throwable {
            processIntercept(invocation.getArgs());
            return invocation.proceed();
        }

        void processIntercept(final Object[] queryArgs) {
            // queryArgs = query(MappedStatement ms, Object parameter, RowBounds
            // rowBounds, ResultHandler resultHandler)
            MappedStatement ms = (MappedStatement) queryArgs[MAPPED_STATEMENT_INDEX];
            Object parameter = queryArgs[PARAMETER_INDEX];
            final RowBounds rowBounds = (RowBounds) queryArgs[ROWBOUNDS_INDEX];
            int offset = rowBounds.getOffset();
            int limit = rowBounds.getLimit();

            if (dialect.supportsLimit()
                    && (offset != RowBounds.NO_ROW_OFFSET || limit != RowBounds.NO_ROW_LIMIT)) {
                BoundSql boundSql = ms.getBoundSql(parameter);
                String sql = boundSql.getSql().trim();
                if (dialect.supportsLimitOffset()) {
                    sql = dialect.getLimitString(sql, offset, limit);
                    offset = RowBounds.NO_ROW_OFFSET;
                } else {
                    sql = dialect.getLimitString(sql, 0, limit);
                }
                limit = RowBounds.NO_ROW_LIMIT;

                queryArgs[ROWBOUNDS_INDEX] = new RowBounds(offset, limit);
                BoundSql newBoundSql = new BoundSql(ms.getConfiguration(),
                        sql, boundSql.getParameterMappings(), boundSql
                                .getParameterObject());
                MappedStatement newMs = copyFromMappedStatement(ms,
                        new BoundSqlSqlSource(newBoundSql));
                queryArgs[MAPPED_STATEMENT_INDEX] = newMs;
            }
        }

        // see: MapperBuilderAssistant
        private MappedStatement copyFromMappedStatement(MappedStatement ms,
                SqlSource newSqlSource) {
            Builder builder = new MappedStatement.Builder(ms
                    .getConfiguration(), ms.getId(), newSqlSource, ms
                    .getSqlCommandType());

            builder.resource(ms.getResource());
            builder.fetchSize(ms.getFetchSize());
            builder.statementType(ms.getStatementType());
            builder.keyGenerator(ms.getKeyGenerator());
            builder.keyProperty(ms.getKeyProperty());

            // setStatementTimeout()
            builder.timeout(ms.getTimeout());

            // setStatementResultMap()
            builder.parameterMap(ms.getParameterMap());

            // setStatementResultMap()
            builder.resultMaps(ms.getResultMaps());
            builder.resultSetType(ms.getResultSetType());

            // setStatementCache()
            builder.cache(ms.getCache());
            builder.flushCacheRequired(ms.isFlushCacheRequired());
            builder.useCache(ms.isUseCache());

            return builder.build();
        }

        public Object plugin(Object target) {
            return Plugin.wrap(target, this );
        }

        public void setProperties(Properties properties) {
            String dialectClass = new PropertiesHelper(properties)
                    .getRequiredString("dialectClass");
            try {
                dialect = (Dialect) Class.forName(dialectClass)
                        .newInstance();
            } catch (Exception e) {
                throw new RuntimeException(
                        "cannot create dialect instance by dialectClass:"
                                + dialectClass, e);
            }
            System.out.println(OffsetLimitInterceptor.class.getSimpleName()
                    + ".dialect=" + dialectClass);
        }

        public static class BoundSqlSqlSource implements  SqlSource {
            BoundSql boundSql;

            public BoundSqlSqlSource(BoundSql boundSql) {
                this .boundSql = boundSql;
            }

            public BoundSql getBoundSql(Object parameterObject) {
                return boundSql;
            }
        }

    }

我的参考: https ://www.java2s.com/Open-Source/Java-Document-2/UnTagged/gmc/com/gm/common/orm/mybatis/plugin/OffsetLimitInterceptor.java.htm

于 2011-12-18T20:37:24.993 回答
2

大多数 SQL 引擎允许您“记录”所有执行的查询(通常连同有关查询所用时间、返回的结果数量等信息)。您是否有权访问引擎的日志,并且您可以对其进行配置,以便它记录您需要的所有内容吗?

于 2010-04-14T05:22:56.227 回答
1

您可以为此使用p6spyjdbcdslog

于 2010-04-14T08:44:12.363 回答