ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

rust rbatis查询表

rust rbatis查询表 在 Rust 中使用rbatis查询表主要有三种方式自动 CRUD、Wrapper 条件查询、以及自定义 SQLhtmlsql/pysql。以下是完整的实用指南1. 添加依赖toml[dependencies] rbatis 4.5 # 或当前最新版本 rbdc-sqlite 4.5 # 根据你的数据库选择rbdc-mysql, rbdc-pg, rbdc-mssql serde { version 1, features [derive] } tokio { version 1, features [full] }2. 定义实体使用crud_table宏自动映射表结构rustuse rbatis::crud::CRUDTable; use serde::{Deserialize, Serialize}; #[derive(Clone, Debug, Serialize, Deserialize, CRUDTable)] #[table_name user] // 指定表名 pub struct User { pub id: Optioni64, pub name: OptionString, pub age: Optioni32, pub email: OptionString, }3. 初始化 RBatisrustuse rbatis::rbatis::Rbatis; use rbdc_sqlite::driver::SqliteDriver; lazy_static::lazy_static! { static ref RB: Rbatis Rbatis::new(); } #[tokio::main] async fn main() { // 初始化连接池以 SQLite 为例 RB.init(SqliteDriver {}, sqlite://target/test.db).unwrap(); // 执行查询... }4. 查询方式方式一全表查询自动 CRUDrust// 查询所有用户 let users: VecUser RB.fetch_list().await.unwrap(); println!({:?}, users);方式二条件查询Wrapperrustuse rbatis::wrapper::Wrapper; // 构建查询条件 let w RB.new_wrapper() .eq(age, 18) // age 18 .like(name, %张三%) // name LIKE %张三% .order_by(true, [id]); // ORDER BY id ASC let users: VecUser RB.fetch_list_by_wrapper(w).await.unwrap();Wrapper 常用方法表格方法说明.eq(col, val)等于.ne(col, val)不等于.gt(col, val)/.ge(col, val)大于 / 大于等于.lt(col, val)/.le(col, val)小于 / 小于等于.like(col, %val%)模糊查询.in_array(col, vec![1,2,3])IN 查询.is_null(col)/.is_not_null(col)NULL 判断.and()/.or()逻辑连接.order_by(asc, [col])排序方式三根据主键查询rustlet user: OptionUser RB.fetch_by_id::User(1i64).await.unwrap();方式四自定义 SQL推荐复杂查询使用htmlsql宏类似 MyBatis 的 XMLrustuse rbatis::{htmlsql, crud::CRUDTable}; #[htmlsql( select SELECT * FROM user where if testname ! \\ AND name LIKE #{name} /if if testage ! 0 AND age #{age} /if /where /select )] async fn select_by_condition(rb: Rbatis, name: str, age: i32) - VecUser { impled!() } // 调用 let users select_by_condition(RB, %张三%, 18).await;或使用pysql宏Python 风格模板rustuse rbatis::pysql; #[pysql( SELECT * FROM user WHERE 11 ${if name ! : AND name LIKE #{name}} ${if age 0: AND age #{age}} )] async fn select_by_condition(rb: Rbatis, name: str, age: i32) - VecUser { impled!() }方式五执行原生 SQLrustlet sql SELECT * FROM user WHERE age ?; let users: VecUser RB.fetch_prepare(, sql, vec![rbatis::Value::I32(18)]) .await .unwrap();5. 分页查询rustuse rbatis::plugin::page::{Page, PageRequest}; let req PageRequest::new(1, 10); // 第1页每页10条 let w RB.new_wrapper().eq(status, 1); let page: PageUser RB.fetch_page_by_wrapper(w, req).await.unwrap(); println!(总条数: {}, page.total); println!(数据: {:?}, page.records);6. 完整示例rustuse rbatis::rbatis::Rbatis; use rbatis::crud::CRUDTable; use rbatis::wrapper::Wrapper; use serde::{Deserialize, Serialize}; use rbdc_sqlite::driver::SqliteDriver; #[derive(Clone, Debug, Serialize, Deserialize, CRUDTable)] #[table_name user] struct User { pub id: Optioni64, pub name: OptionString, pub age: Optioni32, } lazy_static::lazy_static! { static ref RB: Rbatis Rbatis::new(); } #[tokio::main] async fn main() { RB.init(SqliteDriver {}, sqlite://test.db).unwrap(); // 1. 查全部 let all: VecUser RB.fetch_list().await.unwrap(); // 2. 条件查询 let w RB.new_wrapper() .ge(age, 18) .like(name, %李%); let list: VecUser RB.fetch_list_by_wrapper(w).await.unwrap(); // 3. 查单个 let one: OptionUser RB.fetch_by_id(1i64).await.unwrap(); println!(查询结果: {:?}, {:?}, {:?}, all, list, one); }关键提示字段映射默认下划线转驼峰user_name↔user_name如需自定义用#[column_name user_name]日志开启log或tracing可看到实际执行的 SQL连接池RB.init()内部已集成连接池无需额外配置事务使用RB.begin_tx()/RB.commit()/RB.rollback()如果你用的是rbatis 3.x或2.xAPI 略有不同主要是CRUDTable改为CRUD等建议优先使用4.x版本。需要针对特定数据库MySQL/PostgreSQL的示例吗
返回列表