嗯,用户遇到了一個MyBatis的BindingException,説找不到對應的Mapper語句。首先我得確認這個錯誤常見的原因,然後一步步幫用户排查。

用户提供的異常信息裏明確指出了是Invalid bound statement (not found),這通常和XML文件裏的ID不匹配或者配置問題有關。可能用户對MyBatis的機制不太熟悉,需要解釋清楚可能的原因和解決方法。

首先得想到最常見的幾個點:XML文件是否存在、namespace是否正確、方法名是否匹配、掃描路徑是否正確。然後得考慮用户是否用了多模塊,有時候資源文件沒被正確打包進去。

另外,用户提到的是jeecg相關的Mapper,可能他們用的是JEECG框架,可能有特定的配置或者結構,需要提醒用户檢查框架相關的注意事項。比如多模塊項目中,XML文件可能需要放在特定的目錄下,或者需要額外的配置確保XML被複制到target裏。

還要考慮用户是否最近修改過代碼,比如重命名了方法或者移動了文件,導致配置不一致。建議用户檢查最近的改動,並用IDE的搜索功能確認XML中的ID和接口方法是否一致。

最後,步驟要詳細但不過於技術化,讓用户能一步步跟着操作,比如檢查文件路徑、確認配置、清理重新編譯等。同時要給出常見的解決順序,從最簡單到複雜,避免用户感到 overwhelmed。

這個錯誤非常常見,它表示 MyBatis 無法找到與 Mapper 接口中定義的方法相對應的 SQL 語句

具體來説,錯誤信息 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): org.jeecg.modules.jmreport.common.base.mapper.JmSuperMapper.selectPage 告訴我們:

MyBatis 在 JmSuperMapper 這個接口中找到了 selectPage 方法,但是在對應的 SQL 映射文件(XML 或註解)中,找不到一個 ID 為 selectPage 的 SQL 語句定義。

主要原因和解決方案

導致這個問題的原因有很多,請按照以下順序逐一排查:

1. 最可能的原因:XML 文件未正確放置或未被掃描到 (最常見於 Spring Boot 項目)

在 Spring Boot 中,默認的 Mapper XML 文件存放目錄是 src/main/resources 下的某個路徑,而不是和 Java 文件放在一起的 src/main/java

  • 正確做法:確保你的 JmSuperMapper.xml 文件放在了 resources 目錄下,並且其包路徑與 Mapper 接口的包路徑完全一致
  • 接口位置: src/main/java/org/jeecg/modules/jmreport/common/base/mapper/JmSuperMapper.java
  • XML 位置: src/main/resources/org/jeecg/modules/jmreport/common/base/mapper/JmSuperMapper.xml
  • 檢查配置:在你的 application.yml 或 application.properties 中,確認 MyBatis 的 mapper-locations 配置是否正確指向了你的 XML 文件。如果文件位置正確,通常無需額外配置,但如果你放到了非標準目錄,需要明確指定。
    YAML 配置示例:
