tag:github.com,2008:https://github.com/rbatis/rbatis/releases Release notes from rbatis 2026-02-11T06:25:54Z tag:github.com,2008:Repository/174461456/v4.7.2 2026-02-11T06:29:27Z v4.7.2 <p>what changes?</p> <ul> <li>remove #[html_sql] for mod</li> <li>add Page support for #[html_sql] for struct<br> for example:</li> </ul> <div class="highlight highlight-source-rust notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="#[rbatis::html_sql(&quot;example/example.html&quot;)] impl Activity { /// Paginated query - automatically detected by return type Page&lt;Activity&gt; /// Maps to &lt;select id=&quot;select_by_page&quot;&gt; in HTML /// The macro automatically generates pagination logic using PageIntercept pub async fn select_by_page( rb: &amp;dyn Executor, page_req: &amp;dyn PageRequest, name: &amp;str, dt: Option&lt;DateTime&gt;, ) -&gt; rbatis::Result&lt;rbatis::Page&lt;Activity&gt;&gt; { impled!() } }"><pre><span class="pl-c1">#<span class="pl-kos">[</span>rbatis<span class="pl-kos">::</span>html_sql<span class="pl-kos">(</span><span class="pl-s">"example/example.html"</span><span class="pl-kos">)</span><span class="pl-kos">]</span></span> <span class="pl-k">impl</span> <span class="pl-smi">Activity</span> <span class="pl-kos">{</span> <span class="pl-c">/// Paginated query - automatically detected by return type Page&lt;Activity&gt;</span> <span class="pl-c"></span> <span class="pl-c">/// Maps to &lt;select id="select_by_page"&gt; in HTML</span> <span class="pl-c"></span> <span class="pl-c">/// The macro automatically generates pagination logic using PageIntercept</span> <span class="pl-c"></span> <span class="pl-k">pub</span> <span class="pl-k">async</span> <span class="pl-k">fn</span> <span class="pl-en">select_by_page</span><span class="pl-kos">(</span> <span class="pl-s1">rb</span><span class="pl-kos">:</span> <span class="pl-c1">&amp;</span><span class="pl-k">dyn</span> <span class="pl-smi">Executor</span><span class="pl-kos">,</span> <span class="pl-s1">page_req</span><span class="pl-kos">:</span> <span class="pl-c1">&amp;</span><span class="pl-k">dyn</span> <span class="pl-smi">PageRequest</span><span class="pl-kos">,</span> <span class="pl-s1">name</span><span class="pl-kos">:</span> <span class="pl-c1">&amp;</span><span class="pl-smi">str</span><span class="pl-kos">,</span> <span class="pl-s1">dt</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos">&lt;</span><span class="pl-smi">DateTime</span><span class="pl-kos">&gt;</span><span class="pl-kos">,</span> <span class="pl-kos">)</span> -&gt; rbatis<span class="pl-kos">::</span><span class="pl-smi">Result</span><span class="pl-kos">&lt;</span>rbatis<span class="pl-kos">::</span><span class="pl-smi">Page</span><span class="pl-kos">&lt;</span><span class="pl-smi">Activity</span><span class="pl-kos">&gt;</span><span class="pl-kos">&gt;</span> <span class="pl-kos">{</span> <span class="pl-en">impled</span><span class="pl-en">!</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span></pre></div> <div class="highlight highlight-text-html-basic notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="&lt;!-- Paginated query - automatically detected by return type Page&lt;Activity&gt; --&gt; &lt;select id=&quot;select_by_page&quot;&gt; `select * from activity` &lt;where&gt; &lt;if test=&quot;name != ''&quot;&gt; ` and name like #{name}` &lt;/if&gt; &lt;if test=&quot;dt != null&quot;&gt; ` and create_time &lt; #{dt}` &lt;/if&gt; &lt;/where&gt; &lt;!-- PageIntercept will add limit/offset automatically --&gt; &lt;/select&gt;"><pre><span class="pl-c">&lt;!-- Paginated query - automatically detected by return type Page&lt;Activity&gt; --&gt;</span> <span class="pl-kos">&lt;</span><span class="pl-ent">select</span> <span class="pl-c1">id</span>="<span class="pl-s">select_by_page</span>"<span class="pl-kos">&gt;</span> `select * from activity` <span class="pl-kos">&lt;</span><span class="pl-ent">where</span><span class="pl-kos">&gt;</span> <span class="pl-kos">&lt;</span><span class="pl-ent">if</span> <span class="pl-c1">test</span>="<span class="pl-s">name != ''</span>"<span class="pl-kos">&gt;</span> ` and name like #{name}` <span class="pl-kos">&lt;/</span><span class="pl-ent">if</span><span class="pl-kos">&gt;</span> <span class="pl-kos">&lt;</span><span class="pl-ent">if</span> <span class="pl-c1">test</span>="<span class="pl-s">dt != null</span>"<span class="pl-kos">&gt;</span> ` and create_time <span class="pl-kos">&lt;</span> #{dt}` <span class="pl-kos">&lt;/</span><span class="pl-ent">if</span><span class="pl-kos">&gt;</span> <span class="pl-kos">&lt;/</span><span class="pl-ent">where</span><span class="pl-kos">&gt;</span> <span class="pl-c">&lt;!-- PageIntercept will add limit/offset automatically --&gt;</span> <span class="pl-kos">&lt;/</span><span class="pl-ent">select</span><span class="pl-kos">&gt;</span></pre></div> zhuxiujia tag:github.com,2008:Repository/174461456/v4.7.1 2026-02-06T07:24:56Z v4.7.1 <p>what changes?</p> <ul> <li>merge <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="3900199643" data-permission-text="Title is private" data-url="https://github.com/rbatis/rbatis/issues/609" data-hovercard-type="pull_request" data-hovercard-url="/rbatis/rbatis/pull/609/hovercard" href="https://github.com/rbatis/rbatis/pull/609">#609</a> for struct/mod html_sql mapping<br> for example:</li> </ul> <div class="highlight highlight-source-rust notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="use rbatis::dark_std::defer; use rbatis::executor::Executor; use rbatis::rbdc::datetime::DateTime; use rbatis::RBatis; #[derive(serde::Serialize, serde::Deserialize, Debug)] pub struct Activity { pub id: Option&lt;String&gt;, pub name: Option&lt;String&gt;, pub pc_link: Option&lt;String&gt;, pub h5_link: Option&lt;String&gt;, pub pc_banner_img: Option&lt;String&gt;, pub h5_banner_img: Option&lt;String&gt;, pub sort: Option&lt;String&gt;, pub status: Option&lt;i32&gt;, pub remark: Option&lt;String&gt;, pub create_time: Option&lt;DateTime&gt;, pub version: Option&lt;i64&gt;, pub delete_flag: Option&lt;i32&gt;, } /// All methods read SQL from example/example.html #[rbatis::html_sql(&quot;example/example.html&quot;)] impl Activity { /// Maps to &lt;select id=&quot;select_by_condition&quot;&gt; in HTML pub async fn select_by_condition( rb: &amp;dyn Executor, name: &amp;str, dt: &amp;DateTime, ) -&gt; rbatis::Result&lt;Vec&lt;Activity&gt;&gt; { impled!() } /// Maps to &lt;select id=&quot;select_page_data&quot;&gt; in HTML pub async fn select_page_data( rb: &amp;dyn Executor, name: &amp;str, dt: &amp;DateTime, ) -&gt; rbatis::Result&lt;Vec&lt;Activity&gt;&gt; { impled!() } /// Maps to &lt;update id=&quot;update_by_id&quot;&gt; in HTML pub async fn update_by_id( rb: &amp;dyn Executor, arg: &amp;Activity, ) -&gt; rbatis::Result&lt;rbatis::rbdc::db::ExecResult&gt; { impled!() } }"><pre><span class="pl-k">use</span> rbatis<span class="pl-kos">::</span>dark_std<span class="pl-kos">::</span>defer<span class="pl-kos">;</span> <span class="pl-k">use</span> rbatis<span class="pl-kos">::</span>executor<span class="pl-kos">::</span><span class="pl-v">Executor</span><span class="pl-kos">;</span> <span class="pl-k">use</span> rbatis<span class="pl-kos">::</span>rbdc<span class="pl-kos">::</span>datetime<span class="pl-kos">::</span><span class="pl-v">DateTime</span><span class="pl-kos">;</span> <span class="pl-k">use</span> rbatis<span class="pl-kos">::</span><span class="pl-v">RBatis</span><span class="pl-kos">;</span> <span class="pl-c1">#<span class="pl-kos">[</span>derive<span class="pl-kos">(</span>serde<span class="pl-kos">::</span><span class="pl-v">Serialize</span><span class="pl-kos">,</span> serde<span class="pl-kos">::</span><span class="pl-v">Deserialize</span><span class="pl-kos">,</span> <span class="pl-v">Debug</span><span class="pl-kos">)</span><span class="pl-kos">]</span></span> <span class="pl-k">pub</span> <span class="pl-k">struct</span> <span class="pl-smi">Activity</span> <span class="pl-kos">{</span> <span class="pl-k">pub</span> <span class="pl-c1">id</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos">&lt;</span><span class="pl-smi">String</span><span class="pl-kos">&gt;</span><span class="pl-kos">,</span> <span class="pl-k">pub</span> <span class="pl-c1">name</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos">&lt;</span><span class="pl-smi">String</span><span class="pl-kos">&gt;</span><span class="pl-kos">,</span> <span class="pl-k">pub</span> <span class="pl-c1">pc_link</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos">&lt;</span><span class="pl-smi">String</span><span class="pl-kos">&gt;</span><span class="pl-kos">,</span> <span class="pl-k">pub</span> <span class="pl-c1">h5_link</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos">&lt;</span><span class="pl-smi">String</span><span class="pl-kos">&gt;</span><span class="pl-kos">,</span> <span class="pl-k">pub</span> <span class="pl-c1">pc_banner_img</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos">&lt;</span><span class="pl-smi">String</span><span class="pl-kos">&gt;</span><span class="pl-kos">,</span> <span class="pl-k">pub</span> <span class="pl-c1">h5_banner_img</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos">&lt;</span><span class="pl-smi">String</span><span class="pl-kos">&gt;</span><span class="pl-kos">,</span> <span class="pl-k">pub</span> <span class="pl-c1">sort</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos">&lt;</span><span class="pl-smi">String</span><span class="pl-kos">&gt;</span><span class="pl-kos">,</span> <span class="pl-k">pub</span> <span class="pl-c1">status</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos">&lt;</span><span class="pl-smi">i32</span><span class="pl-kos">&gt;</span><span class="pl-kos">,</span> <span class="pl-k">pub</span> <span class="pl-c1">remark</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos">&lt;</span><span class="pl-smi">String</span><span class="pl-kos">&gt;</span><span class="pl-kos">,</span> <span class="pl-k">pub</span> <span class="pl-c1">create_time</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos">&lt;</span><span class="pl-smi">DateTime</span><span class="pl-kos">&gt;</span><span class="pl-kos">,</span> <span class="pl-k">pub</span> <span class="pl-c1">version</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos">&lt;</span><span class="pl-smi">i64</span><span class="pl-kos">&gt;</span><span class="pl-kos">,</span> <span class="pl-k">pub</span> <span class="pl-c1">delete_flag</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos">&lt;</span><span class="pl-smi">i32</span><span class="pl-kos">&gt;</span><span class="pl-kos">,</span> <span class="pl-kos">}</span> <span class="pl-c">/// All methods read SQL from example/example.html</span> <span class="pl-c"></span><span class="pl-c1">#<span class="pl-kos">[</span>rbatis<span class="pl-kos">::</span>html_sql<span class="pl-kos">(</span><span class="pl-s">"example/example.html"</span><span class="pl-kos">)</span><span class="pl-kos">]</span></span> <span class="pl-k">impl</span> <span class="pl-smi">Activity</span> <span class="pl-kos">{</span> <span class="pl-c">/// Maps to &lt;select id="select_by_condition"&gt; in HTML</span> <span class="pl-c"></span> <span class="pl-k">pub</span> <span class="pl-k">async</span> <span class="pl-k">fn</span> <span class="pl-en">select_by_condition</span><span class="pl-kos">(</span> <span class="pl-s1">rb</span><span class="pl-kos">:</span> <span class="pl-c1">&amp;</span><span class="pl-k">dyn</span> <span class="pl-smi">Executor</span><span class="pl-kos">,</span> <span class="pl-s1">name</span><span class="pl-kos">:</span> <span class="pl-c1">&amp;</span><span class="pl-smi">str</span><span class="pl-kos">,</span> <span class="pl-s1">dt</span><span class="pl-kos">:</span> <span class="pl-c1">&amp;</span><span class="pl-smi">DateTime</span><span class="pl-kos">,</span> <span class="pl-kos">)</span> -&gt; rbatis<span class="pl-kos">::</span><span class="pl-smi">Result</span><span class="pl-kos">&lt;</span><span class="pl-smi">Vec</span><span class="pl-kos">&lt;</span><span class="pl-smi">Activity</span><span class="pl-kos">&gt;</span><span class="pl-kos">&gt;</span> <span class="pl-kos">{</span> <span class="pl-en">impled</span><span class="pl-en">!</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-kos">}</span> <span class="pl-c">/// Maps to &lt;select id="select_page_data"&gt; in HTML</span> <span class="pl-c"></span> <span class="pl-k">pub</span> <span class="pl-k">async</span> <span class="pl-k">fn</span> <span class="pl-en">select_page_data</span><span class="pl-kos">(</span> <span class="pl-s1">rb</span><span class="pl-kos">:</span> <span class="pl-c1">&amp;</span><span class="pl-k">dyn</span> <span class="pl-smi">Executor</span><span class="pl-kos">,</span> <span class="pl-s1">name</span><span class="pl-kos">:</span> <span class="pl-c1">&amp;</span><span class="pl-smi">str</span><span class="pl-kos">,</span> <span class="pl-s1">dt</span><span class="pl-kos">:</span> <span class="pl-c1">&amp;</span><span class="pl-smi">DateTime</span><span class="pl-kos">,</span> <span class="pl-kos">)</span> -&gt; rbatis<span class="pl-kos">::</span><span class="pl-smi">Result</span><span class="pl-kos">&lt;</span><span class="pl-smi">Vec</span><span class="pl-kos">&lt;</span><span class="pl-smi">Activity</span><span class="pl-kos">&gt;</span><span class="pl-kos">&gt;</span> <span class="pl-kos">{</span> <span class="pl-en">impled</span><span class="pl-en">!</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-kos">}</span> <span class="pl-c">/// Maps to &lt;update id="update_by_id"&gt; in HTML</span> <span class="pl-c"></span> <span class="pl-k">pub</span> <span class="pl-k">async</span> <span class="pl-k">fn</span> <span class="pl-en">update_by_id</span><span class="pl-kos">(</span> <span class="pl-s1">rb</span><span class="pl-kos">:</span> <span class="pl-c1">&amp;</span><span class="pl-k">dyn</span> <span class="pl-smi">Executor</span><span class="pl-kos">,</span> <span class="pl-s1">arg</span><span class="pl-kos">:</span> <span class="pl-c1">&amp;</span><span class="pl-smi">Activity</span><span class="pl-kos">,</span> <span class="pl-kos">)</span> -&gt; rbatis<span class="pl-kos">::</span><span class="pl-smi">Result</span><span class="pl-kos">&lt;</span>rbatis<span class="pl-kos">::</span>rbdc<span class="pl-kos">::</span>db<span class="pl-kos">::</span><span class="pl-smi">ExecResult</span><span class="pl-kos">&gt;</span> <span class="pl-kos">{</span> <span class="pl-en">impled</span><span class="pl-en">!</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span></pre></div> <div class="highlight highlight-text-html-basic notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.1//EN&quot; &quot;https://raw.githubusercontent.com/rbatis/rbatis/master/rbatis-codegen/mybatis-3-mapper.dtd&quot;&gt; &lt;mapper&gt; &lt;select id=&quot;select_by_condition&quot;&gt; `select * from activity` &lt;where&gt; &lt;if test=&quot;name != ''&quot;&gt; ` and name like #{name}` &lt;/if&gt; &lt;if test=&quot;dt &gt;= '2009-12-12 00:00:00'&quot;&gt; ` and create_time &lt; #{dt}` &lt;/if&gt; &lt;choose&gt; &lt;when test=&quot;true&quot;&gt; ` and id != '-1'` &lt;/when&gt; &lt;otherwise&gt;and id != -2&lt;/otherwise&gt; &lt;/choose&gt; ` and ` &lt;trim prefixOverrides=&quot; and&quot;&gt; ` and name != '' ` &lt;/trim&gt; &lt;/where&gt; &lt;/select&gt; &lt;select id=&quot;select_page_data&quot;&gt; `select * from activity ` &lt;where&gt; &lt;if test=&quot;name != ''&quot;&gt; ` and name like #{name}` &lt;/if&gt; &lt;if test=&quot;dt &gt;= '2009-12-12 00:00:00'&quot;&gt; ` and create_time &lt; #{dt}` &lt;/if&gt; &lt;choose&gt; &lt;when test=&quot;true&quot;&gt; ` and id != '-1'` &lt;/when&gt; &lt;otherwise&gt;and id != -2&lt;/otherwise&gt; &lt;/choose&gt; ` and ` &lt;trim prefixOverrides=&quot; and&quot;&gt; ` and name != '' ` &lt;/trim&gt; &lt;/where&gt; &lt;/select&gt; &lt;update id=&quot;update_by_id&quot;&gt; ` update activity ` &lt;set collection=&quot;arg&quot;&gt;&lt;/set&gt; ` where id = #{id} ` &lt;/update&gt; &lt;/mapper&gt;"><pre><span class="pl-c1">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"</span> <span class="pl-c1"> "https://raw.githubusercontent.com/rbatis/rbatis/master/rbatis-codegen/mybatis-3-mapper.dtd"<span class="pl-kos">&gt;</span></span> <span class="pl-kos">&lt;</span><span class="pl-ent">mapper</span><span class="pl-kos">&gt;</span> <span class="pl-kos">&lt;</span><span class="pl-ent">select</span> <span class="pl-c1">id</span>="<span class="pl-s">select_by_condition</span>"<span class="pl-kos">&gt;</span> `select * from activity` <span class="pl-kos">&lt;</span><span class="pl-ent">where</span><span class="pl-kos">&gt;</span> <span class="pl-kos">&lt;</span><span class="pl-ent">if</span> <span class="pl-c1">test</span>="<span class="pl-s">name != ''</span>"<span class="pl-kos">&gt;</span> ` and name like #{name}` <span class="pl-kos">&lt;/</span><span class="pl-ent">if</span><span class="pl-kos">&gt;</span> <span class="pl-kos">&lt;</span><span class="pl-ent">if</span> <span class="pl-c1">test</span>="<span class="pl-s">dt &gt;= '2009-12-12 00:00:00'</span>"<span class="pl-kos">&gt;</span> ` and create_time <span class="pl-kos">&lt;</span> #{dt}` <span class="pl-kos">&lt;/</span><span class="pl-ent">if</span><span class="pl-kos">&gt;</span> <span class="pl-kos">&lt;</span><span class="pl-ent">choose</span><span class="pl-kos">&gt;</span> <span class="pl-kos">&lt;</span><span class="pl-ent">when</span> <span class="pl-c1">test</span>="<span class="pl-s">true</span>"<span class="pl-kos">&gt;</span> ` and id != '-1'` <span class="pl-kos">&lt;/</span><span class="pl-ent">when</span><span class="pl-kos">&gt;</span> <span class="pl-kos">&lt;</span><span class="pl-ent">otherwise</span><span class="pl-kos">&gt;</span>and id != -2<span class="pl-kos">&lt;/</span><span class="pl-ent">otherwise</span><span class="pl-kos">&gt;</span> <span class="pl-kos">&lt;/</span><span class="pl-ent">choose</span><span class="pl-kos">&gt;</span> ` and ` <span class="pl-kos">&lt;</span><span class="pl-ent">trim</span> <span class="pl-c1">prefixOverrides</span>="<span class="pl-s"> and</span>"<span class="pl-kos">&gt;</span> ` and name != '' ` <span class="pl-kos">&lt;/</span><span class="pl-ent">trim</span><span class="pl-kos">&gt;</span> <span class="pl-kos">&lt;/</span><span class="pl-ent">where</span><span class="pl-kos">&gt;</span> <span class="pl-kos">&lt;/</span><span class="pl-ent">select</span><span class="pl-kos">&gt;</span> <span class="pl-kos">&lt;</span><span class="pl-ent">select</span> <span class="pl-c1">id</span>="<span class="pl-s">select_page_data</span>"<span class="pl-kos">&gt;</span> `select * from activity ` <span class="pl-kos">&lt;</span><span class="pl-ent">where</span><span class="pl-kos">&gt;</span> <span class="pl-kos">&lt;</span><span class="pl-ent">if</span> <span class="pl-c1">test</span>="<span class="pl-s">name != ''</span>"<span class="pl-kos">&gt;</span> ` and name like #{name}` <span class="pl-kos">&lt;/</span><span class="pl-ent">if</span><span class="pl-kos">&gt;</span> <span class="pl-kos">&lt;</span><span class="pl-ent">if</span> <span class="pl-c1">test</span>="<span class="pl-s">dt &gt;= '2009-12-12 00:00:00'</span>"<span class="pl-kos">&gt;</span> ` and create_time <span class="pl-kos">&lt;</span> #{dt}` <span class="pl-kos">&lt;/</span><span class="pl-ent">if</span><span class="pl-kos">&gt;</span> <span class="pl-kos">&lt;</span><span class="pl-ent">choose</span><span class="pl-kos">&gt;</span> <span class="pl-kos">&lt;</span><span class="pl-ent">when</span> <span class="pl-c1">test</span>="<span class="pl-s">true</span>"<span class="pl-kos">&gt;</span> ` and id != '-1'` <span class="pl-kos">&lt;/</span><span class="pl-ent">when</span><span class="pl-kos">&gt;</span> <span class="pl-kos">&lt;</span><span class="pl-ent">otherwise</span><span class="pl-kos">&gt;</span>and id != -2<span class="pl-kos">&lt;/</span><span class="pl-ent">otherwise</span><span class="pl-kos">&gt;</span> <span class="pl-kos">&lt;/</span><span class="pl-ent">choose</span><span class="pl-kos">&gt;</span> ` and ` <span class="pl-kos">&lt;</span><span class="pl-ent">trim</span> <span class="pl-c1">prefixOverrides</span>="<span class="pl-s"> and</span>"<span class="pl-kos">&gt;</span> ` and name != '' ` <span class="pl-kos">&lt;/</span><span class="pl-ent">trim</span><span class="pl-kos">&gt;</span> <span class="pl-kos">&lt;/</span><span class="pl-ent">where</span><span class="pl-kos">&gt;</span> <span class="pl-kos">&lt;/</span><span class="pl-ent">select</span><span class="pl-kos">&gt;</span> <span class="pl-kos">&lt;</span><span class="pl-ent">update</span> <span class="pl-c1">id</span>="<span class="pl-s">update_by_id</span>"<span class="pl-kos">&gt;</span> ` update activity ` <span class="pl-kos">&lt;</span><span class="pl-ent">set</span> <span class="pl-c1">collection</span>="<span class="pl-s">arg</span>"<span class="pl-kos">&gt;</span><span class="pl-kos">&lt;/</span><span class="pl-ent">set</span><span class="pl-kos">&gt;</span> ` where id = #{id} ` <span class="pl-kos">&lt;/</span><span class="pl-ent">update</span><span class="pl-kos">&gt;</span> <span class="pl-kos">&lt;/</span><span class="pl-ent">mapper</span><span class="pl-kos">&gt;</span></pre></div> zhuxiujia tag:github.com,2008:Repository/174461456/v4.7.0 2026-01-20T16:29:22Z v4.7.0 <p>what changes?</p> <ul> <li>RBatis Engine All use dyn Trait for example:</li> </ul> <div class="highlight highlight-source-rust notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="pub struct RBatis { // the connection pool pub pool: Arc&lt;OnceLock&lt;Box&lt;dyn Pool&gt;&gt;&gt;, // intercept vec(default the intercepts[0] is a log interceptor) pub intercepts: Arc&lt;SyncVec&lt;Arc&lt;dyn Intercept&gt;&gt;&gt;, //rb task id gen pub task_id_generator: Arc&lt;dyn IdGenerator&gt;, }"><pre><span class="pl-k">pub</span> <span class="pl-k">struct</span> <span class="pl-smi">RBatis</span> <span class="pl-kos">{</span> <span class="pl-c">// the connection pool</span> <span class="pl-k">pub</span> <span class="pl-c1">pool</span><span class="pl-kos">:</span> <span class="pl-smi">Arc</span><span class="pl-kos">&lt;</span><span class="pl-smi">OnceLock</span><span class="pl-kos">&lt;</span><span class="pl-smi">Box</span><span class="pl-kos">&lt;</span><span class="pl-k">dyn</span> <span class="pl-smi">Pool</span><span class="pl-kos">&gt;</span><span class="pl-kos">&gt;</span><span class="pl-kos">&gt;</span><span class="pl-kos">,</span> <span class="pl-c">// intercept vec(default the intercepts[0] is a log interceptor)</span> <span class="pl-k">pub</span> <span class="pl-c1">intercepts</span><span class="pl-kos">:</span> <span class="pl-smi">Arc</span><span class="pl-kos">&lt;</span><span class="pl-smi">SyncVec</span><span class="pl-kos">&lt;</span><span class="pl-smi">Arc</span><span class="pl-kos">&lt;</span><span class="pl-k">dyn</span> <span class="pl-smi">Intercept</span><span class="pl-kos">&gt;</span><span class="pl-kos">&gt;</span><span class="pl-kos">&gt;</span><span class="pl-kos">,</span> <span class="pl-c">//rb task id gen</span> <span class="pl-k">pub</span> <span class="pl-c1">task_id_generator</span><span class="pl-kos">:</span> <span class="pl-smi">Arc</span><span class="pl-kos">&lt;</span><span class="pl-k">dyn</span> <span class="pl-smi">IdGenerator</span><span class="pl-kos">&gt;</span><span class="pl-kos">,</span> <span class="pl-kos">}</span></pre></div> <ul> <li>performance</li> </ul> <div class="highlight highlight-text-md notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="| Optimization Item | Save Time | |---------------------------------|-----------| | Avoid `vec![]` allocation | ~50 ns | | Avoid creating RBAtisKonExecutor| ~100 ns | | Avoid `task_id` generation | ~11 ns | | Avoid `Arc` cloning | ~20 ns | | Reduce function call hierarchy | ~50 ns | | Empty string fast path | ~30 ns | | **Total** | **~260 ns** |"><pre><span class="pl-ml">|</span> Optimization Item <span class="pl-ml">|</span> Save Time <span class="pl-ml">|</span> <span class="pl-ml">|</span>---------------------------------<span class="pl-ml">|</span>-----------<span class="pl-ml">|</span> <span class="pl-ml">|</span> Avoid <span class="pl-s">`</span><span class="pl-c1">vec![]</span><span class="pl-s">`</span> allocation <span class="pl-ml">|</span> <span class="pl-s">~</span>50 ns <span class="pl-ml">|</span> <span class="pl-ml">|</span> Avoid creating RBAtisKonExecutor<span class="pl-ml">|</span> <span class="pl-s">~</span>100 ns <span class="pl-ml">|</span> <span class="pl-ml">|</span> Avoid <span class="pl-s">`</span><span class="pl-c1">task_id</span><span class="pl-s">`</span> generation <span class="pl-ml">|</span> <span class="pl-s">~</span>11 ns <span class="pl-ml">|</span> <span class="pl-ml">|</span> Avoid <span class="pl-s">`</span><span class="pl-c1">Arc</span><span class="pl-s">`</span> cloning <span class="pl-ml">|</span> <span class="pl-s">~</span>20 ns <span class="pl-ml">|</span> <span class="pl-ml">|</span> Reduce function call hierarchy <span class="pl-ml">|</span> <span class="pl-s">~</span>50 ns <span class="pl-ml">|</span> <span class="pl-ml">|</span> Empty string fast path <span class="pl-ml">|</span> <span class="pl-s">~</span>30 ns <span class="pl-ml">|</span> <span class="pl-ml">|</span> <span class="pl-s">**</span>Total<span class="pl-s">**</span> <span class="pl-ml">|</span> <span class="pl-s">**</span><span class="pl-s">~</span>260 ns<span class="pl-s">**</span> <span class="pl-ml">|</span></pre></div> <ul> <li>intercept add Action</li> </ul> <div class="highlight highlight-source-rust notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="use rbatis::Error; use rbatis::executor::Executor; use rbatis::intercept::{Intercept, ResultType}; use rbdc::db::ExecResult; use rbs::Value; use rbatis::Action; #[derive(Debug)] pub struct ReturningIdPlugin{} #[rbatis::async_trait] impl Intercept for ReturningIdPlugin { async fn before( &amp;self, _task_id: i64, rb: &amp;dyn Executor, sql: &amp;mut String, args: &amp;mut Vec&lt;Value&gt;, result: ResultType&lt;&amp;mut Result&lt;ExecResult, Error&gt;, &amp;mut Result&lt;Value, Error&gt;&gt;, ) -&gt; Result&lt;Action, Error&gt; { Ok(Action::Next) } }"><pre><span class="pl-k">use</span> rbatis<span class="pl-kos">::</span><span class="pl-v">Error</span><span class="pl-kos">;</span> <span class="pl-k">use</span> rbatis<span class="pl-kos">::</span>executor<span class="pl-kos">::</span><span class="pl-v">Executor</span><span class="pl-kos">;</span> <span class="pl-k">use</span> rbatis<span class="pl-kos">::</span>intercept<span class="pl-kos">::</span><span class="pl-kos">{</span><span class="pl-v">Intercept</span><span class="pl-kos">,</span> <span class="pl-v">ResultType</span><span class="pl-kos">}</span><span class="pl-kos">;</span> <span class="pl-k">use</span> rbdc<span class="pl-kos">::</span>db<span class="pl-kos">::</span><span class="pl-v">ExecResult</span><span class="pl-kos">;</span> <span class="pl-k">use</span> rbs<span class="pl-kos">::</span><span class="pl-v">Value</span><span class="pl-kos">;</span> <span class="pl-k">use</span> rbatis<span class="pl-kos">::</span><span class="pl-v">Action</span><span class="pl-kos">;</span> <span class="pl-c1">#<span class="pl-kos">[</span>derive<span class="pl-kos">(</span><span class="pl-v">Debug</span><span class="pl-kos">)</span><span class="pl-kos">]</span></span> <span class="pl-k">pub</span> <span class="pl-k">struct</span> <span class="pl-smi">ReturningIdPlugin</span><span class="pl-kos">{</span><span class="pl-kos">}</span> <span class="pl-c1">#<span class="pl-kos">[</span>rbatis<span class="pl-kos">::</span>async_trait<span class="pl-kos">]</span></span> <span class="pl-k">impl</span> <span class="pl-smi">Intercept</span> <span class="pl-k">for</span> <span class="pl-smi">ReturningIdPlugin</span> <span class="pl-kos">{</span> <span class="pl-k">async</span> <span class="pl-k">fn</span> <span class="pl-en">before</span><span class="pl-kos">(</span> <span class="pl-c1">&amp;</span><span class="pl-smi">self</span><span class="pl-kos">,</span> <span class="pl-s1">_task_id</span><span class="pl-kos">:</span> <span class="pl-smi">i64</span><span class="pl-kos">,</span> <span class="pl-s1">rb</span><span class="pl-kos">:</span> <span class="pl-c1">&amp;</span><span class="pl-k">dyn</span> <span class="pl-smi">Executor</span><span class="pl-kos">,</span> <span class="pl-s1">sql</span><span class="pl-kos">:</span> <span class="pl-c1">&amp;</span><span class="pl-k">mut</span> <span class="pl-smi">String</span><span class="pl-kos">,</span> <span class="pl-s1">args</span><span class="pl-kos">:</span> <span class="pl-c1">&amp;</span><span class="pl-k">mut</span> <span class="pl-smi">Vec</span><span class="pl-kos">&lt;</span><span class="pl-smi">Value</span><span class="pl-kos">&gt;</span><span class="pl-kos">,</span> <span class="pl-s1">result</span><span class="pl-kos">:</span> <span class="pl-smi">ResultType</span><span class="pl-kos">&lt;</span><span class="pl-c1">&amp;</span><span class="pl-k">mut</span> <span class="pl-smi">Result</span><span class="pl-kos">&lt;</span><span class="pl-smi">ExecResult</span><span class="pl-kos">,</span> <span class="pl-smi">Error</span><span class="pl-kos">&gt;</span><span class="pl-kos">,</span> <span class="pl-c1">&amp;</span><span class="pl-k">mut</span> <span class="pl-smi">Result</span><span class="pl-kos">&lt;</span><span class="pl-smi">Value</span><span class="pl-kos">,</span> <span class="pl-smi">Error</span><span class="pl-kos">&gt;</span><span class="pl-kos">&gt;</span><span class="pl-kos">,</span> <span class="pl-kos">)</span> -&gt; <span class="pl-smi">Result</span><span class="pl-kos">&lt;</span><span class="pl-smi">Action</span><span class="pl-kos">,</span> <span class="pl-smi">Error</span><span class="pl-kos">&gt;</span> <span class="pl-kos">{</span> <span class="pl-en">Ok</span><span class="pl-kos">(</span><span class="pl-smi">Action</span><span class="pl-kos">::</span><span class="pl-v">Next</span><span class="pl-kos">)</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span></pre></div> zhuxiujia tag:github.com,2008:Repository/174461456/v4.6.15 2026-01-04T17:51:41Z v4.6.15 <ul> <li>up rbdc version</li> </ul> zhuxiujia tag:github.com,2008:Repository/174461456/v4.6.14 2025-12-27T11:37:23Z v4.6.14 <ul> <li>Simplify implementation for intercept</li> </ul> zhuxiujia tag:github.com,2008:Repository/174461456/v4.6.13 2025-12-03T03:36:12Z v4.6.13 <p>what changes?</p> <ul> <li>Support for temporarily replacing the interceptor list<br> for example:</li> </ul> <div class="highlight highlight-source-rust notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content=" /// Mock intercept that just prints SQL #[derive(Debug)] pub struct MockIntercept; #[async_trait] impl Intercept for MockIntercept { async fn before( &amp;self, task_id: i64, _rb: &amp;dyn Executor, sql: &amp;mut String, _args: &amp;mut Vec&lt;Value&gt;, _result: ResultType&lt;&amp;mut Result&lt;ExecResult, rbatis::Error&gt;, &amp;mut Result&lt;Vec&lt;Value&gt;, rbatis::Error&gt;&gt;, ) -&gt; Result&lt;Option&lt;bool&gt;, rbatis::Error&gt; { *sql = sql.replace(&quot;&lt;my_table_name&gt;&quot;, &amp;format!(&quot;activity_{}&quot;,task_id % 2)); println!(&quot;MockIntercept: SQL = {}&quot;, sql); Ok(Some(true)) } } #[tokio::main] pub async fn main() -&gt; Result&lt;(), rbatis::Error&gt; { _ = fast_log::init(fast_log::Config::new().console()); let rb = RBatis::new(); rb.init(rbdc_sqlite::driver::SqliteDriver {}, &quot;sqlite://target/sqlite.db&quot;)?; // create table _=rb.exec(&quot;CREATE TABLE activity_0 ( id INTEGER PRIMARY KEY);&quot;, vec![]).await; _=rb.exec(&quot;CREATE TABLE activity_1 ( id INTEGER PRIMARY KEY);&quot;, vec![]).await; let len = rb.intercepts.len(); println!(&quot;len={}&quot;, len); // Create new intercept list and add our mock intercept let new_intercept = Arc::new(SyncVec::new()); let intercept: Arc&lt;dyn Intercept&gt; = Arc::new(MockIntercept {}); new_intercept.push(intercept); // Create connection and replace its intercepts let mut conn = rb.acquire().await?; conn.intercepts = new_intercept; println!(&quot;conn.intercepts.len={}&quot;, conn.intercepts.len()); // Execute query to see the mock intercept in action let _ = conn.query(&quot;SELECT &lt;my_table_name&gt;&quot;, vec![]).await; let data = Activity::select_all(&amp;conn).await?; println!(&quot;data={:?}&quot;, json!(data)); Ok(()) } /// table #[derive(serde::Serialize, serde::Deserialize, Clone)] pub struct Activity { pub id: Option&lt;String&gt;, pub name: Option&lt;String&gt;, pub pc_link: Option&lt;String&gt;, pub h5_link: Option&lt;String&gt;, pub pc_banner_img: Option&lt;String&gt;, pub h5_banner_img: Option&lt;String&gt;, pub sort: Option&lt;String&gt;, pub status: Option&lt;i32&gt;, pub remark: Option&lt;String&gt;, pub create_time: Option&lt;DateTime&gt;, pub version: Option&lt;i64&gt;, pub delete_flag: Option&lt;i32&gt;, } //crud!(Activity {},&quot;activity&quot;); crud!(Activity {},&quot;&lt;my_table_name&gt;&quot;);"><pre><span class="pl-c">/// Mock intercept that just prints SQL</span> <span class="pl-c"></span><span class="pl-c1">#<span class="pl-kos">[</span>derive<span class="pl-kos">(</span><span class="pl-v">Debug</span><span class="pl-kos">)</span><span class="pl-kos">]</span></span> <span class="pl-k">pub</span> <span class="pl-k">struct</span> <span class="pl-smi">MockIntercept</span><span class="pl-kos">;</span> <span class="pl-c1">#<span class="pl-kos">[</span>async_trait<span class="pl-kos">]</span></span> <span class="pl-k">impl</span> <span class="pl-smi">Intercept</span> <span class="pl-k">for</span> <span class="pl-smi">MockIntercept</span> <span class="pl-kos">{</span> <span class="pl-k">async</span> <span class="pl-k">fn</span> <span class="pl-en">before</span><span class="pl-kos">(</span> <span class="pl-c1">&amp;</span><span class="pl-smi">self</span><span class="pl-kos">,</span> <span class="pl-s1">task_id</span><span class="pl-kos">:</span> <span class="pl-smi">i64</span><span class="pl-kos">,</span> <span class="pl-s1">_rb</span><span class="pl-kos">:</span> <span class="pl-c1">&amp;</span><span class="pl-k">dyn</span> <span class="pl-smi">Executor</span><span class="pl-kos">,</span> <span class="pl-s1">sql</span><span class="pl-kos">:</span> <span class="pl-c1">&amp;</span><span class="pl-k">mut</span> <span class="pl-smi">String</span><span class="pl-kos">,</span> <span class="pl-s1">_args</span><span class="pl-kos">:</span> <span class="pl-c1">&amp;</span><span class="pl-k">mut</span> <span class="pl-smi">Vec</span><span class="pl-kos">&lt;</span><span class="pl-smi">Value</span><span class="pl-kos">&gt;</span><span class="pl-kos">,</span> <span class="pl-s1">_result</span><span class="pl-kos">:</span> <span class="pl-smi">ResultType</span><span class="pl-kos">&lt;</span><span class="pl-c1">&amp;</span><span class="pl-k">mut</span> <span class="pl-smi">Result</span><span class="pl-kos">&lt;</span><span class="pl-smi">ExecResult</span><span class="pl-kos">,</span> rbatis<span class="pl-kos">::</span><span class="pl-smi">Error</span><span class="pl-kos">&gt;</span><span class="pl-kos">,</span> <span class="pl-c1">&amp;</span><span class="pl-k">mut</span> <span class="pl-smi">Result</span><span class="pl-kos">&lt;</span><span class="pl-smi">Vec</span><span class="pl-kos">&lt;</span><span class="pl-smi">Value</span><span class="pl-kos">&gt;</span><span class="pl-kos">,</span> rbatis<span class="pl-kos">::</span><span class="pl-smi">Error</span><span class="pl-kos">&gt;</span><span class="pl-kos">&gt;</span><span class="pl-kos">,</span> <span class="pl-kos">)</span> -&gt; <span class="pl-smi">Result</span><span class="pl-kos">&lt;</span><span class="pl-smi">Option</span><span class="pl-kos">&lt;</span><span class="pl-smi">bool</span><span class="pl-kos">&gt;</span><span class="pl-kos">,</span> rbatis<span class="pl-kos">::</span><span class="pl-smi">Error</span><span class="pl-kos">&gt;</span> <span class="pl-kos">{</span> <span class="pl-c1">*</span>sql = sql<span class="pl-kos">.</span><span class="pl-en">replace</span><span class="pl-kos">(</span><span class="pl-s">"&lt;my_table_name&gt;"</span><span class="pl-kos">,</span> <span class="pl-c1">&amp;</span><span class="pl-en">format</span><span class="pl-en">!</span><span class="pl-kos">(</span><span class="pl-s">"activity_{}"</span><span class="pl-kos">,</span>task_id % <span class="pl-c1">2</span><span class="pl-kos">)</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-en">println</span><span class="pl-en">!</span><span class="pl-kos">(</span><span class="pl-s">"MockIntercept: SQL = {}"</span><span class="pl-kos">,</span> sql<span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-en">Ok</span><span class="pl-kos">(</span><span class="pl-en">Some</span><span class="pl-kos">(</span><span class="pl-c1">true</span><span class="pl-kos">)</span><span class="pl-kos">)</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span> <span class="pl-c1">#<span class="pl-kos">[</span>tokio<span class="pl-kos">::</span>main<span class="pl-kos">]</span></span> <span class="pl-k">pub</span> <span class="pl-k">async</span> <span class="pl-k">fn</span> <span class="pl-en">main</span><span class="pl-kos">(</span><span class="pl-kos">)</span> -&gt; <span class="pl-smi">Result</span><span class="pl-kos">&lt;</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">,</span> rbatis<span class="pl-kos">::</span><span class="pl-smi">Error</span><span class="pl-kos">&gt;</span> <span class="pl-kos">{</span> _ = fast_log<span class="pl-kos">::</span><span class="pl-en">init</span><span class="pl-kos">(</span>fast_log<span class="pl-kos">::</span><span class="pl-smi">Config</span><span class="pl-kos">::</span><span class="pl-en">new</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">console</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-k">let</span> rb = <span class="pl-smi">RBatis</span><span class="pl-kos">::</span><span class="pl-en">new</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span> rb<span class="pl-kos">.</span><span class="pl-en">init</span><span class="pl-kos">(</span>rbdc_sqlite<span class="pl-kos">::</span>driver<span class="pl-kos">::</span><span class="pl-smi">SqliteDriver</span> <span class="pl-kos">{</span><span class="pl-kos">}</span><span class="pl-kos">,</span> <span class="pl-s">"sqlite://target/sqlite.db"</span><span class="pl-kos">)</span>?<span class="pl-kos">;</span> <span class="pl-c">// create table</span> _=rb<span class="pl-kos">.</span><span class="pl-en">exec</span><span class="pl-kos">(</span><span class="pl-s">"CREATE TABLE activity_0 ( id INTEGER PRIMARY KEY);"</span><span class="pl-kos">,</span> <span class="pl-en">vec</span><span class="pl-en">!</span><span class="pl-kos">[</span><span class="pl-kos">]</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-k">await</span><span class="pl-kos">;</span> _=rb<span class="pl-kos">.</span><span class="pl-en">exec</span><span class="pl-kos">(</span><span class="pl-s">"CREATE TABLE activity_1 ( id INTEGER PRIMARY KEY);"</span><span class="pl-kos">,</span> <span class="pl-en">vec</span><span class="pl-en">!</span><span class="pl-kos">[</span><span class="pl-kos">]</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-k">await</span><span class="pl-kos">;</span> <span class="pl-k">let</span> len = rb<span class="pl-kos">.</span><span class="pl-c1">intercepts</span><span class="pl-kos">.</span><span class="pl-en">len</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-en">println</span><span class="pl-en">!</span><span class="pl-kos">(</span><span class="pl-s">"len={}"</span><span class="pl-kos">,</span> len<span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// Create new intercept list and add our mock intercept</span> <span class="pl-k">let</span> new_intercept = <span class="pl-smi">Arc</span><span class="pl-kos">::</span><span class="pl-en">new</span><span class="pl-kos">(</span><span class="pl-smi">SyncVec</span><span class="pl-kos">::</span><span class="pl-en">new</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-k">let</span> intercept<span class="pl-kos">:</span> <span class="pl-smi">Arc</span><span class="pl-kos">&lt;</span><span class="pl-k">dyn</span> <span class="pl-smi">Intercept</span><span class="pl-kos">&gt;</span> = <span class="pl-smi">Arc</span><span class="pl-kos">::</span><span class="pl-en">new</span><span class="pl-kos">(</span><span class="pl-smi">MockIntercept</span> <span class="pl-kos">{</span><span class="pl-kos">}</span><span class="pl-kos">)</span><span class="pl-kos">;</span> new_intercept<span class="pl-kos">.</span><span class="pl-en">push</span><span class="pl-kos">(</span>intercept<span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// Create connection and replace its intercepts</span> <span class="pl-k">let</span> <span class="pl-k">mut</span> conn = rb<span class="pl-kos">.</span><span class="pl-en">acquire</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-k">await</span>?<span class="pl-kos">;</span> conn<span class="pl-kos">.</span><span class="pl-c1">intercepts</span> = new_intercept<span class="pl-kos">;</span> <span class="pl-en">println</span><span class="pl-en">!</span><span class="pl-kos">(</span><span class="pl-s">"conn.intercepts.len={}"</span><span class="pl-kos">,</span> conn<span class="pl-kos">.</span>intercepts<span class="pl-kos">.</span>len<span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// Execute query to see the mock intercept in action</span> <span class="pl-k">let</span> _ = conn<span class="pl-kos">.</span><span class="pl-en">query</span><span class="pl-kos">(</span><span class="pl-s">"SELECT &lt;my_table_name&gt;"</span><span class="pl-kos">,</span> <span class="pl-en">vec</span><span class="pl-en">!</span><span class="pl-kos">[</span><span class="pl-kos">]</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-k">await</span><span class="pl-kos">;</span> <span class="pl-k">let</span> data = <span class="pl-smi">Activity</span><span class="pl-kos">::</span><span class="pl-en">select_all</span><span class="pl-kos">(</span><span class="pl-c1">&amp;</span>conn<span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-k">await</span>?<span class="pl-kos">;</span> <span class="pl-en">println</span><span class="pl-en">!</span><span class="pl-kos">(</span><span class="pl-s">"data={:?}"</span><span class="pl-kos">,</span> json!<span class="pl-kos">(</span>data<span class="pl-kos">)</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-en">Ok</span><span class="pl-kos">(</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">)</span> <span class="pl-kos">}</span> <span class="pl-c">/// table</span> <span class="pl-c"></span><span class="pl-c1">#<span class="pl-kos">[</span>derive<span class="pl-kos">(</span>serde<span class="pl-kos">::</span><span class="pl-v">Serialize</span><span class="pl-kos">,</span> serde<span class="pl-kos">::</span><span class="pl-v">Deserialize</span><span class="pl-kos">,</span> <span class="pl-v">Clone</span><span class="pl-kos">)</span><span class="pl-kos">]</span></span> <span class="pl-k">pub</span> <span class="pl-k">struct</span> <span class="pl-smi">Activity</span> <span class="pl-kos">{</span> <span class="pl-k">pub</span> <span class="pl-c1">id</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos">&lt;</span><span class="pl-smi">String</span><span class="pl-kos">&gt;</span><span class="pl-kos">,</span> <span class="pl-k">pub</span> <span class="pl-c1">name</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos">&lt;</span><span class="pl-smi">String</span><span class="pl-kos">&gt;</span><span class="pl-kos">,</span> <span class="pl-k">pub</span> <span class="pl-c1">pc_link</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos">&lt;</span><span class="pl-smi">String</span><span class="pl-kos">&gt;</span><span class="pl-kos">,</span> <span class="pl-k">pub</span> <span class="pl-c1">h5_link</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos">&lt;</span><span class="pl-smi">String</span><span class="pl-kos">&gt;</span><span class="pl-kos">,</span> <span class="pl-k">pub</span> <span class="pl-c1">pc_banner_img</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos">&lt;</span><span class="pl-smi">String</span><span class="pl-kos">&gt;</span><span class="pl-kos">,</span> <span class="pl-k">pub</span> <span class="pl-c1">h5_banner_img</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos">&lt;</span><span class="pl-smi">String</span><span class="pl-kos">&gt;</span><span class="pl-kos">,</span> <span class="pl-k">pub</span> <span class="pl-c1">sort</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos">&lt;</span><span class="pl-smi">String</span><span class="pl-kos">&gt;</span><span class="pl-kos">,</span> <span class="pl-k">pub</span> <span class="pl-c1">status</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos">&lt;</span><span class="pl-smi">i32</span><span class="pl-kos">&gt;</span><span class="pl-kos">,</span> <span class="pl-k">pub</span> <span class="pl-c1">remark</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos">&lt;</span><span class="pl-smi">String</span><span class="pl-kos">&gt;</span><span class="pl-kos">,</span> <span class="pl-k">pub</span> <span class="pl-c1">create_time</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos">&lt;</span><span class="pl-smi">DateTime</span><span class="pl-kos">&gt;</span><span class="pl-kos">,</span> <span class="pl-k">pub</span> <span class="pl-c1">version</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos">&lt;</span><span class="pl-smi">i64</span><span class="pl-kos">&gt;</span><span class="pl-kos">,</span> <span class="pl-k">pub</span> <span class="pl-c1">delete_flag</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos">&lt;</span><span class="pl-smi">i32</span><span class="pl-kos">&gt;</span><span class="pl-kos">,</span> <span class="pl-kos">}</span> <span class="pl-c">//crud!(Activity {},"activity");</span> <span class="pl-en">crud</span><span class="pl-en">!</span><span class="pl-kos">(</span><span class="pl-v">Activity</span> <span class="pl-kos">{</span><span class="pl-kos">}</span><span class="pl-kos">,</span><span class="pl-s">"&lt;my_table_name&gt;"</span><span class="pl-kos">)</span><span class="pl-kos">;</span></pre></div> zhuxiujia tag:github.com,2008:Repository/174461456/v4.6.12 2025-10-12T14:33:01Z v4.6.12 <p>what changes?</p> <ul> <li>impl <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="3316863428" data-permission-text="Title is private" data-url="https://github.com/rbatis/rbatis/issues/591" data-hovercard-type="issue" data-hovercard-url="/rbatis/rbatis/issues/591/hovercard" href="https://github.com/rbatis/rbatis/issues/591">#591</a> for</li> </ul> <div class="highlight highlight-source-rust notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content=" #[derive(Clone, Debug, serde::Serialize, serde::Deserialize, PartialEq)] struct MockTable { pub id: Option&lt;String&gt;, pub name: Option&lt;String&gt;, pub status: Option&lt;i32&gt; } crud!(MockTable{}); let r = MockTable::update_by_map(rb, &amp;table, value!{&quot;id&quot;:&quot;1&quot;, &quot;column&quot;: [&quot;name&quot;, &quot;status&quot;]}).await;"><pre> <span class="pl-c1">#<span class="pl-kos">[</span>derive<span class="pl-kos">(</span><span class="pl-v">Clone</span><span class="pl-kos">,</span> <span class="pl-v">Debug</span><span class="pl-kos">,</span> serde<span class="pl-kos">::</span><span class="pl-v">Serialize</span><span class="pl-kos">,</span> serde<span class="pl-kos">::</span><span class="pl-v">Deserialize</span><span class="pl-kos">,</span> <span class="pl-v">PartialEq</span><span class="pl-kos">)</span><span class="pl-kos">]</span></span> <span class="pl-k">struct</span> <span class="pl-smi">MockTable</span> <span class="pl-kos">{</span> <span class="pl-k">pub</span> <span class="pl-c1">id</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos">&lt;</span><span class="pl-smi">String</span><span class="pl-kos">&gt;</span><span class="pl-kos">,</span> <span class="pl-k">pub</span> <span class="pl-c1">name</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos">&lt;</span><span class="pl-smi">String</span><span class="pl-kos">&gt;</span><span class="pl-kos">,</span> <span class="pl-k">pub</span> <span class="pl-c1">status</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos">&lt;</span><span class="pl-smi">i32</span><span class="pl-kos">&gt;</span> <span class="pl-kos">}</span> <span class="pl-en">crud</span><span class="pl-en">!</span><span class="pl-kos">(</span><span class="pl-v">MockTable</span><span class="pl-kos">{</span><span class="pl-kos">}</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-k">let</span> r = <span class="pl-smi">MockTable</span><span class="pl-kos">::</span><span class="pl-en">update_by_map</span><span class="pl-kos">(</span>rb<span class="pl-kos">,</span> <span class="pl-c1">&amp;</span>table<span class="pl-kos">,</span> <span class="pl-en">value</span><span class="pl-en">!</span><span class="pl-kos">{</span><span class="pl-s">"id"</span><span class="pl-kos">:</span><span class="pl-s">"1"</span><span class="pl-kos">,</span> <span class="pl-s">"column"</span><span class="pl-kos">:</span> <span class="pl-kos">[</span><span class="pl-s">"name"</span><span class="pl-kos">,</span> <span class="pl-s">"status"</span><span class="pl-kos">]</span><span class="pl-kos">}</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-k">await</span><span class="pl-kos">;</span></pre></div> <ul> <li>impl <code>crud!</code> for select target columns</li> </ul> <div class="highlight highlight-source-rust notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content=" #[derive(Clone, Debug, serde::Serialize, serde::Deserialize, PartialEq)] struct MockTable { pub id: Option&lt;String&gt;, pub name: Option&lt;String&gt;, pub status: Option&lt;i32&gt; } crud!(MockTable{}); let tables = MockTable::select_by_map(rb,value!{&quot;id&quot;:&quot;1&quot;, &quot;column&quot;: [&quot;id&quot;, &quot;name&quot;]}).await?; "><pre> <span class="pl-c1">#<span class="pl-kos">[</span>derive<span class="pl-kos">(</span><span class="pl-v">Clone</span><span class="pl-kos">,</span> <span class="pl-v">Debug</span><span class="pl-kos">,</span> serde<span class="pl-kos">::</span><span class="pl-v">Serialize</span><span class="pl-kos">,</span> serde<span class="pl-kos">::</span><span class="pl-v">Deserialize</span><span class="pl-kos">,</span> <span class="pl-v">PartialEq</span><span class="pl-kos">)</span><span class="pl-kos">]</span></span> <span class="pl-k">struct</span> <span class="pl-smi">MockTable</span> <span class="pl-kos">{</span> <span class="pl-k">pub</span> <span class="pl-c1">id</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos">&lt;</span><span class="pl-smi">String</span><span class="pl-kos">&gt;</span><span class="pl-kos">,</span> <span class="pl-k">pub</span> <span class="pl-c1">name</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos">&lt;</span><span class="pl-smi">String</span><span class="pl-kos">&gt;</span><span class="pl-kos">,</span> <span class="pl-k">pub</span> <span class="pl-c1">status</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos">&lt;</span><span class="pl-smi">i32</span><span class="pl-kos">&gt;</span> <span class="pl-kos">}</span> <span class="pl-en">crud</span><span class="pl-en">!</span><span class="pl-kos">(</span><span class="pl-v">MockTable</span><span class="pl-kos">{</span><span class="pl-kos">}</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-k">let</span> tables = <span class="pl-smi">MockTable</span><span class="pl-kos">::</span><span class="pl-en">select_by_map</span><span class="pl-kos">(</span>rb<span class="pl-kos">,</span><span class="pl-en">value</span><span class="pl-en">!</span><span class="pl-kos">{</span><span class="pl-s">"id"</span><span class="pl-kos">:</span><span class="pl-s">"1"</span><span class="pl-kos">,</span> <span class="pl-s">"column"</span><span class="pl-kos">:</span> <span class="pl-kos">[</span><span class="pl-s">"id"</span><span class="pl-kos">,</span> <span class="pl-s">"name"</span><span class="pl-kos">]</span><span class="pl-kos">}</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-k">await</span>?<span class="pl-kos">;</span> </pre></div> zhuxiujia tag:github.com,2008:Repository/174461456/v4.6.11 2025-10-12T12:59:32Z v4.6.11 <p>fix+1</p> zhuxiujia tag:github.com,2008:Repository/174461456/v4.6.10 2025-10-12T12:45:32Z v4.6.10 <p>fix test</p> zhuxiujia tag:github.com,2008:Repository/174461456/v4.6.9 2025-10-11T17:48:53Z v4.6.9 <ul> <li>this is an doc fix version</li> <li>merge <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="3242586448" data-permission-text="Title is private" data-url="https://github.com/rbatis/rbatis/issues/586" data-hovercard-type="pull_request" data-hovercard-url="/rbatis/rbatis/pull/586/hovercard" href="https://github.com/rbatis/rbatis/pull/586">#586</a></li> </ul> zhuxiujia