亮健spring boot系统的通用型starter

Jacky Wong b142a8f958 - 4 anni fa
javadocs c5164048b3 added javadoc 4 anni fa
src 60540ef251 finished 0.0.2 4 anni fa
.gitignore 635e3b19a2 delete ignore file 4 anni fa
README.md 8882129c76 - 4 anni fa
mvnw ebd7e2d3aa first commit 4 anni fa
mvnw.cmd ebd7e2d3aa first commit 4 anni fa
pom.xml b142a8f958 - 4 anni fa

README.md

网站系统通用starter

Description

这是一个spring-boot的starter依赖,目前包含了一个解析GET请求的参数成结构化对象的,在请求时解析后放入threadlocal中,响应结束后清空threadlocal的。

另外还包含了一个通用型CRUD的脚手架,用于但表的restful的增删改查。CRUD是基于数据库持久层框架的,目前提供了Jpa和Mybatis-plus两种。

Dependencies

目前maven私库(nexus)放在192.168.50.34上 通过https://192.168.50.34:8081 访问

    <distributionManagement>
        <repository>
            <id>liangjian-192.168.50.34</id>
            <url>http://192.168.50.34:8081/repository/liangjian-host/</url>
        </repository>
    </distributionManagement>
    
    <dependencies>
        <dependency>
            <groupId>com.liangjian</groupId>
            <artifactId>web-common-starter</artifactId>
            <version>0.0.2-SNAPSHOT</version>
        </dependency>
    </dependencies>

Usage & Setting

restful api

  • http 请求API
请求方式 url及path参数 说明
GET /crud/api/{model}/{id} 根据id获取单个数据库对象
GET /crud/api/{model}/page 根据查询条件分页查询(关于查询条件后面介绍)
GET /crud/api/{model}/list 根据查询条件获取列表(关于查询条件后面介绍)
POST /crud/api/{model} 新增对象,提交json
PUT /crud/api/{model} 更新对象,提交json
DELETE /crud/api/{model}/{id} 根据id删除对象
  • GET 请求方式查询条件,通过使用GET请求的query参数实现
类目 query key 示例
字段条件 直接字段名(默认等于逻辑) ?name=jacky&age=20
比较逻辑 直接字段名 + Operate (种类后面介绍) ?age=20&ageOperate=LessEqual
分页 pagesize ?page=1&size=10
排序方式 sortDirection ?sortField=id&sortDirection=DESC
排序字段 sortField ?sortField=id&sortDirection=DESC
  • 比较逻辑
操作类型 说明
Equal 等于(默认)
NotEqual 不等于
Less (数字类型)小于
LessEqual (数字类型)不大于
Greater (数字类型)大于
GreaterEqual (数字类型)不小于
Contains (字符串)包含
StartWith (字符串)以开头
EndWith (字符串)以结尾

动态url查询条件对象

在包com.liangjian.web.common.threadlocal.DynamicParamGetter中可以通过threadlocal获取到到DynamiParams

DynamicParams params = DynamicParamGetter.DynamicParams.get()

Jpa例子:

  • 数据库映射对象:
@Entity
@Table(name = "my_entity")
public class MyEntity {
    @Id
    @GeneratedValue(generator = "metaRelGenerator")
    @GenericGenerator(name = "metaRelGenerator",strategy = "uuid")
    private String id;

    @Column(name = "crt_date")
    private Date crtDate;

    @Column(name = "last_update")
    private Date lastUpdate;

    private Integer version;
    private String name;
    private Integer balance;
    
    //...省略其他getter、setter
}
  • DAO层接口:
public interface MyEntityRepository extends 
    JpaRepository<MyEntity, Serializable>, 
    JpaSpecificationExecutor<MyEntity> {
}
  • Service层接口(继承DynamicApiService):
public interface IMyEntityService extends 
    DynamicApiService<MyEntity> {
}
  • Service层实现(继承JpaDynamicApiService):
@Service
public class MyEntityService 
        extends JpaDynamicApiService<MyEntity> 
        implements IMyEntityService {
    
    @Autowired
    private MyEntityRepository myEntityRepository;

    @Override
    public JpaRepository<MyEntity, Serializable> getJpaRepository() {
        return myEntityRepository;
    }

    @Override
    public Class<MyEntity> getModelClass() {
        return MyEntity.class;
    }

    @Override
    public JpaSpecificationExecutor<MyEntity> getJpaSpecificationExecutor() {
        return myEntityRepository;
    }

    @Override
    public String getMappedName() {
        return "myEntity";
    }
}

完成上述编码即可以实现自动动态crud。

MyBatis-plus 例子

mybatis-plus大致上与jpa的相同。

  • 数据库映射对象:(按照MyBatis-plus的规则)
  • DAO层:(按照MyBatis-plus的Mapper规则)
  • Service层接口:
public interface IMyEntityService2 extends 
    IService<MyEntity>, 
    DynamicApiService<MyEntity> {
}
  • Service层实现(继承MpDynamicApiService):
@Service
public class MyEntityService2 
        extends MpDynamicApiService<MyEntityMapper, MyEntity> 
        implements IMyEntityService2 {
    
    @Override
    public Class<MyEntity> getModelClass() {
        return MyEntity.class;
    }

    @Override
    public String getMappedName() {
        return "myEntity";
    }
}

Extra notes

  • 提供了元组的实现,在包com.liangjian.web.common.entity中,可以直接通过Tuple.of(...)来使用
  • 提供了一个EntityHelper的接口和EntityHelperBuilder的单例,作用是通过class对象获取其字段类型(Java类型), 后期应该会添加上「动态获取对象的值」或是「动态生成Map」。可以通过实现EntityHelper接口来实现,目前EntityHelperBuild是通过反射来实现的。(维护一个LRU缓存,反射一次后放入缓存)
  • 提供了一个简单实现的LRU缓存,在com.liangjian.web.common.util