Request processing failed; nested exception is org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):

2022. 12. 15. 13:20[Error]_

728x90
반응형

환경 

Eclipse 최신버전 2022-09 (4.25.0)

Tomcat - 10.0.23  v

maven Artifact ID : maven-archetype-webapp 1.4v

Spring 6.0.2 ver

Spring Security 6.0.0 ver

spring-jdbc : 6.0.2 ver

mybatis : 3.5.11ver

mybatis-spring : 3.0.1ver

 

eclipse-maven spring 프로젝트에서

mybatis 연동시 오류발생

 

연동 과정은 다음 포스트 참고

https://yn971106.tistory.com/166

 

[Spring]_Oracle 연결 & Mapper 연동 ( Error 정리)

개요 Intellij를 사용하다가 다음 프로젝트가 Eclipse 환경으로 인해 Eclipse 에 spring 최신버전을 설치하였고 Oracle 연동 및 Mapper 환경 구현 환경 Eclipse 최신버전 2022-09 (4.25.0) Tomcat - 10.0.23 v maven Artifact I

yn971106.tistory.com


오류 로그

Request processing failed; nested exception is org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):

 

원인

Mapper interface 와 Mapper.xml 파일간 바인딩이 되지 않아서 발생한 오류입니다.

 

원인은 여러가지가 있습니다.

 

 

해결

mapper.xml 과 interface 간의 바인딩 오류

 

1. mapper.xml 에 정의된 namespace 가 해당 interface 경로와 같지 않은 경우

 

mapper.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.yoon.mapper.MenuMapper">

	<select id="menuTest"  resultType="HashMap">
		select 
		*
		from user_info_manager
	</select>

</mapper>

mapper interface

package com.yoon.mapper;

import java.sql.SQLException;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Mapper;



@Mapper
public interface MenuMapper {

	public List<Map<String,String>> menuTest() throws SQLException;
	
}

 

2. namespace 가 중복될 경우

바인딩 오류가 납니다. namespace는 중복되지 않도록 합니다.

 

3. Parameter 와 bean 의 필드명이 다른 경우

 

4.mapper.xml 에서의 query id 가 interface의 메소드명과 일치하지 않은경우

 


dataSourceContext 설정의 문제일 경우

       <mybatis:scan base-package="com.yoon.mapper"  lazy-initialization="true" />

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

 

1. sqlSessionFactory 빈 생성시 configLocation 부분을 지정하였는데,

해당 설정파일에

<configuration> 태그가 없거나 스펠링이 틀린경우

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
	<settings>
		<setting name="cacheEnabled" value="true"/>
	</settings>
</configuration>

setting 값이 없더라도, configuration 태그는 반드시 필요합니다.

 

2. dataSourceContext 에서 mybatis - scan 이 작동하지 않는 경우

 

제가 한참 삽질했던 부분입니다.

 

원래는

    <mybatis:scan base-package="com.yoon"  lazy-initialization="true" />

로 작성하고, mapper interface 파일을 한곳에 몰지 않고 메뉴 package 별로 분리하여 관리하려고 하였습니다만..

 

위 사진에서 menu 관련 controller 와 service package를 몰아서 관리하는것 처럼

mapper도 menu 하위에 두었습니다.

 

하지만 mapper scan 시 com.yoon 하위의 모든 mapper interface 를 스캔하지 못하였기 때문에

com.yoon.mapper 디렉토리를 생성하고 해당 폴더 아래의 모든 xml 을 scan 하도록 하니 정상 작동하였습니다.

 

 

감사합니다.

 

728x90
반응형