菜单

详细整合教程,MyBatis3用log4j在控制台输出SQL的方法示例

2019年8月9日 - 4166am金沙下载
详细整合教程,MyBatis3用log4j在控制台输出SQL的方法示例

MyBatis3用log4j在控制台输出SQL的方法示例,mybatis3log4j

为什么要在控制台输出 SQL 呢?

当然是为了开发调试的时候方便了。

如果一个
数据库相关的操作出现了问题,我们可以根据输出的SQL语句快速排查问题。

输出的信息:

[org.mybatis.spring.SqlSessionUtils]-Creating a new SqlSession 
[org.mybatis.spring.SqlSessionUtils]-SqlSession
[[email protected]]
was not registered for synchronization because synchronization is not
active 
[org.springframework.jdbc.datasource.DataSourceUtils]-Fetching JDBC
Connection from DataSource 
[org.mybatis.spring.transaction.SpringManagedTransaction]-JDBC
Connection
[jdbc:mysql://rds.aliyuncs.com:3306/yyyy?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull,
[email protected],
MySQL Connector Java] will not be managed by Spring 
[Datenumber.pageSelect]-==>  Preparing: SELECT x.Id,
DATE_FORMAT(x.`Date`, ‘%Y%m%d’) `datestr`, x.befor_num,
x.after_num, x.physician_id, y.department_id, y.clinic_id,
y.true_name, y.avatar, y.title, y.telephone FROM datenumber x right
join physician y on x.physician_id=y.id AND ( x.`Date` >= ? AND
x.`Date` <= ? ) Where 1=1 AND y.clinic_id = ? ORDER BY x.Date
ASC  
[Datenumber.pageSelect]-==> Parameters: 2017-3-28(String),
2017-4-4(String), 1(Long) 
[Datenumber.pageSelect]-<==      Total: 19 

输出的内容比较可怕,数据库连接字符,用户名密码都输出来了,一定要小心。

不过有一点不好的是SQL语句和参数是分开输出的,想复制到查询工具中调试的话还得自己填写参数,比较麻烦。

我的项目环境

Spring 4.0.2 + Spring MVC 4.0.2 + MyBatis 3.2.6

方法一:使用标准日志输出

此方法比较简单,只需要配置 MyBatis 的配置文件 Configuration
中有相关属性即可,不用再放一个 log4j.properties 文件。

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 
    "http://mybatis.org/dtd/mybatis-3-config.dtd"> 
<configuration> 
  <settings> 
    <setting name="logImpl" value="STDOUT_LOGGING"/> 
  </settings> 
</configuration> 

关键语句:

<setting name="logImpl" value="STDOUT_LOGGING"/> 

指定 MyBatis
应该使用哪个日志记录实现。如果此设置不存在,则会自动发现日志记录实
现。

方法二:使用log4j日志输出

1、spring-mybatis.xml 文件不需要修改;

2、在mybatis.xml中,指定使用log4j为日志实现,这个我实际测试也不需要。

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 
    "http://mybatis.org/dtd/mybatis-3-config.dtd"> 
<configuration> 
  <settings> 
    <setting name="logImpl" value="LOG4J"/> 
  </settings> 
</configuration> 
<!-- 实际测试这个文件有没有都可以 --> 

这里的value值可以是SLF4J、Apache Commons Logging、Log4J2、Log4J、JDK
logging(除Log4J2、Log4J外,其他未验证),并会按顺序查找

3、在web.xml中也需要配置

<listener> 
   <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> 
 </listener> 

或者用下面的(未测试)

<listener> 
    <listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class> 
  </listener> 

4、最后配置log4j.properties

### Log4j配置 ### 
### 与Spring结合需要在web.xml中指定此文件位置,并添加监听器 ### 
#定义log4j的输出级别和输出目的地(目的地可以自定义名称,和后面的对应) 
#[ level ] , appenderName1 , appenderName2 
log4j.rootLogger=DEBUG,console,file 

#-----------------------------------# 
#1 定义日志输出目的地为控制台 
log4j.appender.console = org.apache.log4j.ConsoleAppender 
log4j.appender.console.Target = System.out 
log4j.appender.console.Threshold=DEBUG 
####可以灵活地指定日志输出格式,下面一行是指定具体的格式 ### 
#%c: 输出日志信息所属的类目,通常就是所在类的全名 
#%m: 输出代码中指定的消息,产生的日志具体信息  
#%n: 输出一个回车换行符,Windows平台为"/r/n",Unix平台为"/n"输出日志信息换行 
log4j.appender.console.layout = org.apache.log4j.PatternLayout 
log4j.appender.console.layout.ConversionPattern=[%c]-%m%n 

