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

代码说明

  1. 首先定义了BizActivity实体结构体,并实现了SerializeDeserialize trait用于序列化
  2. 使用impl_select!impl_update!impl_insert!impl_delete!宏为实体生成CRUD操作
  3. 初始化Rbatis并连接数据库
  4. 演示了基本的增删改查操作

项目信息

  • 版本: 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);
        },
    }
}

性能优化建议

  1. 使用连接池:确保合理配置连接池大小
  2. 批量操作:使用save_batch代替循环save
  3. 合理使用缓存:对频繁查询但很少变化的数据进行缓存
  4. 索引优化:确保数据库表有适当的索引

总结

rbatis-macro-driver通过宏极大地简化了Rust中的数据库操作,减少了样板代码,同时保持了类型安全和性能。它特别适合需要高效数据库交互的中大型Rust项目。

回到顶部