Skip to content
bytebufferioPublic
forked from liberg-cn/Liberg

About

A high-performance and lightweight suites for spring-boot-based web developing.

Resources

Stars

0 stars

Watchers

0 watching

Forks

 
 

Latest commit

 

History

14 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Liberg

A high-performance and lightweight suites for spring-boot-based web development.

Liberg为从零基础小白到中高级Java Web开发者提供一站式的极速开发体验和解决方案。

包含Liberg库(Jar)和LibergCoder(Idea插件Jar)两部分。

3大特点

  1. Liberg是一个真正实现“零反射”的Java ORM框架。

    反射赋予了Java动态编程的能力。通过反射可以在运行时通过类名称(全限定类名)动态地创建对象、获取对象的属性和方法、为对象赋予新的属性值、调用对象中的方法等等。利用Java的反射机制,动态地创建对象、为对象属性赋值,就可以很容易地实现将数据表中的一条记录转换为一个Java实体类的对象。可以肯定的是,几乎所有ORM(Object Relational Mapping)框架就就是这个套路。差别不过是在反射的基础上做了多大程度的优化。

    反射的强大特性在代码自动化和框架场景中大有用武之地,但也有一个缺点:那就是——慢。

    利用LibergCoder生成代码,Liberg真正做到了实体关系映射上的“零反射”。因此,可以说Liberg是一个极轻量级的ORM框架。

  2. 极速开发:创建最少的文件、写最少的代码。

    很多需要手动创建的代码、配置文件,LibergCoder自动完成创建和维护。在LibergCoder插件的加持下,实现了完全自动化的Spring Boot Web项目初始化,包括yml配置创建、pom.xml依赖添加、数据库创建、数据表创建、表结构升级等等。

    LibergCoder会创建和维护必要的支撑代码,开发者只写业务:定义实体类、定义API接口、编写业务方法的具体实现。

    让开发者创建最少的文件、写最少的代码。这是Liberg项目的不懈追求。

  3. 最接近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系统设计理念

从外部视角来看,Web系统=数据+功能。Liberg就是围绕“数据”和“接口”来设计和构架整个Web系统。

数据:由data.entity包下的实体类进行承载,映射到数据库中的表。entity的一个字段映射为数据库表的一列,通过注解设定为不映射成员除外。

接口:由service.interfaces包下的接口声明类定义,映射为controller.api.XxxControllor和service.XxxService。

其中,XxxController是承接http请求的入口。每一个接口方法,映射为一个接口uri。

XXXService是实现业务逻辑、编写逻辑代码的地方。

因此,基于Liberg来开发Web应用,开发者只需要定义好实体类、对外提供API的接口类,然后编写具体业务逻辑代码即可。其他支撑性的胶水代码由LibergCoder插件进行自动的创建和维护。

如何开始

  1. 在Idea中创建Spring Initializr项目,仅仅需要勾选Spring Web依赖。

  2. 安装Idea插件LibergCoder.jar,安装完成,重启Idea,菜单栏末尾多出一个LibergCoder菜单。

  3. 下载本项目源代码,本地Maven install,将libergjar包安装到本地Maven仓库中。也可以在项目中手动引入jar包:liberg-1.3.0.jar,引入方式见文末备注。

  4. 打开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重新创建出来。

  5. 创建一个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注解。
  6. 创建一个接口类,比如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格式的接口文档。
  7. 运行SpringBoot项目,看看发生了什么。

如果遇到了麻烦,请参考示例项目:https://github.com/liberg-cn/liberg-demo

Liberg+LibergCoder开发体验

重复的事情,无须重复做。

”偷懒“是驱动人类进步的动力??!。

  1. Liberg自动初始化Web项目、添加maven依赖,甚至连数据库都提供了默认配置。
  2. Liberg由工具维护数据库脚本,包括建库、建表、DDL升级等等。一切变得简单高效,一切尽在java程序员的掌控之中。
  3. 基于数据和接口来构建整个系统,有了entity(保存什么数据)和interface(对外提供什么功能),其他都有了。
  4. 基于SpringBoot,遵循SpringMVC规范,天然拥有强大的框架整合能力和开发生态。
  5. 基于java接口(interface),快速建立Controller、Service,自动生成接口定义文档(供前端和测试使用)。

备注

  1. Liberg默认依赖mysql和fastjson。

  2. Liberg JAR还未提交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+插件生成支撑代码的开发方式,欢迎加入贡献代码,一起交流进步。


附录I MySQL风格的代码

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

附录II 相关项目

交流

Liberg,让Web开发更简单!

QQ交流群(推荐):126193402

感谢您的阅读。

About

A high-performance and lightweight suites for spring-boot-based web developing.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages