首页 > 其他分享 >summer-data介绍

summer-data介绍

时间:2024-06-07 23:04:22浏览次数:14  
标签:summer name res 介绍 t1 public prod data id

官网地址: https://www.summer-data.com
代码库地址:https://gitee.com/hahan2020/summer-data

summer-data 是什么?

summer-data设计用于替代 mybatis 和 hibernate 。从个人角度挑一些它们和 spring jdbc-template 的缺点,这些缺点是我创作summer-data的原因。

  • mybatis
    • 需要学习 XML 带来的语法,另外 XML 在处理带有逻辑的动态 SQL 时乏力。
    • 也需要拼装 SQL,容易出错
  • hibernate
    • 用力过猛,数据库操作中间隔着一层 java,隔靴搔痒的感觉
    • 更新数据需要先查询数据,然后再更新,很不理解这种设计
  • spring jdbc-template
    • 拼写 SQL 比较麻烦且容易出错,其它方面都挺好的

认识summer-data

假设有2个表

我们通过 Table 子类将这2个表的投射到 Java 。

@TableName("t_prod")
public class Prod extends Table {

    @AutoGenerated
    public IntegerColumn res_id;
  
    @MaxLength(100)
    public StringColumn prod_name;

    @MaxLength(100)
    public StringColumn prod_desc;    
}

@TableName("t_prod_detail")
public class ProdDetail extends Table {

    @AutoGenerated
    public IntegerColumn prod_res_id;
  
    public IntegerColumn res_id;
  
    @MaxLength(100)
    public StringColumn detail_name;
}

注意:所有的表要继承Table类,字段设定成public 。

持久化

Prod t1 = new Prod();
t1.prod_name.setValue("walker");

// insert into t_prod(prod_name) values('walker');
t1.insert();

// update t_prod set prod_name='walker' where res_id='123';
t1.updateBy(t1.id.eq("123"));

// delete from t_prod where res_id='123';
t1.deleteBy(t1.res_id.eq("123"));

单表查询

Prod t1 = new Prod();

Jql jql = new Jql()
    .select(t1)
    .from(t1)
    .where(t1.res_id.in(1, 2, 3))
    .order(t1.prod_name.desc());
    
// 返回 Map 结构
List<Map<String, Object>> list = jql.queryForMap();

// 返回 Object
List<Prod> prodList = jql.queryForObject(Prod.class);

联合查询

定义一个 VTO 类,存放查询数据

public class ProdVTO {

    public String prod_name;

    public String prod_desc;

    public Integer prod_res_id;
  
    public Integer res_id;
  
    public String detail_name;
}

业务代码

Prod t1 = new Prod();
ProdDetail t2 = new ProdDetail();

Jql jql = new Jql()
    .select(t1.prod_name, t1.prod_desc, t2)
    .from(t1)
    .join(t2).on(t1.res_id.eq(t2.prod_res_id))
    .where(t1.prod_name.isNotNull())
    .and(t1.prod_name.like("中文"))
    .or(t1.res_id.in(1, 2, 3))
    .order(t2.detail_name.desc());
    
// 返回 Map
List<Map<String, Object>> list = jql.queryForMap();
// 返回 Object
List<ProdVTO> list = jql.queryForObject(ProdVTO.class);

上面的 Jql 最终都会转成如下sql执行:

SELECT t1.prod_name, t1.prod_desc, t2.*
  FROM t_prod t1
  JOIN t_prod_detail t2 ON t1.res_id = t2.prod_res_id
 WHERE t1.prod_name IS NOT NULL
   AND t1.prod_name LIKE '%中文%'
    OR t1.res_id IN (1, 2, 3)
 ORDER BY t2.detail_name DESC

也可以用 java 的双大括号语法。


Jql jql = new Jql(){{
    select(t1.prod_name, t1.prod_desc, t2);
    from(t1);
    join(t2).on(t1.res_id.eq(t2.prod_res_id));
    where(t1.prod_name.isNotNull());
    and(t1.prod_name.like("中文"));
    or(t1.res_id.in(1, 2, 3));
    order(t2.detail_name.desc());
}};

链式写法和双大括号写法都可以,选哪个看项目组编码规范和个人习惯。

summer-data 的特点

  • 优点
    • 借助 IDE 拼写 Jql 全程有提示,速度飞快
    • 在编译阶段就能检查拼写错误
    • 支持 Java 的重构。表改名、字段改名没有任何心里负担,比如 Prod 的表名从 t_prod 改成 t_prod_new ,只需要修改 Prod 类的注解即可。
    • 异构数据库支持,在执行阶段 Jql 会根据数据库的不同,生成相应的 SQL 执行。