mybatis-plus:
  mapper-locations: classpath*:org/jeecg/modules/**/mapper/xml/*.xml
  # 或者更精確地指向你的路徑
  # mapper-locations: classpath*:org/jeecg/modules/jmreport/common/base/mapper/*.xml

Properties 配置示例:

mybatis-plus.mapper-locations=classpath*:org/jeecg/modules/**/mapper/xml/*.xml

2. 檢查 XML 文件中的命名空間 (namespace) 和 SQL ID

打開你的 JmSuperMapper.xml 文件,檢查以下兩點:

  • namespace:必須是對應 Mapper 接口的全限定名(包括包名)。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.jeecg.modules.jmreport.common.base.mapper.JmSuperMapper">
    <!-- 你的 SQL 語句在這裏 -->
</mapper>
  • SQL ID:必須有一個 id 為 selectPage 的 SQL 語句定義(例如 <select> 標籤)。如果你使用的是 MyBatis-Plus,selectPage 方法可能來自其內置的 BaseMapper,你不需要自己寫。但這裏報錯的是 JmSuperMapper,所以你需要確認這個自定義的 Mapper 是否正確定義了該方法。
<select id="selectPage" resultType="xxx">
    SELECT * FROM your_table
</select>

3. 項目是多模塊項目 (Maven Multi-module Project)

如果你的項目由多個 Maven 模塊組成,這是一個極其常見的陷阱。

  • 問題:即使你的 XML 文件在 src/main/resources 目錄下且路徑正確,負責打包的模塊(通常是 web 或 app 模塊)可能沒有包含其他模塊(如 mapper 模塊)的 resources 目錄。
  • 解決方案:在包含 Mapper 接口和 XML 文件的模塊的 pom.xml 中,確保添加了 resources 插件配置,明確告訴 Maven 需要打包 *.xml 文件。
<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.xml</include>
                <include>**/*.yml</include>
                <include>**/*.properties</include>
            </includes>
            <filtering>false</filtering>
        </resource>
        <!-- 如果你把 XML 文件放在了 java 目錄下(不推薦),需要額外添加這個 -->
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.xml</include>
            </includes>
            <filtering>false</filtering>
        </resource>
    </resources>
</build>

4. 方法名與 SQL ID 不匹配

  • 檢查接口 JmSuperMapper.java 中的方法名是否是 selectPage
  • 檢查 XML 文件中對應的 SQL 語句的 id 是否也是 selectPage
  • 注意大小寫!雖然在一些系統上不敏感,但最好保持完全一致。

5. 清理並重新編譯項目

有時候 IDE(如 IntelliJ IDEA 或 Eclipse)或 Maven 的編譯緩存會導致問題。

  1. 執行 mvn clean compile 或 mvn clean package 命令。
  2. 在 IDEA 中,可以選擇 Build -> Rebuild Project
  3. 檢查最終的打包文件(如 target/classes 或生成的 .jar 文件),確認 JmSuperMapper.xml 確實被複制到了正確的位置。

6. 檢查是否使用了註解而非 XML

極少數情況下,可能有人在 selectPage 方法上使用了 @Select 等註解,但註解的 SQL 寫錯了或者不存在。檢查接口文件:

java

public interface JmSuperMapper {
    @Select("SELECT * FROM your_table")
    IPage<YourEntity> selectPage(IPage<YourEntity> page);
}

總結排查步驟

  1. 首要檢查:確認 JmSuperMapper.xml 文件在 resources 下的路徑與接口包路徑完全一致。
  2. 檢查配置:確認 application.yml/properties 中的 mybatis-plus.mapper-locations 配置是否正確。
  3. 檢查內容:打開 XML 文件,確認 namespace 和 id="selectPage" 的語句是否存在且正確。
  4. 多模塊項目:如果項目結構複雜,重點檢查 pom.xml 中的 resource 配置。
  5. 清理重編:執行 mvn clean compile 並重啓 IDE/應用。

按照這個順序排查,99% 的情況下都能解決這個錯誤。從你的堆棧信息來看,原因 1 (XML文件位置問題) 或 原因 3 (多模塊資源打包問題) 的可能性最大。

根據提供的代碼,錯誤信息是:Invalid bound statement (not found): org.jeecg.modules.jmreport.common.base.mapper.JmSuperMapper.selectPage

但是,從你提供的代碼中,我注意到你的Controller、Service、Mapper都是針對JackShop的,而錯誤信息中提到的Mapper是JmSuperMapper,這是一個不一致的地方。

可能的原因:

  1. 你的項目可能依賴了jeecg-boot模塊,其中包含了JmSuperMapper,並且在某個地方調用了JmSuperMapper.selectPage方法,但是該Mapper的XML文件中沒有定義selectPage語句,或者XML文件沒有被正確掃描到。
  2. 另一種可能是,你的JackShopMapper繼承了某個基類Mapper(比如JmSuperMapper),而JmSuperMapper中定義了selectPage方法,但是對應的XML文件(JmSuperMapper.xml)中缺少了該方法的實現。

然而,從你提供的代碼中,我沒有看到JackShopMapper的定義。請提供JackShopMapper的代碼。

另外,你提供的XML文件內容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xc.jack.shop.entity.JackShop">
</mapper>

這個XML文件的namespace是實體類JackShop,而不是Mapper接口。這是錯誤的。MyBatis的Mapper XML文件的namespace應該是Mapper接口的全限定名。

因此,我懷疑你的JackShopMapper接口可能沒有對應的XML文件,或者XML文件的namespace寫錯了。

請檢查:

  1. JackShopMapper接口是否存在,以及它是否繼承了其他Mapper(比如JmSuperMapper)。
  2. JackShopMapper.xml文件的namespace應該是JackShopMapper接口的全限定名,而不是實體類。

假設你的JackShopMapper接口如下:

package com.xc.jack.shop.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xc.jack.shop.entity.JackShop;

public interface JackShopMapper extends BaseMapper<JackShop> {
}

那麼對應的XML文件的namespace應該是com.xc.jack.shop.mapper.JackShopMapper

另外,錯誤信息中提到的JmSuperMapper可能是項目中的其他Mapper,也需要檢查其XML文件中是否有selectPage的定義。

由於你提供的代碼中沒有JackShopMapperJmSuperMapper的定義,我需要你提供這些信息。

但是,根據錯誤堆棧,問題出現在調用jackShopService.page方法時,它最終調用的是JmSuperMapper.selectPage,而不是JackShopMapper的某個方法。這暗示着你的JackShopService可能沒有使用JackShopMapper,而是使用了JmSuperMapper?或者你的JackShopMapper繼承了JmSuperMapper

請檢查你的JackShopMapper是否類似於:

public interface JackShopMapper extends JmSuperMapper<JackShop> {
}

JmSuperMapper中定義了selectPage方法,但是對應的XML文件(JmSuperMapper.xml)中沒有這個語句。

解決方案:

  1. 確保JmSuperMapper.xml文件存在,並且其中有一個id為selectPage的查詢語句。
  2. 或者,如果你的JackShopMapper直接繼承自MyBatis-Plus的BaseMapper,那麼selectPage方法是由MyBatis-Plus提供的,不需要在XML中寫。但是錯誤中提到的Mapper是JmSuperMapper,所以可能你的項目中沒有使用MyBatis-Plus的BaseMapper,而是自定義了一個JmSuperMapper

請根據實際情況檢查。

另外,從你提供的XML文件內容來看,它目前是空的,並且namespace指向了實體類,這是錯誤的,需要修正。

總結步驟:

  1. 確認JackShopMapper接口的定義,特別是它繼承的父接口。
  2. 確認JackShopMapper.xml文件的namespace是否正確,以及是否包含了必要的SQL語句(或者是否應該由MyBatis-Plus自動提供)。
  3. 檢查JmSuperMapper接口和JmSuperMapper.xml文件,確保selectPage方法在XML中有對應的語句。

如果JmSuperMapper是MyBatis-Plus的BaseMapper那樣的類,那麼它應該已經內置了selectPage方法,不需要在XML中寫。但是錯誤提示找不到,可能是因為XML文件沒有被正確掃描到,或者MyBatis-Plus的配置有問題。

請先檢查XML文件的位置和掃描配置。

在Spring Boot中,MyBatis-Plus默認的XML文件位置是classpath*:/mapper/**/*.xml。請確保你的XML文件放在src/main/resources下的對應目錄中。

例如,如果JackShopMapper接口在com.xc.jack.shop.mapper包中,那麼XML文件應該放在src/main/resources/mapper/com/xc/jack/shop/mapper/JackShopMapper.xml,或者更常見的做法是直接在src/main/resources/mapper/下放XML文件,然後在配置中指定掃描路徑。

在application.yml中配置MyBatis-Plus的mapper-locations,例如:

yaml

mybatis-plus:
  mapper-locations: classpath*:mapper/**/*.xml

然後確保你的XML文件在src/main/resources/mapper/目錄下。

如果問題仍然存在,請檢查你的項目結構,確保XML文件在編譯時被複制到了target/classes目錄下。

最後,如果JmSuperMapper不是你的項目中的,而是jeecg-boot提供的,那麼可能需要檢查jeecg-boot的依賴是否正確,或者是否有遺漏的配置。

由於信息有限,以上是一些常見的排查方向。

根據您提供的代碼,問題已經非常明確了。錯誤的核心在於 MyBatis XML 映射文件中的 namespace 配置錯誤

問題分析

  1. 錯誤信息Invalid bound statement (not found): org.jeecg.modules.jmreport.common.base.mapper.JmSuperMapper.selectPage
  • 這表明 MyBatis 正在尋找 JmSuperMapper 接口中的 selectPage 方法。
  1. 您的代碼結構
  • 您的 Service (JackShopServiceImpl) 繼承自 ServiceImpl<JackShopMapper, JackShop>
  • 這意味着它依賴於 JackShopMapper 接口來執行數據庫操作。
  • 您的 Controller 調用 jackShopService.page(...),這個方法是 MyBatis-Plus 提供的分頁查詢,它最終會調用 JackShopMapper.selectPage 方法。
  1. 關鍵錯誤:在您提供的 XML 文件片段中:
<mapper namespace="com.xc.jack.shop.entity.JackShop">
  • namespace 的值是錯誤的。它應該指向 Mapper 接口 的全限定名,而不是實體類。

  • MyBatis 會根據 namespace 來綁定接口和 XML。因為這裏指向了實體類,所以它完全找不到 JackShopMapper 接口中定義的任何方法(包括 selectPage)。

解決方案

修改您的 JackShopMapper.xml 文件,將 namespace 更正為 JackShopMapper 接口的全限定名。

修改前:

<mapper namespace="com.xc.jack.shop.entity.JackShop">
</mapper>

修改後:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xc.jack.shop.mapper.JackShopMapper">
    <!-- 這裏將來可以添加自定義的 SQL 查詢 -->
</mapper>

後續步驟和驗證

  1. 確保 XML 文件位置正確
  • 這個 JackShopMapper.xml 文件必須放在項目的資源目錄下,並且路徑要與 Mapper 接口的包名一致。
  • 正確位置: src/main/resources/com/xc/jack/shop/mapper/JackShopMapper.xml
  1. 檢查 Mapper 接口
  • 確保 JackShopMapper 接口存在並且繼承了 MyBatis-Plus 的 BaseMapper。它應該看起來像這樣:
package com.xc.jack.shop.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xc.jack.shop.entity.JackShop;

public interface JackShopMapper extends BaseMapper<JackShop> {
    // 可以在這裏添加自定義接口方法
}
  • 只要繼承了 BaseMapper<JackShop>selectPageselectByIdinsert 等基本 CRUD 方法就已經由 MyBatis-Plus 自動提供了,您不需要在 XML 中手動編寫這些方法的 SQL(除非您需要自定義複雜 SQL)。

  1. 清理和重新編譯
  • 修改後,執行 mvn clean compile 或使用 IDE 的清理和重建功能,確保更改生效。

總結

這個錯誤的根本原因是 XML 映射文件中的 namespace 屬性錯誤地指向了實體類而不是 Mapper 接口。MyBatis 無法將接口方法與 XML 中的 SQL 語句綁定,因此拋出了 BindingException

修正 namespace 後,MyBatis 就能正確找到 JackShopMapper.selectPage 方法(該方法由 MyBatis-Plus 的 BaseMapper 自動提供),問題即可解決。

根據您提供的代碼,我注意到您已經修正了JackShopMapper.xml中的namespace,並且JackShopMapper接口也正確繼承了BaseMapper。但是,您提供的錯誤信息中卻提到了org.jeecg.modules.jmreport.common.base.mapper.JmSuperMapper.selectPage,這個Mapper與您當前的JackShop無關。

可能的原因和解決方案:

  1. 錯誤堆棧中的Mapper與當前業務無關:錯誤信息中提到的JmSuperMapper是jeecg報表模塊的Mapper,而您的Controller中調用的是IJackShopService.page,它應該使用JackShopMapper。這説明問題可能不在您的JackShop相關代碼上,而是報表模塊的配置問題。
  2. 多數據源配置:您的EcomAddressCollectServiceImpl中使用了@DS("hive"),表明項目配置了多數據源。而JmSuperMapper可能配置了錯誤的數據源,或者其XML文件未正確放置。
  3. 報表模塊的Mapper配置:請檢查報表模塊的Mapper接口和XML文件是否正確。確保:
  • JmSuperMapper接口存在。
  • JmSuperMapper.xml文件存在,且namespace指向JmSuperMapper接口的全限定名。
  • XML文件的位置正確(在resources目錄下,與接口相同的包路徑)。
  1. 全局掃描路徑:檢查MyBatis的配置,確保掃描了報表模塊的Mapper。在Spring Boot中,通常使用@MapperScan註解或在配置文件中指定mybatis-plus.mapper-locations
  2. 依賴問題:如果報表模塊是一個獨立的模塊,請確保在當前模塊中正確引入了報表模塊的依賴,並且報表模塊的Mapper XML文件被打包到了最終的jar中。

由於錯誤堆棧是從JackShopControllerqueryPageList方法開始的,但最終卻報錯了JmSuperMapper的綁定異常,我懷疑在JackShopController的調用鏈中可能間接調用了報表模塊的代碼,或者您的項目中有全局的攔截器、過濾器等觸發了報表模塊的代碼。

但是,根據您提供的代碼,JackShopController中只調用了jackShopService.page,而jackShopServiceIJackShopService,其實現是JackShopServiceImpl,它繼承自ServiceImpl<JackShopMapper, JackShop>,所以應該使用JackShopMapper。因此,這個錯誤可能是在調用jackShopService.page時,MyBatis在初始化其他Mapper時出現了問題,導致整個MyBatis的綁定過程失敗。

另一種可能是,您的項目中有一個全局的分頁攔截器,這個攔截器在處理分頁時嘗試使用報表模塊的Mapper(比如JmSuperMapper)來獲取分頁數據,但這只是一種猜測。

建議的排查步驟:

  1. 檢查報表模塊的Mapper配置(JmSuperMapper接口和XML文件)是否正確。
  2. 檢查項目是否配置了多數據源,以及報表模塊的Mapper是否指定了正確的數據源。
  3. 檢查MyBatis的配置,確保報表模塊的Mapper被掃描到。
  4. 如果報表模塊的代碼不在本次修改範圍內,可以嘗試回滾代碼,看是否之前就能正常運行。

如果問題仍然存在,請提供更多關於報表模塊(jmreport)的配置信息,以及項目的數據源配置。

感謝您提供更多的代碼示例。從您提供的 EcomAddressCollect 相關代碼來看,這個模塊的配置是正確的,這也進一步印證了之前關於 JackShop 模塊問題的判斷。

對比分析

讓我們對比一下兩個模塊的配置:

EcomAddressCollect 模塊(正確配置):

  1. Mapper 接口EcomAddressCollectMapper extends BaseMapper<EcomAddressCollect>
  2. XML 文件<mapper namespace="com.xc.jack.mapper.EcomAddressCollectMapper">
  3. Service 實現EcomAddressCollectServiceImpl extends ServiceImpl<EcomAddressCollectMapper, EcomAddressCollect>

JackShop 模塊(問題所在):

  1. Mapper 接口JackShopMapper extends BaseMapper<JackShop> ✅
  2. XML 文件<mapper namespace="com.xc.jack.shop.mapper.JackShopMapper"> ✅(已修正)
  3. Service 實現JackShopServiceImpl extends ServiceImpl<JackShopMapper, JackShop> ✅

從配置上看,JackShop 模塊現在應該是正確的。但是,您仍然遇到 JmSuperMapper.selectPage 的錯誤,這表明問題可能不在 JackShop 模塊本身,而是在其他地方。

問題定位

錯誤信息顯示的是 org.jeecg.modules.jmreport.common.base.mapper.JmSuperMapper.selectPage,這表明:

  1. 問題可能來自 JEECG 報表模塊JmSuperMapper 是 JEECG 報表模塊的 Mapper,不是您自定義的 JackShopMapper
  2. 可能的原因
  • JEECG 報表模塊的 XML 文件未正確配置或未被掃描到
  • 報表模塊的 Mapper 接口與 XML 文件不匹配
  • 多模塊項目中,報表模塊的資源未正確打包

解決方案

請檢查 JEECG 報表模塊的相關配置:

  1. 確認 JmSuperMapper.xml 文件存在且位置正確
  • 路徑應該是:src/main/resources/org/jeecg/modules/jmreport/common/base/mapper/JmSuperMapper.xml
  1. 檢查 JmSuperMapper.xml 的內容
  • 確保 namespace 正確:org.jeecg.modules.jmreport.common.base.mapper.JmSuperMapper
  • 確保有 id="selectPage" 的 SQL 語句定義
  1. 檢查 MyBatis 配置
  • 在 application.yml 或 application.properties 中,確保 MyBatis 的 mapper-locations 配置包含了報表模塊的 XML 文件:
mybatis-plus:
  mapper-locations: classpath*:org/jeecg/modules/**/mapper/xml/*.xml, classpath*:com/xc/**/mapper/xml/*.xml
  1. 如果是多模塊項目
  • 確保報表模塊的 pom.xml 中正確配置了資源打包:
<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.xml</include>
                <include>**/*.yml</include>
                <include>**/*.properties</include>
            </includes>
            <filtering>false</filtering>
        </resource>
    </resources>
</build>
  1. 清理和重新編譯
  • 執行 mvn clean compile 或使用 IDE 的清理和重建功能

總結

您遇到的 JmSuperMapper.selectPage 錯誤與您的 JackShop 模塊無關,而是 JEECG 報表模塊的配置問題。請按照上述步驟檢查報表模塊的配置。

您的 JackShop 模塊配置現在已經正確(Mapper 接口、XML 文件和 Service 實現都正確),一旦報表模塊的問題解決,您的 JackShop 模塊應該能正常工作。

根據您提供的信息,JmSuperMapper 是 JEECG 報表模塊提供的通用 Mapper,它繼承了 MyBatis-Plus 的 BaseMapper。因此,它應該已經包含了 selectPage 方法(來自 BaseMapper)。

錯誤信息 Invalid bound statement (not found): org.jeecg.modules.jmreport.common.base.mapper.JmSuperMapper.selectPage 表明 MyBatis 在綁定 JmSuperMapper 的 selectPage 方法時,沒有找到對應的 SQL 語句。

可能的原因和解決方案

  1. XML 文件未正確配置
  • 雖然 JmSuperMapper 是框架提供的,但可能框架期望有一個對應的 XML 文件來定義 SQL 語句,或者框架通過某種方式動態生成 SQL。
  • 檢查 JEECG 報表模塊是否提供了 JmSuperMapper.xml 文件,並且該文件是否在類路徑下。
  1. MyBatis 配置未掃描到 JEECG 報表模塊的 XML 文件
  • 在 application.yml 或 application.properties 中,確保 MyBatis 的 mapper-locations 包含了 JEECG 報表模塊的 XML 文件路徑。
  • 例如:classpath*:org/jeecg/modules/**/mapper/xml/*.xml
  1. 多模塊項目資源未正確打包
  • 如果項目是多模塊的,確保報表模塊的 pom.xml 中配置了資源打包,將 XML 文件包含進去。
  1. JEECG 版本問題
  • 檢查您使用的 JEECG 版本,可能某些版本中 JmSuperMapper 的配置方式有變化。可以查看官方文檔或更新到最新版本。
  1. 檢查是否有自定義的 selectPage 方法
  • 雖然 BaseMapper 提供了 selectPage 方法,但有可能在 JmSuperMapper 的 XML 文件中需要自定義一個同名的 SQL 語句,而該語句缺失。

具體步驟

  1. 查找 JmSuperMapper.xml 文件
  • 在 JEECG 報表模塊的資源目錄下(通常是 src/main/resources)查找是否有 org/jeecg/modules/jmreport/common/base/mapper/JmSuperMapper.xml 文件。
  1. 檢查 XML 文件內容
  • 如果存在該文件,檢查其中是否有 id 為 selectPage 的 SQL 語句。如果沒有,可能需要添加,或者查看框架是否通過其他方式提供(例如,繼承的 BaseMapper 的方法不需要在 XML 中寫 SQL,除非要自定義)。
  1. 確認 MyBatis 配置
  • 在全局配置文件中,確保 mybatis-plus.mapper-locations 包含了該 XML 文件的路徑。
  1. 清理和重新編譯
  • 執行 mvn clean compile 或使用 IDE 的清理和重建功能。

如果找不到 XML 文件

如果根本不存在 JmSuperMapper.xml 文件,那麼可能框架期望通過 MyBatis-Plus 的自動注入機制來提供 selectPage 方法(即不需要 XML)。但是錯誤表明 MyBatis 在綁定語句時找不到,這可能是由於 MyBatis-Plus 的配置問題。

嘗試在配置文件中添加以下配置,確保 MyBatis-Plus 的 mapper 接口被正確掃描:

mybatis-plus:
  mapper-locations: classpath*:mapper/**/*.xml
  type-aliases-package: com.yourpackage.entity
  # 掃描 mapper 接口的包
  mapper-scan: org.jeecg.modules.jmreport.common.base.mapper

但實際上,MyBatis-Plus 通常通過 @MapperScan 註解來掃描 mapper 接口。請檢查啓動類上是否有類似如下配置:

@MapperScan("org.jeecg.modules.jmreport.common.base.mapper")

或者,如果 JEECG 報表模塊的 mapper 接口不在您的主應用掃描範圍內,可能需要添加這個掃描路徑。

總結

由於 JmSuperMapper 是框架提供的,問題可能出在框架的配置或資源文件缺失上。請按照上述步驟檢查,特別是確保 XML 文件存在且被正確掃描,以及 mapper 接口被正確註冊。

