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 < #{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, поэтому мне потребовалось некоторое время, чтобы понять, почему...