Skip to content

summer-data 是什么?

summer-data是一个 jdbc 框架,与 spring jdbc-template、mybatis 和 hibernate 处于同一位置。

在使用它们的过程中,总有一些让我处在崩溃边缘的时候,所以就有了summer-data,如果你也有我下面的感受,推荐试试summer-data。

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

上面的观点只是我的个人观点,不能代表大家,求同存异、不喜勿喷,谢谢!

认识summer-data

我们通过一组数据库操作来认识一下 summer-data

数据库表映射

表映射到java中后,以后所有关于这张表的操作都由对应的映射类来完成。

java
@Table("t_prod")
public class Prod extends BaseTable {

    public IntegerColumn resId;
  
    public StringColumn prodName;

    public StringColumn prodDesc;    
}

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

    public IntegerColumn prodResId;
  
    public IntegerColumn resId;
  
    public StringColumn detailName;
}

注意:所有的表要继承 BaseTable 类,字段访问标识设定成 public 。

持久化

java
Prod t1 = new Prod();
t1.prodName.setValue("walker");

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

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

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

单表查询

java
Prod t1 = new Prod();

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

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

联合查询

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

java
public class ProdVTO {

    public String prodName;

    public String prodDesc;

    public Integer prodResId;
  
    public Integer resId;
  
    public String detailName;
}

业务代码

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

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

在 mysql 和 oracle 中,上面的 Jql 最终都会转成如下sql执行:

sql
SELECT t1.prodName, t1.prodDesc, t2.*
  FROM t_prod t1
  JOIN t_prod_detail t2 ON t1.resId = t2.prodResId
 WHERE t1.prodName IS NOT NULL
   AND t1.prodName LIKE '%'||?||'%'
    OR t1.resId IN (?, ?, ?)
 ORDER BY t2.detailName DESC

参数:

sql
["中文", 1, 2, 3]

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

java

Jql jql = new Jql(){{
    select(t1.prodName, t1.prodDesc, t2);
    from(t1);
    join(t2).on(t1.resId.eq(t2.prodResId));
    where(t1.prodName.isNotNull());
    and(t1.prodName.like("中文"));
    or(t1.resId.in(1, 2, 3));
    order(t2.detailName.desc());
}};

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

summer-data 的特点

  • 优点

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

    • 表的映射类不是 POJO 类,需要继承 BaseTable 基类
    • 字段采用 StringColumn 等Column 的子类,而不是基础数据类型

summer-data注重开发效率、开发体验和工程能力,希望你能喜欢它并从中获益。