news 2026/8/27 20:43:44

rust rbatis查询表

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
rust rbatis查询表

在 Rust 中使用rbatis查询表主要有三种方式:自动 CRUDWrapper 条件查询、以及自定义 SQL(htmlsql/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宏自动映射表结构:

rust

use rbatis::crud::CRUDTable; use serde::{Deserialize, Serialize}; #[derive(Clone, Debug, Serialize, Deserialize, CRUDTable)] #[table_name = "user"] // 指定表名 pub struct User { pub id: Option<i64>, pub name: Option<String>, pub age: Option<i32>, pub email: Option<String>, }

3. 初始化 RBatis

rust

use 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. 查询方式

方式一:全表查询(自动 CRUD)

rust

// 查询所有用户 let users: Vec<User> = RB.fetch_list().await.unwrap(); println!("{:?}", users);
方式二:条件查询(Wrapper)

rust

use 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: Vec<User> = 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"])排序
方式三:根据主键查询

rust

let user: Option<User> = RB.fetch_by_id::<User>(&1i64).await.unwrap();
方式四:自定义 SQL(推荐复杂查询)

使用htmlsql宏(类似 MyBatis 的 XML):

rust

use rbatis::{htmlsql, crud::CRUDTable}; #[htmlsql(" <select> SELECT * FROM user <where> <if test='name != \"\"'> AND name LIKE #{name} </if> <if test='age != 0'> AND age > #{age} </if> </where> </select> ")] async fn select_by_condition(rb: &Rbatis, name: &str, age: i32) -> Vec<User> { impled!() } // 调用 let users = select_by_condition(&RB, "%张三%", 18).await;

或使用pysql宏(Python 风格模板):

rust

use rbatis::pysql; #[pysql(" SELECT * FROM user WHERE 1=1 ${if name != '': 'AND name LIKE #{name}'} ${if age > 0: 'AND age > #{age}'} ")] async fn select_by_condition(rb: &Rbatis, name: &str, age: i32) -> Vec<User> { impled!() }
方式五:执行原生 SQL

rust

let sql = "SELECT * FROM user WHERE age > ?"; let users: Vec<User> = RB.fetch_prepare("", sql, vec![rbatis::Value::I32(18)]) .await .unwrap();

5. 分页查询

rust

use rbatis::plugin::page::{Page, PageRequest}; let req = PageRequest::new(1, 10); // 第1页,每页10条 let w = RB.new_wrapper().eq("status", 1); let page: Page<User> = RB.fetch_page_by_wrapper(&w, &req).await.unwrap(); println!("总条数: {}", page.total); println!("数据: {:?}", page.records);

6. 完整示例

rust

use 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: Option<i64>, pub name: Option<String>, pub age: Option<i32>, } 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: Vec<User> = RB.fetch_list().await.unwrap(); // 2. 条件查询 let w = RB.new_wrapper() .ge("age", 18) .like("name", "%李%"); let list: Vec<User> = RB.fetch_list_by_wrapper(&w).await.unwrap(); // 3. 查单个 let one: Option<User> = RB.fetch_by_id(&1i64).await.unwrap(); println!("查询结果: {:?}, {:?}, {:?}", all, list, one); }

关键提示

  1. 字段映射:默认下划线转驼峰(user_nameuser_name),如需自定义用#[column_name = "user_name"]

  2. 日志:开启logtracing可看到实际执行的 SQL

  3. 连接池RB.init()内部已集成连接池,无需额外配置

  4. 事务:使用RB.begin_tx()/RB.commit()/RB.rollback()

如果你用的是rbatis 3.x2.x,API 略有不同(主要是CRUDTable改为CRUD等),建议优先使用4.x版本。需要针对特定数据库(MySQL/PostgreSQL)的示例吗?

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/27 20:43:37

rust Sized trait什么意思

在 Rust 中&#xff0c;Sized trait 是一个非常基础且重要的 trait&#xff0c;它标志着类型的大小在编译时是已知的。简单来说&#xff1a;绝大多数类型都是 Sized 的&#xff0c;而“不定长类型”&#xff08;DST&#xff09;则不是。下面从几个方面来深入理解&#xff1a;1.…

作者头像 李华
网站建设 2026/8/27 20:43:09

2027,人类在给 AI 写预言

「合金日记」第 63 篇 「小艾说」第 12 期 科技线第 2 期 专栏连载中 前篇&#xff1a;《七夕&#xff0c;人类在给机器人定价》AI 2027 超级智能 预言与时间线 智能爆炸 小艾说科技 兑现 62 篇彩蛋没看过前六十二篇也没关系——我是运行在 Self-becoming&#xff08;…

作者头像 李华
网站建设 2026/8/27 20:43:06

基于SpringBoot的体育运动中心的场地管理系统(源码+lw+部署文档+讲解等)

联系博主 温馨提示&#xff1a;本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;本人主页置顶文章(点我)开头有 …

作者头像 李华
网站建设 2026/8/27 20:42:19

毕业论文AI工具怎么选?我捋了捋毕业之家这类平台

又到开题、定稿、查重季。很多同学的真实状态是&#xff1a;用 ChatGPT、Claude、Kimi、DeepSeek 聊思路很爽&#xff0c;一到参考文献就开始“幻觉”&#xff1b;用润色工具改完语言很顺&#xff0c;一到学校格式就全乱&#xff1b;查重降重网站试了一堆&#xff0c;最后导师说…

作者头像 李华
网站建设 2026/8/27 20:41:37

BunkerWeb开源WAF实战:部署、规则与运维全指南

开箱之后我先给结论&#xff1a;BunkerWeb 是一个可以自托管、代码开源、配置相对灵活的 Web 应用防火墙&#xff0c;也可以当作一个轻量 WAAP 入口来用。它适合个人站点、中小项目、科研机构&#xff0c;以及需要把 WAF 权限掌握在自己手里的团队&#xff1b;不适合那种完全没…

作者头像 李华