JAVA拓展新的数据库,SqlFaker:轻量级、易拓展的Java数据库智能填充开源库
在开发的过程中,往往会碰到要给数据库填充数据的问题,为了快速生成尽可能接近真实的数据,本人开发了SqlFaker,以下是该开源库的介绍。
开源库特性
支持主流的MySQL、Oracle、SQL Server、H2等数据库
支持8种常见数据库字段类型的智能填充,并支持自定义拓展
支持一次性插入百万级别的数据
支持事务
支持JDK1.6
使用示范
// 创建数据库连接
DBTools.url("jdbc:mysql://localhost:3306/facker")
.username("root")
.password("123456")
.connect();
// 给user表的四个字段填充5条数据
Faker.tableName("user")
.param("name", DataType.USERNAME)
.param("age", DataType.AGE)
.param("sex", DataType.SEX)
.param("birthday", DataType.TIME)
.insertCount(5)
.execute();
上述代码将生成如下SQL语句,并在数据库中执行:
insert into user(name,age,sex,address,birthday) values('武叹霜',21,'山西省晋城市泽州县庆达路463号','2018-02-24 10:56:37')
insert into user(name,age,sex,address,birthday) values('顾什可',50,'广西壮族自治区柳州市融水苗族自治县德堡路419号','2018-04-09 08:10:22')
insert into user(name,age,sex,address,birthday) values('蔡静随',46,'河南省郑州市巩义市广延路240号','2018-06-11 23:02:19')
insert into user(name,age,sex,address,birthday) values('韦丸赤',27,'河南省焦作市博爱县浦润路148号','2018-02-22 15:52:50')
insert into user(name,age,sex,address,birthday) values('任徐',54,'河南省新乡市延津县汉源路14号','2018-07-07 03:48:51')
依赖添加
本开源库已包含commons-dbcp2(2.0.1)、commons-dbutils(1.6)、junit(4.1.2)以及mysql-connector-java(5.1.46)的依赖。
com.github.lkmc2
sql-faker
1.0.0
注意:默认使用MySQL数据库,如需更换成Oracle、SQL Server、H2等commons-dbcp2连接池支持的数据库,可另行添加依赖,并在DBTools的driverClassName(数据库驱动名)方法中指定数据库驱动名。
数据库连接
一、连接属性设置
在进行插入数据之前需要设置数据库属性进行连接,如代码所示:
// 创建数据库连接
DBTools.url("jdbc:mysql://localhost:3306/facker")
.username("root")
.password("123456")
.driverClassName("com.mysql.jdbc.Driver")
.connect();
可设置的属性如下表:
属性名
说明
默认值
url
数据库连接地址
jdbc:mysql://localhost:3306/数据库名?useSSL=true&characterEncoding=utf8
username
数据库用户名
root
url
数据库密码
123456
driverClassName
数据库驱动名
com.mysql.jdbc.Driver
二、特殊情况
当数据库属性值等于默认值时,可省略该属性的设置(如用户名等于root、驱动名为com.mysql.jdbc.Driver时,可只设置url和密码):
// 创建数据库连接
DBTools.url("jdbc:mysql://localhost:3306/facker")
.password("OoOo00Oo00OoOo")
.connect();
DBTools.dbName("facker").connect();
注意 :数据库连接只需要设置一次,之后可以多次调用Faker进行插入数据操作。
数据插入
一、属性介绍
可设置的属性如下表:
属性名
说明
tableName(数据库表名)
设置数据库表名
param(字段名, 数据生成器类型①)
设置数据库字段名,以及对应的数据生成器类型
insertCount(插入条数)
设置插入数据条数
execute( )
生成SQL,显示在控制台,并在数据库中执行
onlyShowSql( )
生成SQL,并显示在控制台
ignored( )
不执行任何操作
注意:① 数据生成器类型,必须是DataType枚举值,或实现了Random接口的类。
使用示例:
// 给user表的四个字段填充5条数据
Faker.tableName("user")
.param("name", DataType.USERNAME)
.param("age", DataType.AGE)
.param("sex", DataType.SEX)
.param("birthday", DataType.TIME)
.insertCount(5)
.execute();
// 给user表的两个字段生成5条SQL,并显示在控制台
Faker.tableName("user")
.param("name", DataType.USERNAME)
.param("age", DataType.AGE)
.insertCount(5)
.onlyShowSql();
// 不执行任何操作,不生成SQL,不显示在控制台
Faker.tableName("user")
.param("name", DataType.USERNAME)
.param("age", DataType.AGE)
.insertCount(5)
.ignored();
二、插入数据的方式
本开源库一共支持三种插入数据的方式,可以混合使用。
1. 使用DataType指定数据类型
DataType一共支持8种枚举类型,如下表所示:
属性名
说明
类型
示例值
ID
用户ID
19位的数字型UUID字符串
1049120504188764160
USERNAME
用户名
长度为2到4个字的中文名
武叹霜
TIME
时间
一年前到现在的时间范围内任意一个时刻
2018-03-01 12:41:00
PHONE
手机号
11位手机号
13192668109
ADDRESS
地址
国内地址,详细到门牌号
四川省绵阳市盐亭县北利路738号
AGE
年龄
18到60岁的数字
19
SEX
性别
字符,0:男,1:女
'1'
使用示例:
// 给user表的8个字段填充1条数据
Faker.tableName("user")
.param("id", DataType.ID)
.param("name", DataType.USERNAME)
.param("birthday", DataType.TIME)
.param("phone", DataType.PHONE)
.param("address", DataType.ADDRESS)
.param("age", DataType.AGE)
.param("sex", DataType.SEX)
.param("email", DataType.EMAIL)
.insertCount(1)
.execute();
对应生成的SQL语句如下:
insert into
user(
id, name, birthday,
phone, address, age,
sex, email
)
values(
'1049120504188764160', '武叹霜', '2018-03-01 12:41:00',
'13192668109', '四川省绵阳市盐亭县北利路73号', 19,
'1', 'Alex705@gmail.com'
)
2. 使用 Values.of()系列方法生成取值范围
Values类共有以下8种生成取值范围方法,如下表:
方法名
取值范围
示例值
Values.of(可变长数组)
从可变长数组中任意抽取一个值
"优品", "良品", "次品"
Values.ofIntRange(起始值,结束值)
在[起始值, 结束值]的范围内取一个整数
33
Values.ofLongRange(起始值,结束值)
在[起始值, 结束值)的范围内取一个长整型数
777777777L
Values.ofFloatRange(起始值,结束值)
在[起始值, 结束值]的范围内取一个单精度浮点数,默认精确到小数点后2位
22.22f
Values.ofFloatRange(起始值,结束值,精度)
在[起始值, 结束值]的范围内取一个单精度浮点数,精度根据参数设置,最多6位
123.333333f
Values.ofDoubleRange(起始值,结束值)
在[起始值, 结束值]的范围内取一个双精度浮点数,默认精确到小数点后2位
788.31d
Values.ofDoubleRange(起始值,结束值,精度)
在[起始值, 结束值]的范围内取一个双精度浮点数,精度根据参数设置,最多6位
1820.4231d
Values.ofTimeRange(开始时间,结束时间)
在[开始时间, 结束时间]的范围内取一个时间,精确到秒
2018-03-14 13:21:11
另外,Times类中还有用于设定时间的两个方法:
方法名
说明
Times.of(年,月,日)
用于生成时间,精确到日
Times.of(年,月,日,时,分,秒)
用于生成时间,精确到秒
使用示例:
// 给product表的9个字段填充1条数据
Faker.tableName("product")
.param("type", Values.of("优品", "良品", "次品"))
.param("person_count", Values.ofIntRange(20, 50))
.param("total_count", Values.ofLongRange(555555555L, 888888888L))
.param("enter_price", Values.ofFloatRange(12.33f, 34.57f))
.param("outcome_price", Values.ofFloatRange(100.004132f, 240.281424f, 6))
.param("speed", Values.ofDoubleRange(750.34d, 800.27d))
.param("salary", Values.ofDoubleRange(1980.3415d, 2700.2315d, 4))
.param("firstTime", Values.ofTimeRange(Times.of(2018,3,22), Times.of(2018,10,22)))
.param("secondTime",
Values.ofTimeRange(
Times.of(2018,3,22,11,23,24),
Times.of(2018,10,22,22,15,17)
)
)
.insertCount(1)
.execute();
对应生成的SQL语句如下:
insert into
product(
type, person_count, total_count,
enter_price, outcome_price, speed,
salary, firstTime, secondTime
)
values(
'良品', 33, 777777777,
22.22, 123.333333, 788.31,
1820.4231, '2018-03-14 00:00:00', '2018-03-14 13:21:11'
)
3. 实现RandomData接口,提供可随机生成的返回值
RandomData接口的代码如下:
public interface RandomData {
T next();
}
实现该接口,并重写next( )方法提供一个返回值,该返回值就是数据库字段对应插入的值。
使用示例:
创建一个自定义类EnglishNameRandom,实现RandomData(泛型T可以是任意类型)接口,并提供一个随机生成的返回值。
// 英文名数据生成器
public class EnglishNameRandom implements RandomData {
// 候选值数组,从该数组中随机抽一个作为返回值
private static final String[] names = {"Kim Lily", "Andy Wang", "July Six"};
@Override
public String next() {
// 从数组中随机选取一个值
return RandomUtils.selectOneInArray(names);
}
}
在Faker中给字段指定使用EnglishNameRandom.class类型的生成器。
// 指定name字段使用EnglishNameRandom类进行随机值的生成
Faker.tableName("user")
.param("name", EnglishNameRandom.class)
.param("age", Values.ofIntRange(20, 50))
.param("address", DataType.ADDRESS)
.insertCount(5)
.execute();
对应生成的SQL语句如下:
insert into user(name, age, address)
values('Andy Wang', 23, '四川省绵阳市盐亭县北利路73号')
PS:如果有任何建议,可以在Issues中提出,如添加DataType的默认类型等。
License
The SqlFaker is released under version 2.0 of the Apache License.
JAVA拓展新的数据库,SqlFaker:轻量级、易拓展的Java数据库智能填充开源库相关推荐
- 易语言mysql数据库分页_易语言分页读数据库 mysql数据库分页
易语言读MySQL数据库出现中文乱码,求高手赐教? 看下mysql数据的编码, 再用易语言,使用同样的编码去链接mysql数据库 易语言如何读取数据库中固定行列的数据? 有几个命令:打开(),用于打开 ...
- 伯乐:一个易用、强大的PyTorch推荐系统开源库
来源:RUC AI Box 本文约3500字,建议阅读5分钟 4类53个模型,27个数据集,又一推荐系统神器! [ 导读 ]是否还在为推荐模型无法复现而怀疑人生?是否还在为不知如何入门推荐而踌躇不前? ...
- 妙笔生花:一个易用、高效的文本生成开源库
文本生成作为近年来自然语言处理中的热门领域,受到了学界和工业界的广泛关注.随着研究的不断深入,文本生成领域下的子任务和相应的模型越来越丰富,一些优秀的开源框架也纷纷涌现. 现有的开源文本生成库大致可分 ...
- Java 8 新特性之Lambda
Java 8 新特性之Lambda.Stream.Optional Java 8 新特性之Lambda.Stream.Optional 速度更快 代码更少(增加了新的语法Lambda表达式) 强大的S ...
- Java 10 新特性概述
Java 10是其23年历史中最快发布的java版本.Java因其缓慢的增长和发展而受到批评,但Java 10刚刚破坏了这个概念.Java 10是一个具有许多未来变化的版本,其范围和影响可能并不明显, ...
- Mybatis自定义轻量级分页组件(易集成,易拓展)
Mybatis自定义轻量级分页组件(易集成,易拓展) 其实github有一个叫做PageHelper的开源分页组件,我也用过,封装的还可以.只是感觉他的量级偏重,其实很多参数,都是我们开发中不需要的参 ...
- JAVA萌新学习day17.18天 数据库MySQL
JAVA萌新学习day17.18天 数据库MySQL基本操作 MySQLDemo // name age address 小明 18 大连 小明 18 大连 小明 18 大连/*** 1.数据库 -& ...
- java计算机毕业设计新冠疫苗接种预约系统登录源码+mysql数据库+lw文档+系统+调试部署
java计算机毕业设计新冠疫苗接种预约系统登录源码+mysql数据库+lw文档+系统+调试部署 java计算机毕业设计新冠疫苗接种预约系统登录源码+mysql数据库+lw文档+系统+调试部署 本源码技 ...
- java持久化框架_众里寻他千百度-- 轻量级持久化框架-java-火龙果软件工程
起了一个比较文艺的标题,但是仍然感觉不能 表达出接下来这个工具的文雅. 虽然这个库是前几个月写的了,但是经过了近期小项目的考验,愈发觉得这款轻量级的库应该被更多的开发者所知晓,于是"臭不要脸 ...
- 船新 IDEA 2020.1真香体验!Java开发首席生产力担当
就在前几天,Java软件开发神器 IDEA 2020.1 新版发布了: 我第一时间在机子上更新并体验了几天,感觉还是有点香的!怎么硕呢,体验完新特性之后,不由的感叹一句:IDEA现在真的是越来越智能, ...
最新文章
- 计算机英语基础课程论文,计算机专业英语课程教学论文
- jsp tag 自定义标签实现按钮的显示
- SDL教程4——在VS2010中设置SDL扩展库
- LeetCode 451. 根据字符出现频率排序(map+优先队列)
- 《CCNA学习指南:Cisco网络设备互连(ICND1)(第4版)》——1.10节本章小结
- 图像处理-直方图均衡化
- Hanlp添加未登陆词
- CEF与JavaScript交互读取电脑信息
- 做情绪的主人,痛苦是人生的催化剂
- 一、Spark安装与部署
- 物联网中无线通信技术
- DSXX平台MCU升级过程研究2014.10.05
- 最不起眼的基础知识,却成了你面试跨不过去的门槛
- 朋友去面试阿里蚂蚁金服测试岗位过程经历
- Android 启动优化说明、黑白屏处理
- 亚马逊服务器升降配和增/减磁盘
- 160个crackme 024详细题解(动态指令)
- 单片机实例3——多路开关状态指示(硬件电路图+汇编程序+C语言程序)
- 学习VR技术要学哪些内容?VR全景如何制作?
- 移动互联网时代必读十大图书