1. Что такое Мибатис?
1. Mybatis представляет собой полу-ORM (Object Relational Mapping) фреймворк, который внутри инкапсулирует JDBC.При разработке вам нужно сосредоточиться только на самом операторе SQL, и вам не нужно тратить энергию на загрузку драйверов, создание соединений, создание
заявление и другие сложные процессы. Программисты напрямую пишут исходный sql, который может строго контролировать производительность выполнения sql с высокой гибкостью.
2. MyBatis может использовать XML или аннотации для настройки и сопоставления собственной информации, сопоставления POJO с записями в базе данных и позволяет избежать почти всего кода JDBC и ручной настройки параметров и получения наборов результатов.
3. Настройте различные операторы для выполнения через xml-файлы или аннотации и сгенерируйте окончательный исполняемый оператор sql, сопоставив объект java и динамические параметры sql в операторе. Наконец, среда mybatis выполняет sql и сопоставляет результат с java объект и возврат. (Процесс от выполнения sql до возврата результата).
2. Преимущества Mybaits:
1. Основанный на программировании операторов SQL, он достаточно гибкий и не окажет никакого влияния на существующую структуру приложения или базы данных.SQL написан в формате XML, что отделяет SQL от программного кода и упрощает унифицированное управление.Предоставляет теги XML для поддержки. динамическое написание операторов SQL и может быть использовано повторно.
2. По сравнению с JDBC уменьшает объем кода более чем на 50%, устраняет много избыточного кода в JDBC и не требует ручного переключения соединений;
3. Он очень совместим с различными базами данных (поскольку MyBatis использует JDBC для подключения к базе данных, поэтому база данных, поддерживаемая JDBC, поддерживается MyBatis).
4. Хорошо интегрируется с Spring;
5. Предоставьте метки сопоставления для поддержки сопоставления отношений полей ORM между объектами и базами данных, предоставьте метки объектно-реляционного сопоставления для поддержки обслуживания объектно-реляционных компонентов.
3. Недостатки фреймворка MyBatis:
1. Рабочая нагрузка по написанию операторов SQL относительно велика, особенно когда имеется много полей и связанных таблиц, к разработчикам предъявляются определенные требования для написания операторов SQL.
2. Оператор SQL зависит от базы данных, что приводит к плохой переносимости базы данных, и базу данных нельзя заменить по желанию.
4. Фреймворк MyBatis подходит для случаев:
1. MyBatis фокусируется на самом SQL и является достаточно гибким решением уровня DAO.
2. Для проектов с высокими требованиями к производительности или проектов с большим количеством изменений спроса, таких как интернет-проекты, MyBatis будет хорошим выбором.
5. В чем разница между MyBatis и Hibernate?
1. В отличие от hibernate, Mybatis не совсем является инфраструктурой ORM, потому что MyBatis требует, чтобы программисты сами писали операторы Sql.
2. Mybatis напрямую пишет исходный экологический sql, который может строго контролировать производительность выполнения sql и обладает высокой гибкостью.Он очень подходит для разработки программного обеспечения, не требующего высоких реляционных моделей данных, поскольку требования к такому программному обеспечению часто меняются, и как только требования меняются, результаты должны быть выведены быстро. Однако предпосылкой гибкости является то, что mybatis не может достичь независимости от базы данных.Если вам нужно внедрить программное обеспечение, которое поддерживает несколько баз данных, вам нужно настроить несколько наборов файлов сопоставления sql, что требует большой работы.
3. Hibernate обладает сильной способностью объектно-реляционного сопоставления и хорошей независимостью от базы данных.Для программного обеспечения, требующего высокой реляционной модели, если оно разработано с использованием гибернации, это может сэкономить много кода и повысить эффективность.
6. В чем разница между #{} и ${}?
#{} — это прекомпилированная обработка, ${} — замена строки.
Когда Mybatis обрабатывает #{}, он заменяет #{} в sql на ? и вызывает метод set в PreparedStatement для присвоения значений;
Mybatis перерабатывает{} заменяется значением переменной. Использование #{} может эффективно предотвратить внедрение SQL и повысить безопасность системы.
7. Что делать, если имя атрибута в классе сущностей отличается от имени поля в таблице?
Тип 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>
9. Обычно файл сопоставления Xml записывает соответствующий ему интерфейс Dao.
Простите, а каков принцип работы этого дао-интерфейса? Метод в интерфейсе Дао, когда параметры разные, метод можно перегрузить?
Интерфейс Dao — это интерфейс Mapper. Полное имя интерфейса — это значение пространства имен в файле сопоставления; имя метода интерфейса — это значение id оператора сопоставления в файле сопоставления; параметры в методе интерфейса — это параметры, переданные в sql.
Интерфейс Mapper не имеет класса реализации.При вызове метода интерфейса в качестве значения ключа используется объединенная строка полного имени интерфейса и имени метода, которая может однозначно найти MapperStatement. В Мибатисе каждый Теги выбора, вставки, обновления и удаления будут проанализированы как объект MapperStatement. Например: com.mybatis3.mappers.StudentDao.findStudentById, вы можете однозначно найти MapperStatement, пространство имен которого — com.mybatis3.mappers.StudentDao, а идентификатор — findStudentById. Методы в интерфейсе Mapper не могут быть перегружены, поскольку они используют полное имя + имя метода. сохранить и найти стратегии. Принцип работы интерфейса Mapper – динамический прокси-сервер JDK. Mybatis будет использовать динамический прокси-сервер JDK для создания прокси-объекта прокси-объекта для интерфейса Mapper во время выполнения. Прокси-объект перехватит метод интерфейса, выполнит sql, представленный MapperStatement, а затем вернуть результат выполнения sql.
10. Как Mybatis выполняет пейджинг? Каков принцип работы плагина пейджинга?
Mybatis использует объект RowBounds для подкачки, то есть подкачки памяти, выполняемой по отношению к набору результатов ResultSet, а не физической подкачки. Вы можете напрямую записать параметры с физическим пейджингом в sql, чтобы завершить функцию физического пейджинга, или вы можете использовать подключаемый модуль пейджинга для завершения физического пейджинга.
Основной принцип подключаемого модуля подкачки заключается в использовании интерфейса подключаемого модуля, предоставленного Mybatis, для реализации пользовательского подключаемого модуля, перехвата sql, который должен быть выполнен в методе перехвата подключаемого модуля, затем перезаписи sql и добавления соответствующий оператор физического пейджинга и параметры физического пейджинга в соответствии с диалектным диалектом.
11. Как Mybatis инкапсулирует результат выполнения sql в виде целевого объекта и возвращает его? Что такое картографические формы?
Первый заключается в использовании тегов для определения отношения сопоставления между именами столбцов базы данных и именами атрибутов объекта одно за другим.
Во-вторых, использовать функцию псевдонима столбца sql для записи псевдонима столбца в качестве имени атрибута объекта.
С отношением сопоставления между именами столбцов и именами атрибутов Mybatis создает объекты посредством отражения и использует отражение для назначения и возврата атрибутов объекта один за другим.Те атрибуты, которые не могут найти отношение сопоставления, не могут завершить назначение.
13. Как получить значение автоматически сгенерированного (первичного) ключа?
Метод вставки всегда возвращает значение int, представляющее количество вставленных строк.
Если принята стратегия автоматического увеличения, автоматически сгенерированное значение ключа может быть установлено для входящего объекта параметра после выполнения метода вставки.
Пример:
<insert id=”insertname” usegeneratedkeys=”true” keyproperty=” id”>
insert into names (name) values (#{name})
</insert>
name name = new name(); name.setname(“fred”);
int rows = mapper.insertname(name);
// 完成后,id 已经被设置到对象中system.out.println(“rows inserted = ” + rows);
system.out.println(“generated key value = ” + name.getid());
14. Как передать несколько параметров в маппер?
1. Первый тип: функция слоя DAO
public UserselectUser(String name,String area);
Соответствующий xml, #{0} представляет первый параметр на уровне dao, #{1} представляет второй параметр на уровне dao, и другие параметры могут быть добавлены позже.
<select id="selectUser"resultMap="BaseResultMap"> select * fromuser_user_t whereuser_name = #{0}
anduser_area=#{1}
</select>
2. Второй: использовать@paramаннотация:
public interface usermapper {
user selectuser(@param(“username”) string username,@param(“hashedpassword”) string hashedpassword);
}
Затем его можно использовать в xml следующим образом (рекомендуется инкапсулировать в виде карты, передаваемой картографу в качестве одного параметра):
<select id=”selectuser” resulttype=”user”> select id, username, hashedpassword from some_table
where username = #{username}
and hashedpassword = #{hashedpassword}
</select>
3. Третий тип: несколько параметров инкапсулируются в карту.
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();
}
15. Для чего нужен динамический sql Mybatis? Принцип исполнения? Какой там динамический sql?
Mybatis dynamic sql может записывать динамический sql в виде тегов в файле сопоставления Xml.Принцип выполнения заключается в завершении логического суждения и динамическом объединении функций sql в соответствии со значением выражения.
Mybatis предоставляет 9 динамических тегов sql: trim | where | set | foreach | if | Choose
|когда |иначе |связать.
16. Помимо обычных тегов select|insert|updae|delete, какие еще теги есть в файле сопоставления Xml?
отвечать: ,
, а также 9 тегов динамического sql, которые являются тегами фрагментов sql, через
Метки вводятся в сегмент sql для создания меток политики для первичных ключей, не поддерживающих автоинкремент.
17. Можно ли в файле сопоставления Xml Mybatis повторять идентификаторы разных файлов сопоставления Xml?
Для разных файлов сопоставления Xml, если пространство имен настроено, идентификатор может повторяться, если пространство имен не настроено, идентификатор повторяться не может;
Причина в том, что namespace+id используется в качестве ключа Map
18. Почему Mybatis является полуавтоматическим инструментом отображения ORM? Чем он отличается от полностью автоматического?
Hibernate — это полностью автоматический инструмент отображения ORM.При использовании Hibernate для запроса связанного объекта или связанного объекта коллекции он может быть получен непосредственно в соответствии с объектно-реляционной моделью, поэтому он полностью автоматический. Когда Mybatis запрашивает связанные объекты или связанные объекты коллекций, ему необходимо вручную написать sql для завершения этого, поэтому он называется полуавтоматическим инструментом отображения ORM.
20. Сколько способов есть у MyBatis для достижения один-на-один?Как с ним работать?
Есть совместный запрос и вложенный запрос.Совместный запрос - это совместный запрос нескольких таблиц, который запрашивается только один раз.Его можно выполнить, настроив узел ассоциации в resultMap и настроив класс "один к одному";
Вложенный запрос заключается в том, чтобы сначала найти таблицу, а затем запросить данные в другой таблице в соответствии с идентификатором внешнего ключа результата в этой таблице.Он также настраивается через ассоциацию, но запрос другой таблицы настраивается через атрибут select.
21. В MyBatis есть несколько способов реализации «один ко многим», как работать?
Существуют запросы на объединение и вложенные запросы. Совместный запрос — это совместный запрос нескольких таблиц, который запрашивается только один раз.
Узел коллекции в resultMap можно заполнить, настроив классы «один ко многим»; вложенный запрос заключается в том, чтобы сначала найти таблицу, а затем запросить данные в другой таблице в соответствии с идентификатором внешнего ключа результата в этой таблице, также настроив коллекции, но запрос другой таблицы настраивается через узел выбора.
22. Поддерживает ли Mybatis ленивую загрузку? Если поддерживается, каков принцип его реализации?
Ответ: Mybatis поддерживает только ленивую загрузку ассоциативных объектов и объектов коллекций.Ассоциация относится к запросам «один к одному», а коллекция — к запросам «один ко многим». В файле конфигурации Mybatis вы можете указать, следует ли включать отложенную загрузку lazyLoadingEnabled=true|false.
Его принцип заключается в использовании CGLIB для создания прокси-объекта целевого объекта, при вызове целевого метода введите метод перехватчика, например вызов a.getB().getName(), метод перехватчика invoke() находит, что a. getB() is Если значение равно null, то предварительно сохраненный sql запроса, связанный с объектом B, будет отправлен отдельно, B будет запрошен, а затем будет вызван a.setB(b), поэтому объект b атрибут a будет иметь значение, а затем завершит вызов метода a.getB().getName(). Это основной принцип ленивой загрузки.
Конечно, не только Mybatis, но и почти все, включая Hibernate, поддерживают тот же принцип ленивой загрузки.
23. Тайники первого и второго уровня Mybatis:
1) Кэш уровня 1: локальный кеш HashMap на основе PerpetualCache, а область его хранения — сеанс.Когда сеанс сбрасывается или закрывается, все кэши в сеансе будут очищены, а кеш уровня 1 будет открыт по умолчанию.
2) Механизм кеша второго уровня такой же, как у кеша первого уровня.По умолчанию для хранения используются PerpetualCache и HashMap.Разница в том, что его областью хранения является Mapper (Namespace), а источником хранения можно настроить, например Ehcache. Кэш второго уровня по умолчанию не открывается. Чтобы включить кеш второго уровня, используйте класс атрибутов кеша второго уровня для реализации интерфейса сериализации Serializable (который можно использовать для сохранения состояния объекта), который может быть настроен в его файле сопоставления
3) Для механизма обновления данных кеша, когда определенная область (сеанс кеша первого уровня/кэш второго уровня)
После операции C/U/D пространств имен) кэш во всех выборках в этой области будет очищен по умолчанию.
24. Какая привязка интерфейса у MyBatis? Каковы методы реализации?
Привязка интерфейса — это произвольное определение интерфейса в MyBatis, а затем привязка метода в интерфейсе к оператору SQL.Можно напрямую вызывать метод интерфейса, чтобы иметь более гибкие варианты выбора и настройки, чем исходный метод, предоставляемый SqlSession. .
Существует два способа реализации привязки интерфейса: один — через привязку аннотаций, то есть добавление @Select, @Update и других аннотаций к методу интерфейса, содержащему операторы Sql для привязки, а другой — написать SQL в формате xml. в этом случае пространство имен в указанном файле сопоставления xml должно быть полным путем к интерфейсу. Когда оператор Sql относительно прост, используйте привязку аннотации, когда оператор SQL более сложный, используйте привязку xml, обычно используйте больше привязок xml.
25. Каковы требования для использования картографического интерфейса MyBatis?
1. Имя метода интерфейса Mapper совпадает с идентификатором каждого sql, определенного в mapper.xml;
2. Тип входного параметра метода интерфейса Mapper совпадает с типом параметра каждого sql, определенного в mapper.xml;
3. Тип выходного параметра метода интерфейса Mapper совпадает с типом результата каждого sql, определенного в mapper.xml;
4. Пространство имен в файле Mapper.xml — это путь к классу интерфейса преобразователя.
26. Какие есть способы написать Mapper?
Первый: класс реализации интерфейса наследует SqlSessionDaoSupport: для использования этого метода необходимо написать интерфейс преобразователя, класс реализации интерфейса преобразователя и файл mapper.xml.
1. Настройте расположение mapper.xml в sqlMapConfig.xml.
<mappers>
<mapper resource="mapper.xml 文件的地址" />
<mapper resource="mapper.xml 文件的地址" />
</mappers>
1. Определите интерфейс картографа
3. Реализовать интеграцию классов SqlSessionDaoSupport
В методе сопоставления this.getSqlSession() можно использовать для добавления, удаления, изменения и запроса данных.
4. Конфигурация пружины
<bean id=" " class="mapper 接口的实现">
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>
Второе: используйте org.mybatis.spring.mapper.MapperFactoryBean:
1. Настройте расположение файла mapper.xml в sqlMapConfig.xml.Если файл mapper.xml и интерфейс mappre имеют одно и то же имя и находятся в одном каталоге, настройка здесь не требуется.
<mappers>
<mapper resource="mapper.xml 文件的地址" />
<mapper resource="mapper.xml 文件的地址" />
</mappers>
2. Определите интерфейс картографа:
1. Пространство имен в mapper.xml — это адрес интерфейса картографа.
2. Имя метода в интерфейсе картографа соответствует идентификатору определенного оператора в mapper.xml.
3. Определено весной
<bean id="" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="mapper 接口地址" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
Третье: используйте маппер-сканер:
1. Напишите файл mapper.xml:
Пространство имен в mapper.xml — это адрес интерфейса преобразователя;
Имя метода в интерфейсе сопоставления соответствует идентификатору определенного оператора в mapper.xml;
Если вы сохраните имя файла mapper.xml и интерфейса преобразователя, вам не нужно настраивать его в sqlMapConfig.xml.
2. Определите интерфейс картографа:
Обратите внимание, что имя файла mapper.xml совпадает с именем интерфейса картографа и находится в том же каталоге.
3. Настройте маппер-сканер:
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="mapper 接口包地址"></property>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
4. После использования сканера получите объект реализации маппера из контейнера Spring.
27. Кратко опишите принцип работы плагина Mybatis и как написать плагин.
Ответ: Mybatis может писать команды только для ParameterHandler, ResultSetHandler,
Для подключаемых модулей четырех интерфейсов, StatementHandler и Executor, Mybatis использует динамический прокси-сервер JDK для создания прокси-объектов для интерфейсов, которые необходимо перехватывать для реализации функции перехвата метода интерфейса. будет введен метод перехвата.В частности, метод invoke() InvocationHandler, конечно же, перехватывает только те методы, которые вы укажете для перехвата.
Напишите подключаемый модуль: реализуйте интерфейс Interceptor Mybatis и переопределите метод intercept(), а затем напишите аннотации для подключаемого модуля, чтобы указать, какие методы какого интерфейса вы хотите перехватывать. Помните, не забудьте настроить плагин, который вы написали в файле конфигурации.
Дополнительные преимущества:
Если вам нужны дополнительные вопросы для интервью и учебные материалы, обратите внимание на публичный аккаунт Brother B: Java2B (поиск WeChat)