【spring boot+mybatis】注解使用方式(無xml配置)設置自動駝峰明明轉換(mapUnderscoreToCamelCase),IDEA中xxDao報錯could not autowire的解決方法


最近使用spring boot+mybatis,使用IntelliJ IDEA開發,記錄一些問題的解決方法。

1、在使用@Mapper注解方式代替XXmapper.xml配置文件,使用@Select等注解配置sql語句的情況下,如何配置數據庫字段名到JavaBean實體類屬性命的自動駝峰命名轉換?

使用spring boot后,越來越喜歡用注解方式進行配置,代替xml配置文件方式。mybatis中也可以完全使用注解,避免使用xml方式配置mapper。(參考  springboot(六):如何優雅的使用mybatis  http://www.ityouknow.com/springboot/2016/11/06/springboot(%E5%85%AD)-%E5%A6%82%E4%BD%95%E4%BC%98%E9%9B%85%E7%9A%84%E4%BD%BF%E7%94%A8mybatis.html

設置自動駝峰命名轉換,在xml中可以直接配置mapUnderscoreToCamelCase屬性。

 

但是使用注解方式時,經過一番查找資料才找到比較好的設置方法。如下:

在spring boot的配置文件application.properties中,加入配置項:

1 mybatis.configuration.mapUnderscoreToCamelCase=true
2 3 mybatis.configuration.map-underscore-to-camel-case=true

設為true表示開啟駝峰轉換。經過試驗,兩種配置方法都可以。但如果同時配置,前者mybatis.configuration.mapUnderscoreToCamelCase的優先級更高。

參考:

官方的配置說明 mybatis-spring-boot-autoconfigure – MyBatis Sring-BootStarter | Reference Documentation  http://www.mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/#Configuration

SpringBoot之Mybatis - 王念博客  https://my.oschina.net/wangnian/blog/667764

另外查到有通過javaConfig方式,配置org.apache.ibatis.session.SqlSessionFactory的Bean,放入spring的對象池。mapUnderscoreToCamelCase是org.apache.ibatis.session.Configuration的一個屬性,實例化Configuration對象並將其mapUnderscoreToCamelCase屬性設為true,再使用這個Configuration對象作為SqlSessionFactory的配置即可使mapUnderscoreToCamelCase=true生效。

但是僅僅為了改變一個屬性的值,就自己編碼生成一個SqlSessionFactory未免太繁瑣了些。使用在application.properties中配置的方法更方便。

 

2.mybatis管理的@Mapper的Dao,在使用@Autowire自動注入時,IDEA有紅色報錯“could not autowire”,但實際運行時正常,如何去除報錯?

按照本人的理解,這個報錯是由於Dao接口只添加了mybatis自定義的@Mapper注解,沒有添加spring定義的@Component、@Repository等,所以IDEA不認為這是納入Spring管理的Bean,導致在IDEA找不到autowire的Dao的來源。

查找解決方法,找到了這里的問答:

java - Idea inspects batis mapper bean wrong - Stack Overflow  https://stackoverflow.com/questions/25379348/idea-inspects-batis-mapper-bean-wrong

里面提到安裝【MyBatis plugin】插件可以解決,但是我嘗試安裝這個插件並啟用后,仍然有紅色報錯(插件已經激活,不是license導致的問題),所以猜測這個插件可能是只針對XXmapper.xml配置的方式有效,而對@Mapper注解Dao interface的方式無效(針對后一種情況是否有效,大家嘗試了可以反饋下結果)

所以只好采用一種折中的不算完美的辦法,在Dao interface中添加@Mapper的同時,再添加@Repository(或者@Component也可以),如下方代碼的第1行:

1 @Repository
2 @Mapper
3 public interface UserDao {
4 
5     @Select("SELECT phone FROM user WHERE name = #{name}") //動態傳入表名,可以使用 ...FROM ${tableName}... ,但需要解決sql注入風險
6     String getPhoneByUserName(@Param("name") String name);
7 }

這個方法使用中看來也沒有什么副作用。

 

PS:第一次試安裝【MyBatis plugin】插件之后,啟動后在IDEA的Event窗口中有以下輸出:

1 Mybatis Plugin: Mybatis Plugin is not activated yet. Click here to enter your license key to activate the plugin. You can also click here to purchase a license key to sponsor us making the plugin better. More features are on their way. Wish you happy coding with the plugin

這是一個收費的插件,需要購買license,官網顯示價格是¥39.99。

我還嘗試安裝了【Free MyBatis plugin】和【iBATIS/MyBatis mini-plugin】插件,都沒有去除紅色報錯。

 

哪位有更好的解決方法也歡迎提出~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM