先看正確的項目結構
其中1、2、3、4編譯之后分別對應target文件夾下的1'、2'、3'、4'。
先講一下Wrapper自定義sql的配置
- 首先在application.yml配置好UserMapper的解析路徑。默認為"classpath:/mapper/**/.xml"。所以按照上面截圖的位置配置是會默認解析到的。
mybatis-plus:
mapper-locations:
- 你的mapper路徑
如果更換了路徑,則需要按照上面yml進行重新配置,並且要確保編譯后到target目錄下(有的位置可能不會編譯到target目錄下,需要注意)。
- 假定com.zhoushiya.demo.dao.UserMapper類編寫了自定義方法selectAll()如下
package com.zhoushiya.demo.dao;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.zhoushiya.demo.entity.User;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface UserMapper extends BaseMapper<User> {
List<User> selectAll(@Param(Constants.WRAPPER) Wrapper<User> wrapper);
}
- 那么resources.mapper.UserMapper.xml必須實現同名方法(id=selectAll),且名稱空間(namespace)需要指定為com.zhoushiya.demo.dao.UserMapper,返回值(resultType)必須為com.zhoushiya.demo.entity.User
<?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.zhoushiya.demo.dao.UserMapper">
<select id="selectAll" resultType="com.zhoushiya.demo.entity.User">
SELECT * FROM user ${ew.customSqlSegment}
</select>
</mapper>
tips:如果可以按住ctrl鍵指向xml中的namespace的最后一個單詞,如果變成手形而且單擊后可以跳轉,那么肯定地址是對的。resultType同理
Invalid bound statement (not found)可能的錯誤原因
如果仔細看了上述注意點,那么很容易就明白可能是哪些地方出現了問題
- application.yml指定的mapper解析目錄不對,或者target目錄下沒有
- UserMapper.xml不存在同名方法,或者名稱空間不對,或者返回值不對