Обмен технологиями

[MyBatis] Теория MyBatis 40 вопросов (2)

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Теория MyBatis 40 вопросов》Содержит следующие 2 статьи:


Теория MyBatis 40 вопросов (2)

21. Как получить сгенерированный первичный ключ?

Добавьте новый тег:keyProperty=“ID” Вот и все.

<insert id="insert" useGeneratedKeys="true" keyProperty="userId" >
	insert into user(user_name, user_password, create_time)
	values(#{userName}, #{userPassword} , #{createTime, jdbcType=TIMESTAMP})
</insert>
  • 1
  • 2
  • 3
  • 4

22.КогдаКласс сущностиЧто делать, если имена атрибутов в таблице отличаются от имен полей в таблице?

(1) Путем запроса SQL Определите псевдоним имени поля в инструкции, чтобы псевдоним имени поля соответствовал имени атрибута класса сущности.

<select id="getOrder" parameterType="int" resultType="com.jourwon.pojo.Order">
	select order_id id, order_no orderno, order_price price form orders
	where order_id=#{id};
</select>
  • 1
  • 2
  • 3
  • 4

(2) Пройти <resultMap> Чтобы сопоставить взаимно однозначное соответствие между именами полей и именами атрибутов класса сущности.

<select id="getOrder" parameterType="int" resultMap="orderResultMap">
	select * from orders where order_id=#{id}
</select>

<resultMap type="com.jourwon.pojo.Order" id="orderResultMap">
	<!-- 用id属性来映射主键字段 -->
	<id property="id" column="order_id">
	<!-- 用result属性来映射非主键字段,property为实体类属性名,column为数据库表中的属性 -->
	<result property="orderno" column="order_no" />
	<result property="price" column="order_price" />
</reslutMap>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

23.Как написать Mapper?

(1) Наследование класса реализации интерфейса SqlSessionDaoSupport: Чтобы использовать этот метод, вам нужно написать mapper интерфейс,mapper Класс реализации интерфейса,mapper.xml документ.

  • существовать sqlMapConfig.xml Средняя конфигурацияmapper.xml позиция.
<mappers>
	<mapper resource="mapper.xml 文件的地址" />
	<mapper resource="mapper.xml 文件的地址" />
</mappers>
  • 1
  • 2
  • 3
  • 4
  • определение mapper интерфейс.
  • Реализация интеграции классов SqlSessionDaoSupportmapper Может использоваться в методахthis.getSqlSession() Выполняйте добавление, удаление, изменение и проверку данных.
  • spring конфигурация.
<bean id=" " class="mapper 接口的实现">
	<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>
  • 1
  • 2
  • 3

(2) Использование org.mybatis.spring.mapper.MapperFactoryBean

  • существовать sqlMapConfig.xml Средняя конфигурацияmapper.xml позиция, еслиmapper.xml иmapper Интерфейсы имеют одинаковые имена и находятся в одном каталоге, поэтому никакой настройки здесь не требуется.
  • определение mapper интерфейс.
<mappers>
	<mapper resource="mapper.xml 文件的地址" />
	<mapper resource="mapper.xml 文件的地址" />
</mappers>
  • 1
  • 2
  • 3
  • 4
  • mapper.xml серединаnamespace дляmapper Адрес интерфейса.
  • mapper Имя метода в интерфейсе иmapper.xml определено вstatement изid быть последовательным.
  • Spring определено в.
<bean id="" class="org.mybatis.spring.mapper.MapperFactoryBean">
	<property name="mapperInterface" value="mapper 接口地址" />
	<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
  • 1
  • 2
  • 3
  • 4

(3) Использование mapper сканер.

  • mapper.xml Написание документов.
    • mapper.xml серединаnamespace дляmapper Адрес интерфейса;
    • mapper Имя метода в интерфейсе иmapper.xml определено вstatement изid быть последовательным;
    • Если mapper.xml иmapper Если имя интерфейса остается неизменным, нет необходимостиsqlMapConfig.xml Настроить в .
  • определение mapper интерфейс.Уведомлениеmapper.xml имя файла иmapper Имена интерфейсов должны быть согласованными и располагаться в одном каталоге.
  • Конфигурация mapper сканер.
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
	<property name="basePackage" value="mapper 接口包地址"></property>
	<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
  • 1
  • 2
  • 3
  • 4
  • После использования сканера из spring Получить из контейнераmapper объект реализации.

24.Что такое MyBatis привязка интерфейса? Каковы методы реализации?

Привязка интерфейса заключается в произвольном определении интерфейса в MyBatis, а затем объединении методов интерфейса с SQL. заявлениеПривязывая, мы можем напрямую вызвать метод интерфейса, поэтому по сравнению с оригиналом SqlSession Предоставленные методы позволяют нам иметь более гибкий выбор и настройки.

Существует два способа реализации привязки интерфейса:

  • Привязка через аннотации заключается в добавлении @Select@Update Дождитесь привязки аннотаций, содержащих инструкции SQL;
  • проходить xml Напишите SQL внутри для привязки. В этом случае вам нужно указать.xml в файле сопоставленияnamespace Должен быть полный путь к интерфейсу.Если оператор SQL относительно прост, используйте привязку аннотации. Если оператор SQL относительно сложен, используйте.xml Переплет, общее использованиеxml Есть еще привязки.

25. Каковы требования для вызова с использованием интерфейса картографа MyBatis?

  • Имя метода интерфейса Mapper и mapper.xml каждого sql, определенного вid такой же.
  • Типы входных параметров методов интерфейса Mapper и mapper.xml каждого sql, определенного вparameterType того же типа.
  • Типы выходных параметров методов интерфейса Mapper и mapper.xml каждого sql, определенного вresultType того же типа.
  • Mapper.xml в файлеnamespace Это путь к классам интерфейса Mapper.

26. Как работает интерфейс Dao? Если метод в интерфейсе Dao имеет другие параметры, можно ли перегрузить метод?

  • Принцип работы интерфейса Dao заключается в динамическом прокси-сервере JDK. MyBatis будет использовать динамический прокси-сервер JDK для создания прокси-сервера для интерфейса Dao во время работы. proxy объект, прокси-объектproxy Вместо этого будут перехвачены и выполнены методы интерфейса.MappedStatement представляет SQL, а затем возвращает результаты выполнения SQL.
  • Методы в интерфейсе Dao не могут быть перегружены, потому что Полное имя + имя метода. Сохранение и поиск стратегий.

27. Может ли идентификатор повторяться в файле сопоставления Xml MyBatis в разных файлах сопоставления XML?

  • Различные файлы сопоставления XML, если они настроены. namespace,Так id Можно повторить, если не настроено;namespace,Так id ведь повториться невозможно;namespace Не обязательно, просто лучшая практика.
  • Причина в том namespace + id как есть Карта &lt;Строка, Сопоставленное утверждение &gt; Карта<String, MappedStatement>Мап<Св.рвг,Мастр.егСв.атемент> Ключ для использования, если его нетnamespace, только оставшиеся id,Так,id Дублирование может привести к перезаписи данных друг друга.Понятноnamespace,природа id Ты можешь это повторить,namespace другой,namespace + id Естественно, оно другое.

28. Кратко опишите связь между файлом сопоставления Xml MyBatis и внутренней структурой данных MyBatis?

MyBatis инкапсулирует всю информацию о конфигурации XML в тяжеловесные объекты «все в одном». Configuration внутренний. В файле сопоставления XML<parameterMap> Тег будет проанализирован какParameterMap объекта, каждый из его дочерних элементов будет анализироваться какParameterMapping объект.<resultMap> Тег будет проанализирован какResultMap объекта, каждый из его дочерних элементов будет анализироваться какResultMapping объект.Каждый<select><insert><update><delete> Теги будут анализироваться какMappedStatement Object, SQL в теге будет анализироваться какBoundSql объект.

29.Как MyBatis инкапсулирует результаты выполнения SQL в целевые объекты и возвращает их? Каковы формы картографирования?

  • Первый заключается в использовании <resultMap> Теги определяют отношения сопоставления между именами столбцов и именами атрибутов объекта одно за другим.
  • Второй способ — использовать функцию псевдонима столбца SQL и записать псевдоним столбца в качестве имени атрибута объекта, например: T_NAME AS NAME, имя атрибута объекта обычно name, в нижнем регистре, но имена столбцов не чувствительны к регистру. MyBatis будет игнорировать регистр имен столбцов и интеллектуально находить соответствующие имена атрибутов объекта. Вы даже можете написать. T_NAME AS NaMe, MyBatis по-прежнему может работать нормально.

Имея связь сопоставления между именами столбцов и именами атрибутов, MyBatis создает объекты посредством отражения и использует отражение для присвоения значений одному за другим свойствам объекта и возврата их для тех свойств, которые не могут найти взаимосвязь сопоставления. , задание не может быть выполнено.

30. Помимо обычных тегов выбора | вставки | обновления | удаления, какие еще теги есть в файле сопоставления XML?

Есть много других тегов, <resultMap><parameterMap><sql><include><selectKey>плюс динамический SQL 9 9 9 теги:trimwheresetforeachifchoosewhenotherwisebind ждать.в<sql> Для тегов фрагмента SQL передайте<include> Теги представляют фрагменты SQL,<selectKey> Создайте метки политики для первичных ключей, которые не поддерживают автоматическое приращение.

31. Если в файле сопоставления MyBatis тег A ссылается на содержимое тега B посредством включения, может ли тег B быть определен после тега A или он должен быть определен перед тегом A?

Хотя MyBatis анализирует файл сопоставления Xml по порядку, указанный тег B по-прежнему может быть определен где угодно, и MyBatis может правильно его идентифицировать.

Принцип заключается в том, что MyBatis анализирует тег A и обнаруживает, что тег A ссылается на тег B, но тег B не был проанализирован и еще не существует. В это время MyBatis пометит тег A как неразрешенный, а затем продолжит. для анализа оставшихся тегов, включая теги B. После анализа всех тегов MyBatis повторно анализирует теги, помеченные как неразрешенные. При анализе тега A тег B уже существует, и тег A можно анализировать обычным образом.

32. Может ли MyBatis выполнять запросы контактов «один ко многим» и «один к одному». Каковы методы реализации?

Может, не только может Один ко многим, один к одному,Достаточно хорошо Многие ко многим, многие к одному . Это достигается следующим образом:

  • Отправьте отдельный SQL-код для запроса связанного объекта, назначьте его основному объекту и затем верните основной объект.
  • При использовании вложенных запросов, аналогичных запросам JOIN, одна часть представляет собой значение атрибута объекта A, а другая часть — значение атрибута связанного объекта B. Преимущество состоит в том, что, пока отправляется одно значение атрибута, основной объект и связанный объект может быть найден.
  • подзапрос

33.Может ли MyBatis сопоставить класс перечисления Enum?

MyBatis может сопоставлять классы перечисления. MyBatis может не только сопоставлять классы перечисления, но и сопоставлять любой объект со столбцом таблицы.Метод отображения является настраиваемымTypeHandler,выполнить TypeHandler изsetParameter() иgetResult() методы интерфейса.

TypeHandler Он имеет две функции, одна из которых заключается в завершенииjavaType кjdbcType Конверсия, вторая завершенаjdbcType кjavaType Преобразование отражается какsetParameter() иgetResult() Эти два метода представляют собой установку параметров заполнителя вопросительного знака SQL и получение результатов запроса столбца соответственно.

34.Что делает динамический SQL MyBatis? Какие виды динамического SQL существуют? Можете ли вы кратко описать принцип выполнения динамического SQL?

Динамический SQL MyBatis позволяет нам записывать динамический SQL в виде тегов в файле сопоставления Xml для выполнения функций логического анализа и динамического объединения SQL, предоставляемых MyBatis. 9 9 9 Динамические теги SQL:trimwheresetforeachifchoosewhenotherwisebind

Принцип его выполнения заключается в использовании OGNL Вычислите значение выражения из объекта параметра SQL и динамически соедините SQL в соответствии со значением выражения, чтобы завершить функцию динамического SQL.

35.Как MyBatis выполняет пейджинг? Каков принцип работы плагина подкачки?

MyBatis использует RowBounds Объект разбит на страницы, это дляResultSet Подкачка памяти, выполняемая набором результатов, не является физической подкачкой. Вы можете напрямую записать параметры с помощью физической подкачки в SQL для выполнения функции физической подкачки или использовать подключаемый модуль подкачки для выполнения физической подкачки.

Основной принцип подключаемого модуля подкачки заключается в использовании интерфейса подключаемого модуля, предоставляемого MyBatis, для реализации специального подключаемого модуля, перехвата SQL, который будет выполняться методом перехвата подключаемого модуля, а затем переписывания SQL в соответствии с к dialect Диалект, добавьте соответствующие операторы физического подкачки и параметры физического подкачки.

Пример:

select * from student
  • 1

После перехвата SQL перепишите его так:

select t.* from (select * from student) t limit 0, 10
  • 1

36. Кратко опишите принцип работы плагина MyBatis и как написать плагин?

MyBatis может писать только для ParameterHandlerResultSetHandlerStatementHandlerExecutor этот 4 4 4 MyBatis, своего рода подключаемый модуль интерфейса, использует динамический прокси-сервер JDK для создания прокси-объектов для интерфейсов, которые необходимо перехватить для реализации функции перехвата метода интерфейса. 4 4 4 метод объекта интерфейса, он войдет в метод перехвата, а именноInvocationHandler изinvoke() Методы, конечно, будут перехватывать только те методы, которые вы указываете для перехвата.

Внедрить MyBatis Interceptor Интерфейс и переопределениеintercept() Method, затем напишите аннотации для плагина и укажите, какие методы какого интерфейса вы хотите перехватить. Помните, не забудьте настроить написанный вами плагин в файле конфигурации.

37. Кэш первого и второго уровня MyBatis.

  • Кэш уровня 1: на основе PerpetualCache Локальный кеш HashMap, его областью хранения является сеанс, когда сеансflush илиclose После этого все кеши в сессии будут очищены, а кеш первого уровня будет включен по умолчанию.
  • Кэш второго уровня имеет тот же механизм, что и кеш первого уровня, и также используется по умолчанию. PerpetualCache, хранилище HashMap, разница в том, что его область хранения MapperNamespace), а источник хранения можно настроить, например Ehcache .Кэш второго уровня по умолчанию не включен. Чтобы включить кеш второго уровня, необходимо реализовать класс атрибута кэша второго уровня.Serializable Интерфейс сериализации (может использоваться для сохранения состояния объекта), настраивается в его файле сопоставления.<cache/>
  • Для механизма обновления данных кэша, когда определенная область (сеанс кэша первого уровня/пространство имен кэша второго уровня) C / U / D После операции по умолчанию все файлы в этой областиselect Кэш будетclear