1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/dromara-mybatis-jpa-extra

Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

MyBatis JPA Extra

MyBatis JPA Extra расширяет функциональность MyBatis, добавляя возможности Jakarta JPA 3.

  1. Jakarta JPA 3 аннотации упрощают работу с CUID;

  2. Улучшенная пагинация для запросов SELECT;

  3. Цепочечный конструктор условий запроса; поддерживает вызов в Lambda-формате, что облегчает создание различных условий запроса;

  4. Аннотация @Encrypted легко реализует шифрование и расшифровку данных полей;

  5. Автоматическое заполнение данных полей;

  6. Поддержка баз данных

База данных Поддержка
MySQL
PostgreSQL
Oracle
SqlServer
DB2

Репозитории кода

| GitCode | Gitee |GitHub |

1. Jakarta JPA 3 аннотации

1.1. Аннотации

  • @Entity
  • @Table
  • @Column
  • @ColumnDefault
  • @Id
  • @GeneratedValue
  • @Encrypted
  • @Transient
  • @Temporal
  • @PartitionKey
  • @SoftDelete

1.2. Стратегии генерации ключей

Поддерживает три стратегии генерации ключей

Номер Стратегия Поддержка
1 AUTO Автоматическое заполнение ключа
snowflakeid (снежинка ID - по умолчанию)
uuid (UUID)
2 SEQUENCE Генерация ключа с помощью базы данных, значение генератора - имя последовательности базы данных
3 IDENTITY Автозаполнение ключа в таблице базы данных
@Entity
@Table(name = "STUDENTS")  
public class Students extends JpaEntity implements Serializable {
    @Id
    @Column
    @GeneratedValue
    private String id;
    @Column
    private String stdNo;
    @Column
    @Encrypted
    private String password;
    @Column
    private String stdName;
    @Column
    @ColumnDefault("'M'")
    private String stdGender;
    @Column
    private int stdAge;
    @Column
    private String stdMajor;
    @Column
    private String stdClass;
    @Column
    private byte[] images;
    @Column(insertable = false)
    @GeneratedValue
    @Temporal(TemporalType.TIMESTAMP)
    private LocalDateTime modifyDate;
    @SoftDelete
    @Column(name = "is_deleted")
    private int isDeleted;
    //getter setter
}

2 Основные операции## 2.1 CRUD

    //Добавление данных
    @Test
    void insert() throws Exception {
        Students student = new Students();
        student.setStdNo("10024");
        student.setStdGender("M");
        student.setStdName("Сыма Цзяо");
        student.setStdAge(20);
        student.setStdMajor("Политика");
        student.setStdClass("4");
        service.insert(student);
    }
    //Поиск данных и обновление
    @Test
    void update() throws Exception {
        Students student = service.get("317d5eda-927c-4871-a916-472a8062df23");
        student.setStdMajor("Политика");
        service.update(student);
    }
    //Поиск по сущности и обновление
    @Test
    void merge() throws Exception {
        Students student = new Students();
        student.setStdMajor("Политика");
        student.setStdClass("4");
        service.merge(student);
    }
    //Поиск по ID
    @Test
    void get() throws Exception {
        Students student = service.get("317d5eda-927c-4871-a916-472a8062df23");
    }
    //Поиск по сущности
    @Test
    void query() throws Exception {
        Students student = new Students();
        student.setStdGender("M");
        List<Students> listStudents = service.query(student);
    }
    //Получение всех записей
    @Test
    void findAll() throws Exception {
        List<Students> listStudents = service.findAll();
    }
    //Удаление по ID
    @Test
    void delete() throws Exception {
        service.delete("921d3377-937a-4578-b1e2-92fb23b5e512");
    }
    //Массовое удаление по списку ID
    @Test
    void batchDelete() throws Exception {
        List<String> idList = new ArrayList<String>();
        idList.add("8584804d-b5ac-45d2-9f91-4dd8e7a090a7");
        idList.add("ab7422e9-a91a-4840-9e59-9d911257c918");
        //...
        service.deleteBatch(idList);
    }

