mybatis spring mvc application,获取无效的绑定语句(未找到)

时间:2013-12-06 15:09:23

标签: spring spring-mvc mybatis

这是我的第一个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>

映射器文件 - &gt; /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>

映射器文件 - &gt; /classes/org/mydomain/formulary/drugmaster/dao/DrugMasterDao.java

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

控制器文件 - &gt; /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*/;

}
}    

服务文件 - &gt; /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 - &gt;

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

enter image description here

17 个答案:

答案 0 :(得分:23)

我在查找错误时搜索了这个答案。它实际上与OP的问题无关,但例外是相同的,这个问题在谷歌中非常明显。

在我的情况下,我忘记更改映射器名称空间

DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
bin=${DIR}/../
lib=${DIR}/../../lib

echo '
{
    "type" : "jdbc",
    "jdbc" : {
        "schedule" : "0 0/1 * 1/1 * ? *",
        "url" : "jdbc:mysql://localhost:3306/mydb",
        "user" : "",
        "password" : "",
        "elasticsearch" : {
            "cluster" : "elasticsearch",
            "host" : "localhost",
            "port" : 9300
        },
        "sql" : [
            {
                "statement" : "/var/test.sql"
            }
        ],
        "index" : "myindex",
        "type" : "mytype"
    }
} ' | java \
    -cp "${lib}/*" \
    -Dlog4j.configurationFile=${bin}/log4j2.xml \
    org.xbib.tools.Runner \
    org.xbib.tools.JDBCImporter

导致了同样的问题。

答案 1 :(得分:5)

在阅读此页面中的配置后,我遇到了同样的问题。 https://mybatis.github.io/spring/mappers.html#scan

我看到我的配置是正确的。所以调试我的应用程序发现我的* mappers.xml文件不在路径中。期望一定是。

我在maven项目的同一个文件夹src“java”中有XML文件。所以当我构建我的应用程序时,文件不会复制到classes文件夹。所以我必须将xml文件移动到文件夹“resources”。并解决问题。

答案 2 :(得分:4)

因为你的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>

答案 3 :(得分:2)

我使用solution of Giovanni Perea的变体解决了同样的问题(谢谢)。我将.xml映射器文件放在与.java映射文件相同的文件夹中,并使用maven和maven-resources-plugin。

在我的解决方案中,我在maven-resources-plugin中添加了一个执行程序,用于将所有.xml映射文件复制到正确的位置(.class映射文件的相同文件夹):

<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的更多示例:Including and excluding files and directories

如果您不使用maven-resources-plugin,请参阅: https://stackoverflow.com/a/12446666/2473158

答案 4 :(得分:2)

很可能是java方法名称和XML块名称不匹配

e.g mapper.getUser()  

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

getUser明显不同于getUsee

答案 5 :(得分:2)

我的spring-boot mybatis应用程序有类似的问题。 问题是mybatis找不到配置文件。添加后

mybatis.config-location=classpath:mybatis-config.xml
在application.properties文件中

,问题得到了解决。看起来问题总是围绕配置文件/映射器文件和语句名称。

答案 6 :(得分:1)

在我的情况下,它是mapper xml语句的id中的拼写错误,例如

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

List<T> getData()

将XML中的id更改为正确的函数名称后,就可以了。

答案 7 :(得分:1)

除了上面提到的@Dariusz之外,我还忘记添加映射器位置。

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

答案 8 :(得分:1)

将mapper / drugmasterDao.xml重命名为mapper / DrugMasterDao.xml,该名称必须与* Dao.java文件名匹配,否则会抛出错误 要么 我们必须明确地创建Ibatismapping.xml并在那里添加mapper配置

答案 9 :(得分:1)

在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>

答案 10 :(得分:0)

DrugMasters属性定义必须与drug_id,drug_name,drug_alert_date,drug_alert_source,rownum相关联。

答案 11 :(得分:0)

我在开发过程中也遇到过这个问题。 通常,如果你使用spring,myBatis等的xml配置文件,那么这个问题主要是由你的xml配置文件中的一些错误引起的。

Dariusz最投票的答案表明myBatis xml配置文件中可能存在一些问题,而在我的情况下,我发现spring xml配置文件中的问题也可能导致此问题。

在这篇文章的情况下,在applicationContext.xml(应该是Spring的配置文件)中,我们可以看到MapperScannerConfigurer的basePackage配置:

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

因此,如果此属性的值错误(包名称不正确),则也会导致此问题。

答案 12 :(得分:0)

2要点

  1. 检查XML和Java方法中的方法名称是否相同。
  2. @MapperScan(com.xxx)涵盖了所需的包。如果您使用的是注释,则<script> var flag = 0; function myFunction() { var str = "Visit W3Schools!"; var n = str.search(/w3Schools/i); if(flag){ document.getElementById("demo").innerHTML = myFunction.flag; flag = 0; } else { document.getElementById("demo").innerHTML = myFunction.flag; flag = 1; } } </script> 必须位于已定义的路径中。

答案 13 :(得分:0)

就我而言,我有多个DataSource,应该为每个SessionFactory设置mappler位置。

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

答案 14 :(得分:0)

检查mapper中是否有任何重载方法。请尝试使用单独的名称。

答案 15 :(得分:0)

就我而言,在批注中使用查询时,我对批注中的XML被解释为XML的事实没有给予足够的重视。

如果有的话

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

<>弄乱了XML。您需要将其放在CDATA部分中

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

答案 16 :(得分:0)

(可能有很多原因,我的案子有点稀奇古怪,很难发现,所以我想在这里添加答案,以防万一有人做与我相同的事情。)

在我的情况下,原因在IDEA中,当为映射器文件创建多级包时,我输入mybatis.mapper,该包仅创建一个单个目录,但其名称包含.

实际上我应该输入mybatis/mapper一次创建多级目录。

在这两种情况下,该目录在IDEA的项目视图中显示为与mybatis.mapper相同,因此花了我一段时间才弄清楚为什么...