Mybatis spring приложение mvc, получение Invalid bound statement (не найдено)

это мое первое приложение mybatis spring mvc с использованием spring 3.2.4, mybatis- spring -1.2.1

Когда я пытаюсь вызвать свой веб-сервис, я получаю сообщение об ошибке::

org.springframework.web.util.NestedServletException: Request processing failed; 
nested exception is org.apache.ibatis.binding.BindingException: Invalid bound 
statement (not found): 
org.mydomain.formulary.drugmaster.dao.DrugMasterDao.getDrugsWithAlert

Я должен упустить что-то очевидное. Спасибо за любую помощь

Вот мои связанные файлы: applicationContext.xml

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="formularyDb" />
    <property name="configLocation"  value="file:/web/sites/drugformulary-spring/config/mybatis-config.xml" />
</bean>

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="org.mydomain.formulary.mappers" />
</bean>
<bean id="DrugMasterDao" class="org.mybatis.spring.mapper.MapperFactoryBean">
    <property name="mapperInterface" value="org.mydomain.formulary.drugmaster.dao.DrugMasterDao" />
    <property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
    <constructor-arg index="0" ref="sqlSessionFactory" />
</bean>

mapper file → /classes/org/mydomain/formulary/mappers/drugmasterDao.xml

<mapper namespace="org.mydomain.formulary.drugmaster.dao.DrugMasterDao">

<select id="getDrugsWithAlert" parameterType="int" resultType="org.mydomain.formulary.drug_master.model.DrugMasters">
    Select drug_id,drug_name,drug_alert_date,drug_alert_source, rownum
    from (select drug_id,drug_name,to_char(drug_alert_datetime,'MM/DD/YYYY') as drug_alert_date ,drug_alert_source, rownum
    from drug_master
    where drug_status ='A' and length(drug_alert) > 0
    order by drug_alert_datetime DESC )
    where
    <if test="_parameter != null">
        rownum &lt; #{count}
    </if>
</select>
</mapper>

mapper file → /classes/org/mydomain/formulary/drugmaster/dao/DrugMasterDao.java

public interface DrugMasterDao {
    public List<DrugMasters> getDrugsWithAlert(int count);
}

файл контроллера → /classes/org/mydomain/formulary/drugmaster/controller/DrugMasterController.java

@Controller
public class DrugMasterController {
@Autowired
DrugMasterService drugMasterService;


@RequestMapping(value = "/drugmaster/withalerts/count/{count}", method = RequestMethod.GET)
public String withAlerts(ModelMap model, @PathVariable int count) {

    List<DrugMasters> drugs = drugMasterService.getDrugsWithAlert(count);

    return null/*for now*/;

}
}    

служебный файл → /classes/org/mydomain/formulary/drugmaster/service/DrugMasterServiceImpl.java

@Service
public class DrugMasterServiceImpl implements DrugMasterService {

    @Autowired
    DrugMasterDao drugMasterDao;

    public List<DrugMasters> getDrugsWithAlert(int count){
        return drugMasterDao.getDrugsWithAlert(count);
    }
}

mybatis-configfile →

<configuration>
<settings>
    <setting name="cacheEnabled" value="false" />
    <setting name="lazyLoadingEnabled" value="false" />
</settings>
</configuration>

enter image description here

Ответ 1

Я искал этот ответ при поиске моей ошибки. Это фактически не связано с проблемой OP, но исключение одно и то же, и этот вопрос очень заметен в google.

В моем случае я забыл изменить пространство имен mapper

<mapper namespace="pl.my.package.MyNewMapper">

Это привело к той же проблеме.

Ответ 2

У меня была такая же проблема, поэтому после прочтения конфигураций на этой странице. https://mybatis.github.io/spring/mappers.html#scan

Я понял, что моя конфигурация верна. поэтому отладка моего приложения. обнаружил, что мои файлы * mappers.xml, где нет в пути. которые ожидаются.

У меня были файлы XML в той же папке src "java" в моем проекте maven. поэтому, когда я создаю свои приложения, файл не копируется в папку классов. Поэтому мне нужно переместить xml файлы в "ресурсы" папки. и устранить проблему.

Ответ 3

Поскольку ваш xml не загружается в mybatis, MapperScannerConfigurer работает только интерфейс сканирования, а не xml. Иметь два пути:

<mappers>
    <mapper resource="org/mydomain/formulary/mappers/drugmasterDao.xml"/>
</mappers>

или

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="configLocation" value="classpath:mybatis-config.xml"/>
    <property name="dataSource" ref="dataSource"/>
    <property name="mapperLocations" value="classpath*:org/mydomain/**/*.xml"/>
</bean>

Ответ 4

Я решил ту же проблему с вариантом решения Giovanni Perea (спасибо). У меня есть файлы .xml mapper в той же папке с .java mapper файлами, и я использую maven с maven-resources-plugin.

В моем решении я добавляю выполнение в maven-resources-plugin для копирования всего файла .xml mapper в нужное место (та же папка файлов .class mapper):

