1024创新实验室-卓大
别点我 (●'◡'●)
卓大主页
文章列表
SmartDb
开源项目
关于我
博客源码
卓大
关注产业互联网,供应链软件,CTO,网络货运,技术顾问,教育培训,开源技术
公众号:1024创新实验室
公众号:六边形工程师
微信号:zhuoda1024
邮箱:zhuoluodada@qq.com
毕业于:山东大学 SDU.CS
地点:洛阳 (偶尔北京 / 郑州)
职位:技术总监 / CTO
管理:敏捷开发 / OKR
后端:Java, Linux, BD, BC
前端:JS, TS, Nodejs
支持多数据库、多数据源、读写分离的极速轻量级ORM框架 SmartDb
发表于 2019-09-21 21:21:50
|
分类于
开源项目
开源项目
|
ORM
JDBC
读写分离
主从
前言:
在这个mybatis、hibernate盛行的年代,为什么还要写一个ORM框架呢,那么这个“轮子”到底好不好呢?所谓事出有因,谈一下SmartDb的初衷、设计思路、使用场景,让你在以后的道路上有个更多的选择
### SmartDb 卓大观点 **【卓大观点】互联网已经发展了二十年,每个企业均有一定的数字化发展,但随着“产业互联网”,“新基建”,“国产数据库”,“国产开源框架”等时代的到来,越来越多的企业在原有数字化(原有各类数据库)的基础之上,需要再向上构建一层新的数据聚合,以此来适应产业互联网的发展需要。所以当下的系统都会在原有数据库基础之上连接其他两个、甚至多个数据库,故一个支持多数据库、多数据源且轻量级的java数据库中间件是及其需要的! ** ** 所以必须有一个能5分钟上手,就可以完美解决多数据库、多数据源问题的框架。** ### SmartDb特点 mybatis现在在国内已经是一家独大,而且也非常好用,笔者也推荐在大型项目中使用mybatis这种框架,但是总有一些场景,mybatis显得有些力不从心,这个时候选择SmartDb是一个不错的选择。 - 在原有mybatis或hibernate连接其他数据库进行一些数据处理 - 读写分离场景,有些数据需要操作主库,有些操作从库 - 多数据源场景,要从mysql读出数据,然后进行转换存储到sqlserver中,等等 - 在一个方法中进行多个数据源的数据库操作 - 一个简单并追求开发效率的小型项目,例如 [SmartBlog(卓大的官方博客)](https://zhuoluodada.cn "SmartBlog(一个精心雕琢的博客)") - 不想使用sharding-sphere,sharding-jdbc, mycat,cobar等重型读写分离框架 - 等等其他 基于以上种种,设计了一个支持多数据源、读写分离的轻量级ORM框架:SmartDb, 让使用者有个极致的开发体验。 ### SmartDb简介 **SmartDb** 是以SQL为中心,支持多数据源、读写分离,同时又不与原有项目mybatis、hibernate冲突的非常轻量级的Java ORM框架。 特性如下: - 支持ORM操作、常见增删改查、批量、分页等功能 - 支持MySQL、Oracle、Postgresql、SqlServer - 支持在mybatis、hibernate等项目上引入SmartDb - 支持多数据源 - 支持分写分离 - 支持枚举Enum映射 - 支持Spring和Spring事务 - 支持SQL链式API - 支持代码生成 - 支持 filter 过滤器 - 所有类均可扩展 - 支持Java 6 (默认支持java8,如需要支持java6,请添加微信) ### SmartDb 文档 github: [https://github.com/1024-lab/smartdb](https://github.com/1024-lab/smartdb "https://github.com/1024-lab/smartdb") gitee: [https://gitee.com/lab1024/smartdb](https://gitee.com/lab1024/smartdb "https://gitee.com/lab1024/smartdb") 官方文档: [https://zhuoluodada.cn/smartdb](https://zhuoluodada.cn/smartdb "https://zhuoluodada.cn/smartdb") 多数据源例子: [https://gitee.com/lab1024/smartdb-demos](https://gitee.com/lab1024/smartdb-demos "https://gitee.com/lab1024/smartdb-demos") ### SmartDb演示 #### SmartDb POM ```xml
net.1024lab
smartdb
1.2.0
``` #### SmartDb 操作多数据源 在一个方法中操作多个数据库,不用再使用注解切换来切换去,还容易出错, oh yeah~ ```java public void multiDatasource(UserEntity userEntity) { // mysqlSmartDb 对象为 连接SqlServer的SmartDb SmartDb mysqlSmartDb = build1(); // sqlServerSmartDb 对象为 连接SqlServer的SmartDb SmartDb sqlServerSmartDb = build2(); // 将数据插入mysql数据库 mysqlSmartDb.insert(userEntity); // 将数据插入sql server数据库 sqlServerSmartDb.insert(userEntity); } ``` #### SmartDb ORM操作 支持简单的orm操作 ```java UserEntity userEntity = new UserEntity(1, "zhuoda"); // 插入 smartDb.insert(userEntity); smartDb.insertSelective(userEntity); // 非空字段插入 smartDb.batchInsert(userList);//批量插入 // 更新 smartDb.update(userEntity); smartDb.updateSelective(userEntity); // 非空字段更新 // 删除 smartDb.delete(userEntity);//根据主键删除 ``` #### SmartDb 读写分离操作 ```java //默认操作 都是操作从库 List
userList = smartDb.selectSqlBuilder() .select("*") .from(UserEntity.class) .queryList(UserEntity.class); //获取写库 SmartDb writeSmartDb = smartDb.getMaster(); //将数据写入主库 writeSmartDb.insert(userEntity); //进行主库其他操作 writeSmartDb.delete(userEntity); writeSmartDb.updateSelective(userEntity); ``` #### SmartDb 链式Builder操作 smartdb为了支持快速开发,支持增删查改四种链式Builder操作 ##### SmartDb 链式SelectBuilder操作 支持and、or、in、like、group、having、limit等等 ```java UserEntity userEntity = smartDb.selectSqlBuilder() .select("user.*") .select("score.*") .from(UserEntity.class) .joinLeft("t_score on t_user.id = t_score.user_id") .whereAnd("user.id = ?", 1) .whereAnd("type = 3") .whereAndIn(" status ", Arrays.asList(1, 2, 3)) .groupby("user.type") .havingAnd("user.type = 1") .queryFirst(UserEntity.class); ``` ##### SmartDb 链式InsertBuilder操作 ```java smartDb.insertSqlBuilder() .table("t_user") .insertColumn("id",1) .insertColumn("name","smartdb") .insertFunctionColumn("login_time","now()") //sql方法 .execute(); ``` ##### SmartDb 链式UpdateBuilder操作 更新操作支持and、or、in、like、等等 ```java smartDb.updateSqlBuilder() .table("t_user") .updateColumn("name = ?","smart") .updateColumn(" login_time = now()") .whereAnd("id = 1") .execute(); ``` ##### SmartDb 链式DeleteBuilder操作 更新操作支持and、or、in、like、等等 ```java smartDb.deleteSqlBuilder() .table("t_user") .whereAnd("id = 1") .execute(); ``` ##### SmartDb 链式ReplaceBuilder操作 ```java ((MysqlSmartDb)smartDb).replaceSqlBuilder() .table("t_user") .replaceColumn("id",1) .replaceColumn("name","smartdb") .replaceFunctionColumn("login_time","now()") .execute(); ``` #### 创建 SmartDb ```java SmartDb smartDb = SmartDbBuilder.create() //设置 写库 数据源 .setMasterDataSource(writeDataSource) //设置 两个读库 数据源 .setSlaveDataSource(readDataSource1,readDataSource2) // 打印 info 级别sql .setShowSql(true) //设置数据库类型 .setSupportDatabaseType(SupportDatabaseType.MYSQL) //设置支持spring .setSmartDbExtEnum(SmartDbExtEnum.SPRING5) //表名与类名转换 .setTableNameConverter(cls -> "t_" + CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, cls.getSimpleName())) //列名字 转换 .setColumnNameConverter(new CaseFormatColumnNameConverter(CaseFormat.LOWER_CAMEL, CaseFormat.LOWER_UNDERSCORE)) .build(); ```
阅读 (13190)
喜欢 (
2
)
评论 (2)
走起吐槽