docs.rs failed to build rbatis-1.1.3
Please check the build logs for more information.
See Builds for ideas on how to fix a failed build, or Metadata for how to configure docs.rs builds.
If you believe this is docs.rs' fault, open an issue.
Please check the build logs for more information.
See Builds for ideas on how to fix a failed build, or Metadata for how to configure docs.rs builds.
If you believe this is docs.rs' fault, open an issue.
Visit the last successful build:
rbatis-4.5.22
A ORM formwork Rustlang-based,dynamic sql, no Runtime,No Garbage Collector, low Memory use,High Performance orm Framework.
rbatis 是一个无GC无虚拟机无运行时Runtime直接编译为机器码,并发安全的 数据库 ORM框架,并且所有数据传值均使用json(serde_json)
rbatis 使用百分之百的安全代码实现
This crate uses #![forbid(unsafe_code)] to ensure everything is implemented in 100% Safe Rust.
- 使用最通用的json数据结构(基于serde_json)进行传参和通讯
- 高性能,单线程benchmark 可轻松拉起200000 QPS/s(直接返回数据(数据库查询时间损耗0),win10,6 core i7,16GB) 多线程更高 远超go语言版本的GoMyBatis
- 多功能,乐观锁插件+逻辑删除插件+分页插件+Py风格Sql+基本的Mybatis功能
- 支持future,async await(理论上,假设严格按照async_std/tokio库替代所有io操作,那么并发量可远远超过go语言)
- 日志支持,可自定义具体日志(基于标准库log(独立于任何特定的日志记录库),日志可选任意第三方库实现)
- 使用百分百的安全代码实现(lib.rs加入了"#![forbid(unsafe_code)]" 禁止不安全的unsafe代码)
- 点击查看-示例代码(建议用Clion导入项目而不是VSCode以支持debug)
首先(Cargo.toml)添加项目依赖
# add this library,and cargo install
#json
serde =
serde_json = "1.0"
#log
log = "0.4"
fast_log="1.0.2"
#rbatis
rbatis-core =
rbatis = "1.1.3"
py风格sql语法Example
// 。
= ::;
= #"
*
= #{delete_flag}
#{name+'%'}
in : :: = ;
!;
日志系统(这里举例使用fast_log)
//main函数加入
use ;
xml使用方法
/**
* 数据库表模型
*/
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Activity {
pub id: Option<String>,
pub name: Option<String>,
pub pc_link: Option<String>,
pub h5_link: Option<String>,
pub pc_banner_img: Option<String>,
pub h5_banner_img: Option<String>,
pub sort: Option<String>,
pub status: Option<i32>,
pub remark: Option<String>,
pub create_time: Option<DateTime<chrono::Utc>>,
pub version: Option<i32>,
pub delete_flag: Option<i32>,
}
fn main() {
async_std::task::block_on(
async move {
fast_log::log::init_log("requests.log", &RuntimeType::Std).unwrap();
let mut rb = Rbatis::new();
rb.link(MYSQL_URL).await.unwrap();
//xml数据建议以 XXMapper.xml 的格式存储管理
rb.load_xml("test", r#"<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://raw.githubusercontent.com/zhuxiujia/Rbatis/master/rbatis-mapper.dtd">
<mapper>
<result_map id="BaseResultMap" table="biz_activity">
<id column="id"/>
<result column="name" lang_type="string"/>
<result column="pc_link" lang_type="string"/>
<result column="h5_link" lang_type="string"/>
<result column="pc_banner_img" lang_type="string"/>
<result column="h5_banner_img" lang_type="string"/>
<result column="sort" lang_type="string"/>
<result column="status" lang_type="number"/>
<result column="remark" lang_type="string"/>
<result column="version" lang_type="number" version_enable="true"/>
<result column="create_time" lang_type="time"/>
<result column="delete_flag" lang_type="number" logic_enable="true" logic_undelete="1"
logic_deleted="0"/>
</result_map>
<select id="select_by_condition">
<bind name="pattern" value="'%' + name + '%'"/>
select * from biz_activity
<where>
<if test="name != null">and name like #{pattern}</if>
<if test="startTime != null">and create_time >= #{startTime}</if>
<if test="endTime != null">and create_time <= #{endTime}</if>
</where>
order by create_time desc
<if test="page != null and size != null">limit #{page}, #{size}</if>
</select>
</mapper>"#).unwrap();
let arg = &json!({
"delete_flag": 1,
"name": "test",
"startTime": null,
"endTime": null,
"page": 0,
"size": 20
});
let data: Vec<Activity> = rb.xml_fetch("", "test", "select_by_condition", arg).await.unwrap();
println!("{}", serde_json::to_string(&data).unwrap_or("".to_string()));
}
)
}
//输出结果
//2020-06-27T03:13:40.422307200+08:00 INFO rbatis::rbatis - [rbatis] >> fetch sql: select * from biz_activity where name like ? order by create_time desc limit ? , ? (src\rbatis.rs:198)
//2020-06-27T03:13:40.424307300+08:00 INFO rbatis::rbatis - [rbatis] >> fetch arg:["%test%",0,20] (src\rbatis.rs:199)
//2020-06-27T03:13:40.446308900+08:00 INFO rbatis::rbatis - [rbatis] << 4 (src\rbatis.rs:234)
//[{"id":"221","name":"test","pc_link":"","h5_link":"","pc_banner_img":null,"h5_banner_img":null,"sort":"0","status":0,"remark":"","create_time":"2020-06-17T20:10:23Z","version":0,"delete_flag":1},{"id":"222","name":"test","pc_link":"","h5_link":"","pc_banner_img":null,"h5_banner_img":null,"sort":"0","status":0,"remark":"","create_time":"2020-06-17T20:10:23Z","version":0,"delete_flag":1},{"id":"223","name":"test","pc_link":"","h5_link":"","pc_banner_img":null,"h5_banner_img":null,"sort":"0","status":0,"remark":"","create_time":"2020-06-17T20:10:23Z","version":0,"delete_flag":1},{"id":"178","name":"test_insret","pc_link":"","h5_link":"","pc_banner_img":null,"h5_banner_img":null,"sort":"1","status":1,"remark":"","create_time":"2020-06-17T20:08:13Z","version":0,"delete_flag":1}]
事务支持
;
block_on
Web框架支持(这里举例hyper)
lazy_static!
use Infallible;
async
pub async
支持数据库类型√已支持.进行中
数据库 | 已支持 |
---|---|
Mysql | √ |
Postgres | √ |
Sqlite | √ |
TiDB | √ |
CockroachDB | √ |
进度表-按照顺序实现
功能 | 已支持 |
---|---|
CRUD(内置CRUD模板(内置CRUD支持乐观锁/逻辑删除)) | √ |
LogSystem(日志组件) | √ |
Tx(事务/事务嵌套/注解声明式事务) | √ |
Py(在SQL中使用和xml等价的类python语法) | √ |
SlowSqlCount(内置慢查询日志分析) | √ |
async/await支持 | √ |
LogicDelPlugin(逻辑删除插件) | x |
VersionLockPlugin(乐观锁插件,防止并发修改数据) | x |
PagePlugin(分页插件) | x |
DataBaseConvertPlugin(数据库表结构转换为配置插件) | x |
web(可视化Web UI) | x |
基准测试benchmark (测试平台 win10,6 core i7,16GB)
分步骤压测
//sql构建性能 Example_ActivityMapper.xml -> select_by_condition
操作/纳秒nano/op: 0.202 s,each:2020 nano/op
事务数/秒 TPS: 495049.50495049503 TPS/s
//查询结果解码性能 decode/mysql_json_decoder -> bench_decode_mysql_json
操作/纳秒nano/op: 0.24 s,each:2400 nano/op
事务数/秒 TPS: 416666.6666666667 TPS/s
//综合性能约等于
操作/纳秒nano/op: 4420 nano/op
事务数/秒 TPS: 200000 TPS/s
- 结论: 假设IO耗时为0的情况下,仅单线程 便有高达20万QPS/TPS,性能也是go语言版、java版 等等有GC暂停语言的 几倍以上性能
常见问题
-
async await支持? 已同时支持async_std和tokio
-
postgres 的stmt使用$1,$2而不是mysql的?,那么是否需要特殊处理? 不需要,因为rbatis旗下 rbatis_driver 已经处理了 ? -> $1的转换,你只需要在sql中写?即可。
-
oracle数据库驱动支持? 不支持,应该坚持去IOE
-
直接使用驱动依赖项目里哪个库? 应该使用rbatis-core, Cargo.toml 加入 rbatis-core = "*"
-
如何选择运行时是tokio还是async_std?
# Cargo.toml 加入
rbatis-core =
# 或者Cargo.toml 加入
# rbatis-core =
和Rbatis相关项目
- Log日志库 https://github.com/rbatis/fast_log
- Rbatis/Core https://github.com/rbatis/rbatis/tree/master/rbatis-core