SmartDb-Java 正在参加 2020 年度 OSC 中国开源项目评选,请投票支持!
SmartDb-Java 在 2020 年度 OSC 中国开源项目评选 中已获得 {{ projectVoteCount }} 票,请投票支持!
投票让它出道
已投票
SmartDb-Java 获得 2020 年度 OSC 中国开源项目评选「最佳人气项目」 !
SmartDb-Java 获得 2020 年度 OSC 中国开源项目评选「最佳人气项目」「最积极运营项目」 !
SmartDb-Java 获得 2020 年度 OSC 中国开源项目评选「最积极运营项目」 !
授权协议 Apache
开发语言 Java
操作系统 跨平台
软件类型 开源软件
开源组织
地区 国产
投 递 者 1024创新实验室
适用人群 未知
收录时间 2020-12-17

软件简介

SmartDb 是以SQL为中心,支持多数据源、读写分离,同时又不与原有项目mybatis、hibernate冲突的非常轻量级的Java ORM框架。

特性如下:

  • 支持ORM操作、常见增删改查、批量、分页等功能
  • 支持MySQL、Oracle、Postgresql、SqlServer
  • 支持在mybatis、hibernate等项目上引入SmartDb
  • 支持多数据源
  • 支持分写分离
  • 支持枚举Enum映射
  • 支持Spring和Spring事务
  • 支持SQL链式API
  • 支持代码生成
  • 支持 filter 过滤器
  • 所有类均可扩展
  • 支持Java 6 ( 收费,收费是为了更好的伺候 “客官 ”  )

SmartDb文档

gitee地址: https://gitee.com/lab1024/smartdb

文档地址:https://zhuoluodada.cn/smartdb

SmartDb特点

