Не могу понять, как работает мой Spring DTO
В настоящее время я работаю над устаревшим проектом, созданным сторонним подрядчиком. Это сервер Java, который использует Spring и MyBatis и общается с сервером MySQL.
Я пытаюсь изменить некоторые некрасивые имена методов в моих методах получения / установки DTO, которые содержат как CamelCase, так и подчеркивание. Я буду использовать метод 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>
Я не видел ничего, что бы явно отображало методы получения и установки DTO, как методы DAO. Например, если я ищу метод getCommon_name()
единственными вхождениями являются определение в самом DTO и вызов этого метода в одном из моих сервисов (я переименовал оба вхождения при переименовании метода). Все, что делает метод, это возвращает свойство с именем common_name
,
2 ответа
Существует ли файл mybatis-config.xml или другой файл сопоставления xml, в котором задано соглашение об именах? Например, отсюда:
<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>
Как и Hibernate, MyBatis - это постоянная среда, которая использует XML-файлы для определения того, какие классы и поля соответствуют каким таблицам базы данных.
Когда вы переименовали этот метод в Java, вы нарушили отображение, определенное в файле XML. Например, этот файл сопоставления определяет выбор SQL:
<?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, который значительно облегчает работу с этим отображением.