Общие вопросы интервью Mybatis

Java Java EE MyBatis

Общие вопросы интервью Mybatis

#{}和${}Какая разница?

#{}和${}的区别是什么?

В Mybatis есть два вида заполнителей.

  • #{}Передаваемые параметрические данные
  • ${} объединяет переданные параметрыкак естьОбъединено в SQL
  • #{}предварительно скомпилированная обработка, ${} - замена строки.
  • Использование #{} может эффективно предотвратить внедрение SQL и повысить безопасность системы.

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

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

Тип 1: В операторе sql запросаОпределите псевдоним имени поля, чтобы псевдоним имени поля соответствовал имени атрибута класса сущностей.



 	<select id=”selectorder” parametertype=”int” resultetype=”me.gacl.domain.order”> 
       select order_id id, order_no orderno ,order_price price form orders where order_id=#{id}; 
    </select> 

Тип 2:Путем сопоставления однозначного соответствия между именами полей и именами атрибутов класса сущностей


 <select id="getOrder" parameterType="int" resultMap="orderresultmap">
        select * from orders where order_id=#{id}
    </select>
   <resultMap type=”me.gacl.domain.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>

Думаю, второй способ будет немного лучше.

Как получить автоматическое созданное (первичное) значение ключа?

Как получить автоматически сгенерированное (первичное) значение ключа?

Если мы обычно вставляем данные,Если мы хотим узнать, каков первичный ключ только что вставленных данных, мы можем получить его следующим образом.

необходимость:

  • После вставки пользовательского объекта в базу данных первичный ключ новой записи возвращается через пользовательский объект, а значение первичного ключа получается через пользователя.

Решения:

  • Получите самоинкрементное значение основного ключа записанной записи до 1299445,После выполнения оператора вставки выполните select 1299445, чтобы получить автоматически увеличивающийся первичный ключ.