mybatis现在在国内已经是一家独大,而且也非常好用,笔者也推荐在大型项目中使用mybatis这种框架,但是总有一些场景,mybatis显得有些力不从心,这个时候选择SmartDb是一个不错的选择。

  • 在原有mybatis或hibernate连接其他数据库进行一些数据处理
  • 读写分离场景,有些数据需要操作主库,有些操作从库
  • 多数据源场景,要从mysql读出数据,然后进行转换存储到sqlserver中,等等
  • 在一个方法中进行多个数据源的数据库操作
  • 一个简单并追求开发效率的小型项目,例如 [SmartBlog(卓大的官方博客)](https://zhuoluodada.cn "SmartBlog(一个精心雕琢的博客)")
  • 不想使用sharding-sphere,sharding-jdbc, mycat,cobar等重型读写分离框架
  • 等等其他

基于以上种种,设计了一个支持多数据源、读写分离的轻量级ORM框架:SmartDb, 让使用者有个极致的开发体验。

SmartDb演示

引入

<dependency>
  <groupId>net.1024lab</groupId>
  <artifactId>smartdb</artifactId>
  <version>1.0.0</version>
</dependency>

SmartDb 操作多数据源(在一个方法中操作多个数据库,不用再使用注解切换来切换去,还不容易出错, oh yeah~)

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操作

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 读写分离操作

//默认操作 都是操作从库
List<UserEntity> 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 链式SelectBuilder操作(支持and、or、in、like、group、having、limit等等)

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操作

smartDb.insertSqlBuilder()
        .table("t_user")
        .insertColumn("id",1)
        .insertColumn("name","smartdb")
        .insertFunctionColumn("login_time","now()") //sql方法
        .execute();

SmartDb 链式UpdateBuilder操作

smartDb.updateSqlBuilder()
        .table("t_user")
        .updateColumn("name = ?","smart")
        .updateColumn(" login_time = now()")
        .whereAnd("id = 1")
        .execute();

SmartDb 链式DeleteBuilder操作

smartDb.deleteSqlBuilder()
        .table("t_user")
        .whereAnd("id = 1")
        .execute();

SmartDb 链式ReplaceBuilder操作

smartDb.replaceSqlBuilder()
        .table("t_user")
        .replaceColumn("id",1)
        .replaceColumn("name","smartdb")
        .replaceFunctionColumn("login_time","now()")
        .execute();

创建 SmartDb 

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

 

展开阅读全文

代码

的 Gitee 指数为
超过 的项目

评论 (3)

加载中
性能,性能怎么样?
01/15 10:58
回复
举报
挺好的,拿来学习一下
2020/12/28 16:17
回复
举报
1024创新实验室软件作者
打分: 力荐
+1
2020/12/17 14:00
回复
举报
更多评论
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
发表于硬件 & IoT专区
2019/11/26 16:21

SmartDb代码修改

在之前的一篇博客中介绍过SmartDB (https://blog.csdn.net/wuquan_1230/article/details/89145012),在使用的过程中发现一个问题,会造成内存泄露,原因是有几个地方需要添加sqlite3_finalize调用以释放prepare sqlite3_stmt实例; 主要修改内容如下: smartDb.hpp文件修改了以下几点: 详见码云: https://gitee.com/fensw/SmartDB 微信订阅号: 本文分享自微信公众号 - 嵌入式技术笔记(fensnote)。 如有侵权,请联系 supp...

0
0
发表于硬件 & IoT专区
2019/04/24 17:30

linux下的SmartDB

这个是从祁宇老师的SmartDB稍作修改而来的,这里改动并不大,原来的版本是windows下的,在linux下编译有点问题,这里的修改主要是适应linux的编译,目前的版本是在linux编译测试通过的版本; 在linux编译时还需要sqlite库,这里没有附带 该目录下已经做好的一个通用的Makefile 还有下面两个接口编译不通过,在这里注释掉了: ExcecuteTuple接口还用不了, Variant的Visit接口编译不通过,注释掉可以通过,这这里好像也没有用到;...

0
0
发表于硬件 & IoT专区
2019/04/25 00:13

SmartDB码云链接

昨天分享的linux下编译的版本,已上传码云,地址: https://gitee.com/fensw/SmartDB 本文分享自微信公众号 - 嵌入式技术笔记(fensnote)。 如有侵权,请联系 support@oschina.cn 删除。 本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

0
0
发表于硬件 & IoT专区
2019/04/09 13:34

分享一个C++版本的Sqlite3封装--SmartDb

Sqlite是一个非常轻量级的开源数据库,在嵌入式系统中使用的比较多,存储管理数据非常方便,Sqlite库提供的基于C语言的API,用起来也挺简单,但是有一点不太好的就是API使用起来有些繁琐,另外就是不同的场合,代码复用率很低,又要重新写代码,增加了工作量,代码要尽量复用,才有价值。SmartDB对sqlite做了一层封装(基于C++11的模板元编程),屏蔽了诸多细节,使得我们使用起来很方便。在注重易用性的基础上还兼顾了性能和灵...

0
0
发表了博客
2018/06/20 15:53

java -d . **.java 与 java **.java 的区别

如何在命令行模式下运行带包的java文件 https://blog.csdn.net/lytor/article/details/17048361 javac,使用"-d ."与省略-d的区别 https://blog.csdn.net/ppxxyy1110/article/details/20971271 1.类文件带包(pakage) //文件名:test.java package org.test; public class test{ public static void main(String[] args){ System.out.println("hello world"); } } 一: 编译命令: javac -d . test.java 生成: 执行:java org/te...

0
2
发表了博客
2018/12/15 17:56

java JDBC

JDBC(Java DataBase Connectivity, java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。 有了JDBC,向各种关系数据发送SQL语句就是一件很容易的事。换言之,有了JDBC API,就不必为访问Sybase数据库专门写一个程序,为访问Oracle数据库又专门写一个程序,或为访问Informix数据库又编写另一个程序等等,程序员只需用JDBC API写一个程序就够了,它可向...

0
1
发表于程序人生专区
2020/02/18 15:01

Java ThreadLocal

点击上方"码之初"关注,···选择"设为星标" 与Java精品技术文章不期而遇 Java ThreadLocal类允许创建只能由同一线程读写的变量。因此,即使两个线程正在执行相同的代码,并且该代码具有对相同ThreadLocal变量的引用,两个线程也无法看到彼此的ThreadLocal变量。因此,Java ThreadLocal类提供了一种使代码线程安全的简单方法。 创建ThreadLocal 你可以像创建其他Java对象一样,通过new运算符创建ThreadLocal实例。代码如下: ...

0
1
发表了博客
2018/01/23 11:41

Java ThreadLocal

Java的ThreadLocal变量用来创建线程本地变量。我们知道,一个对象上的所有线程,都会共享该对象的变量,所以这些共享的变量不是线程安全的。我们可以使用synchronization同步语法来使得线程安全,但如果想避免使用synchronization,那么可以使用线程本地变量(ThreadLocal variables)。 使用了ThreadLocal变量后,每个线程都有它自己的本地变量,可以通过get()、set()方法来获得或设置这些变量的值。ThreadLocal实例通常是类中...

0
1
2014/04/09 14:41

Java JVM

一、Java JVM内存介绍 JVM管理两种类型的内存,堆和非堆。按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给自己用的,所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如...

0
10
发表了博客
2018/02/06 17:15

Java ThreadLocal

source from http://tutorials.jenkov.com/java-concurrency/threadlocal.html#inheritableThreadLocal Java ThreadLocal Creating a ThreadLocal Accessing a ThreadLocal Generic ThreadLocal Initial ThreadLocal Value Full ThreadLocal Example InheritableThreadLocal The ThreadLocal class in Java enables you to create variables that can only be read and written by the same thread. Thus, even if two threads ...

0
0
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
暂无内容
3 评论
14 收藏
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部