Maison  >  Article  >  Java  >  Quels sont les problèmes qui peuvent être rencontrés lorsque SpringBoot intègre MyBatis ?

Quels sont les problèmes qui peuvent être rencontrés lorsque SpringBoot intègre MyBatis ?

WBOY
WBOYavant
2023-05-17 20:43:041385parcourir

Essayez de ne pas utiliser le test unitaire fourni par jUnit

En guise de demande, essayez d'utiliser la classe de test fournie par SpringBoot pour les tests, qui peut analyser automatiquement les composants et utiliser des objets bean dans le conteneur

De plus, s'il y a un injecté objet dans le composant, alors il doit retirer ce composant dans le conteneur SpringBoot et utiliser les fonctions de l'objet injecté ! ! !

Il y a eu une erreur aujourd'hui et il m'a fallu beaucoup de temps pour la résoudre. Finalement, j'ai découvert qu'il s'agissait d'une erreur de très bas niveau et basique !

Il s'agit de l'interface du mappeur. Utiliser @mapper équivaut à enregistrer l'objet proxy de l'interface dans le bean, mais il est introuvable dans le contexte (en fait c'est normal)

Car l'annotation @Mapper est fournie par Mybatis. , et l'annotation @Autowried est fournie par Spring, IDEA peut comprendre le contexte de Spring, mais elle n'est pas liée à Mybatis. Et nous pouvons voir dans le code source de @Autowried que par défaut, @Autowried exige que les objets dépendants existent, donc IDEA ne peut donner qu'un avertissement rouge pour le moment.

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);
}

Il s'agit du fichier xml correspondant à l'interface du mappeur. Il n'y a également aucun problème.

<?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>

Ajoutez le fichier xml dans le répertoire java à la ressource et imbriquez-le dans la balise build.

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

Ensuite, nous écrivons la couche de service, écrivons une interface UserService et créons une classe d'implémentation de l'interface UserServiceImpl

Dans cette classe d'implémentation, l'injection de UserMapper n'arrêtait pas de me dire qu'il ne pouvait pas être injecté. J'ai toujours pensé qu'il y avait un problème (mais. j'ai finalement trouvé qu'il n'y avait pas de problème)

Quels sont les problèmes qui peuvent être rencontrés lorsque SpringBoot intègre MyBatis ?

Implémenter le service Une fois le cours écrit, il n'y a eu aucun problème

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);
    }
}

Puis je suis allé directement le tester. Où était mon test ?

Instanciez UserService, créez un nouvel objet, puis appelez directement la méthode pour voir si UserMapper peut être appelé pour interroger la base de données. Ensuite, j'ai continué à recevoir des erreurs d'exception de pointeur nul

@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));
    }
}

Quels sont les problèmes qui peuvent être rencontrés lorsque SpringBoot intègre MyBatis ?

   J'ai pensé un jour que l'interface du mappeur n'était pas injectée dans UserServcie, ce qui faisait que la méthode d'appel de UserServcie pour appeler UserMapper était vide, pensant que c'était le Mapper Le problème, comment résoudre diverses recherches, après quelques heures, j'ai trouvé la réponse dans les blogs d'autres personnes

  Notre UserMapper est injecté dans UserServiceImpl, nous ne pouvons pas utiliser UserServcieIml directement, s'il est utilisé dans d'autres classes. Pour sa fonction, cette classe doit être injectée dans la classe actuelle et le UserService peut être obtenu à partir du conteneur avant de pouvoir être appelé correctement sans exception de pointeur nul. Je n'ai jamais découvert qu'il s'agissait d'une erreur de très bas niveau.

Approche correcte : assemblez-le d'abord dans l'objet actuel, puis récupérez le grain du conteneur pour l'utiliser

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer