Skip to main content

Module dynamic_sql

Module dynamic_sql 

Source
Expand description

XML/py_sql 动态 SQL 构造器(rbatis 风格)

rbatis 的核心特性是 XML 风格的动态 SQL 模板:

  • <select> / <insert> / <update> / <delete> 顶层语句
  • <if test="..."> 条件块
  • <where> 自动处理首个 AND/OR
  • <set> UPDATE 语句的 SET 子句
  • <foreach> 循环展开(用于 IN 子句)
  • <choose><when><otherwise> 多分支选择
  • <trim> 通用前后缀修剪
  • #{name} 命名参数绑定

§用法

use sz_orm_core::dynamic_sql::{DynamicSqlParser, SqlParams};
use std::collections::HashMap;

let xml = r#"
<select id="find_users">
    SELECT * FROM users
    <where>
        <if test="name != null">AND name = #{name}</if>
        <if test="age != null">AND age &gt; #{age}</if>
    </where>
</select>
"#;

let parser = DynamicSqlParser::from_xml(xml);
let mut params = SqlParams::new();
params.set("name", "Alice");
// params.set("age", 18);  // 不设置则 if 不生效

let sql = parser.build("find_users", &params).unwrap();
// SELECT * FROM users WHERE name = ?

§支持的标签

标签作用
<select id>SELECT 语句容器
<insert id>INSERT 语句容器
<update id>UPDATE 语句容器
<delete id>DELETE 语句容器
<if test="expr">条件包含
<where>WHERE 子句(自动处理首个 AND/OR)
<set>SET 子句(自动处理末尾逗号)
<foreach collection="x" item="i" separator=",">循环展开
<choose> / <when> / <otherwise>多分支选择
<trim prefix="..." suffix="..." prefixOverrides="AND">通用修剪
#{name}命名参数绑定
${name}字符串插值(注意 SQL 注入风险)

§安全警告

${name} 字符串插值存在 SQL 注入风险,即使已添加基础转义。 强烈推荐使用 #{name} 命名参数绑定,仅在 SQL 结构动态(如表名/列名)时 才使用 ${name},且必须确保输入来源可信。

Structs§

DynamicSqlParser
动态 SQL 解析器
SqlParams
SQL 参数容器
XmlNode

Enums§

DynamicSqlError
动态 SQL 错误
ParamValue
参数值
XmlNodeType