logback myBatis 3.0+ 如何打印 sql
2016-06-30 18:10
381 查看
该文中使用的log框架为logback
源码解析:
这个log定义的是PreparedStatement
如果你打算有一个全局配置打印所有的sql,则需要如下配置
在mybatis的configuration中增加setting配置
然后增加配置
源码解析:
其中的isDebugEnabled()指的是
注意这里的statementLog,看SimpleExecutor的prepareStatement(handler, ms.getStatementLog());
这个statementLog是ms.getStatementLog()而来的。而MappedStatement的StatementLog
这里可以看到,logPrefix决定了所有log前缀,所以只需要配置logPrefix就行了
转载地址:http://www.cnblogs.com/beiyeren/p/4196134.html
myBatis3.0.6左右的版本时
打印sql的时候只需要配置如下属性:<logger name="java.sql.Connection" level="DEBUG" /> <logger name="java.sql.Statement" level="DEBUG" /> <logger name="java.sql.PreparedStatement" level="DEBUG" />
源码解析:
PreparedStatementLogger里面看这个log.isDebugEnabled()
public Object invoke(Object proxy, Method method, Object[] params) throws Throwable { try { if (EXECUTE_METHODS.contains(method.getName())) { if (log.isDebugEnabled()) { log.debug("==> Executing: " + removeBreakingWhitespace(sql)); log.debug("==> Parameters: " + getParameterValueString()); } clearColumnInfo(); if ("executeQuery".equals(method.getName())) { ResultSet rs = (ResultSet) method.invoke(statement, params); if (rs != null) { return ResultSetLogger.newInstance(rs); } else { return null; } } else { return method.invoke(statement, params); } }
这个log定义的是PreparedStatement
private static final Log log = LogFactory.getLog(PreparedStatement.class);
在myBatis3.2.7左右版本
更改了打印Sql的模式,它将sql打印细化到了每一个mapperStatement的每一个方法上。如果你打算有一个全局配置打印所有的sql,则需要如下配置
在mybatis的configuration中增加setting配置
<settings> <setting name="logPrefix" value="dao."/> </settings>
然后增加配置
<logger name="dao" level="DEBUG"/>
源码解析:
ConnectionLogger
public Object invoke(Object proxy, Method method, Object[] params) throws Throwable { try { if (Object.class.equals(method.getDeclaringClass())) { return method.invoke(this, params); } if ("prepareStatement".equals(method.getName())) { if (isDebugEnabled()) { debug(" Preparing: " + removeBreakingWhitespace((String) params[0]), true); } PreparedStatement stmt = (PreparedStatement) method.invoke(connection, params); stmt = PreparedStatementLogger.newInstance(stmt, statementLog, queryStack); return stmt; }
其中的isDebugEnabled()指的是
protected boolean isDebugEnabled() { return statementLog.isDebugEnabled(); }
注意这里的statementLog,看SimpleExecutor的prepareStatement(handler, ms.getStatementLog());
public <E> List<E> doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException { Statement stmt = null; try { Configuration configuration = ms.getConfiguration(); StatementHandler handler = configuration.newStatementHandler(wrapper, ms, parameter, rowBounds, resultHandler, boundSql); stmt = prepareStatement(handler, ms.getStatementLog()); return handler.<E>query(stmt, resultHandler); } finally { closeStatement(stmt); } }
这个statementLog是ms.getStatementLog()而来的。而MappedStatement的StatementLog
String logId = id; if (configuration.getLogPrefix() != null) logId = configuration.getLogPrefix() + id; mappedStatement.statementLog = LogFactory.getLog(logId);
这里可以看到,logPrefix决定了所有log前缀,所以只需要配置logPrefix就行了
转载地址:http://www.cnblogs.com/beiyeren/p/4196134.html
相关文章推荐
- 数据库高可用架构(MySQL、Oracle、MongoDB、Redis)
- 一起温故数据库模型设计三种范式
- Mysql
- 解析SQLite中的常见问题与总结详解
- mysql联表Update更新的例子
- Oracle java.sql.SQLException: 数字溢出
- mysql 在启动时配置文件的查找方式
- mongodb 语句和SQL语句对应(SQL to Aggregation Mapping Chart)
- DSM -- 远程连接,并且建立数据库连接的流程
- Oracle的if else if
- 数据仓库数据库设计方法---关系模型和多维模型比较分析
- mysql主从搭建
- window 下装 redis
- Mysql 里面使用row_number() 的用法和注意
- redis启动管理脚本
- MySQL 5.6 SQL 优化及 5.6手册
- Oracle:跳跃式索引(Skip Scan Index)浅析
- sql语句大全
- mysql_convert_table_format 批量修改表引擎
- PL/SQL中 块与过程的记录笔记