stored selectkey parameter example cache java sql ibatis

java - selectkey - parameter mybatis



iBatis se ejecutan sql (6)

Agregue esto a su archivo log4j.xml y podrá ver el resultado en la consola.

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

Verá los parámetros que se están pasando, la consulta que se está ejecutando y el resultado de la consulta.

¿Hay alguna manera de obtener la consulta ejecutada de iBatis? Quiero reutilizar la consulta para una consulta UNION.

Por ejemplo:

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

Y cuando ejecuto la consulta a través de

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

Quiero obtener el SELECT username, password FROM table WHERE id=1

¿Hay alguna manera de que pueda obtener la consulta?

Gracias.


Es posible mostrar esta información. Log4J utiliza algo del marco de registro, incluido Log4J .
Para usar Log4J cree el archivo log4j.properties en la log4j.properties de la clase. Por ejemplo, debe colocar las siguientes líneas en el archivo:

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

Para otro marco de registro e información detallada vea este enlace


La mayoría de los motores SQL le permiten "registrar" todas las consultas ejecutadas (generalmente junto con información sobre el tiempo que tomó la consulta, la cantidad de resultados que devolvió, etc.). ¿Tiene acceso a los registros de su motor y puede configurarlo para que registre todo lo que necesita?


Obtenga el objeto de Configuration de su SqlSessionFactory , luego:

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()方法实现分页方言的插入. * * 配置文件内容: * * <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; } } }

Mi referencia: https://www.java2s.com/Open-Source/Java-Document-2/UnTagged/gmc/com/gm/common/orm/mybatis/plugin/OffsetLimitInterceptor.java.htm