MyBatis JPA Extra расширяет функциональность MyBatis, добавляя возможности Jakarta JPA 3.
Jakarta JPA 3 аннотации упрощают работу с CUID;
Улучшенная пагинация для запросов SELECT;
Цепочечный конструктор условий запроса; поддерживает вызов в Lambda-формате, что облегчает создание различных условий запроса;
Аннотация @Encrypted легко реализует шифрование и расшифровку данных полей;
Автоматическое заполнение данных полей;
Поддержка баз данных
База данных | Поддержка |
---|---|
MySQL | ✅ |
PostgreSQL | ✅ |
Oracle | ✅ |
SqlServer | ✅ |
DB2 | ✅ |
Репозитории кода
Поддерживает три стратегии генерации ключей
Номер | Стратегия | Поддержка |
---|---|---|
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
}
//Добавление данных
@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);
}
//Массовое логическое удаление по списку 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", "Лю Мэн")));
}
// Пагинация запроса по объекту
@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);
}
// Пагинация запроса по конфигурации 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");
}
}
<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>
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 )