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」という名前のパッケージのリソースの下にあります
誰かがここで何が悪いのか考えていますか?
前もって感謝します
Mybatis-conf.xml(このファイルの名前は何であれ)ファイルを確認して、次のようなxmlマッパーがあるかどうかを確認してください。
<mappers>
<mapper resource="BrandMapper.xml">
<mappers>
この正確なエラーメッセージがあり、マッパーxmlファイルの名前空間パスであることが判明しました。Javaインターフェースファイルでパッケージ名を変更しましたが、マッパーでパッケージ名を更新するのを忘れていましたxml、少し変わったものです。パッケージの名前空間を更新し、ねえpresto!
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
ディレクトリにあることを確認してください
エラーメッセージ:
org.Apache.ibatis.binding.BindingException: Invalid bound statement (not found):
おそらく間違ったマッパーが原因ですクエリ構文。私は何度もこの問題を抱えていましたが、そのたびに、エラーはMapper xmlファイルとインターフェースファイルに記述されたクエリの誤った構文によって引き起こされていました。私はあなたに、
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に置き換えてください
これがお役に立てば幸いです。
マッパーファイルは、* Repo.Javaファイルと同じパッケージに含める必要があります。マッパー名前空間も確認してください。
クエリから;
を削除します。
<select id="getBrand" resultType="Brand" parameterType="int">
SELECT id, name
FROM brand
WHERE id = #{id}
</select>
多分あなたは@ Aliasアノテーションが必要だと思います:
@Alias( "Brand")クラスBrand {...}
これが私の頭に浮かぶ最初のことです。