我目前正在研究由第三方承包商建造的遗留项目。它是一个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
的属性。
答案 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插件,这使得这种映射更容易处理。