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
注重开发效率、开发体验和工程能力,希望你能喜欢它并从中获益。