mybatis打印SQL,并顯示參數(shù)的實例
在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>
然后在數(shù)據(jù)源的配置文件添加以下配置:
<bean id="dataSource" class="net.sf.log4jdbc.Log4jdbcProxyDataSource"> <constructor-arg ref="dataSourceSpied" /> </bean>(此處數(shù)據(jù)源用來代理原有的數(shù)據(jù)源,注入sessionfactory的時候用此處的dataSource) <bean id="dataSource" class="net.sf.log4jdbc.Log4jdbcProxyDataSource"> <constructor-arg ref="dataSourceSpied" /> </bean>(此處數(shù)據(jù)源用來代理原有的數(shù)據(jù)源,注入sessionfactory的時候用此處的dataSource)
最后添加一個配置的logback.xml文件:
<?xml version="1.0" encoding="UTF-8"?> <!-- scan 當(dāng)此屬性設(shè)置為true時,配置文件如果發(fā)生改變,將會被重新加載, 默認值為true。 --> <!-- scanPeriod 設(shè)置監(jiān)測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認單位是毫秒。 當(dāng)scan為true時,此屬性生效。 默認的時間間隔為1分鐘。 --> <!-- debug 當(dāng)此屬性設(shè)置為true時,將打印出logback內(nèi)部日志信息,實時查看logback運行狀態(tài)。 默認值為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 的括號需要轉(zhuǎn)義 --> <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 //當(dāng)表中的字段名有下劃線,則需要開啟這個配置,將下劃線轉(zhuǎn)成駝峰命名法 configuration: map-underscore-to-camel-case: true
原因三
主配置文件中未配置@MapperScan注解掃描mapper接口。
當(dāng)查詢返回的字段特別多時,而使用的字段又只有一兩個。
可以使用 entityWrapper.setSqlSelect()方法指定查詢那些列。
當(dāng)order by和limit一起使用的時候,如果使用wrapper,他會先分頁后排序
解決方式:
可以將page引入進來,結(jié)合一起使用。
selectById方法問題
mybatis-plus默認是根據(jù)主鍵去查詢的,如果是非主鍵的查詢,使用該方法不能達到預(yù)期的效果。
wrapper構(gòu)造器的in方法的問題
如果使用wrapper.in(id,list),當(dāng)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作為返回值,查詢出來的記錄屬性字段轉(zhuǎn)成大寫,或者轉(zhuǎn)成小寫問題
解決方式:將mapper.xml中的sql語句的sql列名使用雙引號包裹。
例如:
select name as "userName" from user
查詢出來的記錄字段名是駝峰命名法,但是傳回前端卻全部變成了小寫
在使用mybatis和lombok的時候,遇到一個特別奇怪的問題。實體類是駝峰命名,查出來的屬性名也是駝峰命名,屬性值什么的也注入到了實體了,但是傳回前端就變成小寫了。
原因:
在java bean的規(guī)范中實體類的屬性名前兩位必須要小寫或者大寫。
例如
private String cName;
傳遞到前端就會變成cname
這個問題確實挺坑的,又因為用的是@Data的注解修飾的實體類。
解決方式:
1、使用@JsonProperty注解修飾該字段
2、手動添加get、set方法。
3、換一個屬性名。
以上這篇mybatis打印SQL,并顯示參數(shù)的實例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring Boot Web 靜態(tài)文件緩存處理的方法
本篇文章主要介紹了Spring Boot Web 靜態(tài)文件緩存處理的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-02-02在Mac下IDEA安裝并使用protobuf方式(Java)
這篇文章主要介紹了在Mac下IDEA安裝并使用protobuf方式(Java),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11淺談Java編程之if-else的優(yōu)化技巧總結(jié)
說實話,其實我很討厭在代碼里大量使用if-else,一是因為該類代碼執(zhí)行方式屬于面向過程的,二嘛,則是會顯得代碼過于冗余.這篇筆記,主要記錄一些自己在工作實踐當(dāng)中針對if-else的優(yōu)化心得,將會不定期地長期更新,需要的朋友可以參考下2021-06-06利用Java簡單實現(xiàn)一個代碼行數(shù)統(tǒng)計器方法實例
這篇文章主要給大家介紹了關(guān)于如何利用Java簡單實現(xiàn)一個代碼行數(shù)統(tǒng)計器的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11SpringBoot使用編程方式配置DataSource的方法
這篇文章主要介紹了SpringBoot使用編程方式配置DataSource的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-01-01SpringData如何通過@Query注解支持JPA語句和原生SQL語句
這篇文章主要介紹了SpringData如何通過@Query注解支持JPA語句和原生SQL語句,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11