iBatis执行sql

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

例如:

  SELECT username, password FROM table WHERE id=#value#   

当我执行查询时

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

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

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

谢谢。

显示这些信息是可行的.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 

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

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

     

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

SqlSessionFactory获取Configuration对象,然后:

 MappedStatement ms = configuration.getMappedStatement("MyMappedStatementId"); BoundSql boundSql = ms.getBoundSql(parameters); // pass in parameters for the SQL statement System.out.println("SQL" + boundSql.getSql()); 
  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()方法实现分页方言的插入. * * 配置文件内容: * * 
 * <plugins> * <plugin interceptor="com.gm.common.orm.mybatis.plugin.OffsetLimitInterceptor"> * <property name="dialectClass" value="com.gm.common.orm.mybatis.dialect.MySQLDialect"/> * </plugin> * </plugins> * 

*/ @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

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

您可以使用p6spy或jdbcdslog 。