2.2 Логическое удаление

    //Массовое логическое удаление по списку ID
    @Test
    void softDelete() throws Exception {
        List<String> idList = new ArrayList<String>();
        idList.add("8584804d-b5ac-45d2-9f91-4dd8e7a090a7");
        idList.add("ab7422e9-a91a-4840-9e59-9d911257c918");
        //...
        service.softDelete(idList);
    }
```## 2.3 Поиск с использованием Find и Query конструктора

```java
    // Способ запроса SpringJDBC: where StdNo = '10024' or StdNo = '10004'
    @Test
    void find() throws Exception {
        List<Students> listStudents = service.find(" StdNo = ? or StdNo = ? ",
                new Object[]{"10024", "10004"},
                new int[]{Types.VARCHAR, Types.INTEGER});
    }
    // Запрос построен с использованием конструктора цепочки условий
    // WHERE (stdMajor = 'политика' and STDAGE > 30 and stdMajor in ('политика', 'химия') or (stdname = 'Чжоу Ю' or stdname = 'Лю Мэн'))
    @Test
    void queryByCondition() throws Exception {
        List<Students> listStudents = service.query(
                new Query().eq("stdMajor", "политика").and().gt("STDAGE", 30).and().in("stdMajor", new Object[]{"политика", "химия"})
                        .or(new Query().eq("stdname", "Чжоу Ю").or().eq("stdname", "Лю Мэн")));
    }

2.4 Пагинация при запросе с одним объектом

    // Пагинация запроса по объекту
    @Test
    void fetch() throws Exception {
        JpaPage page = new JpaPage(1);
        Students student = new Students();
        student.setStdGender("M");
        JpaPageResults<Students> results = service.fetch(page, student);
    }
    // Пагинация запроса по условию WHERE stdMajor = 'политика' AND STDAGE > 30
    @Test
    void fetchByCondition() throws Exception {
        JpaPage page = new JpaPage(1, 20);
        Query condition = new Query().eq("stdMajor", "политика").and().gt("STDAGE", 30);
        JpaPageResults<Students> results = service.fetch(page, condition);
    }

2.5 Пагинация запроса по конфигурации mapper.xml```java

// Пагинация запроса по конфигурации fetchPageResults в mapper.xml
@Test
void fetchPageResults() throws Exception {
     Students student = new Students();
     student.setStdGender("M");
     student.setPageNumber(1);
     JpaPageResults<Students> results = service.fetchPageResults(student);
}
// Пагинация запроса по ID конфигурации в mapper.xml, fetchPageResults1
@Test
void fetchPageResultsByMapperId() throws Exception {
     Students student = new Students();
     student.setStdGender("M");
     student.setPageNumber(1);
     JpaPageResults<Students> results = service.fetchPageResults("fetchPageResults1", student);
}

```java
    // Запрос с использованием Lambda-цепочки условий
    // WHERE (stdMajor = 'политика' AND STDAGE > 30 AND stdMajor IN ('политика', 'химия') OR (stdName = 'Чжоу Ю' OR stdName = 'Лю Мэн'))
    service.query(
                new LambdaQuery<Students>().eq(Students::getStdMajor, "политика")
                                     .and().gt(Students::getStdAge, Integer.valueOf(30))
                                     .and().in(Students::getStdMajor, new Object[]{"политика", "химия"})
                                     .or(
                                            new LambdaQuery<Students>().eq(Students::getStdName, "Чжоу Ю")
                                                                  .or().eq(Students::getStdName, "Лю Мэн")
                                        )
                );
