Skip to content

3.x #26

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Oct 6, 2023
Merged

3.x #26

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
159 changes: 159 additions & 0 deletions docs/wiki/springboot-starter-data-fast.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ springboot-starter-data-fast

基于JPA的快速API能力服务

## FastController 快速API能力服务
```java
package com.codingapi.springboot.example.query;

Expand Down Expand Up @@ -45,3 +46,161 @@ value为查询语句,countQuery为查询总数语句,query为查询参数,
MultiResponse为返回结果
@PreAuthorize(value = "hasRole('ROLE_USER')") 用于标记当前接口的权限,如果不需要权限可以不用添加

## FastRepository 的使用教程


继承FastRepository接口,实现自定义的接口,即可使用FastRepository的能力
```java


import com.codingapi.springboot.fast.entity.Demo;
import com.codingapi.springboot.fast.query.FastRepository;

public interface DemoRepository extends FastRepository<Demo,Integer> {

}


```
动态FastRepository的能力展示

```java

// 重写findAll,通过Example查询
@Test
void findAll() {
demoRepository.deleteAll();
Demo demo1 = new Demo();
demo1.setName("123");
demoRepository.save(demo1);

Demo demo2 = new Demo();
demo2.setName("456");
demoRepository.save(demo2);

PageRequest request = new PageRequest();
request.setCurrent(1);
request.setPageSize(10);
request.addFilter("name", "123");

Page<Demo> page = demoRepository.findAll(request);
assertEquals(1, page.getTotalElements());
}


// pageRequest 自定义条件查询
@Test
void pageRequest() {
demoRepository.deleteAll();
Demo demo1 = new Demo();
demo1.setName("123");
demoRepository.save(demo1);

Demo demo2 = new Demo();
demo2.setName("456");
demoRepository.save(demo2);

PageRequest request = new PageRequest();
request.setCurrent(1);
request.setPageSize(10);
request.addFilter("name", PageRequest.FilterRelation.LIKE, "%2%");

Page<Demo> page = demoRepository.pageRequest(request);
assertEquals(1, page.getTotalElements());
}


// 动态sql的List查询
@Test
void dynamicListQuery() {
demoRepository.deleteAll();
Demo demo1 = new Demo();
demo1.setName("123");
demoRepository.save(demo1);

Demo demo2 = new Demo();
demo2.setName("456");
demoRepository.save(demo2);

List<Demo> list = demoRepository.dynamicListQuery("from Demo where name = ?1", "123");
assertEquals(1, list.size());
}


// 动态sql的分页查询
@Test
void dynamicPageQuery() {
demoRepository.deleteAll();
Demo demo1 = new Demo();
demo1.setName("123");
demoRepository.save(demo1);

Demo demo2 = new Demo();
demo2.setName("456");
demoRepository.save(demo2);

Page<Demo> page = demoRepository.dynamicPageQuery("from Demo where name = ?1", PageRequest.of(1, 2), "123");
assertEquals(1, page.getTotalElements());
}

// 增加排序查询
@Test
void sortQuery() {
demoRepository.deleteAll();
Demo demo1 = new Demo();
demo1.setName("123");
demoRepository.save(demo1);

Demo demo2 = new Demo();
demo2.setName("456");
demoRepository.save(demo2);

PageRequest request = new PageRequest();
request.setCurrent(1);
request.setPageSize(10);

request.addSort(Sort.by("id").descending());
Page<Demo> page = demoRepository.findAll(request);
assertEquals(page.getContent().get(0).getName(), "456");
assertEquals(2, page.getTotalElements());
}

```
## SortRepository的使用教程

```java

public interface DemoRepository extends FastRepository<Demo,Integer>, SortRepository<Demo,Integer> {

}

```

SortRepository的能力展示

```java

@Test
@Transactional
void pageSort() {
demoRepository.deleteAll();
Demo demo1 = new Demo();
demo1.setName("123");
demoRepository.save(demo1);

Demo demo2 = new Demo();
demo2.setName("456");
demoRepository.save(demo2);

List<Integer> ids = Arrays.asList(demo1.getId(), demo2.getId());
System.out.println(ids);
demoRepository.pageSort(PageRequest.of(1, 10), ids);

Demo newDemo1 = demoRepository.getReferenceById(demo1.getId());
Demo newDemo2 = demoRepository.getReferenceById(demo2.getId());

assertEquals(newDemo2.getSort(), 1);
assertEquals(newDemo1.getSort(), 0);
}

