兩個月前團隊基於 Spring + SpringMVC + Druid + JPA(Hibernate) 搭建了一套穩健的後端框架,經過項目組打磨已趨成熟。近期為了探索更靈活的 SQL 控制能力,嘗試將持久層遷移至 MyBatis。作為接觸 Hibernate 更早的開發者,我發現兩大 ORM 框架核心思想相通,但 MyBatis 獨有的 ResultMap 機制支持極致的 SQL 調優,這正是我們遷移的核心動力。雖然 Hibernate 在社區活躍度、版本迭代、工具生態上略勝一籌,但 MyBatis 的半自動映射特性更適合複雜查詢場景。
項目地址:https://git.oschina.net/LanboEx/sdm

代碼生成採用 org.mybatis.generator 插件,可自動生成 PO、Mapper 接口、XML 映射文件,大幅提升開發效率。
配置 sqlSessionFactory 直接引用 bean 時,Spring 無法解析 ${jdbc.username} 等佔位符,導致數據源初始化失敗。
MapperScannerConfigurer 在 Bean 定義解析階段初始化,此時 PropertyPlaceholderConfigurer 尚未替換佔位符,導致表達式作為字面值傳遞。
改用 sqlSessionFactoryBeanName 指定 bean 名稱,延遲初始化至 Bean 創建階段:
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.rambo.sdm.dao.inter"/> <property name="sqlSessionFactoryBeanName" value="sessionFactory"/> </bean>
MyBatis Generator 生成的映射文件中,主鍵生成策略(自增/UUID)需手動配置,易遺漏、易出錯。
<insert id="insert" parameterType="UserPO">
<selectKey keyProperty="uuid" resultType="String" order="BEFORE">
SELECT REPLACE(UUID(),'-','') AS UUID
</selectKey>
...
</insert>
<table tableName="user" domainObjectName="UserPO"> <generatedKey column="uuid" sqlStatement="SELECT REPLACE(UUID(),'-','') UUID FROM DUAL"/> </table>
注意:SQL 寫死導致數據庫移植性下降,跨數據庫項目需謹慎評估。
運行報錯 BindingException: Invalid bound statement (not found),實為 Mapper XML 未編譯到輸出目錄。
在 pom.xml <resources> 節點添加兩個 resource 目錄:
<resources>
<resource>
<directory>src/main/java</directory>
<includes><include>**/*.xml</include></includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
jetty:run 時 Generator 插件先運行,配置文件內容追加而非覆蓋,導致 Result Maps collection already contains value 錯誤。
Generator 插件綁定到 generate-sources 階段,Jetty 啟動觸發完整構建生命週期。插件邏輯:Java 文件存在則跳過,但 XML 文件追加內容。
mvn mybatis-generator:generate -Pgenerator<overwrite>true</overwrite>(需插件版本支持)/,REST 風格CharacterEncodingFilter 設置 UTF-8這套方案經過實戰驗證,穩定支撐業務增長。開源地址歡迎 Star、Fork、Issue 交流,共同完善。