log4jdbc简介
来源:互联网 发布:实木床 品牌 知乎 编辑:程序博客网 时间:2024/06/08 19:09
- 前言
- log4jdbc简介
- 特性
- 使用
- 0 jar包的选择
- 1 日志系统的选择
- 2 更改DriverClass
- 3 prepend jdbcUrl属性
- 4 建立你的日志系统
- 5 修改debug选项可选
- 实战
- 0 纯JDBClog4j
- 00 jar包
- 01 配置文件
- 02 测试
- 1 DataSourcec3p0
- 10 jar包
- 11 配置文件
- 12 测试
- 0 纯JDBClog4j
- 声明
0 前言
使用java进行数据库操作时最痛苦的莫过于拼接SQL语句。在实际运行时往往需要查看实际生成的SQL语句和实际传入的参数,或许还会有查看SQL执行时间等的需求。
无论原生JDBC、dbutils、mybatis还是hibernate,使用log4j等日志框架可以看到生成的SQL,但是占位符和参数总是分开打印的。实在是不太友好。显示如下的效果:
select * from t_user where age>? and (sex=? or dept_id=?)
log4jdbc能很好的解决上述问题。使用log4jdbc之后的效果如下:
select * from t_user where age>1 and (sex=0 or dept_id='007')
1 log4jdbc简介
没有什么比官网对它的介绍更加贴切了:
log4jdbc is a Java JDBC driver that can log SQL and/or JDBC calls (and optionally SQL timing information) for other JDBC drivers using the Simple Logging Facade For Java (SLF4J) logging system.
但是,众所周知googlecode在国内的访问问题……
官网的News一栏有如下消息:2015-03-30: Due to Google Code shutting down soon, log4jdbc has moved to github at 2015-03-30: Due to Google Code shutting down soon, log4jdbc has moved to github at https://github.com/arthurblake/log4jdbc
2 特性
- 完全支持JDBC3和JDBC4
- 配置简单,一般情况下你只需要将你的DriverClass改为:net.sf.log4jdbc.DriverSpy,并在你的jdbcUrl之前拼接jdbc:log4
- 自动将占位符(?)替换为实际的参数
- 能够及时方便地显示SQL的实际执行时间
- 显示SQL Connection的数量的信息
- 能在JDK1.4+和SLF4J1.X上和大多数常见的JDBC驱动协同工作
- open source
3 使用
以下多数信息来自于官网
3.0 jar包的选择
不了解 JDBC3 JDBC4?
3.1 日志系统的选择
log4jdbc 使用Simple Logging Facade for Java (SLF4j) 作为日志系统,(SLF4J)是一个简单灵活的日志抽象层,可以方便的在以下日志系统之间切换:
- Log4j
- java.util logging in JDK 1.4
- logback
- Jakarta Commons Logging
下载 SLF4j,你将需要slf4j-api-1.5.0.jar和你实际所用的日志系统的jar包,或许还会有一个适配的中间插件jar包(取决于你使用的实际日志系统)。
3.2 更改DriverClass
log4jdbc “spy” driver 将会尝试着加载以下驱动:
注意: 如果你要使用一个不在上表中的Driver,请提供log4jdbc.drivers配置,多个之间用逗号分隔,不带空格。
3.3 prepend jdbcUrl属性
例如:
你的url为: url= jdbc:mysql://localhost:3306/mvn
应该改为: url= jdbc:log4jdbc:mysql://localhost:3306/mvn
3.4 建立你的日志系统
log4jdbc使用5种logger:
此外还有个叫 log4jdbc.debug 的 logger,用于log4jdbc的内部调试,会输出 log4jdbc spy 加载驱动的时的信息,如driver found 或 not found 等信息。
3.5 修改debug选项–可选
可以在类路径下提供一个名为 log4jdbc.properties 的配置文件,用以修改一些默认的debug属性。
其常用属性如下(来自于 官网 文档):
4 实战
4.0 纯JDBC–log4j
4.0.0 jar包
maven 依赖
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.4</version> <scope>test</scope> </dependency> <dependency> <groupId>com.googlecode.log4jdbc</groupId> <artifactId>log4jdbc</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.35</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.16</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.6.0</version> </dependency> </dependencies>
4.0.1 配置文件
log4j.properties
log4j.logger.jdbc.sqlonly=OFFlog4j.logger.jdbc.sqltiming=INFOlog4j.logger.jdbc.audit=OFFlog4j.logger.jdbc.resultset=OFFlog4j.logger.jdbc.connection=OFFlog4j.logger.jdbc.sqlonly=consolelog4j.appender.console=org.apache.log4j.ConsoleAppenderlog4j.appender.console.layout=org.apache.log4j.PatternLayoutlog4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} %m%n%n#log4j.logger.jdbc.sqltiming=INFO,console #log4j.logger.jdbc.connection=INFO,consolelog4j.rootLogger=DEBUG, console
- dbconfig.properties
java
url:jdbc:log4jdbc:mysql://localhost:3306/mvn
driverClassName:net.sf.log4jdbc.DriverSpy
username:root
password:root log4jdbc.properties
log4jdbc.debug.stack.prefix=software_test.log4jdbclog4jdbc.drivers=com.mysql.jdbc.Driverlog4jdbc.auto.load.popular.drivers=truelog4jdbc.statement.warn=truelog4jdbc.sqltiming.warn.threshold=1000log4jdbc.sqltiming.error.threshold=3000log4jdbc.dump.booleanastruefalse=truelog4jdbc.dump.sql.maxlinelength=90log4jdbc.dump.fulldebugstacktrace=falselog4jdbc.dump.sql.select=truelog4jdbc.dump.sql.insert=truelog4jdbc.dump.sql.delete=truelog4jdbc.dump.sql.update=truelog4jdbc.dump.sql.create=truelog4jdbc.dump.sql.addsemicolon=falselog4jdbc.trim.sql=truelog4jdbc.trim.sql.extrablanklines=truelog4jdbc.suppress.generated.keys.exception=false
4.0.2 测试
```javaimport java.io.IOException;import java.io.InputStream;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.SQLException;import java.util.Properties;import org.junit.Test;public class SimpleTest { @Test public void test1() { String sql = "select * " + "from t_user where id=?"; Connection conn = null; PreparedStatement ps = null; try { conn = getConnection(); ps = conn.prepareStatement(sql); ps.setInt(1, 2); ps.executeQuery(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } public Connection getConnection() throws IOException, SQLException, ClassNotFoundException { String driverClassName = null; String jdbcUrl = null; String user = null; String password = null; // 读取类路径下的配置文件 InputStream in = getClass().getClassLoader().getResourceAsStream( "dbconfig.properties"); Properties properties = new Properties(); properties.load(in); driverClassName = properties.getProperty("driverClassName"); jdbcUrl = properties.getProperty("url"); user = properties.getProperty("username"); password = properties.getProperty("password"); Class.forName(driverClassName); // 连接信息 Properties info = new Properties(); info.put("user", user); info.put("password", password); // 获取连接 Connection connection = DriverManager.getConnection(jdbcUrl, user, password); return connection; }}```
4.1 DataSource–c3p0
截至目前为止,官网 对于log4jdbc和数据源的使用还没有一个很好地例子,以下是官网的截图:
本人尝试了一下C3P0数据源,不到之处请指正。
4.1.0 jar包
maven 依赖
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.4</version> <scope>test</scope> </dependency> <dependency> <groupId>com.googlecode.log4jdbc</groupId> <artifactId>log4jdbc</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.35</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.16</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.6.0</version> </dependency> <dependency> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> <version>0.9.1.2</version> </dependency> </dependencies>
4.1.1 配置文件
此处只需要 log4j.properties 和log4jdbc.properties 两个配置文件即可,配置同4.0中的配置文件。
4.1.2 测试
package software_test.log4jdbc;import java.sql.Connection;import java.sql.PreparedStatement;import org.junit.Test;import com.mchange.v2.c3p0.ComboPooledDataSource;public class DataSourceTest { @Test public void testC3P0() { try { ComboPooledDataSource dataSource = new ComboPooledDataSource(); dataSource.setUser("root"); dataSource.setPassword("1234"); dataSource.setDriverClass("net.sf.log4jdbc.DriverSpy"); dataSource.setJdbcUrl("jdbc:log4jdbc:mysql://localhost:3306/mvn"); dataSource.setMaxPoolSize(50); Connection conn = dataSource.getConnection(); String sql = "select * " + "from t_user where id=?"; PreparedStatement ps = null; ps = conn.prepareStatement(sql); ps.setInt(1, 2); ps.executeQuery(); ps.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); } }}
5 声明
在此将log4jdbc的使用结合官网的帮助文档中主要的一部分罗列出来。部分不太常用或理解不到位的没有翻译,怕误人子弟,有翻译不周的地方或理解不到位的地方欢迎指正。
实战部分,以后会抽时间加入其它的使用方式。
转载请保留出处。
- log4jdbc简介
- log4jdbc
- log4jdbc
- log4jdbc
- 试用log4jdbc
- log4jdbc使用
- log4jdbc使用
- 试用log4jdbc
- log4jdbc使用
- net.sf.log4jdbc.DriverSpy
- log4jdbc日志框架
- log4jdbc的使用
- log4jdbc打印sql信息
- log4jdbc的使用
- log4jdbc日志框架介绍
- log4jdbc日志框架介绍
- java log4jdbc日志框架
- log4jdbc日志框架
- slf4j简介
- 六、实验三:事件驱动-协程实现爬虫
- 基于 Python + LeanCloud 的短信验证
- 高德API+Python解决租房问题
- Android开发中控件的三种点击事件+短信API调用方式
- log4jdbc简介
- 基于 python + SendCloud 的邮箱认证
- Solution of 1119. Pre- and Post-order Traversals (30)
- Java:控制线程
- Django 搭建简易博客(1)
- Django 搭建简易博客(2)
- Django 搭建简易博客(3)
- Django 搭建简易博客(4)
- Django 搭建简易博客(5)