Skip to content

springboot starter data fast

lorne edited this page Dec 12, 2025 · 5 revisions

springboot-starter-data-fast

基于JPA的快速API能力服务

FastRepository 的使用教程

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

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

public interface DemoRepository extends FastRepository<Demo,Integer> {

}

动态FastRepository的能力展示


    // 重写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 pageRequest1() {
            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%");
            //sql: select demo0_.id as id1_0_, demo0_.name as name2_0_, demo0_.sort as sort3_0_ from t_demo demo0_ where demo0_.name like ? limit ?

            Page<Demo> page = demoRepository.pageRequest(request);
            assertEquals(1, page.getTotalElements());
    }
    
    // pageRequest 自定义条件查询      
    @Test
    void pageRequest2() {
            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.orFilters(Filter.as("name","123"),Filter.as("name","456"));
            //sql: select demo0_.id as id1_0_, demo0_.name as name2_0_, demo0_.sort as sort3_0_ from t_demo demo0_ where demo0_.name=? or demo0_.name=? limit ?

            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());
        }

ScriptMapping 教程

通过动态添加mvc mapping实现查询功能.

ScriptMapping scriptMapping = new ScriptMapping({mapinggUrl}, {mapinggMethod}, {mappingGrovvry});
scriptMappingRegister.addMapping(scriptMapping);

mapinggUrl 是mvc接口的地址
mapinggMethod 是mvc接口的请求方式
mappingGrovvry 是执行的查询脚本

脚本实例代码:

  • 动态分页查询
// 获取name的请求参数
var name = $request.getParameter("name","");
var pageNumber = $request.getParameter("pageNumber",0);
var pageSize = $request.getParameter("pageSize",10);
// 创建分页对象
var pageRequest = $request.pageRequest(pageNumber,pageSize);
// 动态组织sql
var sql = "select * from api_mapping where 1 =1 ";
var countSql = "select count(1) from api_mapping where 1 =1 ";
// 动态组织参数
var params = [];
if(!"".equals(name)){
   sql += " and name = ? ";
   countSql += " and name = ? ";
   params.push(name);
}
sql += " limit ?,?";
// 添加分页参数
params.add(pageRequest.getOffset());
params.add(pageRequest.getPageSize());
// 执行分页查询
return $jdbc.queryForPage(sql,countSql,pageRequest,params.toArray());
  • 动态条件查询
// 获取name的请求参数
var name = $request.getParameter("name","");
// 动态组织sql
String sql = "select * from api_mapping where 1=1 ";
// 动态组织参数
var params = [];
if(!"".equals(name)){
    sql += " and name = ? ";
    params.add(name);
}
// 执行查询
return $jdbc.queryForList(sql,params.toArray());

脚本语法介绍:

  • $request
// 获取参数name的值,如果参数不存在,则返回默认值
var name = $request.getParameter("name","");
// 获取分页对象
var pageRequest = $request.pageRequest(0,10);
// 获取分页对象的页码
var pageNumber = pageRequest.getPageNumber();
// 获取分页对象的每页记录数
var pageSize = pageRequest.getPageSize();
// 获取分页对象的偏移量
var offset = pageRequest.getOffset();
  • $jdbc
// 查询jdbcSQL $jdbc.queryForList({sql},{params})

// 查询无条件的数据
var res = $jdbc.queryForList("select * from api_mapping");
// 查询有条件的数据
var res = $jdbc.queryForList("select * from api_mapping where name = ?",name);
// 查询多条件的数据
var res = $jdbc.queryForList("select * from api_mapping where name = ? and url = ?",name,url);

// 分页查询 $jdbc.queryForPage({sql},{countSql},{pageRequest},{params})
var res = $jdbc.queryForPage("select * from api_mapping where name = ? and url = ?",
"select count(1) from api_mapping where name = ? and url = ?",pageRequest,params.toArray());
  • $jpa
// 查询jpa $jpa.listQuery({clazz},{sql},{params})

// 查询无条件的数据
var res = $jpa.listQuery(com.example.entity.NodeEntity.class,"from NodeEntity");
// 查询有条件的数据
var res = $jpa.listQuery(com.example.entity.NodeEntity.class,"from NodeEntity where name = ?",name);

DynamicTableGenerator 教程

DynamicTableGenerator 支持动态的创建表的能力
核心能力包括:

  • validatorTable | 检验对象与数据库是否一致,一致时无异常信息
  • generateCreateTableDDL | 创建创建DDL语句
  • generateMigratorTableDDL | 创建变更DDL语句,当数据不存在时则为创建,当数据中的表对象与entityClass不一致时则创建调整DDL
  • generateDropTableDDL | 创建删除DDL语句

其中generateCreateTableDDL 、generateMigratorTableDDL、generateDropTableDDL 设置 参数 executable为true时即可直接执行。

TableEntityMetadata 支持动态entity元数据的构建,buildClass()支持构建class对象


import com.codingapi.springboot.fast.jdbc.JdbcQuery;
import com.codingapi.springboot.fast.jdbc.JdbcQueryContext;
import com.codingapi.springboot.fast.jpa.JpaQuery;
import com.codingapi.springboot.fast.jpa.JpaQueryContext;
import com.codingapi.springboot.fast.metadata.TableEntityMetadata;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.GenerationType;
import org.hibernate.cfg.AvailableSettings;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.env.Environment;
import org.springframework.jdbc.core.JdbcTemplate;

import java.util.List;
import java.util.Map;

import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertThrows;

@SpringBootTest
public class DynamicTableGeneratorQueryTest {

    @Autowired
    private EntityManagerFactory entityManagerFactory;

    @Autowired
    private Environment environment;

    @Autowired
    private JdbcTemplate jdbcTemplate;


    @Test
    void generateThenUpdateQuery() throws ClassNotFoundException {
        String dialect = entityManagerFactory.getProperties().get(AvailableSettings.DIALECT).toString();
        String jdbcUrl = environment.getProperty("spring.datasource.url");
        String username = environment.getProperty("spring.datasource.username");
        String password = environment.getProperty("spring.datasource.password");

        DynamicTableGenerator dynamicTableGenerator = new DynamicTableGenerator(Class.forName(dialect), jdbcUrl, username, password);

        TableEntityMetadata tableEntityMetadata = new TableEntityMetadata("com.codingapi.springboot.fast.entity.Test");
        tableEntityMetadata.setTable("test");
        tableEntityMetadata.addPrimaryKeyColumn(Long.class, "id", GenerationType.IDENTITY, "主键");
        tableEntityMetadata.addColumn(String.class, "name", "姓名");

        Class<?> entityClass = tableEntityMetadata.buildClass();

        // 创建表
        dynamicTableGenerator.generateMigratorTableDDL(entityClass, true);

        // 通过DynamicTableGenerator 动态创建的entity无法通过jpa的 EntityManager进行数据查询处理, 因为Entity不在JPA扫描支持的范围内。
        JpaQuery jpaQuery = JpaQueryContext.getInstance().getJpaQuery();
        assertThrows(Exception.class,()->{
            jpaQuery.listQuery(entityClass,"select t from com.codingapi.springboot.fast.entity.Test");
        });

        // 插入数据
        jdbcTemplate.update("insert into test(name) values(?)", "小明");

        // 查询数据
        JdbcQuery jdbcQuery = JdbcQueryContext.getInstance().getJdbcQuery();
        List<Map<String, Object>> list = jdbcQuery.queryForMapList("select * from test");
        System.out.println(list);
        assertFalse(list.isEmpty());

    }
}

Clone this wiki locally