#-----------------------------------# 
#2 文件大小到达指定尺寸的时候产生一个新的文件  
log4j.appender.file = org.apache.log4j.RollingFileAppender 
#日志文件输出目录 
log4j.appender.file.File=log/tibet.log 
#定义文件最大大小 
log4j.appender.file.MaxFileSize=10mb 
###输出日志信息### 
#最低级别 
log4j.appender.file.Threshold=ERROR 
log4j.appender.file.layout=org.apache.log4j.PatternLayout 
log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n 

#-----------------------------------# 
#3 druid 
log4j.logger.druid.sql=INFO 
log4j.logger.druid.sql.DataSource=info 
log4j.logger.druid.sql.Connection=info 
log4j.logger.druid.sql.Statement=info 
log4j.logger.druid.sql.ResultSet=info 

#4 mybatis 显示SQL语句部分 
log4j.logger.org.mybatis=DEBUG 
#log4j.logger.cn.tibet.cas.dao=DEBUG 
#log4j.logger.org.mybatis.common.jdbc.SimpleDataSource=DEBUG 
#log4j.logger.org.mybatis.common.jdbc.ScriptRunner=DEBUG 
#log4j.logger.org.mybatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG 
#log4j.logger.java.sql.Connection=DEBUG 
log4j.logger.java.sql=DEBUG 
log4j.logger.java.sql.Statement=DEBUG 
log4j.logger.java.sql.ResultSet=DEBUG 
log4j.logger.java.sql.PreparedStatement=DEBUG 

两种方式比较

1、使用标准日志输出配置简单,使用log4j日志输出配置相对复杂;

2、log4j功能强大,控制粒度比较细;

当在配置文件中指定为“
STDOUT_LOGGING”时,实际使用的是哪一个日志实现?Apache Commons Logging
还是JDK logging ?

都不是,实际是 System.out.pringln.

2017-09-14更新

有小伙伴反馈按第二种方法配置后不输出SQL 语句,请注意 log4j.properties
文件中的:

log4j.appender.console.Threshold=DEBUG 

是否与本例一致!

请注意细节,刚开始学习的朋友可以先完全使用本例提供的配置,得到正确的输出后再做个性定制。
另外,按照我上面的配置会输出大量 SQL
语句之外的信息,一位朋友尝试出只输出 SQL 语句、参数、结果的配置方法,

在此表示感谢并分享给大家:

图片 1

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持帮客之家。

为什么要在控制台输出 SQL 呢? 当然是为了开发调试的时候方便了。 如果一个
数据库…

使用Mybatis的时候,有些时候能输出(主要是指sql,参数,结果)日志。有些时候就不能。

