首頁 > Java > java教程 > SpringBoot整合MyBatis過程中可能遇到的問題有哪些

SpringBoot整合MyBatis過程中可能遇到的問題有哪些

WBOY
發布: 2023-05-17 20:43:04
轉載
1396 人瀏覽過

盡量不要用jUnit 提供的單元測試

提一個要求盡量使用SpringBoot 提供的測試類別進行測試,能夠自動掃描組件以及使用容器中的bean物件

還有如果有元件中存在註入物件的話,那麼必須在SpringBoot容器中取出這個元件,進而使用注入的物件的功能! ! !

今天有個錯誤,花了很長時間來解決,最後發現是一個很低級很基礎的錯誤!

這是mapper接口,使用@mapper 相當於將接口的代理對象註冊進入bean中,但是上下文中找不到(其實是正常)

因為@Mapper 這個註解是Mybatis提供的,而@Autowried 註解是Spring 提供的,IDEA能理解Spring 的上下文,但是卻和Mybatis 關聯不上。而且我們可以根據 @Autowried 原始碼看到,預設情況下,@Autowried 要求依賴物件必須存在,那麼此時 IDEA 只能給個紅色警告了。

package com.bit.mapper;
import com.bit.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface UserMapper {
    User selectById(@Param("userid") Integer id);
}
登入後複製

這是與mapper介面對應的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.bit.mapper.UserMapper">
        <select id="selectById" resultType="com.bit.pojo.User">
            select * from users where id = #{userid}
        </select>
</mapper>
登入後複製

將java目錄下的xml文件加入resource資源,在build 標籤中嵌套,同樣沒有問題

<resources>    
    <resource>        
        <directory>src/main/java</directory>        
        <includes>            
            <include>**/*.xml</include>        
        </includes>    
    </resource>
</resources>
登入後複製

然後我們寫service層,寫了一個UserService接口,有些了一個UserServiceImpl 接口的實現類

在這個實現類中,注入UserMapper 一直提示無法注入,我一直認為有問題(但是最後發現沒問題)

SpringBoot整合MyBatis過程中可能遇到的問題有哪些

把service實作類別寫完了,也沒問題

package com.bit.service;
import com.bit.mapper.UserMapper;
import com.bit.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements UserService{
    @Autowired
    private UserMapper userMapper;
    @Override
    public User queryById(Integer id) {
        System.out.println("进入了service");
        return userMapper.selectById(id);
    }
}
登入後複製

然後我直接去測試了,我測試的呢?

實例化了UserService,new了一個對象,然後直接呼叫方法,看看是否能夠呼叫UserMapper查詢到資料庫。然後就不斷的包空指標異常的錯誤

@SpringBootTest
class BitApplicationTests {
    @Test
    void contextLoads() {
        UserService userService = new UserServiceImpl();
        userService.queryById(13);
        System.out.println(userService);
        System.out.println(userService.queryById(15));
        System.out.println(userService.queryById(13));
    }
}
登入後複製

SpringBoot整合MyBatis過程中可能遇到的問題有哪些

  我一度以為是mapper介面沒有註入到UserServcie中,導致呼叫UserServcie的方法就是呼叫UserMapper的方法是空的,以為是Mapper介面的問題,各種搜尋怎麼解決,經過幾個小時之後,在他人的博客中找到了答案

  我們的UserMapper 注入到了UserServiceImpl ,我們不能直接使用UserServcieIml, 如果在其他的類別中進行使用其功能,必須將這個類別注入到當前類別中,從容器中拿到這個UserService,才能正確的進行調用,不會發生空指針異常,我一直沒有發現,這是也該非常低級的錯誤。

正確做法: 先組裝到目前物件中,再從容器中拿到bean進行使用

@SpringBootTest
class BitApplicationTests {
    @Autowired
    private UserService userService;
    @Test
    void contextLoads() {
        System.out.println(userService.queryById(15));
        System.out.println(userService.queryById(13));
    }
}
登入後複製

以上是SpringBoot整合MyBatis過程中可能遇到的問題有哪些的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:yisu.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板