// Создание пагинации с использованием Lambda-запроса
// where stdMajor = 'Политика' and stdAge > 30
JpaPage page = new JpaPage();
page.setPageSize(20);
page.setPageable(true);
LambdaQuery<Students> lambdaQuery = new LambdaQuery<>();
lambdaQuery.eq(Students::getStdMajor, "Политика").and().gt(Students::getStdAge, Integer.valueOf(30));
JpaPageResults<Students> results = service.fetch(page, lambdaQuery);
## 2.6 Обновление данных с помощью UpdateWrapper
```java
    // Обновление данных с использованием UpdateWrapper
    UpdateWrapper updateWrapper = new UpdateWrapper();
    updateWrapper.set("StdMajor", "история").eq("StdName", "Чжоу Ю").or().eq("StdName", "Лю Мэн");
    service.update(updateWrapper);
```    // Обновление данных с использованием LambdaUpdateWrapper, содержащего несколько LambdaUpdateWrapper
    List<String> majorList = new ArrayList<>(Arrays.asList("политика", "химия"));
    LambdaUpdateWrapper<Students> updateWrapper = new LambdaUpdateWrapper<>();
    updateWrapper.set(Students::getStdMajor, "история")
                 .eq(Students::getStdMajor, "политика")
                 .and().gt(Students::getStdAge, Integer.valueOf(30))
                 .and().in(Students::getStdMajor, majorList)
                 .or(new LambdaUpdateWrapper<Students>().eq(Students::getStdName, " Zhou Yu ").or().eq(Students::getStdName, " Lu Meng "));
        
    service.update(updateWrapper);Тип документа для перевода: markdown
Язык исходного текста: китайский
Язык финального текста должен быть: русский

```## 2. 8 Поиск с помощью findBy
 Реализация функции findBy с использованием Spring Data JPA
 ```java
      // Определение интерфейса Mapper
      // where x.stdNo = ? 1
      @Select({})
      public List<Students> findByStdNo(String stdNo);
      // where x.stdNo = ? 1
      @Select({})
      public List<Students> findByStdNoIs(String stdNo);
      // where x.stdNo = ? 1
      @Select({})
      public List<Students> findByStdNoEquals(String stdNo);
      // where x.stdAge between ? 1 and ? 2
      @Select({})
      public List<Students> findByStdAgeBetween(int ageStart, int ageEnd);
      // where x.stdAge < ? 1
      @Select({})
      public List<Students> findByStdAgeLessThan(int ageLessThan);
      // where x.stdAge <= ? 1
      @Select({})
      public List<Students> findByStdAgeLessThanEqual(int ageLessThanEqual);
      // where x.stdAge > ? 1
      @Select({})
      public List<Students> findByStdAgeAfter(int ageAfter);
      // where x.stdAge < ? 1
      @Select({})
      public List<Students> findByStdAgeBefore(int ageBefore);
      // where x.images is null
      @Select({})
      public List<Students> findByImagesNull();
      // where x.images is null
      @Select({})
      public List<Students> findByImagesIsNull();
      // where x.images is not null
      @Select({})
      public List<Students> findByImagesIsNotNull();
      // where x.images is not null
      @Select({})
      public List<Students> findByImagesNotNull();
      // where x.stdName like ? 1
      @Select({})
      public List<Students> findByStdNameLike(String stdName);
      // where x.stdName not like ? 1
      @Select({})
      public List<Students> findByStdNameNotLike(String stdName);
      // where x.stdName like ? 1 (parameter bound with appended %)
      @Select({})
      public List<Students> findByStdNameStartingWith(String stdName);
      // where x.stdName like ? 1 (parameter bound with prepended %)
      @Select({})
      public List<Students> findByStdNameEndingWith(String stdName);
      // where x.stdName like ? 1 (parameter bound wrapped in %)
      @Select({})
      public List<Students> findByStdNameContaining(String stdName);
      // where x.stdGender = ? 1 order by x.stdAge desc
      @Select({})
      public List<Students> findByStdGenderOrderByStdAge(String stdGender);
      // where x.stdGender = ? 1 order by x.stdAge desc
      @Select({})
 ```     public List<Students> findByStdGenderIsOrderByStdAge(String stdGender);
      //where x.stdMajors in ? 1
      @Select({})
      public List<Students> findByStdMajorIn(String... stdMajors);
      //where x.stdMajors not in ? 1
      @Select({})
      public List<Students> findByStdMajorNotIn(String... stdMajors);
      //where x.deleted = true
      @Select({})
      public List<Students> findByDeletedTrue();
      //where x.deleted = false
      @Select({})
      public List<Students> findByDeletedFalse();
      //where UPPER(x.stdGender) = UPPER(? 1)
      @Select({})
      public List<Students> findByStdGenderIgnoreCase(String stdGender);
      //where x.stdNo <> ? 1
      @Select({})
      public List<Students> findByStdNoNot(String stdNo);
      //where x.lastname = ? 1 and x.firstname = ? 2
      @Select({})
      public List<Students> findByStdMajorAndStdClass(String stdMajor, String stdClass);## 2.9. Задача автоматического заполнения данных по умолчаниюНаследуйте класс `FieldAutoFillHandler` и реализуйте функции `insertFill` и `updateFill`, чтобы заполнить поля арендатора, создателя, дату создания, изменяющего, дату изменения и другие поля по умолчанию.

```java
import org.apache.ibatis.reflection.MetaObject;
import org.dromara.mybatis.jpa.handler.FieldAutoFillHandler;