摘要: 基本概念 1.1、Spring spring是一个开源框架,Spring是于2003
年兴起的一个轻量级的Java开发框架,由Rod Johnson 在其著作Expert
One-On-One J2EE Development and
Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。
简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(A

无法输出日志的时候,无论怎么配置log4j,不管是properties的还是xml的,都不起作用。

1、基本概念

有些时候,我们没做什么配置就能输出日志….

1.1、Spring

这是一个让无数人烦躁的问题。其实解决问题很容易(我过了这么久才解决,以前都用拦截器输出)。

spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。 简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。

这是一个普大喜奔的日子,让我们一起来看看如何解决mybatis的日志问题。

1.2、SpringMVC

为什么说这个问题很容易解决呢?因为mybatis的文档写的很清楚。

Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。

为什么我们都没找到解决办法呢?因为即使看过文档的人,也未必去看Logging这一节。但是这一节正是解决问题的关键。

1.3、MyBatis

已经等不及的小伙伴们可以直接去这里看文档:http://mybatis.github.io/mybatis-3/zh/logging.html

MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。MyBatis是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

提醒最常用的方法不再这个链接中,但是这个文档提供了对log4j的详细配置。本文下面的内容大部分是这个文档的Copy。

2、开发环境搭建

Mybatis内置的日志工厂提供日志功能,具体的日志实现有以下几种方式

技术选型(只列了一部分技术)

SLF4J

1、后端

Apache Commons Logging

服务框架:Dubbo、zookeeper、Rest服务

Log4j 2

缓存:Redis、ehcache

Log4j

消息中间件:ActiveMQ

JDK logging

负载均衡:Nginx

具体选择哪个日志实现由MyBatis的内置日志工厂确定。它会使用最先找到的(按上文列举的顺序查找)。如果一个都未找到,日志功能就会被禁用。

分布式文件:FastDFS

不少应用服务器的classpath中已经包含Commons
Logging,如Tomcat和WebShpere,
所以MyBatis会把它作为具体的日志实现

数据库连接池:Alibaba
Druid 1.0

记住这点非常重要。这意味着,在诸如WebSphere的环境中——WebSphere提供了Commons
Logging的私有实现,你的Log4J配置将被忽略。

核心框架:Spring framework

这种做法不免让人悲催,MyBatis怎么能忽略你的配置呢?事实上,因Commons
Logging已经存
在,按优先级Log4J自然就被忽略了!**

安全框架:Apache Shiro 1.2

不过,如果你的应用部署在一个包含Commons
Logging的环境,而你又想用其他的日志框架,你可以根据需要调用如下的某一方法:

视图框架:Spring MVC 4.0

[java]view
plaincopy

服务端验证:hibernateValidator
5.1

布局框架:SiteMesh 2.4

1.org.apache.ibatis.logging.LogFactory.useSlf4jLogging();

工作流引擎:Activiti 5.15

2.org.apache.ibatis.logging.LogFactory.useLog4JLogging();

任务调度:quartz 1.8.5

3.org.apache.ibatis.logging.LogFactory.useJdkLogging();

持久层框架:MyBatis 3.2

4.org.apache.ibatis.logging.LogFactory.useCommonsLogging();

日志管理:SLF4J 1.7、Log4j

5.org.apache.ibatis.logging.LogFactory.useStdOutLogging();

工具类:Apache Commons、Jackson 2.2、Xstream 1.4、Dozer 5.3、POI

如果的确需要调用以上的某个方法,请在调用所有其他MyBatis方法前调用它。另外,只有在相应日志实现存在的前提下,调用对应的方法才是有意义的,否则MyBatis一概忽略。如你环境中并不存在Log4J,你却调用了相应的方法,MyBatis就会忽略这一调用,代之默认的查找顺序查找日志实现。

2、前端

例如使用log4j就需要在调用mybatis方法前,先执行代码:

js框架:jQuery1.9。

[java]view
plaincopy

CSS框架: Bootstrap 4 metronic

客户端验证:jqueryValidation
Plugin。

1.org.apache.ibatis.logging.LogFactory.useLog4JLogging();

富文本:CKEcitor

上面这是一种解决办法,但是有些情况你不知道何时执行这个方法。

文件管理:CKFinder

mybatis还提供了另外一种(推荐使用这种)解决方法,继续看下面。

动态页签:Jerichotab

另一种解决为,在mybatis-config.xml配置文件中:

数据表格:jqGrid

[html]view
plaincopy

对话框:jQuery jBox

树结构控件:jQuery zTree

1.

其他组件:Bootstrap 4 metronic

2.

3、支持

3.name=”logImpl”value=”LOG4J”/>**

服务器中间件:Tomcat 6、7、Jboss 7、WebLogic 10、WebSphere 8

4.

数据库支持:目前仅提供MySQL数据库的支持,但不限于数据库,下个版本升级多数据源切换和数据库读写分离:
如:Oracle、SqlServer、H2等

5.

支持开发环境:Eclipse、MyEclipse、Ras、Idea等

这里只写了关键的一部分配置信息,在你自己配置的基础上增加即可。这样一来log4j的配置信息就会起作用。

经典介绍:

参数说明:

源码结构

Mybatis对Log4j的配置支持:

图片 2

Logging Configuration

欢迎大家一起学习研究相关技术愿意了解框架技术或者源码的朋友直接加求求(企鹅):2042849237

MyBatis可以对包、类、命名空间和全限定的语句记录日志。

更多详细源码参考来源:http://minglisoft.cn/technology

具体怎么做,视使用的日志框架而定,这里以Log4J为例。配置日志功能非常简单:添加几个配置文件,如log4j.properties,再增加个jar包,如log4j.jar。下面是具体的例子,共两个步骤:

3、Maven Web项目创建

步骤1:增加Log4J jar包**

4、SSM整合

因为采用Log4J,要确保在应用中对应的jar包是可用的。要满足这一点,只要将jar包添加到应用的classpath中即可。Log4J的jar包可以从上方的链接下载。

下面主要介绍三大框架的整合,至于环境的搭建以及项目的创建,参看上面的博文。这次整合我分了2个配置文件,分别是spring-mybatis.xml,包含spring和mybatis的配置文件,还有个是spring-mvc的配置文件,此外有2个资源文件:jdbc.propertis和log4j.properties。完整目录结构如下(最后附上源码下载地址,不建议直接使用源码,因为此教程已经有了全部代码):

具体而言,对于web或企业应用,需要将log4j.jar添加到WEB-INF/lib目录;对于独立应用,可以将它添加到jvm的-classpath启动参数中。

图片 3

步骤2:配置Log4J

使用框架都是较新的版本:

配置Log4J比较简单,比如需要记录这个mapper接口的日志:

Spring 4.0.2 RELEASE

[java]view
plaincopy

Spring MVC 4.0.2 RELEASE

MyBatis 3.2.6

1.packageorg.mybatis.example;

4.1、Maven引入需要的JAR包

2.publicinterfaceBlogMapper {

为了方便后面说的时候不需要引入JAR包,我这里直接给出所有需要的JAR包,这都是基本的JAR包,每个包的是干什么的都有注释,就不再多说了。

3.@Select(“SELECT * FROM blog WHERE id = #{id}”)

pom.xml

4.Blog selectBlog(intid);

4.0.2.RELEASE

5.}

3.2.6

只要在应用的classpath中创建一个名称为log4j.properties的文件,文件的具体内容如下:

1.7.7

[plain]view
plaincopy

1.2.17

junit

1.# Global logging configuration

junit

2.log4j.rootLogger=ERROR, stdout

4.11

3.# MyBatis logging configuration…

test

4.log4j.logger.org.mybatis.example.BlogMapper=TRACE

org.springframework

5.# Console output…

spring-core

6.log4j.appender.stdout=org.apache.log4j.ConsoleAppender

${spring.version}

7.log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

org.springframework

8.log4j.appender.stdout.layout.ConversionPattern=%5p [%t] – %m%n

spring-web

添加以上配置后,Log4J就会把org.mybatis.example.BlogMapper的详细执行日志记录下来,对于应用中的其它类则仅仅记录错误信息。

${spring.version}

也可以将日志从整个mapper接口级别调整到到语句级别,从而实现更细粒度的控制。如下配置只记录selectBlog语句的日志:

org.springframework

[plain]view
plaincopy

spring-oxm

${spring.version}

1.log4j.logger.org.mybatis.example.BlogMapper.selectBlog=TRACE

org.springframework

与此相对,可以对一组mapper接口记录日志,只要对mapper接口所在的包开启日志功能即可:

spring-tx

[plain]view
plaincopy

${spring.version}

org.springframework

1.log4j.logger.org.mybatis.example=TRACE

spring-jdbc

某些查询可能会返回大量的数据,只想记录其执行的SQL语句该怎么办?为此,Mybatis中SQL语句的日志级别被设为DEBUG(JDK
Logging中为FINE),结果日志的级别为TRACE(JDK
Logging中为FINER)。所以,只要将日志级别调整为DEBUG即可达到目的:

${spring.version}

[plain]view
plaincopy

org.springframework

spring-webmvc

1.log4j.logger.org.mybatis.example=DEBUG

${spring.version}

要记录日志的是类似下面的mapper文件而不是mapper接口又该怎么呢?

org.springframework

[html]view
plaincopy

spring-aop

${spring.version}

1.version=”1.0″encoding=”UTF-8″?>**

org.springframework

2.

spring-context-support

3.PUBLIC “-//mybatis.org//DTD Mapper 3.0//EN”

${spring.version}

4.”

org.springframework

5.namespace=”org.mybatis.example.BlogMapper”>**

spring-test

6.id=”selectBlog”resultType=”Blog”>**

${spring.version}

7.select * from Blog whereid= #{id}

org.mybatis

8.

mybatis

9.

${mybatis.version}

对这个文件记录日志,只要对命名空间增加日志记录功能即可:

org.mybatis

[plain]view
plaincopy

mybatis-spring

1.2.2

1.log4j.logger.org.mybatis.example.BlogMapper=TRACE

javax

进一步,要记录具体语句的日志可以这样做:

javaee-api

[plain]view
plaincopy

7.0

mysql

1.log4j.logger.org.mybatis.example.BlogMapper.selectBlog=TRACE

mysql-connector-java

看到了把,两种配置没差别!

5.1.30

配置文件log4j.properties的余下内容是针对日志格式的,这一内容已经超出本文档范围。关于Log4J的更多内容,可以参考Log4J的网站。不过,可以简单试一下看看,不同的配置会产生什么不一样的效果。

commons-dbcp

��C”����’

commons-dbcp

1.2.2

jstl

jstl

1.2

log4j

log4j

${log4j.version}

com.alibaba

fastjson

1.1.41

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图