Не могу понять, как работает мой 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, который значительно облегчает работу с этим отображением.

Другие вопросы по тегам