summer-data更注重开发效率和开发体验,有些时候它看上去并不优雅。

  • 字段定义给 Jql 让步,比如: varchar 字段使用 StringColumn ,而不是 String。
  • 字段访问范围给 Jql 让步,所有字段定义访问范围都是 public 。
  • pojo 为 Jql 让步,所有表都继承 Table 。

summer-data 追求简单、自然、高效,希望你能喜欢它。

标签:summer,name,res,介绍,t1,public,prod,data,id
From: https://blog.csdn.net/m0_37670700/article/details/139477766

相关文章

  • 鸿蒙开发接口数据管理:【@ohos.data.rdb (关系型数据库)】
    关系型数据库关系型数据库(RelationalDatabase,RDB)是一种基于关系模型来管理数据的数据库。关系型数据库基于SQLite组件提供了一套完整的对本地数据库进行管理的机制,对外提供了一系列的增、删、改、查等接口,也可以直接运行用户输入的SQL语句来满足复杂的场景需要。该模块提......
  • [4DIAC] 应用开发界面详细介绍——【1.System Explorer】
    以下内容均为个人经验,欢迎交流。——旅客一、概要    4DIACIDE是在大名鼎鼎的EclipseIDE上扩展而来的,在4DIAC官网也提供了相应的IDE源码,可以尝试自己加入一些个人元素,例如更换背景、增加用户登录、增加外链按钮等等,这对于开发自己的控制系统或是OEM成自己......
  • ECharts数据集合(dataset)用法一(完整举例)
            数据集(dataset)是专门用来管理数据的组件。虽然每个系列都可以在series.data中设置数据,但是从ECharts4支持数据集开始,更推荐使用数据集来管理数据。因为这样,数据可以被多个组件复用,也方便进行“数据和其他配置”分离的配置风格。毕竟,在运行时,数据是最常改变的,而......
  • 安卓ROM包的主要结构和组成部分介绍
    AndroidROM包(ROMpackage)是Android操作系统的固件包,通常用于安装或更新Android设备的操作系统。它的结构包含多个关键组件,每个组件都有特定的功能。以下是AndroidROM包的主要结构和组成部分:1.**boot.img**:  -包含引导内核和ramdisk。引导内核负责启动操作系统,而ramdis......
  • [ICML2022]Open-Sampling Exploring Out-of-Distribution Data for Re-balancing Long
    引入开集样本训练模型有点像dropout,“破坏”某些模型参数防止尾部类的过拟合Motivation长尾学习中的训练数据集分布不平衡的问题,解决方法之一是重采样。重采样主要对于尾部类重复采用,但这种做法往往会导致尾部类的过拟合。为了缓解过拟合[2](Rethinkingthevalueoflabelsf......
  • 【源码】Spring Data JPA原理解析之事务注册原理
     SpringDataJPA系列1、SpringBoot集成JPA及基本使用2、SpringDataJPACriteria查询、部分字段查询3、SpringDataJPA数据批量插入、批量更新真的用对了吗4、SpringDataJPA的一对一、LazyInitializationException异常、一对多、多对多操作5、SpringDataJPA自定义......
  • 详细介绍视频汇聚共享平台LntonCVS视频存储平台支持的多种视频流协议
    LntonCVS国标视频综合管理平台是一款以视频为核心的智慧物联应用平台。它基于分布式、负载均衡等流媒体技术进行开发,提供广泛兼容、安全可靠、开放共享的视频综合服务。该平台具备多种功能,包括视频直播、录像、回放、检索、云存储、告警上报、语音对讲、集群、智能AI分析以及平......
  • MainWindows移动View文件夹和使用Window.DataContext单例绑定需要修改的地方
    项目结构移动文件夹后需要修改的三个地方1、App.xaml2、MainWindow.xaml3、MainWindow.xaml.cs单例绑定需要修改的地方MainWindow.xaml ......
  • Vue的data中对象新增属性后,页面却不渲染(未渲染)
    前提背景:在data中定义了一个数组 usableList:[],给数组中的每个对象添加checked属性(用来查看数据的勾选状态) 问题:勾选后,数组的数据已经改变了,但是未渲染到页面中 问题原因:在于在Vue实例创建时,对象新增的属性并未声明,因此就没有被Vue转换为响应式的属性,自然就不会触发视......
  • 怎么避免电脑磁盘数据泄露?磁盘数据保护方法介绍
    电脑磁盘是电脑存储数据的基础,而为了避免磁盘数据泄露,我们需要保护电脑磁盘。下面我们就来了解一下磁盘数据保护的方法。磁盘加密磁盘加密可以通过专业的加密算法来加密保护磁盘数据,避免电脑磁盘数据泄露。在这里小编推荐使用文件夹只读加密专家来加密保护电脑磁盘。文件......