mybatis打印SQL,并显示参数的实例
作者:肉松饼代言人 发布时间:2022-08-03 16:46:59
在maven的pom.xml里面添加一下依赖:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.version>3.2.4.RELEASE</spring.version>
<version.slf4j>1.7.6</version.slf4j>
<version.logback>1.1.2</version.logback>
</properties>
<!-- log -->
<dependency>
<groupId>org.lazyluke</groupId>
<artifactId>log4jdbc-remix</artifactId>
<version>0.2.7</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${version.slf4j}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${version.logback}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-access</artifactId>
<version>${version.logback}</version>
</dependency>
<dependency>
<groupId>org.logback-extensions</groupId>
<artifactId>logback-ext-spring</artifactId>
<version>0.1.2</version>
</dependency>
<!--jul桥接 用来输出 Java Logging Framework (JUL) -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jul-to-slf4j</artifactId>
<version>${version.slf4j}</version>
/dependency>
<!-- jcl桥接,用来输出 第三方Jakarta Commons Logging (JCL) -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${version.slf4j}</version>
</dependency>
然后在数据源的配置文件添加以下配置:
<bean id="dataSource" class="net.sf.log4jdbc.Log4jdbcProxyDataSource">
<constructor-arg ref="dataSourceSpied" />
</bean>(此处数据源用来代理原有的数据源,注入sessionfactory的时候用此处的dataSource)
<bean id="dataSource" class="net.sf.log4jdbc.Log4jdbcProxyDataSource">
<constructor-arg ref="dataSourceSpied" />
</bean>(此处数据源用来代理原有的数据源,注入sessionfactory的时候用此处的dataSource)
最后添加一个配置的logback.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<!-- scan 当此属性设置为true时,配置文件如果发生改变,将会被重新加载, 默认值为true。 -->
<!-- scanPeriod 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。 当scan为true时,此属性生效。 默认的时间间隔为1分钟。 -->
<!-- debug 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。 默认值为false。 -->
<configuration scan="true" scanPeriod="60" debug="false">
<substitutionProperty name="log.base" value="c:/" />
<contextName>${tomcatName}${catalina.home}</contextName>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>DEBUG</level>
</filter>
<!-- 注意 logback 的括号需要转义 -->
<encoder charset="UTF-8" class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>[%-5level] %d{MM-dd HH:mm:ss} %method - %m%n
</pattern>
</encoder>
</appender>
<!-- 此处配置用来只打印sql语句,若还想打印其他可注释此处代码-->
<logger name="jdbc.sqltiming" level="INFO" />
<logger name="jdbc" level="ERROR" />
<root level="INFO">
<appender-ref ref="CONSOLE" />
</root>
</configuration>
补充知识:使用mybatis-plus遇到的一些问题,以及一些简单的使用技巧
运行提示Invalid bound statement (not found)
原因一:
实体类的的id没有指定@TableId,
不管是主启动还是yml文件中的扫描mapper.xml的配置,还是dao接口,全部都没有错但就是运行报Invalid bound statement (not found)。
原因:
如果是使用mybatis-plus在涉及到主键id的查询的时候,如果实体类的属性字段不是叫做id,则需要使用@TableId指定实体类的id,就算是使用@TableField指定都没有用,必须要使用@TableId指定。
原因二:
yml文件中配置的mapper.xml配置不正确。
例如:
mybatis-plus:
mapper-locations: classpath*:/mapping/**/*.xml
//当表中的字段名有下划线,则需要开启这个配置,将下划线转成驼峰命名法
configuration:
map-underscore-to-camel-case: true
原因三
主配置文件中未配置@MapperScan注解扫描mapper接口。
当查询返回的字段特别多时,而使用的字段又只有一两个。
可以使用 entityWrapper.setSqlSelect()方法指定查询那些列。
当order by和limit一起使用的时候,如果使用wrapper,他会先分页后排序
解决方式:
可以将page引入进来,结合一起使用。
selectById方法问题
mybatis-plus默认是根据主键去查询的,如果是非主键的查询,使用该方法不能达到预期的效果。
wrapper构造器的in方法的问题
如果使用wrapper.in(id,list),当list集合的元素size为0时,这个in的id操作会直接去掉。
多个模糊查询条件为and并列问题
在使用wrapper的时候有多个条件并列的时候,它是使用or来连接这些条件的。
例如:
wrapper.eq("id","123").eq("name","zs")
sql语句会变成id=“123” and name="zs"
解决方式:
wrapper.eq("id","123").eq("name","zs")
sql语句会变成id=“123” and name="zs"
mybatis和mybatis-plus的配置扫描的方式有些不同
如果使用mybatis-plus的依赖,不能使用mybatis的方式配置,否则会一直有问题,可能会报invalid not bind statement
mybatis提示java.lang.IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String
在mapper.xml文件中使用了这种判断 date != null and date != ‘',把date!=''删除就可以了。
使用Map作为返回值,查询出来的记录属性字段转成大写,或者转成小写问题
解决方式:将mapper.xml中的sql语句的sql列名使用双引号包裹。
例如:
select name as "userName" from user
查询出来的记录字段名是驼峰命名法,但是传回前端却全部变成了小写
在使用mybatis和lombok的时候,遇到一个特别奇怪的问题。实体类是驼峰命名,查出来的属性名也是驼峰命名,属性值什么的也注入到了实体了,但是传回前端就变成小写了。
原因:
在java bean的规范中实体类的属性名前两位必须要小写或者大写。
例如
private String cName;
传递到前端就会变成cname
这个问题确实挺坑的,又因为用的是@Data的注解修饰的实体类。
解决方式:
1、使用@JsonProperty注解修饰该字段
2、手动添加get、set方法。
3、换一个属性名。
来源:https://blog.csdn.net/qq_21315403/article/details/43194237


