含泪开源已用多年的JAVA框架_PART1_ORM组件
写在前面
虽然还带着研发团队,但是主业已经是产品5年了。前几天部门里的研发经理找我说:领导,你的那套老框架现在有点年岁太久,维护成本太高了,团队最近正好有时间想启动一套新的java开发框架,你看行么。当然是随他们去了,毕竟已经不写代码好几年了。
想想也是,这个老框架已经是12年封装的框架一直用到现在,突然感觉老眼都湿润了,岁月不饶人,长江后浪推前浪,一代新人换旧人啊。
想想怎么也的给他一个好的结果,算是给自己研发生涯送个终吧,然后就打算给开源了,说是开源,其实就是放在开源网上了,由于框架毕竟太老了,代码也被小伙子长时间迭代改的有点面目全非了,也没有技术支持,所以不建议大家项目中使用,可以用来学习和产考。
这里陆续写几篇文章大概做一些对这个框架的介绍,包含一些实例。
打算主要介绍框架里面自己封装的ORM框架(基于对象关系映射的数据库访问框架)代号“TURBO”(涡轮增压),因为他是系统的内核,所以就想用发动机来起名。后面会陆续分享框架里面对权限验证、单点登录,监控,传输等组件。
项目已发布到码云上,地址:https://gitee.com/osjoe/turbo
整套ORM基于springjdbc封装,利用java反射机制实现,这里有同学会问,外面已经有hibernate,MyBatis这些牛逼的框架了你还封装个毛线。
初衷是啥
1、受不了hibernate,MyBatis太多的xml配置,就想能不配置就不配置。这种思想也一直延续到自己做产品,简单就是美。
2、由于自己曾经是orale的dba,所以就自己控制底层拼装sql,为未来的优化留后门,不想啥都让hibernate和mybatis做了,还是透明的方式,无法在底层插入自己的优化手段。
3、想用对象查询用对象查询,想写sql写sql,想混合就混合。
4、为了适应自己的前端框架,使得mvc各层对接更加轻量级,让各种什么PO,BO,VO,DTO,POJO来回转换都见鬼去吧。
5、多数据源的无缝切换,0代码修改。首先配置要尽可能的少,第二是底层要适配各种数据库的常用语法。
6、多个数据源的支持更简答话。
7、可动态创建数据源。
8、mvc能不能不要DAO层。
9、方便对接自己写的各种分表分区查询啥的。
10、(50%的初衷)当初年少轻狂,也没女票,对代码爱的痴狂,半夜2点还在撸代码,觉得有必要写一个展示一下自己的能力。
下面就从实际例子来介绍一下这个ORM吧。
整个ORM目前已经适配数据库包括:Oracle、Mysql、SQLserver、Postgresql,可扩展支持及其数据库。
本文打算按以下流程来介绍,着重第三部分:
1.数据源配置;2.对象关系配置;3.增删改查,事务操作、多数据源、动态创建数据源支撑等操作实例。
1、数据源配置
可以同时配置多个数据源,驱动也不用配置(底层直接根据链接查找不同数据库的驱动名),那种万年不变的老驱动,还天天配置个啥,一到配置的时候小伙子们就各种查百度。
#默认数据库配置
db.default.url=jdbc:mysql://localhost:3306/test
db.default.username=root
db.default.password=root
db.default.initPoolSize=5
db.default.maxPoolSize=5
db.default.schema=test
#第二个数据源(可无限多个),下面的v2代表第二个数据源的别名,可以自定义,实际操作中用到。
db.v2.url=jdbc:postgresql://10.237.33.127:5432/test
db.v2.username=test
db.v2.password=123456
db.v2.initPoolSize=5
db.v2.maxPoolSize=5
2、对象关系配置和注入;
我们内部将整个支持MVC三层的对象统一叫做VO,没有绝对的标准。采用注解(annotation)的方式,但已经尽量简化了。后面介绍,mvc各层就一个,可作为前端对象接收表单传值,也可根据annotation配置直接入库。
举个栗子。
先建个表吧!
为了标识这个框架支撑各种字段的能力,所以建了几个不同数据类型的字段。如:字符,CLOB,BLOB,时间戳啥的。
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (
`id` char(32) DEFAULT '' COMMENT '用户id',
`name` varchar(255) DEFAULT NULL COMMENT '用户名',
`email` varchar(255) DEFAULT NULL COMMENT '邮箱',
`head_sculpture` blob COMMENT '头像图片',
`resume` longtext COMMENT '简历',
`ts` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '时间戳'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
看看vo的注解吧(简书的排版简直让人抓狂,ε=(´ο`*))),不支持插入代码,为了好看这里及截图了,后面get和set我省略了,实际是有的)。
下图中可以看到,只要是和数据库字段名相同的属性都不用注释。不向数据库插入,但是用来接收前端表单数据的属性用@WsdNotDbColumn标注即可。
vo注入这里看一下封装的annotation吧,和ORM相关的也就4个,如下:
1)表的注解(wsdTable):
wsdTable2)字段注解(WsdColumn关键注解)
这里面定义了不同数据库字段类型的映射关系,以方便一个别名适配各种数据库的类型。
WsdColumn例如NUMBER,可映射到("number","int","tinyint","decimal","float","double","bigint","numeric"),代表不同数据库相同类型的别名。
3)是否是数据库字段注解(WsdNotDbColumn)
没有任何属性,只是标记这个字段是否是数据库字段,本来想通过数据库链接的元数据来自动判断的,最后偷懒了,就多出这么一个注解。
WsdNotDbColumn4)字段是否可为空(WsdColumnNullAble)
是否可为空,主要用于验证,这个也是偷懒了,可以通过数据库链接的元数据来自动判断的。
字段是否可为空3、配置启动扫描。
这里要说一下,框架设计了一个引擎启动的配置文件,里面会配置要扫描的VO对象的位置,多个要扫描的包用竖线隔开几个。
这样项目启动的时候就会对这些包进行扫描,并将所有扫描到的VO的元数据存入内容中或者缓存服务中。具体过程大家有兴趣可查看源码。
启动配置扫描的类似产考spring源码自己写的。具体类名为:ModuleParser。大家可以自己看。
4、各种数据操作
从曾删改查、事务操作、多数据源、非spring环境使用进行示例说明。
以下示例都可在类DaoTest里,可查看源码。
已经封装数据库操作常用方法列表
方法列表4.1插入操作
如果对于小型项目,我们一般不写DAO层。直接在service层通过CM,CM为服务获取入口类(当然服务也可以用用spring注入的方式)。
1)对象Insert
这里和常用的框架类似。
对象Insert2)批量插入
批量插入4.2查询操作
1)列表查询
列表查询2)根据id查询
根据id查询3)条件查询
所有的条件组合封装在了WhereCondition这个类中,采用链式封装,操作非常简洁。
条件查询3)多条件组合查询
WhereCondition封装了对所有sql基本语法的支撑,如:
=、!= 、>、>=、<、<= 、 like、not like 、between and 、in 、 and、 or 、EXISTS 、NOT EXISTS、 IS NULL、 IS NOT NULL;
多条件组合查询4)根据sql查询,返回对象列表
根据sql查询,返回对象列表5)分页查询
分页主要看Pager这个类,大家可以查看源码。
分页主要看Pager这个对象。4.3修改操作
1)根据id修改
自动排除值为空的属性。
自动排除值为空的属性。手动设置哪些字段不更新
手动设置哪些字段不更新2)根据条件批量修改
根据条件批量修改4.5 SaveOrUpdate
根据数据库是否有着id来判断新增还是插入。
SaveOrUpdate4.4删除操作
1)条件删除
条件删除2)根据id删除
根据id删除4.5事务操作
在一个事务中执行多个ddl操作。
事务操作4.6多数据源操作
1.首先需提前在配置文件中配置多数据源信息。配置很简单,个支持多个。如下:
配置2.在CM中定义。
在CM中定义3.然后就可以直接调用了
测试4.7动态创建数据源
主要用在通过界面添加数据源的情况,比如动态添加一个数据库对其进行定时监控,或者ETL中的数据源动态配置
动态创建数据源~~以上便是对本框架中ORMd的介绍。
大家可以从指定git地址上把代码pull下来,按步骤测试。
GIT地址:https://gitee.com/osjoe/turbo
微信公众号老司机再次共勉。祭奠写代码折腾框架的日子。也欢迎关注。同名公众号,18岁fantasy,欢迎关注!
奉献上动效!