MybatisでSpringBoot起動時にCaused by: org.apache.ibatis.builder.BuilderException: Error resolving class. Cause: org.apache.ibatis.type.TypeException: Could not resolve type alias
ログの出力例
Caused by: org.apache.ibatis.builder.BuilderException: Error resolving class. Cause: org.apache.ibatis.type.TypeException: Could not resolve type alias 'com.springhack.okozukaisystem.integration.mapper.enitity.ChildrenEntity'. Cause: java.lang.ClassNotFoundException: Cannot find class: com.springhack.okozukaisystem.integration.mapper.enitity.ChildrenEntity
上記例では、
com.springhack.okozukaisystem.integration.mapper.enitity.ChildrenEntity
が見つからないと怒られています。
そのクラスのパッケージを確認しましょう。
もしくは、「com.springhack.okozukaisystem.integration.mapper.enitity.ChildrenEntity」で文字列検索して、SQLを定義した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.springhack.okozukaisystem.integration.mapper.ChildrenMapper">
<select id="selectAll" resultType="com.springhack.okozukaisystem.integration.mapper.enitity.ChildrenEntity">
SELECT * FROM children;
</select>
</mapper>
<?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.springhack.okozukaisystem.integration.mapper.ChildrenMapper">
<select id="selectAll" resultType="com.springhack.okozukaisystem.integration.enitity.ChildrenEntity">
SELECT * FROM children;
</select>
</mapper>
わかりにくいかもしれませんが、パッケージ名に不要な「mapper」が入っちゃっていました。あなたのXML内のパッケージ名を確認してください。
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):
ログの出力例
2022-01-26 12:54:30.041 ERROR 68837 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.springhack.okozukaisystem.integration.mapper.ChildrenMapper.selectAll] with root cause
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.springhack.okozukaisystem.db.mapper.ChildrenMapper.selectAll
at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:235) ~[mybatis-3.5.9.jar:3.5.9]
at
SQLを定義したXMLファイルが見つからない。
まずは、XMLファイルの配置ディレクトリを確認すること。
上記ログの例では、
package com.springhack.okozukaisystem.integration.mapper;
@Mapper
public interface ChildrenMapper {
public List<ChildrenEntity> selectAll();
}
上記のselectAllに相当するXMLファイルが見つからない。
XMLファイルはこの場合、
src/main/resources/com/springhack/okozukaisystem/integration/mapper/ChildrenMapper.xml
このように配置されていないといけない。
Field shopMapper in com.xxx.controller.ShopListController required a bean of type 'com.xxx.mapper.ShopMapper' that could not be found.
コントローラーやサービスにおいて、MapperインターフェースのDIに失敗しています。
MapperとしてDI対象になるのは、@MapperScanで指定されたパッケージに入っているインターフェースです。
Mapperインターフェースが@MapperScanで指定されたパッケージに入っているか確認してください。
@Configuration
@MapperScan("com.noricgeographic.shopreview.mapper")
public class MyBatisConfig {
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource);
return factoryBean.getObject();
}
上記の設定例では、「com.noricgeographic.shopreview.mapper」パッケージ配下にMapperインターフェースを配置する必要があります。
package com.noricgeographic.shopreview.mapper;
import java.util.List;
import com.noricgeographic.shopreview.mapper.dto.ShopDto;
public interface ShopMapper {
List<ShopDto> findAll();
boolean insert(ShopDto shopDto);
}
このように、Mapperインターフェースのパッケージが、@MapperScanの引数で指定されているパッケージ内であることが必要です。