猜你喜欢
- WebFilter.javapackage com.hongyuan.route;import java.io.File;import ja
- 1.首先在 build.gradle 里导入包implementation 'com.github.PhilJay:MPAndroi
- 需求输入手机号码,点击获取按钮,服务端接受请求发送短信用户输入验证码点击登录手机号码必须属于系统的注册用户,并且唯一手机号与验证码正确性及其
- 1. 简介直到4g时代,流量依然是宝贵的东西。而移动网络传输中,最占流量的一种载体:图片,成为了我们移动开发者不得不关注的一个问题。我们关注
- 前言前面小空带同学们学了EditText控件,又用其实践做了个验证码功能,以为这就完了吗?然而并没有。Android在5.0以后引入了Mat
- 文件上传页面<%@ page language="java" contentType="text/htm
- 一、C#语言的简单介绍根据微软官网的介绍,C#是为.NET平台量身订做的一种面向对象的语言,它与Java类似都属于从C++演变(提取了C++
- 背景:写一个用户登录拦截,在网上找了一圈没找到好用的,于是自己试验了一下,总结出来,分享给大家。1.自定义登录 * LoginInterce
- Spring Cloud Zuul 集成Swagger1.准备服务注册中心eureka-server2.创建微服务swagger-servi
- 一、简介正则表达式是一种匹配输入文本的模式,.Net 框架提供了允许这种匹配的正则表达式引擎,模式由一个或多个字符、运算符和结构组成。下面列
- GC的前世与今生虽然本文是以.NET作为目标来讲述GC,但是GC的概念并非才诞生不久。早在1958年,由鼎鼎大名的图林奖得主John McC
- 对某个类型中的方法进行拦截,然后加入固定的业务逻辑,这是AOP面向切面编程可以做的事,在springboot里实现aop的方法也有很多, s
- 概述在本文章中,我们对如何在 Java 中对 Array 和 List 进行转换进行一些说明和示例。这些示例通过使用 Core Java 和
- 前言map的迭代删除,和我们常见的list,set不太一样,不能直接获取Iteraotr对象,提供的删除方法也是单个的,根据key进行删除,
- 以前编程的时候,遇到倒计时的功能时,经常自己去写,但其实Android已经帮封装好了一个倒计时类CountDownTimer,其实是将后台线
- 先给大家展示下效果图:1、验证码生成类:import java.util.Random;import java.awt.imag
- java.util.Arrays类能方便地操作数组,它提供的所有方法都是静态的。静态方法是属于类的,不是属于类的对象。所以可以直接使用类名加
- 本文以实例形式介绍了基于Java实现的Dijkstra算法,相信对于读者研究学习数据结构域算法有一定的帮助。Dijkstra提出按各顶点与源
- 目标:了解Swagger的作用和概念了解前后端分离在springBoot中集成SwaggerSwagger简介前后端分离VUE+spring
- ①概念二叉搜索树又称二叉排序树,它或者是一棵空树**,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值