mysql:

	<insert id="insertUser" parameterType="cn.itcast.mybatis.po.User">
		<selectKey keyProperty="id" order="AFTER" resultType="int">
			select 1299445
		</selectKey>
		INSERT INTO USER(username,birthday,sex,address) VALUES(#{username},#{birthday},#{sex},#{address})
	</insert>

oracle:

Идеи реализации:

  • Сначала запросите последовательность, чтобы получить первичный ключ, установите первичный ключ для объекта пользователя и вставьте объект пользователя в базу данных.

	<!-- oracle
	在执行insert之前执行select 序列.nextval() from dual取出序列最大值,将值设置到user对象 的id属性
	 -->
	<insert id="insertUser" parameterType="cn.itcast.mybatis.po.User">
		<selectKey keyProperty="id" order="BEFORE" resultType="int">
			select 序列.nextval() from dual
		</selectKey>
		
		INSERT INTO USER(id,username,birthday,sex,address) VALUES( 序列.nextval(),#{username},#{birthday},#{sex},#{address})
	</insert> 

Как передать несколько параметров в маппере?

Как передать несколько параметров в маппере?

Первое: идея использования плейсхолдеров

  • Используйте #{0}, #{1} в файле сопоставления для представления первых параметров, переданных в

  • **Используйте аннотацию @param: для именования параметров **

  • #{0},#{1} способ


//对应的xml,#{0}代表接收的是dao层中的第一个参数,#{1}代表dao层中第二参数,更多参数一致往后加即可。

<select id="selectUser"resultMap="BaseResultMap">  
    select *  fromuser_user_t   whereuser_name = #{0} anduser_area=#{1}  
</select>  
  • Метод аннотации @param

		public interface usermapper { 
         user selectuser(@param(“username”) string username, 
         @param(“hashedpassword”) string hashedpassword); 
        }
 <select id=”selectuser” resulttype=”user”> 
         select id, username, hashedpassword 
         from some_table 
         where username = #{username} 
         and hashedpassword = #{hashedpassword} 
    </select>

Второй: использовать коллекцию Map в качестве параметра для загрузки


 	try{
            //映射文件的命名空间.SQL片段的ID,就可以调用对应的映射文件中的SQL


            /**
             * 由于我们的参数超过了两个,而方法中只有一个Object参数收集
             * 因此我们使用Map集合来装载我们的参数
             */
            Map<String, Object> map = new HashMap();
            map.put("start", start);
            map.put("end", end);
            return sqlSession.selectList("StudentID.pagination", map);
        }catch(Exception e){
            e.printStackTrace();
            sqlSession.rollback();
            throw e;
        }finally{
            MybatisUtil.closeSqlSession();
        }

	<!--分页查询-->
	<select id="pagination" parameterType="map" resultMap="studentMap">

		/*根据key自动找到对应Map集合的value*/
		select * from students limit #{start},#{end};

	</select>

Что делает Mybatis dynamic sql? Какие динамические sql существуют? Можете вкратце описать принцип реализации динамического sql?

Что делает Mybatis dynamic sql? Какие динамические sql существуют? Можете вкратце описать принцип реализации динамического sql?

  • Динамический sql Mybatis позволяет нам отображать в файле Xml,Написать динамический sql в виде тегов, выполнить функции логического суждения и динамической склейки sql.
  • Mybatis предоставляет 9 динамических тегов sql: trim|where|set|foreach|if|choose|when|иначе|bind.
  • Его принцип выполнения заключается в использовании OGNL для вычисления значения выражения из объекта параметра sql,Динамически соединять sql в соответствии со значением выражения для завершения функции динамического sql.

Подробности смотрите в других моих статьях:

В файле сопоставления Xml Mybatis может ли повторяться идентификатор разных файлов сопоставления Xml?

В файле сопоставления Xml Mybatis может ли повторяться идентификатор разных файлов сопоставления Xml?

Если пространство имен настроено, конечно, его можно повторить, потому что наш Statement на самом деле namespace+id

Если пространство имен не настроено, тот же идентификатор вызовет перезапись.

Почему Mybatis — это полуавтоматический инструмент отображения ORM? Чем он отличается от полностью автоматического?

Почему Mybatis — это полуавтоматический инструмент отображения ORM? Чем он отличается от полностью автоматического?

  • Hibernate относится к полностью автоматическому инструменту сопоставления ORM.При использовании Hibernate запрашивают связанный объект или связанный объект коллекции, он может быть получен напрямую в соответствии с моделью отношений объектов, поэтому он полностью автоматизирован.
  • Mybatis необходимо вручную писать sql при запросе связанных объектов или связанных объектов коллекции, поэтому он называется полуавтоматическим инструментом сопоставления ORM.

Обычно файл сопоставления Xml будет писать соответствующий ему интерфейс Dao.Простите, каков принцип работы этого интерфейса Dao? Методы в интерфейсе Dao имеют разные параметры, могут ли методы быть перегружены?

Обычно файл сопоставления Xml будет писать соответствующий ему интерфейс Dao.Простите, каков принцип работы этого интерфейса Dao? Методы в интерфейсе Dao имеют разные параметры, могут ли методы быть перегружены?

  • Интерфейс Dao — это интерфейс Mapper, о котором часто говорят, полное имя интерфейса — это значение пространства имен в файле сопоставления, имя метода интерфейса — это значение идентификатора MappedStatement в файле сопоставления, а параметры — в интерфейсе. метод передаются параметру sql.
  • Для интерфейса Mapper не существует класса реализации.При вызове метода интерфейса в качестве значения ключа используется объединенная строка полного имени интерфейса и имени метода, которая может однозначно определить местонахождение MappedStatement.

Пример:

com.mybatis3.mappers.StudentDao.findStudentById,

可以唯一找到namespace为com.mybatis3.mappers.StudentDao下面id = findStudentById的MappedStatement。在Mybatis中,每一个<select>、<insert>、<update>、<delete>标签,都会被解析为一个MappedStatement对象。

Методы в интерфейсе Dao,Его нельзя перегрузить, потому что это стратегия сохранения и поиска полного имени + имени метода..

Принцип работы интерфейса Dao - динамический прокси JDK. Mybatis будет использовать динамический прокси JDK для создания прокси-объекта прокси для интерфейса Dao во время выполнения. Прокси-объект прокси перехватит метод интерфейса, выполнит sql, представленный MappedStatement , а затем вернуть результат выполнения sql.

Для получения подробной информации см.:

Каковы основные улучшения Mybatis по сравнению с IBatis?

Каковы основные улучшения Mybatis по сравнению с IBatis?

  • a.Существуют привязки интерфейса, в том числе привязка аннотации sql и привязка xml Sql ,
  • б. Динамический sql изменен с исходной конфигурации узла на выражение OGNL,
  • c. Ассоциация вводится в случаях один-к-одному и один-ко-многим, а узлы сбора вводятся в случаях один-ко-многим, но все они настраиваются в resultMap

Существует несколько способов реализации привязки интерфейса, и как они реализуются?

Существует несколько способов реализации привязки интерфейса, и как они реализуются?

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

  • Одним из них является привязка через аннотации, то есть добавление @Select@Update и других аннотаций к методам интерфейса и включение операторов Sql для привязки
  • Другой — привязать, написав SQL в XML.В этом случае пространство имен в указанном файле сопоставления XML должно быть полным путем к интерфейсу.

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

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

Mybatis использует объект RowBounds для пейджинга, который представляет собой пейджинг памяти для набора результатов ResultSet, а не физического пейджинга.Вы можете напрямую писать параметры с физическим пейджингом в sql для выполнения функции физического пейджинга, или вы можете использовать подключаемый модуль пейджинга для завершения физический пейджинг.

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

Пример:select * from student,拦截sql后重写为:select t.* from (select * from student)t limit 0,10

Ссылки на плагины подкачки:

Кратко опишите принцип работы плагина Mybatis и как написать плагин

Кратко опишите принцип работы плагина Mybatis и как написать плагин

Мибатис может толькоНапишите подключаемые модули для четырех интерфейсов ParameterHandler, ResultSetHandler, StatementHandler и Executor.Mybatis использует динамический прокси-сервер JDK для создания прокси-объектов для интерфейсов, которые необходимо перехватить для реализации функции перехвата метода интерфейса.Всякий раз, когда выполняются методы этих четырех объектов интерфейса, метод перехвата будет введен, введен в систему метода Invoke () invocationHandler. Конечно, только те методы, которые вы указываете, чтобы перехватить, будет перехвачен.

Реализовать интерфейс Interceptor Mybatis и переопределить метод intercept(),Затем напишите аннотации к плагину, чтобы указать, какие методы какого интерфейса перехватывать.Помните, не забудьте настроить плагин, который вы написали в файле конфигурации.

Поддерживает ли Mybatis ленивую загрузку? Если поддерживается, каков принцип его реализации?

Поддерживает ли Mybatis ленивую загрузку? Если поддерживается, каков принцип его реализации?

Mybatis поддерживает только ленивую загрузку объектов, связанных с ассоциацией, и объектов, связанных с коллекцией, Ассоциация относится к запросу «один к одному», а коллекция относится к запросу «один ко многим». В файле конфигурации MybatisМожно настроить, включать ли отложенную загрузку lazyLoadingEnabled=true|false.

Его принцип заключается в том,Используйте CGLIB для создания прокси-объекта для целевого объекта., когда вызывается целевой метод,Введите метод перехватчика, например вызов a.getB().getName(), метод перехватчика invoke() обнаруживает, что a.getB() является нулевым значением, затем отдельно отправляет предварительно сохраненный запрос, связанный с sql объекта B, и запрос B. Затем вызовите a.setB(b), чтобы свойство объекта b объекта a имело значение, а затем завершите вызов метода a.getB().getName(). Это основной принцип ленивой загрузки.

Разумеется, не только Mybatis, но и почти все, включая Hibernate, поддерживают тот же принцип отложенной загрузки.

Какие Исполнители есть у Mybatis? В чем разница между ними?

Какие Исполнители есть у Mybatis? В чем разница между ними?

Mybatis имеет три основных исполнителя Executor,SimpleExecutor, ReuseExecutor, BatchExecutor.

  • SimpleExecutor: каждый раз, когда выполняется обновление или выбор, открывается объект Statement,Закройте объект Statement сразу после использования.
  • ReuseExecutor: выполнить обновление или выбрать, использовать sql в качестве ключа для поиска объекта Statement, использовать его, если он существует, и создать его, если он не существует.После его использования объект Statement не закрывается, а помещается в Map для следующего использования. Короче,Объект выписки повторно используется.
  • BatchExecutor: выполнить обновление (без выбора, пакет JDBC не поддерживает выбор), добавить все sql в пакет (addBatch()), дождаться единого выполнения (executeBatch()),Он кэширует несколько объектов Statement, и каждый объект Statement ожидает выполнения пакетов executeBatch() один за другим после addBatch(). То же, что и пакет JDBC.

Область действия: эти функции Executor строго ограничены областью жизненного цикла SqlSession.

Чем MyBatis отличается от Hibernate?

Чем MyBatis отличается от Hibernate?

Mybatis отличается от hibernate.Это не совсем структура ORM, потому что MyBatis требует, чтобы программисты сами писали операторы SQL, но mybatis может гибко настраивать операторы SQL для запуска через XML или аннотации, а также отображать объекты Java и операторы SQL для генерации окончательное выполнение.sql и, наконец, переназначить результат выполнения sql для создания объекта java.

Mybatis имеет низкий порог обучения и прост в освоении. Программисты могут напрямую написать исходный экологический sql, который может строго контролировать производительность выполнения sql и обладает высокой гибкостью. Он очень подходит для разработки программного обеспечения, не требующего высоких моделей реляционных данных. , такие как программное обеспечение для Интернета, программное обеспечение для работы предприятия и т. д. Поскольку требования к этому типу программного обеспечения часто меняются, после изменения требований требуется быстрый вывод результатов. Однако предпосылкой гибкости является то, что mybatis не может достичь независимости от базы данных.Если вам нужно внедрить программное обеспечение, которое поддерживает несколько баз данных, вам нужно настроить несколько наборов файлов сопоставления sql, что требует большой работы.

Hibernate обладает мощными возможностями объектно-реляционного сопоставления и хорошей независимостью от базы данных.Для программного обеспечения с высокими требованиями к реляционным моделям (например, специализированное программное обеспечение с фиксированными требованиями), если вы используете Hibernate для его разработки, вы можете сэкономить много кода и повысить эффективность. Однако недостатком Hibernate является то, что порог обучения высок, порог освоения выше, а то, как спроектировать сопоставление O/R, как сбалансировать производительность и объектную модель, и как правильно использовать Hibernate, требует большого опыта и способностей. Короче говоря, в соответствии с потребностями пользователей, если программная архитектура с хорошей ремонтопригодностью и масштабируемостью может быть создана в среде с ограниченными ресурсами, это хорошая архитектура, поэтому инфраструктура является лучшей, только если она подходит.

Наконец

Использованная литература:

Если в статье есть какие-либо ошибки, пожалуйста, поправьте меня, и мы сможем общаться друг с другом.Учащиеся, которые привыкли читать технические статьи в WeChat и хотят получить больше ресурсов по Java, могут подписаться на общедоступную учетную запись WeChat: Java3y.