Mybatis — неверный связанный оператор (не найден)

Я создал новый проект, используя mybatis для подключения к базе данных mysql. Это мой второй проект с использованием mybatis, поэтому я с ним знаком, но при вызове метода сохранения получаю следующую ошибку:

2019-03-05 10:08:01.031 ОШИБКА 86438 --- [nio-9905-exec-1] cqfrcResolveRestController: ошибка при запуске предустановки: неверный связанный оператор (не найден): com.qlsdistribution.fps.resolverender.data.mybatis .mapper.ResolveJobReportMapper.saveResolveJobReport org.apache.ibatis.binding.BindingException: неверный связанный оператор (не найден): com.qlsdistribution.fps.resolverender.data.mybatis.mapper.ResolveJobReportMapper.saveResolveJobReport в org.apache.ibatis.binding.MapperMethod$SqlCommand.(MapperMethod.java:232) ~[mybatis-3.5.0.jar:3.5.0] в org.apache.ibatis.binding.MapperMethod.(MapperMethod.java:50) ~[mybatis-3.5.0.jar:3.5.0] в org.apache.ibatis.binding.MapperProxy.lambda$cachedMapperMethod$0(MapperProxy.java:62) ~[mybatis-3.5.0.jar:3.5.0] в java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1660) ~[na:1.8.0_101] в org.apache.ibatis.binding.MapperProxy.cachedMapperMethod(MapperProxy.java:62) ~[mybatis-3.5.0.jar:3.5.0] .....

Мой конфигурационный файл mybatis выглядит следующим образом (в src/main/resources):

<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
    <settings>
        <!-- changes from the defaults -->
       <setting name = "lazyLoadingEnabled" value = "true" />
       <!-- Mybatis logging -->
       <setting name = "logImpl" value = "LOG4J2"/>
    </settings>
    <typeAliases>
        <package name = "com.qlsdistribution.fps.resolverender.data.mybatis.domain"/>

    </typeAliases>

   <mappers>
      <mapper resource = "mapper/ResolveJobReport.xml"/>
<!--       <mapper resource = "com/qlsdistribution/fps/resolverender/data/mybatis/mapper/ResolveJobReport.xml"/> -->
   </mappers>
</configuration>

Как вы можете видеть, я пробовал разные места для xml-файла преобразователя, но если я поместил неверный синтаксис в xml-файл преобразователя, вместо этого произойдет сбой с недопустимым синтаксисом (SAXParseException), поэтому я знаю, что XML-файл преобразователя читается.

XML-файл картографа выглядит следующим образом (в src/main/resources/mapper):

