-
2021-10-21 09:38:57更多相关内容
-
打印sql日志怎么在logback里配置
2020-08-22 21:22:54其后,捐献给了Apache基金会,成立了iBatis 项目。2010 年5 月,将代码库迁致Google Code,并更名为MyBatis。(导包名:ibatis) MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除 了...MyBatis 世界上流行最广泛的SQL 映射框架,由Clinton Begin 在2002 年创建,iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。其后,捐献给了Apache基金会,成立了iBatis 项目。2010 年5 月,将代码库迁致Google Code,并更名为MyBatis。(导包名:ibatis)
MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs映射成数据库中的记录。(类似Hibernate)
问: org.apache.ibatis 和 org.mybatis 路径的日志都打印什么?
我们项目里是这么配的:
<!-- logback --> <logger name="org.apache.ibatis" additivity="false" level="ERROR"> <appender-ref ref="LOGGER-INFO" /> </logger> <logger name="org.mybatis" additivity="false" level="ERROR"> <appender-ref ref="LOGGER-INFO" /> </logger>
对比一下:
org.apache.ibatis 在 mybatis 包
org.mybatis 在 mybatis-spring 包- ibatis 是单独的持久层, mybatis在ibatis基础上升级了一下,是半自动化的持久层, hibernate 是全自动化的持久层.
- ibatis 封装了绝大多数的 JDBC 样板代码,使得开发者只需关注 SQL 本身,而不需要花费精力去处理例如注册驱动,创建 Connection,以及确保关闭 Connection 这样繁杂的代码.
- mybatis在很多地方都借助于 JDK 的泛型和注解特性进行了简化,反射很强大.
- mybatis有很多优点: 对象和数据库orm字段映射, sql和代码分离,写在xml里统一管理, 支持动态sql. 使用的时候只需要配置 SqlSessionTemplate,sqlSessionFactory,MapperScannerConfigurer, 然后写接口和映射文件就可以了.
- 在 iBatis 中,namespace 不是必需的,且它的存在没有实际的意义。在 MyBatis 中,namespace 终于派上用场了,它使得映射文件与接口绑定变得非常自然.
- ibatis麻烦一些,原生写法(现在都不用了,就连mybatis各种配置被mybatis-spring-boot-starter集成起来,写法更简便了,还有阿里的durid封装了数据库连接池、插件化扩展框架和SQL解析器,还支持页面监控sql执行情况,技术的迭代不断解放劳动力):
String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession session = sqlSessionFactory.openSession(); try { Employee employee = new Employee(null, "name", "1", "123@qq.com"); EmployeeMapper mapper = session.getMapper(EmployeeMapper.class); mapper.addEmp(employee); session.commit(); } finally { session.close(); }
所以
基本都是通过配置日志来实现的,比如配置我们最常用的 log4j.properties 或者 logback-spring.xml 来实现.
sql的日志由org.apache.ibatis 路径打印出来,
org.mybatisSql打印的是上层操作SessionTemplate等的日志. -
mybatis拦截器记录sql日志
2019-07-05 14:35:471.最近公司一个需求让我把每次执行的sql都保存到数据库,然而我看了一些网上的资料没有适合我的例子,下面是我自己用mybatis拦截器写的一套管理sql日志的代码; 其中保存的sql 使用Druid数据库连接池配置的打印SQL的...1.最近公司一个需求让我把每次执行的sql都保存到数据库,然而我看了一些网上的资料没有适合我的例子,下面是我自己用mybatis拦截器写的一套管理sql日志的代码;
其中保存的sql 使用Druid数据库连接池配置的打印SQL的方式,其他方式我也不太了解感兴趣的可以自己了解一下;1.Druid的包和json的包
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.10</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.47</version> </dependency>
2.数据库sql
CREATE TABLE `sp_audit_db_log` ( `ID` varchar(48) NOT NULL, `SQL_CONTENT` text COMMENT 'SQL内容', `IN_PARAM` varchar(256) DEFAULT NULL COMMENT 'sql入参', `START_TIME` datetime DEFAULT NULL COMMENT 'sql开始执行时间', `END_TIME` datetime DEFAULT NULL COMMENT 'sql执行结束时间', `COST_TIME` bigint(20) DEFAULT NULL COMMENT '执行sql耗时', `RESUTL_TYPE` varchar(4) DEFAULT NULL COMMENT '执行结果,01:成功;02:失败', `ERROR_CONTENT` varchar(512) DEFAULT NULL COMMENT '错误内容', `REMARK` varchar(256) DEFAULT NULL COMMENT '备注', PRIMARY KEY (`ID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8
3.实体
额,这个自己看着数据库写把;
4.拦截器代码
所用工具地址:
日期工具类:https://blog.csdn.net/qq_41988504/article/details/94734733
stringutil工具类:https://blog.csdn.net/qq_41988504/article/details/94735032package com.xiaolc.intercept; import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.sql.SQLUtils; import com.alibaba.fastjson.JSON; import com.xiaolc.mapper.SpAuditDbLogMapper; import com.xiaolc.model.SpAuditDbLog; import com.xiaolc.util.DateUtils; import com.xiaolc.util.StringUtil; import org.apache.ibatis.cache.CacheKey; import org.apache.ibatis.executor.Executor; import org.apache.ibatis.executor.statement.StatementHandler; import org.apache.ibatis.mapping.BoundSql; import org.apache.ibatis.mapping.MappedStatement; import org.apache.ibatis.mapping.ParameterMapping; import org.apache.ibatis.plugin.*; import org.apache.ibatis.session.Configuration; import org.apache.ibatis.session.ResultHandler; import org.apache.ibatis.session.RowBounds; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.lang.reflect.Method; import java.util.*; /** * @Author: LiCheng * @Date: 2019/7/4 16:04 */ @Intercepts({@org.apache.ibatis.plugin.Signature( type = Executor.class, method = "update", args = {MappedStatement.class, Object.class}), @Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class, CacheKey.class, BoundSql.class})}) @Component public class ExecutorInterceptor implements Interceptor { @Autowired private SpAuditDbLogMapper spAuditDbLogMapper; @Override public Object intercept(Invocation invocation) throws Throwable { Object[] args = invocation.getArgs(); MappedStatement ms = (MappedStatement) args[0]; ms.getStatementType(); //当前SQL使用的是哪个Mapper,即哪个Mapper类 String mapper = ms.getResource(); Configuration configuration = ms.getConfiguration(); //执行当前SQL的Mapper id,其组成 [ 类型.方法 ] String mapperID = ms.getId(); //获取当前执行的SQL使用哪个数据源,我这里的数据源组件使用的是Druid,如果使用c3p0或者其他,则需要查看相关API,一般来降一个项目可能会配多个数据源,但是数据源组件都会使用一个 DruidDataSource dataSource = (DruidDataSource) configuration.getEnvironment().getDataSource(); //获取数据库的类型[即mysql,或者oracle等等] Date createdTime = dataSource.getCreatedTime(); String dbType = dataSource.getDataSourceStat().getDbType(); //存放的是SQL的参数[它是一个实例对象] Object parameterObject = args[1]; Object target = invocation.getTarget(); StatementHandler handler = configuration.newStatementHandler((Executor) target, ms, parameterObject, RowBounds.DEFAULT, null, null); /** * commandName.startsWith(增/删/改/查),可以得到crud的具体类型[得到的是大写的INSERT UPDATE] * method.getName()得到的name可能为update, query, flushStatements, commit, rollback, getTransaction, close, isClosed */ String commandName = ms.getSqlCommandType().name(); Method method = invocation.getMethod(); String methodName = method.getName(); BoundSql boundSql = ms.getBoundSql(parameterObject); //这个ParameterMapping表示当前SQL绑定的是哪些参数,及参数类型,但并不是参数本身 List<ParameterMapping> parameterMappings = boundSql.getParameterMappings(); //将参数值转成json字符串 String parameterObjects = JSON.toJSONString(boundSql.getParameterObject()); //要拦截的SQL,通过拦截器的SQL 其不带参数 String srcSQL = boundSql.getSql(); //返回拼装好参数的SQL String retSQL = formatSQL(srcSQL, dbType, parameterObjects); //先执行当前的SQL方法,即通过当前拦截器的CRUD操作,因为我们要返回这个结果 long start = System.currentTimeMillis(); Object result = invocation.proceed(); long end = System.currentTimeMillis(); long time = end - start; //记录影响行数 // Integer integer = Integer.valueOf(Integer.parseInt(result.toString())); //TODO 还可以记录参数,或者单表id操作时,记录数据操作前的状态 //获取insertSqlLog方法 //ms = ms.getConfiguration().getMappedStatement("insertSqlLog"); //替换当前的参数为新的ms //args[0] = ms; //insertSqlLog 方法的参数为 log //args[1]=log; //组装自己的SQL记录类 SpAuditDbLog spAuditDbLog = new SpAuditDbLog(); spAuditDbLog.setId(UUID.randomUUID().toString()); //记录SQL spAuditDbLog.setSqlContent(retSQL); //入参 spAuditDbLog.setInParam(parameterObjects); //sql开始执行时间 spAuditDbLog.setStartTime(DateUtils.dateParse(start, "yyyy-MM-dd HH:mm:ss")); //sql执行结束时间 spAuditDbLog.setEndTime(DateUtils.dateParse(end, "yyyy-MM-dd HH:mm:ss")); //耗时 spAuditDbLog.setCostTime(time); //执行结果 spAuditDbLog.setResutlTupe(StringUtil.isNotEmpty(result) ? "01" : "02"); SpAuditDbLog save = spAuditDbLogMapper.save(spAuditDbLog); //返回拦截器拦截的执行结果 return result; } /** * plugin方法是拦截器用于封装目标对象的,通过该方法我们可以返回目标对象本身,也可以返回一个它的代理。 * 当返回的是代理的时候我们可以对其中的方法进行拦截来调用intercept方法,当然也可以调用其他方法 * 对于plugin方法而言,其实Mybatis已经为我们提供了一个实现。Mybatis中有一个叫做Plugin的类, * 里面有一个静态方法wrap(Object target,Interceptor interceptor),通过该方法可以决定要返回的对象是目标对象还是对应的代理。 */ @Override public Object plugin(Object o) { // 只拦截Executor对象,减少目标被代理的次数 if (o instanceof Executor) { return Plugin.wrap(o, this); } return o; } /** * setProperties方法是用于在Mybatis配置文件中指定一些属性的 * 这个方法在Configuration初始化当前的Interceptor时就会执行 */ @Override public void setProperties(Properties properties) { } /** * @describe: 组装SQL * @params: * @Author: LiCheng * @Date: 2019/7/4 15:10 */ public String formatSQL(String src, String dbType, String params) { //要传入的SQLUtils的参数集合,实际上虽然泛型是Object,但其实都是基本数据类型 List<Object> paramList = new ArrayList(); //有了JSON字符串我们就可以通过正则表达式得到参数了 System.out.println(params); //需要注意的是这个SQLUtils是Druid数据源中的一个工具类,因为有现成的拼sql的工具,所以我就不再重复造轮子了,如果你的项目并没有使用Druid, //则需要将这个工具类加入到你的项目中 String retSQL = SQLUtils.format(src, dbType, paramList); return retSQL; } }
5.测试结果
6.不懂的或者有问题的加我qq:1269958153 欢迎一起交流 -
SpringBoot打印sql日志(附动态修改日志级别)
2019-04-18 15:06:31项目运行报错时,查看sql日志是非常好的排查手段,以前在spring框架下往往都是通过修改日志级别为DEBUG然后重启再次运行才生效,那么SpringBoot如何修改呢? SpringBoot的spring-boot-starter依赖默认已经包含日志...项目运行报错时,查看sql日志是非常好的排查手段,以前在spring框架下往往都是通过修改日志级别为DEBUG然后重启再次运行才生效,那么SpringBoot如何修改呢?
SpringBoot的spring-boot-starter依赖默认已经包含日志依赖,其默认使用的日志框架为logback,且默认的日志级别均为INFO,若不配置日志输出路径,默认日志信息打印在控制台。为了打印sql日志信息,我们只需把对应dao包下的日志级别改为DEBUG即可,在yaml配置文件中配置如下:
logging: level: # Map<String, String>格式,前者为对应的路径或是进程 后者为日志级别 activitiTest.activitiTest.dao: debug
上图这种是针对本地测试或是临时修改,毕竟DEBUG级别下打印的日志会非常多,倘若生产环境下使用该级别会造成大量的垃圾日志信息,因此项目运行时一般不会这么干,所以需要在项目运行时动态修改其日志级别(无需重启),使之输出sql日志
SpringBoot动态修改日志级别
1、首先引入对应的监控工具依赖,其中包含有日志端点监控:
<!-- springBoot监控工具 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
2、在yaml中配置如下:
# 配置端点信息 management: endpoints: # 关闭所有默认为true的端点 enabled-by-default: false web: exposure: # 由于health端点在启动时无法扫描MongoConfig类中的mongoTemplate实例,因此此处去掉该端点 这里只留日志端点 使用post请求访问/actuator/loggers/端点名(先通过get请求访问/actuator/loggers获取所有端点名) # 请求体为{"configuredLevel": "DEBUG"},即可打印sql日志 include: - loggers # 端点访问路径 默认即为/actuator # base-path: /actuator endpoint: loggers: enabled: true # 端点端口配置,默认与服务端一样 # server: # port:
3、由于本文只是为了修改日志级别,因此只配了loggers端点,一般项目中往往还需要info和health端点用以监控,下面启动项目,然后使用get请求访问/actuator/loggers,会看到以下输出信息:
{ "levels":[ "OFF", "ERROR", "WARN", "INFO", "DEBUG", "TRACE" ], "loggers":{ "ROOT":{ "configuredLevel":"INFO", "effectiveLevel":"INFO" }, "com":{ "configuredLevel":null, "effectiveLevel":"INFO" }, "com.caiyi":{ "configuredLevel":null, "effectiveLevel":"INFO" } ... } }
4、开始修改日志级别,使用post请求访问,例如:/actuator/loggers/com.caiyi,请求体如下:
{ "configuredLevel": "DEBUG" }
此时已经修改完毕,可直接访问controller层,查看日志信息,此时已有sql日志打印出:
-
SSM项目中如何添加日志文件
2022-01-29 10:20:27项目中添加日志文件 -
记springBoot + mybatis +log4j2 不打印sql日志问题
2020-10-30 11:24:17因项目依赖太多导致sql不打印,下面介绍下处理过程 首先排除包 一定要排除干净,不然会报这个,虽然不报错(有得冲突直接报错了)但是已经冲突了 SLF4J: Class path contains multiple SLF4J bindings. SLF4J:... -
SpringBoot打印Mybatis执行SQL及slf4j日志配置
2021-11-29 16:40:34最近在springboot项目的代码问题定位时需要知道mybatis的执行SQL,所以查了下如何配置,并顺道整理下之前一直忽略的日志内容。 1 日志框架介绍 23种设计模式中有一种模式叫门面模式。 在这个结构图中,出现了两... -
达梦数据库SQL日志功能的使用
2020-03-09 14:17:16这个时候就需要开启SQL日志,将数据库执行过的SQL都记录下来,以方便进行跟踪分析 DM数据库控制SQL日志是通过一个系统参数,以及一个ini文件动态控制的 DM数据库开启SQL日志的方法: SP_SET_PARA_VALUE(1,‘SVR_LOG... -
SpringBoot项目的logback日志配置(包括打印mybatis的sql语句)
2018-05-04 16:09:21我在这就开门见山直接介绍我们项目日志的配置使用吧!~ 1、基本介绍 默认情况下,Spring Boot项目就会用Logback来记录日志,并用INFO级别输出到控制台。如下图: 实际开发中我们不需要直接添加logback日志... -
springboot logback配置详解,可以直接使用更改保存日志路径及包名,SQL日志和DEBUG日志分别输出到指定文件
2019-07-15 16:54:53原文地址: ... 作者:永远的70KG logback中文网: ...-- 日志级别从低到高分为TRACE ,如果设置为WARN,则低于WARN的信息都不会输出 --> ...-- scan:当此属性设置为... 使用mybatis的时候,sql语句是debug下才会打印,而... -
springboot项目大量打印debug日志问题
2021-01-12 20:32:27目前,java下应用最广泛的日志系统主要就是两个系列: log4j和slf4j+logback 。其中,slf4j只包含日志的接口,logback只包括日志的具体实现,两者加起来才是一个完整的日志系统。Log4j则同时包含了日志接口和实现。这... -
Golang实战 XORM搭配OpenTracing+Jaeger链路监控让SQL执行一览无遗
2020-06-16 00:17:43Golang XORM搭配OpenTracing+Jaeger链路监控让SQL执行一览无遗 -
MySQL—SQL优化笔记整理
2022-03-13 21:27:10SQL 优化 第一节 准备数据 1、修改配置 为了能够看出 SQL 优化前后的性能差异,我们需要较为大量的数据。生成这些数据我们需要用到 MySQL 中的自定义函数。 但是 MySQL 默认关闭了自定义函数功能,所以我们需要通过... -
【SQL查询日志】查看数据库历史查询记录
2016-04-05 14:49:24在查询分析器中写了半天的SQL,...或者DIY个SQL日志查看工具,记得一定放出来大家共享一下~ == 首先假定你执行过它。没有?好吧,要么它太过简单,要么你太过不简单。。重写一遍吧 下面直接看语句,大家都懂的。 -
springboot 项目中在控制台打印日志以及生成log日志文件
2020-08-21 14:26:10项目结构 步骤一:在项目下创建一个文件夹存放log文件,如图logInfo文件夹 步骤二:在resources目录下或者说在application.properties相同的目录下创建一个xml,如图logback.xml,代码如下 <?xml version=... -
SpringBoot日志配置详解
2020-12-20 23:53:06前言记录应用系统曰志主要有三个原因 记录操作轨迹、监控系统运行状况、...全面有效的日志系统有助于建立完善的应用监控体系,由此工程师可以实时监控系统运行状况,及时预警,避免故障发生。监控系统运行状况,... -
SpringBoot 日志输出到指定文件&控制台彩色输出配置(彩色日志配置)
2021-07-24 10:39:441.SLF4J提供了五种日志级别 trace :跟踪,级别最低的日志 debug :调试,用来查看调试内容 info:信息,一般记录一些方法执行等 warn :警告,可能发生错误的代码 error :错误,一般在catch里面执行 package ... -
SpringBoot如何打印带参数的sql和执行时间-p6spy
2021-12-02 09:19:19软件简介 P6Spy是一个可以用来在应用程序中拦截和修改...根据配置的时间控制SQL语句的执行时间,对超出时间的SQL语句输出到日志文件中 展示效果 可以看到打印的sql,执行时间,和打印sql所携带的参数 如何配 -
微服务[v1.0.0][MyBatis日志信息配置]
2020-11-05 17:19:10使用MyBatis的时候,经常需要输出SQL语句、参数信息、查询结 果等日志信息,为此MyBatis也提供了非常简单有效的解决方案。MyBatis内置的日志工厂提供日志功能,具体的日志实现有以下几 种工具:SLF4J/Apache/Commons... -
SQL Server 2008宝典--详细书签版(第2/2部分)
2013-02-06 13:36:57通过通俗易懂的语言讲解SQL Server 2008的各个强大功能,并配以插图讲解和详细的步骤说明,帮助读者快速掌握实用技能。 由浅入深,难易穿插。《SQL Server 2008宝典》面向入门级和提高级两类读者,每个知识点都... -
本项目用于学习安全开发,采用hackgame的闯关模式,在了解攻击原理和成功实现攻击后,给出相关的防御代码
2021-05-08 04:08:12本项目用于学习安全开发,采用hackgame的闯关模式,在了解攻击原理和成功实现攻击后,给出相关的防御代码 使用说明: other中的Secure_Development.sql为相应的数据库,需要进行导入 index.html为主页 本项目用到... -
SQL SERVER 2000开发与管理应用实例
2013-12-13 23:12:46本书不但融合了作者在使用SQL Server 2000过程中遇到的各种常见问题和应用案例,还总结了作者几年来在CSDN 社区SQL Server版所解决的大量问题,面向实际项目需求,涉及不同类型的应用,能够多角度地引导读者学习相关... -
mysql通过sql文件导入数据时出现乱码的解决办法
2021-01-19 11:02:02oracle数据库单表查询 今天给大家分享的是关于数据库的单表查询,像单表查询/多表查询/分组查询/子查询,这些方法的使用在实际项目过程中会经常用到,作为一名合格的测试人员如果不会数据库那肯定是不行的,行走江湖... -
新闻网日志实时分析可视化系统项目
2018-11-04 22:29:03本次项目是基于企业大数据经典案例项目(大数据日志分析),全方位、全流程讲解 大数据项目的业务分析、技术选型、架构设计、集群规划、安装部署、整合继承与开发和web可视化交互设计。 项目代码托管于github,大家... -
Beetlsql自学笔记
2021-11-26 14:37:08自用为主,beetlsql是现在实习公司里用的,官网的文档有点乱。。然后找到了个比较好的文档,大部分来源于那篇文档,不过这里也加入了一些我自己的理解 # BeetlSQL 1、简介 BeetlSqk是一个数据访问框架,目标是... -
hibernate按自己要求输出自己规则的完整SQL
2013-10-17 16:43:28就是如何让输出sql方便查看,因为出了问题时,要去查错时sql日志会给我们很大帮助,但hibernate通过配p6spy输出很乱,且只能输了到spy.log中,很不好查看,这里是我在项目中的一个解决过程,和大家分享一下,按照... -
springboot+mybatis日志转换——log4j转logback配置文件如何配
2019-03-27 15:31:00目录 第一步:首先处理pom.xml中的依赖关系,...springboot+mybatis日志转换——log4j转logback配置文件怎么配 公司的项目一直都是运行起来会打印所有执行的语句: 好处是:一旦出现问题方便排查,可以清晰的知道... -
企业级的认证系统,开发平台,应用监控,慢速SQL监控,统一日志,单点登录,Redis分布式高速缓存,配
2021-01-30 00:48:163.项目介绍 技术交流群 详细在线文档: : 演示环境地址:http: 账号密码:admin / admin APM监控账号密码:admin / admin Grafana账号:zlt / zlt123 txlcn事务管理器密码:admin 任务管理账号密码:admin / ... -
SQL 实验项目8_事务控制
2019-12-25 01:34:57高配笔记本:Intel® Core™ i7-7700HQ CPU @ 2.80GHz 、16G内存、48TB分布式硬盘、Windows 10 1909政府版、SQL Server Management Studio 18.4 实验室电脑:英特尔 酷睿2 双核 T7700 @ 2.40GHz、3G内存、128 G...