Heim >Java >javaLernprogramm >Welche Probleme können auftreten, wenn SpringBoot MyBatis integriert?
Versuchen Sie, den von jUnit bereitgestellten Unit-Test nicht zu verwenden Objekt in der Komponente, dann muss es Nehmen Sie diese Komponente im SpringBoot-Container heraus und verwenden Sie die Funktionen des injizierten Objekts! ! !
Heute ist ein Fehler aufgetreten und es hat lange gedauert, ihn zu beheben. Am Ende habe ich herausgefunden, dass es sich um einen sehr einfachen und grundlegenden Fehler handelte!
Dies ist die Mapper-Schnittstelle. Die Verwendung von @mapper entspricht der Registrierung des Proxy-Objekts der Schnittstelle in der Bean, kann jedoch nicht im Kontext gefunden werden (eigentlich ist dies normal)
Da die @Mapper-Annotation von Mybatis bereitgestellt wird , und die @Autowried-Annotation wird von Spring bereitgestellt. IDEA kann den Kontext von Spring verstehen, hat jedoch nichts mit Mybatis zu tun. Und wir können dem @Autowried-Quellcode entnehmen, dass @Autowried standardmäßig erfordert, dass abhängige Objekte vorhanden sein müssen, sodass IDEA derzeit nur eine rote Warnung ausgeben kann.
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); }
Dies ist die XML-Datei, die der Mapper-Schnittstelle entspricht.
<?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>
Fügen Sie die XML-Datei im Java-Verzeichnis hinzu und verschachteln Sie sie im Build-Tag
<resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> </resources>Dann haben wir die Serviceschicht geschrieben, eine UserService-Schnittstelle geschrieben und eine Implementierungsklasse der UserServiceImpl-Schnittstelle erstelltIn dieser Implementierungsklasse wurde beim Einfügen von UserMapper immer wieder angezeigt, dass es nicht injiziert werden konnte (aber Endlich wurde festgestellt, dass es kein Problem gab)
Implementieren Sie den Dienst. Nachdem der Kurs geschrieben wurde, gab es kein Problem
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); } }
Dann ging ich direkt zum Testen. Was ist mit dem, was ich getestet habe?
Instanziieren Sie UserService, erstellen Sie ein neues Objekt und rufen Sie dann die Methode direkt auf, um zu sehen, ob UserMapper zum Abfragen der Datenbank aufgerufen werden kann. Dann bekam ich immer wieder Nullzeiger-Ausnahmefehler@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)); } }
Ich dachte einmal, dass die Mapper-Schnittstelle nicht in UserServcie eingefügt wurde, was dazu führte, dass die Methode zum Aufrufen von UserServcie zum Aufrufen von UserMapper leer war, weil ich dachte, es sei der Mapper Das Problem, wie man verschiedene Suchvorgänge löst, habe ich nach ein paar Stunden in den Blogs anderer Leute gefunden
Unser UserMapper ist in UserServiceImpl eingefügt, wir können UserServcieIml nicht direkt verwenden, wenn es in anderen Klassen verwendet wird Für ihre Funktion muss diese Klasse in die aktuelle Klasse eingefügt werden, und der UserService kann aus dem Container abgerufen werden, bevor er ohne Nullzeigerausnahme korrekt aufgerufen werden kann. Ich habe nie herausgefunden, dass es sich um einen sehr einfachen Fehler handelt.
Richtiger Ansatz: Zuerst zum aktuellen Objekt zusammenbauen und dann die Bohne zur Verwendung aus dem Container holen@SpringBootTest class BitApplicationTests { @Autowired private UserService userService; @Test void contextLoads() { System.out.println(userService.queryById(15)); System.out.println(userService.queryById(13)); } }
Das obige ist der detaillierte Inhalt vonWelche Probleme können auftreten, wenn SpringBoot MyBatis integriert?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!