首页 资讯频道 互联频道 智能频道 网络 数据频道 安全频道 服务器频道 存储频道

jSqlBox 4.0.3 发布 支持多种数据库方言的DDL生成

2020-03-02 10:27:42 来源 : 开源中国

jSqlBox是一个Java全功能数据库持久层工具,主页https://gitee.com/drinkjava2/jsqlbox

jSqlBox主要特点是架构优、尺寸小、功能全,基本上所有与数据库操作相关的功能,jSqlBox都已提供。其它数据库工具的主要功能,jSqlBox通常都有对应的方案提供,不提供的往往是不重要甚至是反模式的功能,不信可以随便找一个其它持久层工具的功能,而jSqlBox却没有提供或无法轻易实现的功能来,我会给一个合理解释。反之,如下jSqlBox具备的功能其它持久层工具往往并不提供:

1.支持在Java里存放和定位多行(SQL)文本

2.参数内嵌式SQL写法

3.自带分库分表

4.自带声明式事务、分布式事务

5.ActiveRecord模式实体类可以只声明接口,不占用宝贵的单继承

6.支持多种数据库方言的DDL生成

jSqlBox的目标是做最好的通用持久层工具,正如我喜欢给别的项目找缺点一样,也欢迎大家来找出jSqlBox的缺点。开源项目就是在不断的对比和相互学习中进步的。另外如果有谁想听我唠叨其它持久层工具优缺点的,也可以在评论里提出,一起来讨论,jSqlBox是因为无法忍受现有持久层工具的缺点而诞生的,但是缺点是不是都找对了是值得花时间讨论的。

本次更新(4.0.3.jre8版)内容:

1. [I19WO0] 添加@CreateTimestamp和@UpdateTimestamp两个实体注解,前者在实体插入到数据库时自动写入当前时间戳,后者在实体更新时自动更新对应字段的时间戳,这两个注解添加在Date或Timestamp类型上,一个使用示例如下:

public class SomeEntity {

@CreateTimestamp

java.sql.TimeStamp createTime;

@Temporal(TemporalType.TIMESTAMP) //指定Date的映射类型,可选

@UpdateTimestamp

java.util.Date updateTime;

...

}

2. 添加@CreatedBy和@LastModifiedBy两个实体注解,前者在实体插入到数据库时自动写入当前创建者ID,后者在实体更新时自动更新对应字段的编辑者ID,这两个注解添加在实体的String类型属性上,一个使用示例如下:

public class SomeEntity {

@CreatedBy

String creator;

@LastModifiedBy

String modifier;

...

}

因为这两个注解的当前创建者或修改者ID是在运行期动态获取的,所以如果用到这两个注解,必须在jSqlBox的DbContext上下文初始化时,先设置一个编辑者ID获取类的实例,这个类中必须有一个名为getCurrentAuditor的方法。示例如下:

public static class GetUserIdDemo {

public Object getCurrentAuditor() {

//从Spring Security或Shiro之类的单点登录工具中获取当前用户ID值

return SomeSecurityUtil.getCurrentUserID();

}

}

DbContext db=new DbContext(dataSource);

db.setAuditorGetter(new GetUserIdDemo());

3. 添加一个@COLUMN实体注解

@COLUMN这个全大写的注解表示它是非标的,与标准JPA的@Column注解的区别是多了creationTimestamp, cpdateTimestamp, createdBy, lastModifiedBy, comment, tail这几个私房货字段。所以@CreationTimestamp注解也可以写成@COLUMN(creationTimestamp=true),效果等同。

@COLUMN注解中的comment和tail不会覆盖掉columnDefinition的内容,而是累加在后面。comment顾名思义是数据表collumn列定义的comment片段,tail则可以加入任意字符串内容到column的DDL列定义未尾。

4. 增强了从数据库生成Java实体源代码功能,将细节配置放在map里作为参数,并增加了linkStyle和fieldFlags两个选项。使用示例如下,以下语句会读取数据库所有表格并在指定的"c:\temp"目录下生成与所有数据库表格对应的实体类源码:

Map setting = new HashMap();

setting.put("packageName", "somepackage");

setting.put("imports",

"import com.github.drinkjava2.jdialects.annotation.jdia.*;\n"

+ "import com.github.drinkjava2.jdialects.annotation.jpa.*;\n"

+ "import com.github.drinkjava2.jsqlbox.*;\n"

+ "import static com.github.drinkjava2.jsqlbox.DB.*;\n");

setting.put("classDefinition", "public class $1 extends ActiveRecord<$1>");

setting.put("linkStyle", true);

setting.put("fieldFlags", true);

...

TableModelUtils.db2JavaSrcFiles(dataSource, Dialect.MySqlDialect, "c:/temp", setting);

db2JavaSrcFiles方法的第一个参数是数据池,第二个参数是方言,第三个参数是输出目录,第四个参数是一个细节配置Map,其中的设定有:

packageName: 实体类的包名

imports: 要引入哪些外部包

classDefinition: 类定义模板,$1占位符会被类名替换,类可以是POJO,也可以继承于jSqlBox的ActiveRecord或只声明实现ActiveEntity接口(限Java8)。

linkStyle:生成链式风格的setter, 即settter方法不再是void声明,而是会返回类实例本身。链式风格的优点是可以写出非常简洁高效的语句,如:

new User().setId("张三").load().setAge(13).update();

fieldFlags: 为每一个实体属性生成一个字符串常量,常量名为为属性的大写,值为数据表的列名。有了这个字段,可以利用它来拼写支持重构的SQL。

以下是一个实际由jSqlBox的源码生成程序生成的实体类示例,它的linkStyle属性和fieldFlags属性都设为了true:

package somepackage;

import com.github.drinkjava2.jdialects.annotation.jdia.*;

import com.github.drinkjava2.jdialects.annotation.jpa.*;

import com.github.drinkjava2.jsqlbox.*;

import static com.github.drinkjava2.jsqlbox.DB.*;

@Table(name="entity1")

public class Entity1 extends ActiveRecord {

public static final String ID = "id";

@Id

@Column(name=ID)

private Integer id;

public static final String NAME = "name";

@Id

@Column(name=NAME, length=10)

private String name;

public static final String CUSTID = "cust_id";

@Column(name=CUSTID)

private Integer custId;

public Integer getId(){

return id;

}

public Entity1 setId(Integer id){

this.id=id;

return this;

}

public String getName(){

return name;

}

public Entity1 setName(String name){

this.name=name;

return this;

}

public Integer getCustId(){

return custId;

}

public Entity1 setCustId(Integer custId){

this.custId=custId;

return this;

}

}

实体源码自动生成功能在项目开发初期比较有用,尤其是以数据库建模驱动而不是以实体建模驱动开发的项目,但是不能过分依赖它,代码生成工具到了项目后期就成了鸡肋,实体字段的增减、重构,直接在IDE里修改反而更简单稳当。

相关文章

最近更新