Rust ORM框架Rbatis宏驱动库rbatis-macro-driver的使用,简化数据库操作与代码生成
Rust ORM框架Rbatis宏驱动库rbatis-macro-driver的使用,简化数据库操作与代码生成
安装
在项目目录中运行以下Cargo命令:
cargo add rbatis-macro-driver
或者在Cargo.toml中添加以下行:
rbatis-macro-driver = "4.6.0"
使用方式
rbatis-macro-driver是Rbatis ORM框架的宏驱动库,主要用于简化数据库操作和代码生成。
完整示例
以下是使用rbatis-macro-driver的完整示例:
use rbatis::Rbatis;
use rbatis::crud::CRUD;
use serde::{Deserialize, Serialize};
// 定义实体结构体
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct BizActivity {
pub id: Option<String>,
pub name: Option<String>,
pub delete_flag: Option<i32>,
}
// 使用宏生成CRUD实现
impl_select!(BizActivity{});
impl_update!(BizActivity{});
impl_insert!(BizActivity{});
impl_delete!(BizActivity{});
#[tokio::main]
async fn main() {
// 初始化Rbatis
let rb = Rbatis::new();
rb.link("mysql://root:123456@localhost:3306/test")
.await
.unwrap();
// 查询示例
let activity = BizActivity {
id: Some("1".to_string()),
name: Some("test".to_string()),
delete_flag: Some(0),
};
// 插入数据
let result = rb.save(&activity, &[]).await;
println!("Insert result: {:?}", result);
// 查询数据
let wrapper = rb.new_wrapper()
.eq("id", "1");
let activity: Option<BizActivity> = rb.fetch_by_wrapper(wrapper).await.unwrap();
println!("Query result: {:?}", activity);
// 更新数据
let mut activity = activity.unwrap();
activity.name = Some("updated".to_string());
let result = rb.update_by_id(&activity).await;
println!("Update result: {:?}", result);
// 删除数据
let result = rb.remove_by_id::<BizActivity>("1").await;
println!("Delete result: {:?}", result);
}
代码说明
- 首先定义了
BizActivity
实体结构体,并实现了Serialize
和Deserialize
trait用于序列化 - 使用
impl_select!
、impl_update!
、impl_insert!
和impl_delete!
宏为实体生成CRUD操作 - 初始化Rbatis并连接数据库
- 演示了基本的增删改查操作
项目信息
- 版本: 4.6.0
- 许可证: Apache-2.0
- 分类: Database interfaces
- 发布时间: 2个月前
- 大小: 12.1 KiB
1 回复
Rust ORM框架Rbatis宏驱动库rbatis-macro-driver使用指南
简介
rbatis-macro-driver
是Rust ORM框架Rbatis的一个宏驱动库,它通过过程宏简化数据库操作和代码生成,让开发者能够更高效地进行数据库交互。该库提供了多种宏来减少样板代码,提高开发效率。
主要特性
- 简化CRUD操作
- 自动生成SQL语句
- 减少样板代码
- 支持异步操作
- 类型安全的查询构建
安装
在Cargo.toml中添加依赖:
[dependencies]
rbatis = { version = "4.0" }
rbatis-macro-driver = "4.0"
完整示例代码
use rbatis::crud::CRUD;
use rbatis::Rbatis;
use rbatis_macro_driver::{CRUDTable, py_sql};
use rbatis::wrapper::Wrapper;
use rbatis::plugin::page::{Page, PageRequest};
use rbatis::executor::Executor;
// 1. 定义实体
#[derive(CRUDTable, Clone, Debug)]
pub struct User {
pub id: Option<u64>,
pub name: String,
pub age: Option<u32>,
pub email: Option<String>,
}
// 自定义SQL查询
#[py_sql("select * from user where name = #{name} and age > #{age}")]
async fn select_by_name_age(rb: &Rbatis, name: &str, age: u32) -> Vec<User> {
// 宏会自动生成实现代码
}
#[tokio::main]
async fn main() {
// 2. 初始化Rbatis
let rb = Rbatis::new();
rb.link("mysql://root:123456@localhost:3306/test")
.await
.unwrap();
// 3. 基本CRUD操作
// 插入数据
let user = User {
id: None,
name: "John".to_string(),
age: Some(30),
email: Some("john@example.com".to_string()),
};
let result = rb.save(&user, &[]).await.unwrap();
println!("Insert result: {:?}", result);
// 查询数据
// 根据ID查询
let user: Option<User> = rb.fetch_by_column("id", 1).await.unwrap();
println!("User by id: {:?}", user);
// 查询所有
let users: Vec<User> = rb.list().await.unwrap();
println!("All users: {:?}", users);
// 带条件查询
let wrapper = rb.new_wrapper().eq("name", "John");
let users = rb.fetch_list_by_wrapper(wrapper).await.unwrap();
println!("Users with name John: {:?}", users);
// 更新数据
let mut user = rb.fetch_by_column("id", 1).await.unwrap().unwrap();
user.name = "John Updated".to_string();
rb.update_by_column("id", &user).await.unwrap();
println!("User updated");
// 删除数据
rb.remove_by_column::<User, _>("id", 1).await.unwrap();
println!("User deleted");
// 高级功能
// 自定义SQL查询
let users = select_by_name_age(&rb, "John", 25).await.unwrap();
println!("Custom SQL query result: {:?}", users);
// 分页查询
let page_req = PageRequest::new(1, 10);
let wrapper = rb.new_wrapper().like("name", "John");
let page: Page<User> = rb.fetch_page_by_wrapper(wrapper, &page_req).await.unwrap();
println!("Page result: {:?}", page);
// 事务处理
let tx = rb.acquire_begin().await.unwrap();
let result = tx.exec(|tx| async move {
let user = User {
id: None,
name: "Transaction".to_string(),
age: Some(25),
email: None,
};
tx.save(&user, &[]).await?;
Ok(())
}).await;
match result {
Ok(_) => {
tx.commit().await.unwrap();
println!("Transaction committed");
},
Err(e) => {
tx.rollback().await.unwrap();
println!("Transaction rolled back: {:?}", e);
},
}
}
性能优化建议
- 使用连接池:确保合理配置连接池大小
- 批量操作:使用
save_batch
代替循环save
- 合理使用缓存:对频繁查询但很少变化的数据进行缓存
- 索引优化:确保数据库表有适当的索引
总结
rbatis-macro-driver
通过宏极大地简化了Rust中的数据库操作,减少了样板代码,同时保持了类型安全和性能。它特别适合需要高效数据库交互的中大型Rust项目。