无法理解我的Spring DTO的工作原理

时间:2016-12-13 00:29:32

标签: java mysql spring mybatis

我目前正在研究由第三方承包商建造的遗留项目。它是一个Java服务器,它使用Spring和MyBatis并与MySQL服务器通信。

我正在尝试在包含CamelCase和下划线的DTO getter / setter中重构一些丑陋的方法名称。我将使用方法getCommon_name()作为示例。当我将其重命名为getCommonName())时,该方法的数据库查找将停止工作。我已经尝试进行文本搜索以在调用方法的代码中查找出现的事件,但它似乎只存在于DTO定义中。可能有一些我无法正确理解的数据库自动映射,因为该方法查找了一个名为common_name的表,但我无法确定。

是否有人能够了解可能发生的事情?这是我第一次使用Spring / MyBatis。

使用更多详细信息进行修改:

到目前为止,答案一直在询问我的映射是如何设置的。它看起来像这样:

mybatis-config.xml

<configuration>
  <typeAliases>
    <typeAlias type="com.example.dto.SpeciesDTO" alias="species" />
    <!--aliases for other DTOs-->
  </typeAliases>

  <mappers>
    <mapper resource="com/example/dao/species/speciesSQL.xml" />
    <!--aliases for other DAOs-->
  </mappers>
</configuration>

mybatis-context.xml

<beans>
  <bean id="SpeciesDao" class="org.mybatis.spring.mapper.MapperFactoryBean">
    <property name="mapperInterface"
        value="com.example.dao.species.SpeciesDAO" />
    <property name="sqlSessionFactory" ref="sqlSessionFactory" />
  </bean>
  <!--beans for other DAOs-->
</beans>

此外,DAO文件都有关联的.xml文件,如下所示:

<mapper namespace="com.example.species.speciesDAO">
  <select id="getSpecies" parameterType="String" resultType="species">
    SELECT * FROM SPECIES
  </select>
  <!--other methods executing SQL-->
</mapper>

我没有看到任何以DAO方法显式映射DTO getter / setter的东西。例如,如果我搜索方法getCommon_name(),则唯一出现的是DTO本身的定义以及在我的一个服务中调用该方法(我确保在重命名方法时编辑两个匹配项)。所有方法都返回一个名为common_name的属性。

2 个答案:

答案 0 :(得分:0)

是否有设置名称约定的mybatis-config.xml或其他xml映射文件?例如,来自here

<mapper namespace="org.podcastpedia.dao.PodcastDao">
<!--    result maps     -->
<resultMap id="podcastsMap" type="Podcast" >
    <id column="podcast_id" property="podcastId"  />
    <result column="url" property="url" />
    <result column="rating" property="rating" />
    <result column="numberRatings" property="number_ratings" />
    <result column="number_visitors" property="numberOfVisitors" />
    <result column="DESCRIPTION" property="description" />
    <result column="PODCAST_IMAGE_URL" property="urlOfImageToDisplay" />
    <result column="TITLE" property="title" />
    <result column="last_episode_url" property="lastEpisodeMediaUrl" />
    <result column="title_in_url" property="titleInUrl" />
    <result column="publication_date" property="publicationDate"/>
</resultMap>

答案 1 :(得分:0)

与Hibernate一样,MyBatis是一个持久性框架,它使用XML文件来定义哪些类和字段映射到哪些数据库表。

在Java中重命名该方法时,您破坏了XML文件中定义的映射。例如,此映射文件定义SQL select:

<?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="org.mybatis.example.BlogMapper">
  <select id="selectBlog" resultType="Blog">
    select * from Blog where id = #{id}
  </select>
</mapper>

然后Java实现调用它:

Blog blog = session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);

如果在Java代码中,您将selectBlog重命名为selectMyBlog并且未更新地图,则可能会获得NoClassDefFoundError。确保您的文本搜索包括所有.java文件以及非Java文件,例如.xml。

另外,你没有说你正在使用哪个IDE(如果有的话),但我知道Hibernate为IDEA和Eclipse都提供了插件。可能还有MyBatis插件,这使得这种映射更容易处理。