Springboot整合mybatis:Invalid bound statement (not found)


前言

使用springboot整合mybatis報如下錯誤。

Invalid bound statement (not found) :com.mc.mapper.UsersMapper.insertMapper

望聞問切

查看錯誤日志,只有一句無效綁定語句。推斷是UsersMapper未被掃描到。

分析出現該情況的原因大致有以下幾種情況:

  • Mapper.xml中namespace與Mapper.java不一致。

    檢查一致。排除。

  • Mapper.xml中insert id與Mapper.java中Method名不一致。

    檢查一致。排除。

  • Mapper.xml中參數類型及返回值類型與Mapper.java中Method參數表不一致。

    檢查一致。排除。

  • UsersMapper未注解為Mapper。

    嘗試兩種方式,1.啟動器掃描。2.Mapper注解。 操作如下:

    • App.java中添加注解@MapperScan("com.mc.mapper")掃描。
    • UsersMapper.java中添加注解@Mapper

    兩種方式均不能解決問題。

  • 刪除Mapper.xml中多余的空行並保存。

    網上查到有這種方式解決問題的,想到此前jsp中也經常因為空格空行報錯,嘗試了一下。查看我的xml文件也有一些空行,刪除后無效果。

對症下葯

至此網上能查到的方式基本全部嘗試無效了。翻閱手邊書本(《Spring Boot+Vue全棧開發實戰》王松 著 清華大學出版社)查看基本配置發現這樣一段話:

在Maven工程中,XML配置文件建議寫在resources目錄下,但是上文中的Mapper.xml文件寫在包下,Maven在運行時會忽略包下的XML文件,因此需要在pom.xml文件中重新指明資源文件位置,配置如下:

<build>
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>
                    **/*.xml
                </include>
            </includes>
        </resource>
    </resources>
</build>

看到里發現這個描述好像和我的工程目錄一致,嘗試添加該配置,重啟項目,結果竟然無效!對症下葯都無效,要哭遼。(╥╯^╰╥)

回頭准備關閉項目繼續問度娘時,突然看到IDEA出現一個M型圖標,才想起來新版本IDEA修改完pom.xml文件后不再彈窗提示update了,而是在右上角顯示一個Maven圖標。reimport后重啟,問題解決。依賴IDE害死人呀!!!!o(╥﹏╥)o

總結

在網上查看的挺多springboot整合mybatis資料或視頻,均未做resources的多余操作仍能正常使用,猜測Maven可能是版本原因?出現該問題后排查思路總結如下:

  1. 查看基礎配置是否完整,注解、文件名、方法名等。
  2. 查看是否IDE問題導致,將XML、JSP等兼容性不是很好的文件刪除重建。
  3. 查看resources是否需要重新制定。
  4. 修改pom.xml后一定要reimport。

附錄

以下為demo

pom.xml

<!- GAV坐標省略 ->
	<dependencies>
        <!--springboot啟動器-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.3.1.RELEASE</version>
        </dependency>
        <!--web啟動器-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
            <version>2.2.0.RELEASE</version>
        </dependency>

        <!--mybatis啟動器-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.3</version>
        </dependency>
        <!--mysql 驅動-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.20</version>
        </dependency>
        <!--數據源-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.23</version>
        </dependency>
    </dependencies>
   <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>
                        **/*.xml
                    </include>
                </includes>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

src\main\resources\application.properties

spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://*.*.*.*:port/ssm
spring.datasource.username=root
spring.datasource.password=root

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

# 包名前綴
mybatis.type-aliases-package=com.mc.pojo

com.mc.pojo.User

public class User {
    private Integer id;
    private String name;
    private Integer age;
	// get set
}

com.mc.mapper.UsersMapper

public interface UsersMapper {
    void insertUser(User user);
}

com\mc\mapper\UsersMapper.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.mc.mapper.UsersMapper">
    <insert id="insertUser" parameterType="user">
        insert into t_user(name,age) values(#{name},#{age});
    </insert>
</mapper>

com.mc.service.UserService

public interface UserService {
    void addUser(User user);
}

com.mc.service.impl.UserServiceImpl

@Service
@Transactional
public class UserServiceImpl implements UserService {

    @Autowired
    private UsersMapper usersMapper;

    @Override
    public void addUser(User user) {
        System.out.println(user);
        System.out.println(this.usersMapper);
        this.usersMapper.insertUser(user);
    }
}

com/mc/controller/UsersCtrl.java

@Controller
@RequestMapping("/users")
public class UsersCtrl {

    @Autowired
    private UserService userService;

    @RequestMapping("/{page}")
    public String showPage(@PathVariable String page){
        return page;
    }

    @RequestMapping("/addUser")
    public String addUser(User user){
        System.out.println(user.toString());
        this.userService.addUser(user);
        return "ok";
    }
}

com/mc/Application.java

@SpringBootApplication
@MapperScan("com.mc.mapper") // @MapperScan 用於掃描mybatis的mapper接口
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

表現層使用的thymeleaf做簡單顯示。

src\main\resources\templates\input.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>添加用戶</title>
</head>
<body>
    <form th:action="@{/users/addUser}" method="post">
        姓名:<input type="text" name="name" value="Admin">
        年齡:<input type="text" name="age" value="10">
        <input type="submit" value="確定">
    </form>
</body>
</html>

src\main\resources\templates\ok.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>操作提示頁面</title>
</head>
<body>
    操作成功~~~
</body>
</html>

訪問錄入頁面測試即可 http://localhost:8080/users/input


免責聲明!

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



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