Я создал новый проект, используя 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);
}
}
Может ли кто-нибудь увидеть, что не так.




Проблема возникает из-за того, что 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