1. @Выберите аннотацию
1.1 Используйте оператор Sql для установки режима псевдонима
Предположим, теперь есть требование: запрашивать информацию о роли на основе идентификатора. Как использовать аннотации для достижения этого?
Во-первых, добавьте в интерфейс SysRoleMappper следующий метод:
@Select({"SELECT id,role_name roleName,enabled,create_by createBy,create_time createTime ","FROM sys_role ","WHERE id = #{id}"})
SysRole selectById(Long id);
Приведенный выше код также может быть записан в следующем формате:
@Select({"SELECT id,role_name roleName,enabled,create_by createBy,create_time createTime FROM sys_role WHERE id = #{id}"})
SysRole selectById(Long id);
Вышеупомянутые два метода все в форме передачи строковых массивов, мы также можем использовать форму передачи строк напрямую:
@Select("SELECT id,role_name roleName,enabled,create_by createBy,create_time createTime FROM sys_role WHERE id = #{id}")
SysRole selectById(Long id);
Использование аннотаций также необходимо рассмотреть отображение полей таблицы и поля Java атрибута. Есть три основных способа использования аннотаций.
Первый способ — установить псевдоним с помощью инструкции Sql, что и используется в приведенном выше коде.
1.2 Используйте метод конфигурации mapUnderscoreToCamelCase
Откройте созданный ранее файл mybatis-config.xml в каталоге src/main/resources и добавьте следующую конфигурацию:
<settings>
<!--其他配置-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
После включения конфигурации MyBatis автоматически сопоставит по правилу «подчеркивание с горбом», то есть столбец базы данных имя_роли будет автоматически преобразован в атрибут имя_роли.
На этом этапе приведенный выше код можно изменить на:
@Select("SELECT id,role_name,enabled,create_by,create_time FROM sys_role WHERE id = #{id}")
SysRole selectById(Long id);
Хотя его также можно записать в следующем формате, не рекомендуется использовать его таким образом:
@Select("SELECT * FROM sys_role WHERE id = #{id}")
SysRole selectById(Long id);
1.3 Использование метода resultMap
В xml мы использовали resultMap для настройки отображения:
<resultMap id="sysUserMap" type="com.zwwhnly.mybatisaction.model.SysUser">
<id property="id" column="id"/>
<result property="userName" column="user_name"/>
<result property="userPassword" column="user_password"/>
<result property="userEmail" column="user_email"/>
<result property="userInfo" column="user_info"/>
<result property="headImg" column="head_img" jdbcType="BLOB"/>
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
</resultMap>
В методе аннотации есть соответствующая аннотация @Results для настройки отображения:
@Results({
@Result(property = "id", column = "id", id = true),
@Result(property = "roleName", column = "role_name"),
@Result(property = "enabled", column = "enabled"),
@Result(property = "createBy", column = "create_by"),
@Result(property = "createTime", column = "create_time")
})
@Select("SELECT id,role_name,enabled,create_by,create_time FROM sys_role WHERE id = #{id}")
SysRole selectById2(Long id);
Простое объяснение кода:
1) Аннотация @Results соответствует тегу resultMap в xml
2) @Result соответствует тегу результата в xml
3)@Result(property = "id", column = "id", id = true)
соответствует xml<id property="id" column="id"/>
Некоторые люди могут спросить, я установил идентификатор для resultMap в xml, чтобы я мог повторно использовать resultMap, поддерживается ли он в методе аннотации?
Имея в виду этот вопрос, давайте попробуем изменить код:
@Results(id = "roleResultMap", value = {
@Result(property = "id", column = "id", id = true),
@Result(property = "roleName", column = "role_name"),
@Result(property = "enabled", column = "enabled"),
@Result(property = "createBy", column = "create_by"),
@Result(property = "createTime", column = "create_time")
})
@Select("SELECT id,role_name,enabled,create_by,create_time FROM sys_role WHERE id = #{id}")
SysRole selectById2(Long id);
Получается, что код компилируется неправильно и атрибут id не может быть найден.
Нажмите Ctrl+B и убедитесь, что исходный код @Results выглядит следующим образом:
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Results {
Result[] value() default {};
}
Из исходного кода мы можем обнаружить, что эта аннотация не имеет атрибута id.Нужно ли нам добавлять повторные сопоставления для каждого метода?
Ответ, конечно, нет, но в MyBatis 3.3.0 и предыдущих версиях @Results, определенные аннотациями, не могут быть разделены, и это нужно прописывать на каждом методе. Но, начиная с MyBatis версии 3.3.1, в аннотацию @Results добавлен атрибут id. После установки атрибута id вы можете ссылаться на ту же конфигурацию @Results через атрибут id.
Читатели, которые читали предыдущие блоги, возможно, знают, что наш MyBatis использует только версию 3.3.0, поэтому он просто не поддерживает установку атрибута id, ха-ха.
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.3.0</version>
</dependency>
Измените версию MyBatis на 3.3.1 (если не установлен автоматический импорт изменений, необходимо вручную нажать «Импортировать изменения»):
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.3.1</version>
</dependency>
В это время вы обнаружите, что код, изначально скомпилировавший ошибку, может быть скомпилирован и передан.
На данный момент исходный код @Results выглядит следующим образом: по сравнению с предыдущим кодом добавлен атрибут id:
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Results {
String id() default "";
Result[] value() default {};
}
Итак, как сослаться на эту аннотацию @Results? См. следующий код:
@ResultMap("roleResultMap")
@Select("SELECT * FROM sys_role")
List<SysRole> selectAll();
Примечание. При использовании с XML указанное здесь значение id также может быть значением атрибута id элемента resultMap в XML.
Чтобы не занимать слишком много места, код модульного теста и журнал вывода этих трех методов не будут здесь публиковаться Я считаю, что читатели, которые читали предыдущие блоги, уже могут сами написать код модульного теста, а вы также можете обратиться к исходному коду в конце статьи.Загрузите исходный код по адресу.
2. @Вставить аннотацию
2.1 Нет необходимости возвращать первичный ключ
Почти так же, как и в XML, код выглядит следующим образом:
@Insert({"INSERT INTO sys_role(id, role_name, enabled, create_by, create_time) ",
"VALUES (#{id},#{roleName},#{enabled},#{createBy},#{createTime,jdbcType=TIMESTAMP})"})
int insert(SysRole sysRole);
2.2 Возврат автоинкрементного первичного ключа
Если вам нужно вернуть автоинкрементный первичный ключ базы данных, код выглядит следующим образом:
@Insert({"INSERT INTO sys_role(role_name, enabled, create_by, create_time) ",
"VALUES (#{roleName},#{enabled},#{createBy},#{createTime,jdbcType=TIMESTAMP})"})
@Options(useGeneratedKeys = true, keyProperty = "id")
int insertUseGeneratedKeys(SysRole sysRole);
Подобно тому, как это используется в XML,@Options(useGeneratedKeys = true, keyProperty = "id")
Эквивалент XMLuseGeneratedKeys="true" keyProperty="id"
.
2.3 Вернуть неавтоматически увеличивающийся первичный ключ
В предыдущих блогах мы знали, что selectKey поддерживает как базы данных с автоматически увеличивающимися первичными ключами, такими как MySql, так и базы данных с неавтоматически увеличивающимися первичными ключами, такими как Oracle, которые написаны на XML следующим образом:
<selectKey keyColumn="id" resultType="long" keyProperty="id" order="AFTER">
SELECT 1491607
</selectKey>
Итак, как использовать аннотации для достижения этого? Код выглядит следующим образом:
@Insert({"INSERT INTO sys_role(role_name, enabled, create_by, create_time) ",
"VALUES (#{roleName},#{enabled},#{createBy},#{createTime,jdbcType=TIMESTAMP})"})
@SelectKey(statement = "SELECT 1491607", keyColumn = "id", keyProperty = "id", resultType = Long.class, before = false)
int insertUseSelectKey(SysRole sysRole);
before = false эквивалентно order="AFTRE" в XML, который является конфигурацией базы данных MySql.
before = true эквивалентно order="BEFORE" в XML, который является конфигурацией базы данных Oracle.
Примечание. Значение инструкции в разных базах данных будет отличаться. Значение, указанное выше, относится к базе данных MySql. Обратите внимание на изменения при использовании других типов баз данных.
3. @Обновить аннотацию
Почти так же, как и в XML, код выглядит следующим образом:
@Update({"UPDATE sys_role ", "SET role_name = #{roleName},enabled = #{enabled},create_by=#{createBy}, ",
"create_time=#{createTime,jdbcType=TIMESTAMP} ", " WHERE id=#{id}"})
int updateById(SysRole sysRole);
4. @Удалить аннотацию
Почти так же, как и в XML, код выглядит следующим образом:
@Delete("DELETE FROM sys_role WHERE id = #{id}")
int deleteById(Long id);
5. Аннотация провайдера
MyBatis предоставляет аннотации 4 поставщиков, а именно @SelectProvider, @InsertProvider, @UpdateProvider и @DeleteProvider.
Давайте возьмем @SelectProvider в качестве примера, чтобы понять, как использовать аннотацию Provider.
Сначала создайте следующий класс в пакете com.zwwhnly.mybatisaction.mapper:
package com.zwwhnly.mybatisaction.mapper;
import org.apache.ibatis.jdbc.SQL;
public class SysPrivilegeProvider {
public String selectById(final Long id) {
return new SQL() {
{
SELECT("id,privilege_name,privilege_url");
FROM("sys_privilege");
WHERE("id = #{id}");
}
}.toString();
}
}
Приведенный выше код также можно записать следующим образом:
public String selectById(final Long id) {
return "SELECT id,privilege_name,privilege_url FROM sys_privilege WHERE id = #{id}";
}
Затем добавьте в интерфейс SysPrivilegeProvider следующий метод:
@SelectProvider(type = SysPrivilegeProvider.class, method = "selectById")
SysPrivilege selectById(Long id);
Наконец, создайте новый тестовый класс SysPrivilegeMapperTest в пакете com.zwwhnly.mybatisaction.mapper в src/test/java:
package com.zwwhnly.mybatisaction.mapper;
import com.zwwhnly.mybatisaction.model.SysPrivilege;
import org.apache.ibatis.session.SqlSession;
import org.junit.Assert;
import org.junit.Test;
public class SysPrivilegeMapperTest extends BaseMapperTest {
@Test
public void testSelectById() {
SqlSession sqlSession = getSqlSession();
try {
SysPrivilegeMapper sysPrivilegeMapper = sqlSession.getMapper(SysPrivilegeMapper.class);
SysPrivilege sysPrivilege = sysPrivilegeMapper.selectById(1L);
Assert.assertNotNull(sysPrivilege);
Assert.assertEquals("用户管理", sysPrivilege.getPrivilegeName());
} finally {
sqlSession.close();
}
}
}
Запустите тестовый код, тест пройден, и выходной журнал выглядит следующим образом:
DEBUG [main] - ==> Preparing: SELECT id,privilege_name,privilege_url FROM sys_privilege WHERE (id = ?) DEBUG [main] - ==> Parameters: 1(Long)
TRACE [main] - <== Columns: id, privilege_name, privilege_url
TRACE [main] -
DEBUG [main] - <== Total: 1
6. Исходный код и ссылка
Адрес источника:GitHub.com/Как Ухань, где/каждый шаг…, добро пожаловать на скачивание.
Лю Цзэнхуэй "MyBatis от входа до мастерства"