Ответ 1
ОК, получилось - это происходит потому, что я использовал XML файл для конфигурации и аннотации для самих mappers - и mybatis не находит аннотации mapper при использовании конфигурации XML.
Смотрите этот следующий вопрос.
Я настраиваю mybatis с помощью аннотаций и получаю это полезное исключение
org.apache.ibatis.binding.BindingException: Тип интерфейса org.foo.Bar не известный MapperRegistry
Googling it не находит ничего, кроме руководства пользователя. Что мне не хватает?
ОК, получилось - это происходит потому, что я использовал XML файл для конфигурации и аннотации для самих mappers - и mybatis не находит аннотации mapper при использовании конфигурации XML.
Смотрите этот следующий вопрос.
только для тех, кто оказался здесь, потому что они новичок в mybatis
http://www.mybatis.org/core/configuration.html
http://www.mybatis.org/mybatis-3/configuration.html
в разделе конфигурационных файлов конфигурации
<mappers>
<mapper class="my.package.com.MyClass"/>
</mappers>
это приведет вас к запуску с помощью config.xml и аннотированных интерфейсов
добавьте класс Mapper в конфигурацию SqlSessionFactory следующим образом:
SqlSessionFactory factory = new SqlSessionFactoryBuilder()
.build(reader);
//very import
factory.getConfiguration().addMapper(BarMapper.class);
SqlSession sqlSession = factory.openSession();
В вашем пространстве имен mapper.xml файла mapper должен быть путь к интерфейсу mapper.
например:
<mapper namespace="com.mapper.LineMapper">
<select id="selectLine" resultType="com.jiaotong114.jiaotong.beans.Line">
select * from bus_line where id = #{id}
</select>
</mapper>
ваш интерфейс mapper должен быть в пакете com.mapper, а его имя - LineMapper.
Возможно, ваш файл mapper.xml использует неправильное пространство имен (возможно, из-за ошибки копирования).
Например, скажем, у вас есть Java-интерфейс под названием MyEntityMapper.java
, который должен быть связан с конфигурацией xml-конфигуратора mybatis, называемой MyEntityMapper.xml
:
MyEntityMapper.java
package my.mappers;
public interface MyEntityMapper {
MyEntity getById(@Param("id") String id);
}
MyEntityMapper.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="non.existent.package.NonExistentMapper">
<resultMap id="MyEntityResultmap" type="MyEntity">
<!-- some result map stuff here -->
</resultMap>
<select id="getByUuid" resultMap="MyEntityResultMap">
<!-- some sql code here -->
</select>
</mapper>
Обратите внимание, что атрибут namespace
в элементе <mapper>
в MyEntityMapper.xml
указывает на несуществующий mapper non.existent.package.NonExistentMapper
, когда он действительно должен указывать на my.mappers.MyEntityMapper
.
Интерфейс типа org.domain.classmapper не известен MapperRegistry
MyBatis выдает это исключение, если полный пакет/класс не вводится в пространство имен xper-сервера.
например.
<mapper namespace="classmapper">
вызывает исключение, но
<mapper namespace="org.domain.classmapper">
работает
Произошло со мной при создании shadowJar/bootJar для проекта весенней загрузки и использовании плагина gradle org.springframework.boot
Когда файлы jar заархивированы внутри bootJar, myBatis может не найти файлы конфигурации XML и выдаст описанное исключение
добавив этот блок в файл build.gradle:
bootJar {
requiresUnpack '**/MyProblematic.jar'
}
решил мою проблему