A high-performance and lightweight suites for spring-boot-based web development.
Liberg为从零基础小白到中高级Java Web开发者提供一站式的极速开发体验和解决方案。
包含Liberg库(Jar)和LibergCoder(Idea插件Jar)两部分。
-
Liberg是一个真正实现“零反射”的JavaORM框架。反射赋予了Java动态编程的能力。通过反射可以在运行时通过类名称(全限定类名)动态地创建对象、获取对象的属性和方法、为对象赋予新的属性值、调用对象中的方法等等。利用Java的反射机制,动态地创建对象、为对象属性赋值,就可以很容易地实现将数据表中的一条记录转换为一个Java实体类的对象。可以肯定的是,几乎所有
ORM(Object Relational Mapping)框架就就是这个套路。差别不过是在反射的基础上做了多大程度的优化。反射的强大特性在代码自动化和框架场景中大有用武之地,但也有一个缺点:那就是——慢。
利用
LibergCoder生成代码,Liberg真正做到了实体关系映射上的“零反射”。因此,可以说Liberg是一个极轻量级的ORM框架。 -
极速开发:创建最少的文件、写最少的代码。
很多需要手动创建的代码、配置文件,
LibergCoder自动完成创建和维护。在LibergCoder插件的加持下,实现了完全自动化的Spring Boot Web项目初始化,包括yml配置创建、pom.xml依赖添加、数据库创建、数据表创建、表结构升级等等。LibergCoder会创建和维护必要的支撑代码,开发者只写业务:定义实体类、定义API接口、编写业务方法的具体实现。让开发者创建最少的文件、写最少的代码。这是
Liberg项目的不懈追求。 -
最接近
SQL的代码风格。这里指数据查询和更新的一些代码。先来看一段演示代码:
// UserDao.java // 演示查询操作:查询用户名为name,或者密码为xxx并且年龄大于30的一条记录, // 返回一个User对象或null return select() .whereEq(columnName, name) .or() .eq(columnPassword, "xxx") .gt(columnAge, 30) .one();
更多示例,请参见附录I MySQL风格的代码。
总之,Liberg + LibergCoder == 零反射的ORM框架 + 代码自动化工具。
特别说明: 由于Github在国内访问太慢,相关文档和资源优先在网站liberg.cn进行更新。
从外部视角来看,Web系统=数据+功能。Liberg就是围绕“数据”和“接口”来设计和构架整个Web系统。
数据:由data.entity包下的实体类进行承载,映射到数据库中的表。entity的一个字段映射为数据库表的一列,通过注解设定为不映射成员除外。
接口:由service.interfaces包下的接口声明类定义,映射为controller.api.XxxControllor和service.XxxService。
其中,XxxController是承接http请求的入口。每一个接口方法,映射为一个接口uri。
XXXService是实现业务逻辑、编写逻辑代码的地方。
因此,基于Liberg来开发Web应用,开发者只需要定义好实体类、对外提供API的接口类,然后编写具体业务逻辑代码即可。其他支撑性的胶水代码由LibergCoder插件进行自动的创建和维护。
-
在Idea中创建
Spring Initializr项目,仅仅需要勾选Spring Web依赖。 -
安装Idea插件LibergCoder.jar,安装完成,重启Idea,菜单栏末尾多出一个
LibergCoder菜单。 -
下载本项目源代码,本地
Maven install,将libergjar包安装到本地Maven仓库中。也可以在项目中手动引入jar包:liberg-1.3.0.jar,引入方式见文末备注。 -
打开SpringBoot项目的启动类(判断标准:带@SpringBootApplication注解),然后执行点击LibergCoder菜单,执行
Initialize...完成项目代码的初始化。Initialize执行完成之后,整个项目会被IDEA重新载入。Initialize操作会执行如下动作:-
在项目目录下创建LibergCoder的配置文件
LibergConfig.properties。 -
修改
pom.xml,增加mysql和fastjson依赖,如果缺失的话。 -
修改
resources下的application.properties文件,增加一些数据库和application.name等默认配置。 -
创建
data.dao、data.entity、data.type、service.interfaces、controller.api、misc等package。 -
创建
misc.InitializeRunner类,该类完成数据库的初始化(建库、建表、初始化数据等等)。 -
创建
misc.ResponseBodyProcessor类,完成fastjson序列化,并且加入跨域和JSONP的支持。 -
创建
data.DBConfig类,用于从application.properties文件加载数据库的配置。 -
创建
data.DBImpl类,这个类是数据库建表、数据库版本升级,以及数据初始化的入口,由LibergCoder插件维护。 -
创建
data.DBInitializer类,开发者在这里增加数据初始化的代码。 -
创建
data.DBUpgrader类,由LibergCoder维护的数据库版本自动升级实现类。一般情况下不需要额外关心。需要将多个升级版本合并为一个升级版本时,可以手动编辑删掉一些版本的upgradeTo方法,记得一并修改DBImpl中的数据库当前版本。Initialize一般仅需要执行一次,如果某些支撑文件缺失,可以执行Initialize重新创建出来。
-
-
创建一个entity类,比如data/entity/User.java
public class User { public long id; //每个实体类都要有一个long类型的id作为数据表的自增主键 @dbmap(isIndex=true) //isIndex为true表示需要给此列创建索引 public String name; public String password; public long roleId; public long createTime; @dbmap(isMap=false) //isMap为false表示不映射到数据库的字段 public Role role; }
在IDEA中打开
User.java文件后,执行LibergCoder--Build entity/interface...,LibergCoder插件会解析此实体类,生成或修改相关的代码文件。比如:- 创建
data.dao.UserDao类,用于支持对user表的CRUD操作。 - 修改
data.DBImpl加入user表的建表逻辑。 - 修改
User.java文件,给每个字段增加@JSONField注解。
- 创建
-
创建一个接口类,比如service/interfaces/IUserService.java
public interface IUserService { //接口中的方法须冠以public修饰符,否则当前版本LibergCoder不能识别 public Response register(String userName, String password) throws OperatorException; public Response login(String userName, String password) throws OperatorException; public User getByName(String userName) throws OperatorException; public boolean nameExists(String userName) throws OperatorException; }
在IDEA中打开
IUserService.java文件后,执行LibergCoder--Build entity/interface...,LibergCoder插件会解析此interface,生成或修改相关的代码文件。比如:- 创建
controller.api.UserController类,用于承接http请求。 - 创建
service.UserService类,这是IUserService的实现类,开发者在此编写代码,完成接口需要实现的具体业务逻辑。 - 在
resources/static/api-doc目录下创建Markdown格式的接口文档。
- 创建
-
运行
SpringBoot项目,看看发生了什么。
如果遇到了麻烦,请参考示例项目:https://github.com/liberg-cn/liberg-demo
重复的事情,无须重复做。
”偷懒“是驱动人类进步的动力??!。
- Liberg自动初始化Web项目、添加maven依赖,甚至连数据库都提供了默认配置。
- Liberg由工具维护数据库脚本,包括建库、建表、DDL升级等等。一切变得简单高效,一切尽在java程序员的掌控之中。
- 基于数据和接口来构建整个系统,有了entity(保存什么数据)和interface(对外提供什么功能),其他都有了。
- 基于SpringBoot,遵循SpringMVC规范,天然拥有强大的框架整合能力和开发生态。
- 基于java接口(interface),快速建立Controller、Service,自动生成接口定义文档(供前端和测试使用)。
Liberg默认依赖mysql和fastjson。
LibergJAR还未提交Maven中央仓库。目前可以下载最新版liberg-1.3.0.jar,在项目下新增一个lib目录,放入jar包,然后在pom.xml中引入:<dependency> <groupId>cn.liberg</groupId> <artifactId>liberg</artifactId> <version>1.2.0</version> <scope>system</scope> <systemPath>${project.basedir}/lib/liberg-1.2.0.jar</systemPath> </dependency>或者如前文所述,下载
Liberg源码,本地Maven instal后直接进行引入。
如果您也认可Liberg这种零反射ORM+插件生成支撑代码的开发方式,欢迎加入贡献代码,一起交流进步。
MySQL风格的查询、更新代码演示:
// 只查询用户名这一列,按id列降序,返回一个List<String>对象
return select(columnName)
.whereGt(columnId, 0)
.eq(columnNickName, nickName)
.desc(columnId)
.all();
// prepare方式的预编译查询:这里演示只查询用户名
final PreparedSelectWhere<String> psw = prepareSelect(columnName)
.whereGe$(columnId)
.eq$(columnAge);
try (final PreparedSelectExecutor<String> prepare = psw.prepare()) {
// 填充条件参数
prepare.setParameter(columnId, 1);
prepare.setParameter(columnAge, 10);
// 第一次查询
prepare.one();
// 填充条件参数
prepare.setParameter(columnId, 2);
prepare.setParameter(columnAge, 30);
// 再次查询
prepare.one();
}
// 演示更新操作:更新用户名、密码、增大年龄,通过id相等条件
update().set(columnName, newName)
.set(columnPassword, newPassword)
.increment(columnAge, ageIncrement)
.whereEq(columnId, id)
.execute();-
Liberg项目:https://github.com/liberg-cn/Liberg
-
liberg-demo: Liberg演示项目
-
LibergCoder: Idea插件(已支持idea2020)
Liberg,让Web开发更简单!
QQ交流群(推荐):126193402
感谢您的阅读。