Это 27-й день моего участия в августовском испытании обновлений. Ознакомьтесь с подробностями мероприятия: Испытание августовского обновления
Как Mybatis инкапсулирует результат выполнения sql в качестве целевого объекта и возвращает его? Что такое картографические формы?
Первый метод заключается в использовании тегов для определения сопоставления между именами столбцов базы данных и именами свойств объекта одно за другим.
Второй метод заключается в использовании функции псевдонима столбца SQL для записи псевдонима столбца в качестве имени свойства объекта.
Используя сопоставление между именами столбцов и именами атрибутов, Mybatis создает объекты посредством отражения и использует атрибуты отраженного объекта для присвоения значений по одному и их возврата.Если отношение сопоставления не может быть найдено, назначение не может быть завершено.
Как Mybatis выполняет массовые вставки?
- Сначала создайте простую инструкцию INSERT:
<insert id=”insertname”>
insert into names (name) values (#{value})
</insert>
Затем выполните операцию массовой вставки в коде Java:
list < string > names = new arraylist();
names.add(“fred”);
names.add(“barney”);
names.add(“betty”);
names.add(“wilma”);
// 注意 executortype.batch
sqlsession sqlsession =sqlsessionfactory.opensession(executortype.batch);
try {
namemapper mapper = sqlsession.getmapper(namemapper.class);
for (string name: names) {
mapper.insertname(name);
}
sqlsession.commit();
} catch (Exception e) {
e.printStackTrace();
sqlSession.rollback();
throw e;
} finally {
sqlsession.close();
}
Как Mybatis получает автоматически сгенерированное (первичное) значение ключа?
Настройки оператора вставки файла сопоставления
useGeneratedKeys="true" keyProperty="id"
Как Mybatis передает несколько параметров в картограф?
Первая схема Функциональный метод слоя DAO
Public User selectUser(String name,String area);
Соответствующий файл конфигурации Mapper.xml
<select id="selectUser" resultMap="BaseResultMap" parameterType="java.lang.String">
select * from user_user_t where user_name = #{0} and user_area=#{1}
</select>
Среди них #{0} представляет первый параметр полученного уровня dao, #{1} представляет второй параметр на уровне dao, и позже можно добавить дополнительные параметры.
Второй функциональный метод слоя Дао
Public User selectUser(@param(“userName”)Stringname,@param(“userArea”)String area);
Соответствующий файл конфигурации Mapper.xml
<select id=" selectUser" resultMap="BaseResultMap">
select * from user_user_t where user_name = #{userName,jdbcType=VARCHAR} and user_area=#{userArea,jdbcType=VARCHAR}
</select>
Лично я считаю, что этот метод лучше. Он позволяет разработчикам знать, какие параметры передавать, когда они видят метод слоя dao. Он более интуитивно понятен, и я лично рекомендую этот метод.
Какая польза от динамического sql Mybatis? Принцип исполнения? Какой там динамический sql?
Динамический sql Mybatis может записывать динамический sql в виде тегов в файле сопоставления Xml,
Принцип выполнения — функция завершения логического суждения и динамического сплайсинга sql в соответствии со значением выражения.
Существует девять типов динамического SQL, а именно: обрезка | где | установка | foreach | если | выбор | когда | иначе | привязка.
Конкретные девять примеров динамического SQL:
если тег
<!-- 查询学生list,like姓名 -->
<select id=" getStudentListLikeName " parameterType="StudentEntity" resultMap="studentResultMap">
SELECT * from STUDENT_TBL ST
<if test="studentName!=null and studentName!='' ">
WHERE ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%')
</if>
</select>
где тег
<!-- 查询学生list,like姓名,=性别 -->
<select id="getStudentListWhere" parameterType="StudentEntity" resultMap="studentResultMap">
SELECT * from STUDENT_TBL ST
<where>
<if test="studentName!=null and studentName!='' ">
ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%')
</if>
<if test="studentSex!= null and studentSex!= '' ">
AND ST.STUDENT_SEX = #{studentSex}
</if>
</where>
</select>
установить тег
<!-- 更新学生信息 -->
<update id="updateStudent" parameterType="StudentEntity">
UPDATE STUDENT_TBL
<set>
<if test="studentName!=null and studentName!='' ">
STUDENT_TBL.STUDENT_NAME = #{studentName},
</if>
<if test="studentSex!=null and studentSex!='' ">
STUDENT_TBL.STUDENT_SEX = #{studentSex},
</if>
<if test="studentBirthday!=null ">
STUDENT_TBL.STUDENT_BIRTHDAY = #{studentBirthday},
</if>
<if test="classEntity!=null and classEntity.classID!=null and classEntity.classID!='' ">
STUDENT_TBL.CLASS_ID = #{classEntity.classID}
</if>
</set>
WHERE STUDENT_TBL.STUDENT_ID = #{studentID};
</update>
тег обрезки
<!-- 查询学生list,like姓名,=性别 -->
<select id="getStudentListWhere" parameterType="StudentEntity" resultMap="studentResultMap">
SELECT * from STUDENT_TBL ST
<trim prefix="WHERE" prefixOverrides="AND|OR">
<if test="studentName!=null and studentName!='' ">
ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%')
</if>
<if test="studentSex!= null and studentSex!= '' ">
AND ST.STUDENT_SEX = #{studentSex}
</if>
</trim>
</select>
выбирать, когда иначе Теги
<!-- 查询学生list,like姓名、或=性别、或=生日、或=班级,使用choose -->
<select id="getStudentListChooseEntity" parameterType="StudentEntity" resultMap="studentResultMap">
SELECT * from STUDENT_TBL ST
<where>
<choose>
<when test="studentName!=null and studentName!='' ">
ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%')
</when>
<when test="studentSex!= null and studentSex!= '' ">
AND ST.STUDENT_SEX = #{studentSex}
</when>
<when test="studentBirthday!=null">
AND ST.STUDENT_BIRTHDAY = #{studentBirthday}
</when>
<when test="classEntity!=null and classEntity.classID !=null and classEntity.classID!='' ">
AND ST.CLASS_ID = #{classEntity.classID}
</when>
<otherwise>
</otherwise>
</choose>
</where>
</select>
foreach
<select id="getStudentListByClassIDs" resultMap="studentResultMap">
SELECT * FROM STUDENT_TBL ST
WHERE ST.CLASS_ID IN
<foreach collection="list" item="classList" open="(" separator="," close=")">
#{classList}
</foreach>
</select>
В файле сопоставления Xml Mybatis может ли повторяться идентификатор разных файлов сопоставления Xml?
Различные файлы сопоставления Xml, если пространство имен настроено, идентификатор может повторяться;
Если пространство имен не настроено, идентификатор не может быть повторен, причина в том, что пространство имен + идентификатор используется в качестве ключа Map
С пространством имен естественный идентификатор может повторяться, и пространство имен + идентификатор, естественно, отличается, если пространство имен отличается.
Помимо обычных тегов select|insert|updae|delete, какие еще теги есть в файле сопоставления Xml?
, , , , плюс 9 тегов динамического sql, из которых тег sql фрагмент, sql фрагмент вводится через тег, а тег стратегии генерируется для первичного ключа, не поддерживающего автоинкремент.
Почему Mybatis — это полуавтоматический инструмент отображения ORM? Чем он отличается от полностью автоматического?
Hibernate — это полностью автоматический инструмент отображения ORM.При использовании Hibernate для запроса связанного объекта или связанного объекта коллекции он может быть получен непосредственно в соответствии с объектно-реляционной моделью, поэтому он полностью автоматический. Когда Mybatis запрашивает связанные объекты или связанные объекты коллекций, ему необходимо вручную написать sql для его завершения, поэтому он называется полуавтоматическим инструментом сопоставления ORM.
Запрос ассоциации «один к одному», «один ко многим» в Mybatis?
реляционный запрос один к одному
<mapper namespace="com.lcb.mapping.userMapper">
<!--association 一对一关联查询 -->
<select id="getClass" parameterType="int" resultMap="ClassesResultMap">
select * from class c,teacher t where c.teacher_id=t.t_id and c.c_id=#{id}
</select>
<resultMap type="com.lcb.user.Classes" id="ClassesResultMap">
<!-- 实体类的字段名和数据表的字段名映射 -->
<id property="id" column="c_id"/>
<result property="name" column="c_name"/>
<association property="teacher" javaType="com.lcb.user.Teacher">
<id property="id" column="t_id"/>
<result property="name" column="t_name"/>
</association>
</resultMap>
</mapper>
Запрос ассоциации «один ко многим»
<!--collection 一对多关联查询 -->
<select id="getClass2" parameterType="int" resultMap="ClassesResultMap2">
select * from class c,teacher t,student s where c.teacher_id=t.t_id and c.c_id=s.class_id and c.c_id=#{id}
</select>
<resultMap type="com.lcb.user.Classes" id="ClassesResultMap2">
<id property="id" column="c_id"/>
<result property="name" column="c_name"/>
<association property="teacher" javaType="com.lcb.user.Teacher">
<id property="id" column="t_id"/>
<result property="name" column="t_name"/>
</association>
<collection property="student" ofType="com.lcb.user.Student">
<id property="id" column="s_id"/>
<result property="name" column="s_name"/>
</collection>
</resultMap>
Сколько способов MyBatis реализует один к одному? Как это работает?
Существуют запросы на объединение и вложенные запросы,
Совместный запрос — это совместный запрос нескольких таблиц, который запрашивается только один раз.Это можно выполнить, настроив узел ассоциации в resultMap и настроив класс «один к одному»;
Вложенный запрос заключается в том, чтобы сначала найти таблицу, а затем запросить данные в другой таблице в соответствии с идентификатором внешнего ключа результата в этой таблице.Он также настраивается через ассоциацию, но запрос другой таблицы настраивается через атрибут select.
В MyBatis есть несколько способов реализации «один ко многим», как работать?
Существуют запросы на объединение и вложенные запросы.
Совместный запрос — это совместный запрос нескольких таблиц, который запрашивается только один раз и может быть выполнен путем настройки класса «один ко многим» в узле коллекции в resultMap; вложенный запрос — это сначала поиск таблицы, а затем в соответствии с идентификатором внешнего ключа результата в этой таблице. Чтобы запросить данные в другой таблице, это также осуществляется через конфигурацию коллекции, но запрос другой таблицы настраивается через узел выбора.
Поддерживает ли Mybatis ленивую загрузку? Если поддерживается, каков принцип его реализации?
Mybatis поддерживает толькоassociationсопутствующие объекты иcollectionЛенивая загрузка объектов ассоциативной коллекции , ассоциация относится к запросу «один к одному», коллекция относится к запросу «один ко многим». В файле конфигурации Mybatis вы можете указать, следует ли включать отложенную загрузку lazyLoadingEnabled=true|false.
Его принцип заключается в использовании CGLIB для создания прокси-объекта целевого объекта.При вызове целевого метода введите метод перехватчика, например вызов a.getB().getName(), метод перехватчика invoke() находит, что a. getB() is Если значение равно null, то sql предварительно сохраненного запроса, связанного с объектом B, будет отправлен отдельно, B будет запрошен, а затем будет вызван a.setB(b), поэтому объект b имеет значение, а затем завершите вызов метода a.getB().getName(). Это основной принцип ленивой загрузки.
Разумеется, не только Mybatis, но и почти все, включая Hibernate, поддерживают тот же принцип отложенной загрузки.
Тайники уровня 1 и уровня 2 Mybatis
Кэш L1:
Mybatis поддерживает кэширование, но без настройки по умолчанию он включает только кэширование 1-го уровня. Кэширование уровня 1 включено только для одного и того же SqlSession. Итак, если параметры SQL точно такие же, мы вызываем метод карты с тем же объектом SqlSession, обычно выполняем SQL только один раз, потому что первый запрос с использованием SelSession MyBatis поместит его в кеш, а последующие запросы, если они не объявлены необходимо обновить, если нет в кеше, SqlSession получит текущие кэшированные данные и больше не будет отправлять SQL в базу данных
Кэш L2:
Вторичный кеш MyBatis — это кеш уровня приложения, который может повысить эффективность запросов к базе данных для повышения производительности приложения. Механизм кеша второго уровня такой же, как у кеша первого уровня, по умолчанию для хранения используются PerpetualCache и HashMap, разница в том, что его областью хранения является Mapper (Namespace), а источником хранения может быть настраиваемые, такие как Ehcache. Кэш второго уровня не открывается по умолчанию.Чтобы включить кеш второго уровня, использование класса атрибута кеша второго уровня должно реализовать интерфейс сериализации Serializable (который можно использовать для сохранения состояния объекта), который может быть настроен в его файле сопоставления;
Для механизма обновления данных кэша, когда операция C/U/D выполняется в области (сеанс кэша первого уровня/пространства имен кэша второго уровня), кэши во всех выборках в этой области будут очищены по умолчанию.
Что такое привязка интерфейса в MyBatis? Каковы методы реализации?
привязка интерфейса , заключается в том, чтобы произвольно определить интерфейс в MyBatis, а затем связать метод интерфейса с оператором SQL, мы можем напрямую вызвать метод интерфейса, чтобы иметь более гибкие варианты выбора и настройки, чем исходный метод, предоставляемый SqlSession.
Существует два способа реализации привязки интерфейса: один — через привязку аннотаций, то есть добавление @Select, @Update и других аннотаций к методам интерфейса, которые содержат операторы Sql для привязки;
Другой — привязать, написав SQL в XML.В этом случае пространство имен в указанном файле сопоставления XML должно быть полным путем к интерфейсу.
Когда оператор Sql относительно прост, используйте привязку аннотации, когда оператор SQL более сложный, используйте привязку xml, как правило, больше привязки xml.
Каковы требования для использования картографического интерфейса MyBatis?
Имя метода интерфейса Mapper совпадает с идентификатором каждого sql, определенного в mapper.xml;
Тип входного параметра метода интерфейса Mapper совпадает с типом параметра каждого sql, определенного в mapper.xml;
Тип выходного параметра метода интерфейса Mapper совпадает с типом результата каждого sql, определенного в mapper.xml;
Пространство имен в файле Mapper.xml — это путь к классу интерфейса сопоставления.
Несколько реализаций, написанных Mapper?
Во-первых, класс реализации интерфейса наследует SqlSessionDaoSupport: для использования этого метода необходимо написать интерфейс преобразователя, класс реализации интерфейса преобразователя и файл mapper.xml.
1. Настройте расположение mapper.xml в sqlMapConfig.xml.
<mappers>
<mapper resource="mapper.xml 文件的地址" />
<mapper resource="mapper.xml 文件的地址" />
</mappers>
2. Определите интерфейс картографа.
3. Реализовать интеграцию классов.В методе SqlSessionDaoSupportmapper 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. Определите интерфейс картографа:
2.1 Пространство имен в mapper.xml — это адрес интерфейса картографа
2.2. Имя метода в интерфейсе картографа соответствует идентификатору определенного оператора в mapper.xml.
2.3, определено в Spring
<bean id="" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="mapper 接口地址" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
В-третьих, используйте маппер-сканер:
1. В файл mapper.xml записывается: пространство имен в mapper.xml — это адрес интерфейса маппера, имя метода в интерфейсе маппера согласуется с id определенного оператора в mapper.xml, если имена маппера .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 после использования сканера.
Кратко опишите принцип работы плагина Mybatis, и как написать плагин?
Mybatis может взаимодействовать только с ParameterHandler, ResultSetHandler, StatementHandler и Executor. Mybatis использует динамическую генерацию JDK для генерации прокси-объектов для интерфейсов, которые необходимо перехватить, чтобы реализовать методы интерфейса при выполнении этих 4-х типов для перехвата Invoke(), Invoke(), Invoke(), разумеется, метод будет только перехватывать те, которые вы указываете, нуждаются в методе перехвата.
Напишите плагин: реализуйте интерфейс Interceptor Mybatis
public interface Interceptor {
Object intercept(Invocation invocation) throws Throwable;
default Object plugin(Object target) {
return Plugin.wrap(target, this);
}
default void setProperties(Properties properties) {
// NOP
}
}
Плагины дублирующих методов intercept() пишут аннотации, чтобы указать, какие методы интерфейса должны быть перехвачены. Не забудьте не забыть текст конфигурации для настройки плагина, который вы пишете.
public class Invocation {
private final Object target;
private final Method method;
private final Object[] args;
public Invocation(Object target, Method method, Object[] args) {
this.target = target;
this.method = method;
this.args = args;
}
public Object getTarget() {
return target;
}
public Method getMethod() {
return method;
}
public Object[] getArgs() {
return args;
}
public Object proceed() throws InvocationTargetException, IllegalAccessException {
return method.invoke(target, args);
}
}
Описание метода: Эта штука содержит четыре понятия:
- целевой перехваченный объект
- Метод перехватывает конкретный метод в цели, а это означает, что степень детализации плагина Mybatis соответствует уровню метода.
- args Перехваченные аргументы.
- continue выполняет перехваченный метод, вы можете делать некоторые вещи до и после выполнения.
Суммировать:
Что ж, я поделюсь ею сегодня.Вообще говоря, эта статья относительно хороша для изучения или интервью, и точки знаний, затронутые в статье, более важны.