web-dev-qa-db-ja.com

MyBatis Spring MVCエラー:バインドされたステートメントが無効です(見つかりません)

MyBatisを使用して簡単なクエリを実行しようとしたときのスタックトレースは次のとおりです。

org.Apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.my.package.persistence.BrandMapper.getBrand
    org.Apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.Java:189)
    org.Apache.ibatis.binding.MapperMethod.<init>(MapperMethod.Java:43)
    org.Apache.ibatis.binding.MapperProxy.cachedMapperMethod(MapperProxy.Java:58)
    org.Apache.ibatis.binding.MapperProxy.invoke(MapperProxy.Java:51)
    com.Sun.proxy.$Proxy25.getBrand(Unknown Source)
    com.my.package.service.BrandService.getBrand(BrandService.Java:18)
    com.my.package.service.BrandService$$FastClassBySpringCGLIB$$1140c60a.invoke(<generated>)
    org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.Java:204)
    org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.Java:649)
    com.my.package.service.BrandService$$EnhancerBySpringCGLIB$$ea6f89cd.getBrand(<generated>)
    com.my.package.controller.HomeController.getBrands(HomeController.Java:28)
    Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:62)
    Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
    Java.lang.reflect.Method.invoke(Method.Java:483)
    org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.Java:221)
    org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.Java:137)
    org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.Java:110)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.Java:777)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.Java:706)
    org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.Java:85)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.Java:943)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.Java:877)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.Java:966)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.Java:857)
    javax.servlet.http.HttpServlet.service(HttpServlet.Java:622)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.Java:842)
    javax.servlet.http.HttpServlet.service(HttpServlet.Java:729)
    org.Apache.Tomcat.websocket.server.WsFilter.doFilter(WsFilter.Java:52)

XML構成の代わりにJavaconfig構文を使用しています。これが私のPersistenceConfigです:

@Configuration
@EnableTransactionManagement
@MapperScan("com.my.package.persistence")
public class PersistenceConfig {

    @Bean
    public DataSource dataSource() {

        DriverManagerDataSource dataSource = new DriverManagerDataSource();

        try {
            dataSource.setDriverClassName("com.mysql.jdbc.Driver");
            dataSource.setUrl("jdbc:mysql//localhost:3306/db");
            dataSource.setUsername("dbuser");
            dataSource.setPassword("dbpassword");
        } catch (Exception e) {
            System.out.print(e);
        }
        return dataSource;
    }

    @Bean
    public DataSourceTransactionManager transactionManager() {
        return new DataSourceTransactionManager(dataSource());
    }

    @Bean
    public SqlSessionFactoryBean sqlSessionFactory() throws Exception {
        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource());
        sessionFactory.setTypeAliasesPackage("com.my.package.domain");
        return sessionFactory;
    }
}

これが私のコントローラーです:

@Controller
public class HomeController {

    private static Logger logger = LoggerFactory.getLogger(HomeController.class);

    @Autowired
    private BrandService brandService;

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String index() {
        return "index";
    }

    @RequestMapping(value = "/brands", method = RequestMethod.GET)
    public String getBrands(Model model) {
        model.addAttribute("brands",brandService.getBrand(1));
        return "brands";
    }

}

これが私のブランドマッパーインターフェイスです。

public interface BrandMapper {

    Brand getBrand(int id);

    Brand getBrandByName(String name);

    List<Brand> getBrandList();

    void addBrand(Brand brand);

    void updateBrand(Brand brand);

    void deleteBrand(int id);

}

これが私のBrandMapper 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.my.package.persistence.BrandMapper">

    <select id="getBrand" resultType="Brand" parameterType="int">
        SELECT id, name
        FROM brand
        WHERE id = #{id};
    </select>

    <select id="getBrandByName" resultType="Brand" parameterType="String">
        SELECT id, name
        FROM brand
        WHERE name = #{name};
    </select>

    <select id="getBrandList" resultType="Brand">
        SELECT id, name
        FROM brand;
    </select>

    <insert id="addBrand" parameterType="Brand">
        INSERT INTO brand (id, name)
        VALUE (#{id}, #{name})
    </insert>

    <update id="updateBrand" parameterType="Brand">
        UPDATE brand
        SET
        name = #{name}
        where id = #{id}
    </update>

    <delete id="deleteBrand" parameterType="int">
        DELETE FROM brand
        WHERE id = #{id}
    </delete>

</mapper>

私はいくつかの調査を行いましたが、解決策のどれも私のために働いていません。私のXMLマッパーファイルは、「com.my.package.persistence」という名前のパッケージのリソースの下にあります

誰かがここで何が悪いのか考えていますか?

前もって感謝します

6
Jail

Mybatis-conf.xml(このファイルの名前は何であれ)ファイルを確認して、次のようなxmlマッパーがあるかどうかを確認してください。


<mappers> 
    <mapper resource="BrandMapper.xml">
<mappers>

この正確なエラーメッセージがあり、マッパーxmlファイルの名前空間パスであることが判明しました。Javaインターフェースファイルでパッケージ名を変更しましたが、マッパーでパッケージ名を更新するのを忘れていましたxml、少し変わったものです。パッケージの名前空間を更新し、ねえpresto!

1
derek

DbサービスコードのJUNITを実行した場合、それは機能します。したがって、WARファイルが生成されたときの問題は、構成から* Mapper.Javaと* Mapper.xmlが同じ場所を指していると考えられます。したがって、warが両方のJavaとxmlファイルはWEB-INF/classes/com/my/package/persistenceになります。ただし、*。xmlファイルはその場所にコピーされません。1つの方法は、ビルドスクリプトを構成してxmlファイルもコピーするか、リソースにsqlmapディレクトリを作成することです。ディレクトリとすべてのxmlマッパーファイルをディレクトリにコピーし、sessionFactory.setMapperLocationsを使用してmapperfileの場所をポイントします。warファイルが生成されたら、sqlmapディレクトリがWEB-INF/classesディレクトリにあることを確認してください

1
Karthik Prasad

エラーメッセージ

org.Apache.ibatis.binding.BindingException: Invalid bound statement (not found):

おそらく間違ったマッパーが原因ですクエリ構文。私は何度もこの問題を抱えていましたが、そのたびに、エラーはMapper xmlファイルとインターフェースファイルに記述されたクエリの誤った構文によって引き起こされていました。私はあなたに、

  • クエリを適切に再確認してください。これが主にこのエラーの原因です。
  • 構成=>構成ファイル内のマッパーファイル(インターフェイスとxml)の構成が無効であるために発生する可能性もあります。
  • Maven clean、maven install(rebuild)、サーバーの再起動
1
Lucky

SqlSessionFactoryを初期化するときにマッパーの場所を指定する必要があります。

    @Autowired
    private ResourceLoader resourceLoader;

    @Bean
    public SqlSessionFactoryBean sqlSessionFactory() throws Exception {
        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource());
        //sessionFactory.setTypeAliasesPackage("com.my.package.domain");
        sessionFactory.setMapperLocations(ResourcePatternUtils.getResourcePatternResolver(resourceLoader).
            getResources("classpath:path/to/mappers/*.xml"));
        return sessionFactory;
   }

あなたの場合、"classpath:path/to/mappers/*。xml"classpath:com/my/package/persistence/*。xmlに置き換えてください

これがお役に立てば幸いです。

0
JackJonesAngel

マッパーファイルは、* Repo.Javaファイルと同じパッケージに含める必要があります。マッパー名前空間も確認してください。

0
Sravan

クエリから;を削除します。

<select id="getBrand" resultType="Brand" parameterType="int">
    SELECT id, name
    FROM brand
    WHERE id = #{id}
</select>
0
Akash Rajbanshi

多分あなたは@ Aliasアノテーションが必要だと思います:

@Alias( "Brand")クラスBrand {...}

これが私の頭に浮かぶ最初のことです。

0
S_intg