public class MxkFieldAutoFillHandler extends FieldAutoFillHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        this.setFieldValue(metaObject, "stdNo", "AutoFill_Insert");
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValue(metaObject, "stdNo", "AutoFill_Update");
    }
}

3. Конфигурация маппера

<mapper namespace="org.apache.mybatis.jpa.test.dao.persistence.StudentsMapper">
    <sql id="sql_condition">
        WHERE 1 = 1
        <if test="id != null">
            AND ID = '${id}'
        </if>
        <if test="stdName != null and stdName != ''">
            AND STDNAME like '%${stdName}%'
        </if>
        <if test="stdGender != null and stdGender != ''">
            AND STDGENDER = #{stdGender}
        </if>
        <if test="stdMajor != null">
            <![CDATA[AND STDMAJOR = #{stdMajor}]]>
        </if>
    </sql>

    <select id="fetchPageResults" parameterType="Students" resultType="Students">
        SELECT
            id, stdno, stdname, stdgender, stdage, stdmajor, stdclass
        FROM STUDENTS
        <include refid="sql_condition"/>
    </select>

    <select id="fetchPageResults1" parameterType="Students" resultType="Students">
        SELECT
            id, stdno, stdname, stdgender, stdage, stdmajor, stdclass
        FROM STUDENTS
        <include refid="sql_condition"/>
    </select>

    <select id="queryBy" parameterType="Students" resultType="Students">
        SELECT
            id, stdno, stdname, stdgender, stdage, stdmajor, stdclass
        FROM ROLES
        <include refid="sql_condition"/>
    </select>
</mapper>

4. Конфигурация Spring Boot```ini

spring.datasource.username=root spring.datasource.password=maxkey spring.datasource.url=jdbc:mysql://localhost/test?autoReconnect=true&characterEncoding=UTF-8&serverTimezone=UTC spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

mybatis.type_aliases_package=org.apache.mybatis.jpa.test.entity
mybatis.mapper_locations=classpath*:/org/apache/mybatis/jpa/test/dao/persistence/xml/${mybatis.dialect}/*.xml
mybatis.table_column_escape=true
#mybatis.table_column_escape_char=``
```## Связанные ресурсы

[Сайт MyBatis][1]

[GitHub репозиторий исходного кода MyBatis][2]

[GitHub репозиторий исходного кода системы единого входа MaxKey][3]

[Gitee репозиторий исходного кода системы единого входа MaxKey][4]

  [1]: http://www.mybatis.org/mybatis-3/
  [2]: https://github.com/mybatis/mybatis-3/
  [3]: https://github.com/dromara/MaxKey
  [4]: https://gitee.com/dromara/MaxKey

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Расширить поддержку MyBatis JPA, упростить операции с CUID и улучшить пагинацию запросов SELECT. Развернуть Свернуть
Apache-2.0
Отмена

Обновления (7)

все

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/dromara-mybatis-jpa-extra.git
git@api.gitlife.ru:oschina-mirror/dromara-mybatis-jpa-extra.git
oschina-mirror
dromara-mybatis-jpa-extra
dromara-mybatis-jpa-extra
master