2012-08-05 65 views
1

我想使用的MyBatis運行一個簡單的SQL查詢,但它給我下面的異常運行SQL查詢不能與MyBatis的

java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for com.mycom.myproject.db.mybatis.dao.UserMapper.countByExample 
org.apache.ibatis.session.Configuration$StrictMap.get(Configuration.java:660) 
org.apache.ibatis.session.Configuration.getMappedStatement(Configuration.java:495) 
org.apache.ibatis.session.Configuration.getMappedStatement(Configuration.java:488) 
org.apache.ibatis.binding.MapperMethod.setupCommandType(MapperMethod.java:236) 
org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:71) 
org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:39) 
$Proxy9.countByExample(Unknown Source) 
com.mycom.myproject.controller.LoginController.login(LoginController.java:39) 
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
java.lang.reflect.Method.invoke(Method.java:601) 
org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:213) 
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:126) 
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96) 
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617) 
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578) 
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) 
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923) 
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852) 
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882) 
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 

我UserMapper.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="com.mycom.myproject.db.mybatis.dao.UserMapper" > 
<select id="countByExample" resultType="int"> 
select count(*) from users 
</select> 
</mapper> 

我UserMapper是

public interface UserMapper { 
    int countByExample(); 
} 

我試圖訪問它在我的LoginController

public class LoginController 
{ 
static final Logger logger = Logger.getLogger(LoginController.class); 

@Autowired 
private UserMapper userMapper; 



@RequestMapping("/login") 
public ModelAndView login(@ModelAttribute User userBean, Model model){ 

    int count = userMapper.countByExample(); 

    System.out.println("Count: "+ count);  

    return new ModelAndView("login", "userBean", userBean); 

} 
    } 

我的彈簧servlet.xml文件是

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:p="http://www.springframework.org/schema/p" 
xmlns:context="http://www.springframework.org/schema/context" 
xmlns:mvc="http://www.springframework.org/schema/mvc" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.1.xsd 
    http://www.springframework.org/schema/mvc 
    http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd"> 



<context:annotation-config /> 

<context:component-scan 
    base-package="com.mycom.myproject" /> 

<!-- Enable annotation driven controllers, validation etc... --> 
<mvc:annotation-driven /> 

<mvc:resources mapping="/resources/**" location="/resources/" /> 


<bean id="datasource" class="org.apache.commons.dbcp.BasicDataSource"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/> 
    <property name="url" value="jdbc:mysql://localhost/mydatabase"/> 
    <property name="username" value="root"/> 
    <property name="password" value="root"/> 
</bean> 

<!-- Declare a transaction manager --> 

<bean id="transactionManager" 
class="org.springframework.jdbc.datasource.DataSourceTransactionManager" 
p:dataSource-ref="datasource" /> 


<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 
    <property name="dataSource" ref="datasource" /> 
</bean> 

<!-- scan for mappers and will automatically scan the whole classpath for xmls --> 
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 
    <property name="sqlSessionFactory" ref="sqlSessionFactory" /> 
    <property name="basePackage" value="com.mycom.myproject.db.mybatis.dao" /> 
</bean> 


<bean id="viewResolver" 
    class="org.springframework.web.servlet.view.UrlBasedViewResolver"> 
    <property name="viewClass" 
     value="org.springframework.web.servlet.view.JstlView" /> 
    <property name="prefix" value="/WEB-INF/jsp/" /> 
    <property name="suffix" value=".jsp" /> 
</bean> 

我不知道爲什麼這個錯誤即將到來。

+1

它看起來像myBatis沒有找到您的查詢。 UserMapper.java和UserMapper.xml在同一個文件夾中嗎?如果您正在使用Maven,請確保將UserMapper.xml正確複製到類路徑中。 – jddsantaella 2012-08-06 10:58:09

+0

嗨jddsantaella,謝謝你的回覆。我的UserMapper.xml位於com.mycom.myproject.db.mybatis.sqlmap包中,而我的UserMapper.java類位於com.mycom.myproject.db.mybatis.dao包中。那麼你的意思是UserMapper.xml和UserMapper.java應該位於dao pr sqlmap包中嗎?不,我沒有使用Maven – user965884 2012-08-06 11:13:38

+0

是的,他們都應該在com.mycom.myproject.db.mybatis.dao中,因爲您正在對myBatis進行掃描。讓我知道它是否有效,我會寫一個答案。 – jddsantaella 2012-08-06 11:21:33

回答

6

縱觀到錯誤

Mapped Statements collection does not contain value for com.mycom.myproject.db.mybatis.dao.UserMapper.countByExample 

它看起來像MyBatis沒有找到您的查詢。這可能是因爲它沒有找到你的XML映射。它應該與你的配置根據在com.mycom.myproject.db.mybatis.dao package

<!-- scan for mappers and will automatically scan the whole classpath for xmls --> 
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 
    <property name="sqlSessionFactory" ref="sqlSessionFactory" /> 
    <property name="basePackage" value="com.mycom.myproject.db.mybatis.dao" /> 
</bean> 

在項目結構,UserMapper.java和UserMapper.xml可以在不同的文件夾(如果你想分開java文件,XML),但他們應該在一個名稱相同的包,它們應該在war構建過程中的相同文件夾中合併,因爲它們都應該在類路徑中根據您的配置提供。

+0

嗨jddsantaella,我需要你的幫助了。您可以看看http://stackoverflow.com/questions/12103606/get-the-id-of-last-inserted-record-in-mybatis上發佈的問題 – user965884 2012-08-24 08:38:36