Серия MyBatis (5): базовое использование метода аннотации MyBatis

MyBatis

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 от входа до мастерства"