如果問題仍然存在,建議查看 JEECG 的官方文檔或尋求社區支持,因為這可能是框架特定的問題。

您提供的代碼片段顯示 JmSuperMapper 是 JEECG 框架提供的一個通用 Mapper 接口,它繼承了 MyBatis-Plus 的 BaseMapper<T>。這意味着它應該自動擁有所有基本的 CRUD 方法,包括 selectPage

現在問題變得更加清晰了。錯誤信息表明框架在嘗試調用 JmSuperMapper.selectPage 方法時出現了問題,但這可能不是問題的根源,而是問題的表現。

深入分析問題

從您提供的代碼和錯誤堆棧來看,問題可能不在 JmSuperMapper 本身,而是在您的 JackShop 模塊與 JEECG 框架的集成方式上。以下是幾種可能的情況:

  1. JEECG 框架的自動報表功能
  • JEECG 框架有強大的自動報表功能,它可能會自動掃描實體類並嘗試為其創建報表。
  • 當它掃描到您的 JackShop 實體時,可能會嘗試使用 JmSuperMapper 來查詢數據。
  • 如果框架配置有問題,或者您的實體類與框架期望的不完全一致,就可能導致這個錯誤。
  1. 多數據源配置問題
  • 從您提供的 EcomAddressCollectServiceImpl 代碼中可以看到使用了 @DS("hive") 註解,表明您的項目配置了多數據源。
  • JmSuperMapper 可能沒有正確配置數據源,導致無法找到對應的 SQL 映射。
  1. MyBatis 配置衝突
  • 您的項目中可能有多個 MyBatis 配置,導致映射文件掃描不正確。

解決方案

  1. 檢查 JEECG 報表配置
  • 查看 JEECG 的報表配置,確認是否正確配置了數據源和 Mapper 掃描路徑。
  • 檢查 application.yml 或 application.properties 中關於報表的配置項。
  1. 檢查多數據源配置
  • 確保 JmSuperMapper 使用的數據源與您的實體類所在的數據源一致。
  • 如果 JackShop 實體使用的是默認數據源,而 JmSuperMapper 配置了其他數據源,可能會導致問題。
  1. 檢查 MyBatis 配置
  • 確認 MyBatis 的配置是否正確,特別是 mapper-locations 是否包含了所有必要的路徑。
mybatis-plus:
  mapper-locations: classpath*:/mapper/**/*.xml, classpath*:/org/jeecg/modules/**/mapper/xml/*.xml
  type-aliases-package: com.xc.**.entity, org.jeecg.modules.**.entity
  1. 檢查實體類註解
  • 確保您的 JackShop 實體類有正確的註解,特別是 @TableName 註解:
@Data
@TableName("jack_shop") // 確保表名正確
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="jack_shop對象", description="jack_shop")
public class JackShop implements Serializable {
    // 字段定義
}
  1. 檢查是否缺少依賴
  • 確保您的項目中包含了 JEECG 報表模塊的所有必要依賴。
  1. 查看 JEECG 文檔或社區
  • 這個問題可能是 JEECG 框架特有的,查看官方文檔或在 JEECG 社區中搜索類似問題可能會找到解決方案。

臨時解決方案

如果以上方法都不能解決問題,您可以嘗試一個臨時解決方案:為您的 JackShop 實體創建一個自定義的 Mapper 方法,而不是依賴框架的自動功能。

  1. 在 JackShopMapper 接口中添加自定義的分頁查詢方法:
public interface JackShopMapper extends BaseMapper<JackShop> {
    IPage<JackShop> selectShopPage(IPage<JackShop> page, @Param("ew") Wrapper<JackShop> queryWrapper);
}
  1. 在 JackShopMapper.xml 中實現這個方法:
<select id="selectShopPage" resultType="com.xc.jack.shop.entity.JackShop">
    SELECT * FROM jack_shop ${ew.customSqlSegment}
</select>
  1. 在 Service 中使用這個自定義方法而不是默認的 page 方法。

總結

您遇到的問題很可能是 JEECG 框架的自動報表功能與您的實體類配置之間的兼容性問題。雖然錯誤信息指向 JmSuperMapper.selectPage,但根本原因可能在於框架如何嘗試自動為您的 JackShop 實體創建報表。

建議先檢查 JEECG 框架的配置,特別是數據源和 MyBatis 相關配置。如果問題仍然存在,可以考慮使用自定義的 Mapper 方法來繞過框架的自動功能。