```
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.codingapi.springboot.fast.dynamic;

import jakarta.persistence.EntityManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration
public class DynamicConfiguration {

@Bean
public DynamicQuery dynamicQuery(EntityManager entityManager){
return new DynamicQuery(entityManager);
}

@Bean
public DynamicQueryContextRegister dynamicQueryContextRegister(DynamicQuery dynamicQuery){
return new DynamicQueryContextRegister(dynamicQuery);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package com.codingapi.springboot.fast.dynamic;

import jakarta.persistence.EntityManager;
import jakarta.persistence.TypedQuery;
import lombok.AllArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest;

import java.util.List;

@AllArgsConstructor
public class DynamicQuery {

private final EntityManager entityManager;

public List<?> listQuery(Class<?> clazz, String sql, Object... params) {
TypedQuery<?> query = entityManager.createQuery(sql, clazz);
if (params != null) {
for (int i = 0; i < params.length; i++) {
query.setParameter(i + 1, params[i]);
}
}
return query.getResultList();
}

public Page<?> pageQuery(Class<?> clazz, String sql, String countSql, PageRequest pageRequest, Object... params) {
TypedQuery<?> query = entityManager.createQuery(sql, clazz);
if (params != null) {
for (int i = 0; i < params.length; i++) {
query.setParameter(i + 1, params[i]);
}
}
query.setFirstResult(pageRequest.getPageNumber() * pageRequest.getPageSize());
query.setMaxResults(pageRequest.getPageSize());
return new PageImpl<>(query.getResultList(), pageRequest, countQuery(countSql, params));
}


private long countQuery(String sql, Object... params) {
TypedQuery<Long> query = entityManager.createQuery(sql, Long.class);
if (params != null) {
for (int i = 0; i < params.length; i++) {
query.setParameter(i + 1, params[i]);
}
}
return query.getSingleResult();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.codingapi.springboot.fast.dynamic;


import lombok.Getter;

public class DynamicQueryContext {

@Getter
private static final DynamicQueryContext instance = new DynamicQueryContext();

private DynamicQueryContext() {

}

@Getter
private DynamicQuery dynamicQuery;

void setDynamicQuery(DynamicQuery dynamicQuery) {
this.dynamicQuery = dynamicQuery;
}


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.codingapi.springboot.fast.dynamic;

import lombok.AllArgsConstructor;
import org.springframework.beans.factory.InitializingBean;

@AllArgsConstructor
public class DynamicQueryContextRegister implements InitializingBean {

private DynamicQuery dynamicQuery;

@Override
public void afterPropertiesSet() throws Exception {
DynamicQueryContext.getInstance().setDynamicQuery(dynamicQuery);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.codingapi.springboot.fast.dynamic;

import org.springframework.core.ResolvableType;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.NoRepositoryBean;

import java.util.List;

@NoRepositoryBean
public interface DynamicRepository<T, ID> extends JpaRepository<T, ID> {

default Class<?> getEntityClass() {
ResolvableType resolvableType = ResolvableType.forClass(this.getClass()).as(DynamicRepository.class);
return resolvableType.getGeneric(new int[]{0}).resolve();
}

default List<T> dynamicListQuery(String sql, Object... params) {
return (List<T>) DynamicQueryContext.getInstance().getDynamicQuery().listQuery(getEntityClass(), sql, params);
}

default <V> List<V> dynamicListQuery(Class<V> clazz, String sql, Object... params) {
return (List<V>) DynamicQueryContext.getInstance().getDynamicQuery().listQuery(clazz, sql, params);
}

default Page<T> dynamicPageQuery(String sql, String countSql, PageRequest request, Object... params) {
return (Page<T>) DynamicQueryContext.getInstance().getDynamicQuery().pageQuery(getEntityClass(), sql, countSql, request, params);
}

default Page<T> dynamicPageQuery(String sql, PageRequest request, Object... params) {
return (Page<T>) DynamicQueryContext.getInstance().getDynamicQuery().pageQuery(getEntityClass(), sql, "select count(1) " + sql, request, params);
}

default <V> Page<V> dynamicPageQuery(Class<V> clazz, String sql, String countSql, PageRequest request, Object... params) {
return (Page<V>) DynamicQueryContext.getInstance().getDynamicQuery().pageQuery(clazz, sql, countSql, request, params);
}

}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.codingapi.springboot.fast.query;

import com.codingapi.springboot.fast.dynamic.DynamicRepository;
import com.codingapi.springboot.framework.dto.request.PageRequest;
import jakarta.persistence.criteria.Order;
import jakarta.persistence.criteria.Predicate;
Expand All @@ -13,7 +14,7 @@
import java.util.List;

@NoRepositoryBean
public interface FastRepository<T, ID> extends JpaRepository<T, ID>, JpaSpecificationExecutor<T> {
public interface FastRepository<T, ID> extends JpaRepository<T, ID>, JpaSpecificationExecutor<T>, DynamicRepository<T,ID> {

default Page<T> findAll(PageRequest request) {
if (request.hasFilter()) {
Expand All @@ -32,7 +33,7 @@ default Class<T> getDomainClass() {
}


default Page<T> findAllByRequest(PageRequest request) {
default Page<T> pageRequest(PageRequest request) {
if (request.hasFilter()) {
Class<T> clazz = getDomainClass();
Specification<T> specification = (root, query, criteriaBuilder) -> {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.codingapi.springboot.fast.sort;

public interface ISort {

Integer getSort();

void setSort(Integer sort);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.codingapi.springboot.fast.sort;

import com.codingapi.springboot.framework.dto.request.PageRequest;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.NoRepositoryBean;

import java.util.ArrayList;
import java.util.List;

@NoRepositoryBean
public interface SortRepository<T extends ISort, ID> extends JpaRepository<T, ID> {


default void pageSort(PageRequest request, List<ID> ids) {
List<T> list = new ArrayList<>();
for (int i = 0; i < ids.size(); i++) {
ISort entity = getReferenceById(ids.get(i));
entity.setSort(i + (request.getPageNumber() * request.getPageSize()));
list.add((T) entity);
}
saveAll(list);
}

}
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.codingapi.springboot.fast.DataFastConfiguration,\
com.codingapi.springboot.fast.registrar.DataFastBeanDefinitionRegistrar
com.codingapi.springboot.fast.registrar.DataFastBeanDefinitionRegistrar,\
com.codingapi.springboot.fast.dynamic.DynamicConfiguration
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
com.codingapi.springboot.fast.DataFastConfiguration
com.codingapi.springboot.fast.registrar.DataFastBeanDefinitionRegistrar
com.codingapi.springboot.fast.registrar.DataFastBeanDefinitionRegistrar
com.codingapi.springboot.fast.dynamic.DynamicConfiguration
Loading