MyBatis with Spring:找不到结果图

时间:2019-01-10 15:22:07

标签: java spring spring-boot mybatis

我无法使用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文件上?

3 个答案:

答案 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 所以我们必须使用 $