jSqlBox 4.0.3 发布,Java 全功能数据库持久层 ORM 工具
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<String, Object> setting = new HashMap<String, Object>(); 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<Entity1> { 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里修改反而更简单稳当。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Spring Security基于Oauth2的SSO单点登录怎样做?一个注解搞定
一、说明 单点登录顾名思义就是在多个应用系统中,只需要登录一次,就可以访问其他相互信任的应用系统,免除多次登录的烦恼。本文主要介绍 同域 和 跨域 两种不同场景单点登录的实现原理,并使用 Spring Security 来实现一个最简单的跨域 SSO客户端 。 二、原理说明 单点登录主流都是基于共享 cookie 来实现的,下面分别介绍 同域 和 跨域 下的两种场景具体怎样实现共享 cookie 的 2.1. 同域单点登录 适用场景:都是企业自己的系统,所有系统都使用同一个一级域名通过不同的二级域名来区分。 举个例子:公司有一个一级域名为 zlt.com ,我们有三个系统分别是:门户系统(sso.zlt.com)、应用1(app1.zlt.com)和应用2(app2.zlt.com),需要实现系统之间的单点登录,实现架构如下: 核心原理: 门户系统设置 Cookie 的 domain 为一级域名也就是 zlt.com,这样就可以共享门户的 Cookie 给所有的使用该域名(xxx.zlt.com)的系统 使用 Spring Session 等技术让所有系统共享 Session 这样只...
- 下一篇
ZStack 3.8.0 发布
近日,ZStack正式发布最新版本——ZStack 3.8.0,涵盖一系列重要功能,以下为您进行详细介绍。 ZStack 3.8.0新功能概览 云主机内部监控: 实现主流Linux/Windows以及国产操作系统覆盖 云主机(包括云路由器)新增内部监控项,且新增监控项均支持ZWatch报警 大屏监控/性能TOP5/性能分析支持外部/内部监控切换展示 裸金属主机实时监控及自定义报警 报警器自定义报警级别,报警消息按报警级别筛选展示 企业管理增强:系统角色新增“监控大屏角色” 计费价目 引入计费价目概念,实现准公有云计费方式 各项目/账户使用不同计费价目,制定不同定价策略 VPC私有网络内网负载均衡 混合云IPsec增强:ZStack 单个VPC子网可与阿里云子网建立隧道连接 V2V迁移增强:源vCenter平台新增支持5.0、5.1版本 云主机启动顺序新增“Network(网络)”选项 允许设置“禁止云主机(包括VPC路由器)跨集群触发高可用”相关策略 VPC路由器资源优先级提高 VPC防火墙增强: 向规则集中添加规则,源IP和目的IP支持批量填写固定IP地址/IP范围/CIDR(一次...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS8编译安装MySQL8.0.19
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Hadoop3单机部署,实现最简伪集群
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果