我无法使用XML文件使用MyBatis和Spring Boot将查询结果映射到Bean。
如果我尝试使用注解@ResultType(ResultBean.class)映射结果,则一切正常,但是我不知道如何映射内部类,因此,我尝试使用xml映射器映射结果。 / p>
我有这个界面:
public interface MyMapper {
@ResultMap("MyBean")
@Select("SELECT myData as myData FROM myTable")
public List<MyMapper> getMappedData();
}
我在同一个程序包上有这个MyMapper.xml文件(java类在src / main / java / myPackage中,而xml文件在/ src / main / resources / myPackage中)。
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="myPackage.MyMapper">
<resultMap id="MyBean" type="MyBean">
<id property="myData " column="myData " />
</resultMap>
</mapper>
这是我的SpringBootServletInitializer类:
@SpringBootApplication
@EnableTransactionManagement
@MapperScan("myPackage")
@PropertySource(value = "classpath:application.properties")
public class Application extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class);
}
@Value("${spring.datasource.jndi-name}")
private String jndiName;
@Bean
public DataSource dataSource() {
final JndiDataSourceLookup dsLookup = new JndiDataSourceLookup();
DataSource dataSource = dsLookup.getDataSource(jndiName);
return dataSource;
}
@Bean
public DataSource jndiObjectFactoryBean() {
JndiObjectFactoryBean jofb = new JndiObjectFactoryBean();
jofb.setJndiName(jndiName);
return (DataSource) jofb.getObject();
}
@Bean
public DataSourceTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean
public ManagedTransactionFactory transactionFactory() {
return new ManagedTransactionFactory();
}
@Bean
public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
sessionFactory.setTypeAliasesPackage("beansPackage");
return sessionFactory;
}
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
sqlSessionFactory.setDataSource(dataSource());
return (SqlSessionFactory) sqlSessionFactory.getObject();
}
}
豆是
@Alias("MyBean")
public class MyBeanimplements Serializable {
private static final long serialVersionUID = 3143220123058683967L;
private String myData;
}
但是MyBatis似乎找不到xml映射器,因此无法将结果映射到正确的bean。我收到的错误是:
16:02:56,074错误 [org.springframework.boot.web.servlet.support.ErrorPageFilter] (默认任务1)从请求转发到错误页面 [/ MyPage / getData]由于异常[找不到结果图 myPackage.MyMapper.MyBean]: org.apache.ibatis.builder.IncompleteElementException:找不到 结果图myPackage.MyMapper.MyBean
我缺少一些配置?也许在application.property文件上?
答案 0 :(得分:0)
您必须输入 <结果图 类型类的CanonicalName
例如MyBean pkg是:org.mypkg.MyBean:
<resultMap id="MyBean" type="org.mypkg.MyBean">
<id property="myData " column="myData " />
</resultMap>
答案 1 :(得分:0)
找到了解决方案:对于xml映射器文件,我已经使用了点划线的路径(与java映射器程序包名称相同),但是该路径必须是常规路径(带有斜线而不是点)。
答案 2 :(得分:0)
第一件事是你的 bean 类应该有 getter 和 setter。
如果你想使用内部类作为 bean,你必须使用 $
符号来表示你的内部类的路径,如下所示。
<mapper namespace="myPackage.MyMapper">
<resultMap id="MyBean" type="MainClass$MyBean">
<id property="myData " column="myData " />
</resultMap>
</mapper>
MainClassName$MyBean
public class MainClassName{
public static class MyBean{
private String myData;
//getters
//setters
}
}
原因是Mybatits在编译后检查你的ben文件。 MyBatis 找不到名为 MyBean.class
的类文件。像这样编译后的类文件名 MainClassName$MyBean.class
所以我们必须使用 $
。