<execution>
    <id>copy-mappers-xml</id>
    <phase>validate</phase>
    <goals>
        <goal>copy-resources</goal>
    </goals>
    <configuration>
        <outputDirectory>${project.build.directory}/classes/com/myapplication/mapper</outputDirectory>
        <resources>          
            <resource>
                <directory>${project.basedir}/src/main/java/com/myapplication/mapper/</directory>
                <filtering>false</filtering>
                <includes>
                    <include>*.xml</include>
                </includes>
            </resource>
        </resources>              
     </configuration>
</execution>

Дополнительные примеры с maven-resources-plugin: Включение и исключение файлов и каталогов

Если вы не используете maven-resources-plugin, см. fooobar.com/questions/491703/...

Ответ 5

У меня была аналогичная проблема для моего приложения spring -boot mybatis. Проблема заключалась в том, что mybatis не смог найти файл конфигурации. После добавления

mybatis.config-location=classpath:mybatis-config.xml

в файле application.properties, проблема решена. Похоже, что проблема всегда связана с файлами конфигурации/файлами карт и именами операторов.

Ответ 6

скорее всего, имя метода java и имя блока XML не совпадают

e.g mapper.getUser()  

 <select id="getUsee" resultMap="student">
    ...........
 <>

getUser явно отличается от getUsee

Ответ 7

в конфигурации spring, например, с использованием xml, убедитесь, что файлы mapper.xml расположены в месте, назначенном как значение свойства с именем mapperLocations. Однажды я получил его в mappers/anotherfolder/*. Xml. И это вызывает боль.

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="typeAliasesPackage" value="somepackage.model"/>
    <property name="mapperLocations" value="classpath*:mappers/*.xml"/>
</bean>

Ответ 8

В моем случае это была ошибка опечатки в идентификаторе оператора xper mapper, например.

<select id="getDtaa" resultType="Data">

List<T> getData()

После изменения идентификатора в XML с правильным именем функции он работал.

Ответ 9

Переименуйте mapper/drugmasterDao.xml в mapper/DrugMasterDao.xml, имя должно совпадать с именем файла * Dao.java, в противном случае выдается ошибка, или мы должны явно создать Ibatismapping.xml и добавить туда конфигурацию mapper.

Ответ 10

За исключением @Dariusz, упомянутого выше, я также забыл добавить местоположение Mapper.

<property name="mapperLocations" value="classpath:mybatis/mappers/*.xml"/>

Ответ 11

Определения атрибутов DrugMasters должны ассоциироваться с drug_id, drug_name, drug_alert_date, drug_alert_source, rownum.

Ответ 12

Проверьте, есть ли какой-либо метод перегрузки в mapper. Вместо этого попробуйте использовать другое имя.

Ответ 13

Я также столкнулся с этой проблемой в своем развитии. В общем случае, если вы используете xml файлы конфигурации для spring, myBatis и т.д., Эта проблема в основном вызвана некоторой ошибкой в ​​ваших конфигурационных файлах xml.

Самый проголосовавший ответ Дариуша показал, что в файле конфигурации myBatis xml могут быть проблемы, в то время как в моем случае я обнаружил, что проблемы в файле конфигурации spring xml также могут привести к этой проблеме.

В ситуации этого сообщения в applicationContext.xml(который должен быть конфигурационным файлом Spring), мы можем увидеть конфигурацию basePackage для MapperScannerConfigurer:

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="org.mydomain.formulary.mappers" /> </bean>

поэтому, если значение для этого свойства неверно (имя пакета неверно), это также приведет к этой проблеме.

Ответ 14

2 Точки для покрытия

  • Проверьте, совпадает ли имя метода как в методах XML, так и в Java.
  • Mapper:scan охватывает требуемый пакет. Если вы используете аннотацию, тогда @MapperScan(com.xxx) должен находиться в определенном пути.

Ответ 15

В моем случае у меня было несколько DataSource и я должен установить расположение картографов для каждого SessionFactory.

SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(mysqlDataSource);
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
sessionFactory.setMapperLocations(resolver.getResources("classpath:mappers/**/*Mapper.xml"));

Ответ 16

В моем случае, используя запрос в аннотации, я не уделял должного внимания тому факту, что XML в аннотации интерпретируется как XML.

Так что если у вас есть

@Select("select * from table where id <> 'blabla'")

<> Портит XML. Вы должны поместить его в раздел CDATA

@Select("select * from table where id <![CDATA[ <> ]]> 'blabla'")

Ответ 17

(Может быть много причин, мой случай немного редкий и странный, его трудно обнаружить, поэтому я хотел бы добавить ответ здесь, на случай, если кто-то сделал то же самое, что и я.)

В моем случае, причина в IDEA, когда я создаю многоуровневый пакет для файла mapper, я mybatis.mapper, который создает только один mybatis.mapper, но с именем name . ,

Хотя на самом деле я должен ввести mybatis/mapper чтобы создать многоуровневый mybatis/mapper сразу.

В этих двух случаях mybatis.mapper отображается так же, как mybatis.mapper в виде проекта IDEA, поэтому мне потребовалось некоторое время, чтобы понять, почему...