<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>JdbcTemplate - tag - 沐木</title><link>https://oldletter.cn/tags/jdbctemplate/</link><description>JdbcTemplate - tag - 沐木</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Tue, 21 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://oldletter.cn/tags/jdbctemplate/" rel="self" type="application/rss+xml"/><item><title>数据开放平台架构设计（二）：SQL 转 API 引擎</title><link>https://oldletter.cn/posts/dp-02-sql-to-api/</link><pubDate>Tue, 21 Apr 2026 00:00:00 +0000</pubDate><author>mumu</author><guid>https://oldletter.cn/posts/dp-02-sql-to-api/</guid><description><![CDATA[<blockquote>
<p><strong>上一篇：</strong> <a href="/posts/dp-01-architecture/" rel="">数据开放平台（一）：从 SQL2API 到数据开放平台的演进</a></p></blockquote>
<p>SQL 转 API 引擎是整个数据开放平台的核心。用户在界面上写一条受控 SQL 模板，配好参数规则，系统自动生成一个可调用的 API。听起来简单，但要做到&quot;运行时解析、校验、执行、审计&quot;这一整套链路，细节其实不少。</p>
<p>下面看看这个引擎到底是怎么实现的。</p>
<hr>
<h2 id="一为什么选-jdbctemplate">一、为什么选 JdbcTemplate</h2>
<p>结论：这个场景里，执行层放在 JdbcTemplate 上。</p>
<p>为什么不是 JPA？因为 JPA 要求编译期定义 Entity，SQL2API 的 SQL 在运行时才确定，核心不知道返回什么字段。JPA 的 EntityManager 也执行原生 SQL，但返回值绑死在 Entity 上，灵活性为零。</p>
<p>为什么不是 MyBatis？MyBatis 的 XML 是编译时写死的，要支持运行时动态 SQL 得 hack 进 Configuration 对象，线程不安全、内存泄漏、复杂度高。收益为零。</p>
<p>JdbcTemplate 的好处是足够薄：</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-java">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title=""><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="c1">// 运行时执行任意 SQL，返回 List&lt;Map&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">List</span><span class="o">&lt;</span><span class="n">Map</span><span class="o">&lt;</span><span class="n">String</span><span class="p">,</span><span class="w"> </span><span class="n">Object</span><span class="o">&gt;&gt;</span><span class="w"> </span><span class="n">result</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">jdbcTemplate</span><span class="p">.</span><span class="na">queryForList</span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="s">&#34;SELECT * FROM user WHERE status = ? AND name LIKE ?&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">status</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;%&#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">name</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s">&#34;%&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">// 结果直接是通用 Map，不用定义任何 Entity</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="o">//</span><span class="w"> </span><span class="n">连接自动归还</span><span class="err">，</span><span class="n">异常自动处理</span><span class="err">，</span><span class="n">参数自动绑定防注入</span></span></span></code></pre></div></div>
<p>它不要求提前定义 Entity，也不强行接管 SQL 生成过程。对于&quot;运行时执行 SQL 模板，返回通用结构&quot;这个场景，JdbcTemplate 的抽象刚刚好：连接释放、异常转换、参数绑定这些脏活它来做，SQL 的控制权仍然在平台手里。</p>]]></description></item></channel></rss>