<?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.qlsdistribution.fps.resolverender.data.mybatis.ResolveJobReportMapper">

    <resultMap id = "resolveJobReport" type = "com.qlsdistribution.fps.resolverender.data.mybatis.domain.ResolveJobReport">
        <result property = "id" column = "id" />
        <result property = "fpsProjectName" column = "fps_project_name" />
        <result property = "inputPath" column = "input_path" />
        <result property = "destinationPath" column = "destination_path" />
        <result property = "presetName" column = "preset_name" />
        <result property = "ipAddress" column = "ip_address" />
        <result property = "frameRate" column = "frame_rate" />
        <result property = "resolveProjectName" column = "resolve_project_name" />
        <result property = "width" column = "width" />
        <result property = "height" column = "height" />
        <result property = "renderFormat" column = "render_format" />
        <result property = "renderCodec" column = "render_codec" />
        <result property = "scriptPath" column = "script_path" />
        <result property = "cliOutput" column = "cli_output" />
        <result property = "jobStartedDate" column = "job_started_date" />
        <result property = "jobFinishedDate" column = "job_finished_date" />
        <result property = "createdBy" column = "created_by" />
        <result property = "createdDate" column = "created_date" />
        <result property = "modifiedBy" column = "modified_by" />
        <result property = "modifiedDate" column = "modified_date" />
    </resultMap>

    <select id = "getAllResolveJobReports" resultMap = "resolveJobReport">
        SELECT id, fps_project_name, input_path, destination_path, preset_name, ip_address, frame_rate, resolve_project_name, width, height, 
        render_format, render_codec, script_path, cli_output, job_started_date, job_finished_date, created_by, created_date, modified_by, modified_date
        FROM resolve_job_report
        WHERE fps_setting_id = #{value}
        ORDER by id desc;
    </select>

    <select id = "getAllResolveJobReportsById" parameterType = "Long"  resultMap = "resolveJobReport">
        SELECT id, fps_project_name, input_path, destination_path, preset_name, ip_address, frame_rate, resolve_project_name, width, height, 
        render_format, render_codec, script_path, cli_output, job_started_date, job_finished_date, created_by, created_date, modified_by, modified_date
        FROM resolve_job_report
        WHERE id = #{value};
    </select>

    <insert id = "saveResolveJobReport" parameterType = "com.qlsdistribution.fps.resolverender.data.mybatis.domain.ResolveJobReport">
        INSERT INTO resolve_job_report 
        (fps_project_name, input_path, destination_path, preset_name, ip_address, frame_rate, resolve_project_name, width, height, 
        render_format, render_codec, script_path, cli_output, job_started_date, job_finished_date, created_by)
        VALUE 
        (#{fpsProjectName},#{inputPath},#{destinationPath},#{presetName},#{ipAddress},#{frameRate},#{resolveProjectName},#{width},#{height},
        #{renderFormat},#{renderCodec}, #{scriptPath},#{cliOutput},#{jobStartedDate},#{jobFinishedDate},#{createdBy});
    </insert>

    <update id = "updateResolveJobReportById" parameterType = "resolveJobReport">
        UPDATE resolve_job_report
        SET
        fps_project_name = #{fpsProjectName}, 
        input_path = #{inputPath}, 
        destination_path = #{destinationPath}, 
        preset_name = #{presetName}, 
        ip_address = #{ipAddress}, 
        frame_rate = #{frameRate}, 
        resolve_project_name = #{resolveProjectName}, 
        width = #{width}, 
        height = #{height}, 
        render_format = #{renderFormat}, 
        render_codec = #{renderCodec}, 
        script_path = #{scriptPath}, 
        cli_output = #{cliOutput}, 
        job_started_date = #{jobStartedDate}, 
        job_finished_date = #{jobFinishedDate},
        modified_by = #{modifiedBy}
        where id = #{id};
    </update>

    <delete id = "deleteResolveJobReporttById" parameterType = "Long">
        DELETE FROM resolve_job_report
        WHERE id = #{value}
    </delete>
</mapper>

Мой файл application.properties содержит следующее (в (src/main/resources):

spring.datasource.url=jdbc:mysql://localhost:3306/fpsresolvetool?createDatabaseIfNotExist=true&autoReconnect=true&useSSL=false
spring.datasource.username=root
spring.datasource.password=
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
spring.datasource.schema=classpath:schema.sql

mybatis.config-location=classpath:SqlMapConfig.xml

Я даже пытался использовать последние версии mybatis в своем pom.xml:

    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>2.0.0</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.0.0</version>
    </dependency>

Мое весеннее загрузочное приложение выглядит следующим образом:

@SpringBootApplication
@EnableScheduling
@ComponentScan({"com.qlsdistribution.fps.resolverender"})
@EnableJms
@MapperScan("com.qlsdistribution.fps.resolverender.data.mybatis")
public class FPSResolveRenderApp implements WebMvcConfigurer {
    /** UTF-8 Character set name */
    private static final String UTF_8 = "UTF-8";

    /** Logger */
    private static final Logger logger = LogManager.getLogger(FPSResolveRenderApp.class);

    public static void main(String[] args) {
        new SpringApplicationBuilder(FPSResolveRenderApp.class).run(args);

    }

    /**
     * Creates and gets the FilterRegistrationBean
     * @return
     */
    @Bean
    public FilterRegistrationBean<CharacterEncodingFilter> filterRegistrationBean() {
        FilterRegistrationBean<CharacterEncodingFilter> registrationBean = new FilterRegistrationBean<CharacterEncodingFilter>();
        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        characterEncodingFilter.setEncoding(UTF_8);
        registrationBean.setFilter(characterEncodingFilter);
        return registrationBean;
    }
}

Интерфейс маппера выглядит следующим образом:

@Mapper
public interface ResolveJobReportMapper {

    public List<ResolveJobReport> getAllResolveJobReports();

    public List<ResolveJobReport> getAllResolveJobReports(RowBounds rowBounds);

    public List<ResolveJobReport> getAllResolveJobReportsById(Long id);

    public List<ResolveJobReport> getAllResolveJobReportsById(Long id, RowBounds rowBounds);

    public void saveResolveJobReport(ResolveJobReport resolveJobReport);

    public void updateResolveJobReportById(ResolveJobReport resolveJobReport);

    public void deleteResolveJobReporttById(Long id);

}

И класс обслуживания следующий:

@Service("ResolveJobReportService")
public class ResolveJobReportService {

    @Autowired
    private ResolveJobReportMapper resolveJobReportMapper= null;

    public List<ResolveJobReport> getAllResolveJobReports() {
        return resolveJobReportMapper.getAllResolveJobReports();
    }

    public List<ResolveJobReport> getAllResolveJobReports(RowBounds rowBounds) {
        return resolveJobReportMapper.getAllResolveJobReports();
    }

    public List<ResolveJobReport> getAllResolveJobReportsById(Long id) {
        return resolveJobReportMapper.getAllResolveJobReportsById(id);
    }

    public List<ResolveJobReport> getAllResolveJobReportsById(Long id, RowBounds rowBounds) {
        return resolveJobReportMapper.getAllResolveJobReportsById(id);
    }

    public void saveResolveJobReport(ResolveJobReport resolveJobReport) {
        resolveJobReportMapper.saveResolveJobReport(resolveJobReport);
    }

    public void updateResolveJobReportById(ResolveJobReport resolveJobReport) {
        resolveJobReportMapper.updateResolveJobReportById(resolveJobReport);
    }

    public void deleteResolveJobReporttById(Long id) {
        resolveJobReportMapper.deleteResolveJobReporttById(id);
    }

}

Может ли кто-нибудь увидеть, что не так.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
6
0
22 320
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

Проблема возникает из-за того, что namespace в mapper xml — это com.qlsdistribution.fps.resolverender.data.mybatis.ResolveJobReportMapper, а в пакете интерфейс mapper — com.qlsdistribution.fps.resolverender.data.mybatis.mapper.ResolveJobReportMapper.

Чтобы исправить это, убедитесь, что они совпадают.

У меня было такое же сообщение об ошибке, когда я изменил свой проект с проекта JavaFX на проект Maven.

Мне пришлось переместить все мои файлы сопоставления xml в папку ресурсов. После этого работал нормально.

Я столкнулся с этой проблемой недавно и проверил все, что можно найти в Интернете. Стоил мне целого дня.

Наконец, я положил файлы xml в одно место с java-файлами интерфейса, что решило проблему.

Я думаю, это потому, что по каким-то причинам файлы xml не могут быть найдены, и размещение их там делает их видимыми.

У меня была такая же проблема

для меня исправление давало одно и то же имя файла как для java (класс интерфейса сопоставления), так и для соответствующего файла xml

Для тех, кто использует MyBatis без xml в весеннем загрузочном проекте:

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>

Пожалуйста, проверьте свой класс приложения весенней загрузки, убедитесь, что ваш @MapperScan соответствует вашему dao пакету.

@MapperScan("com.jjs.videoservice.dao") 

Путь должен быть таким же, как у вашего пакета dao (содержит интерфейс вашего картографа), я проигнорировал «dao» и вызвал проблему.

Надеюсь кому-нибудь поможет, спасибо

Поместите его в application.properties mybatis.mapper-locations=classpath*:**/mappers/*Mapper.xml

Другие вопросы по теме