2022. 12. 15. 13:20ㆍ[Error]_
환경
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
오류 로그
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 하도록 하니 정상 작동하였습니다.
감사합니다.