Jekyll2023-12-30T16:38:57+08:00http://minsongtao.com/feed.xml松濤松涛的个人博客MinSongTao年轻人该怎么锻炼自己的内心2023-12-30T00:00:00+08:002023-12-30T00:00:00+08:00http://minsongtao.com/2023/12/30/%E5%B9%B4%E8%BD%BB%E4%BA%BA%E8%AF%A5%E6%80%8E%E4%B9%88%E9%94%BB%E7%82%BC%E8%87%AA%E5%B7%B1%E7%9A%84%E5%86%85%E5%BF%83<p>年轻人该怎么锻炼自己的内心?</p>
<p>主动去出丑,而且要大庭广众的去出丑,多出丑几次,脸皮就练厚了,内心脆弱的都是些什么人?就是有表演欲,喜欢装B的人,他们装惯了,偶尔一次出丑,就能要了他们命。越能装的人,内心越是弱小。
王阳明说过,你们以落榜为耻,我以落榜动心。做大事的人,脸可以撕下来扔地上踢几脚,扬长而去。
多经历挫折,主动去出丑,路会越走越宽,无拘无束,走出一个通天大道。</p>MinSongTao年轻人该怎么锻炼自己的内心?起青苹之微末兮,化狂飙以聘太宇;斥蜚语流言而自立兮,辟江山社稷以新章2023-10-16T00:00:00+08:002023-10-16T00:00:00+08:00http://minsongtao.com/2023/10/16/%E8%B5%B7%E9%9D%92%E8%90%8D%E4%B9%8B%E5%BE%AE%E6%9C%AB%E5%85%AE<p>94版三国演义的第45集中,曹操在孔雀台上宴请群臣,众文官为庆祝孔雀台落成,纷纷向曹操献诗,以示祝贺。曹操看完后,十分高兴。念起其中一篇:</p>
<p> 起青苹之微末兮,化狂飙以聘太宇;</p>
<p> 斥蜚语流言而自立兮,辟江山社稷以新章;</p>
<p> 唯天地之无穷兮,颂宏恩之不绝;</p>
<p> 尽吐哺握发之苦心兮,畴亘古孰可与比伉。</p>
<p>这首诗意思是:(曹操)虽出身于低微,却身化狂风漫卷天下;不理会流言蜚语自立于军阀乱世,破旧立新开辟江山新局面;只有巍巍苍天与迥迥大地是永恒的,不停地赞颂天地盛大的恩典以表敬畏;一饭三吐哺一濯三握发为了招贤纳用心良苦,这样的人自古以来谁又可以与他相比呢!</p>MinSongTao94版三国演义的第45集中,曹操在孔雀台上宴请群臣,众文官为庆祝孔雀台落成,纷纷向曹操献诗,以示祝贺。曹操看完后,十分高兴。念起其中一篇:windows 下定时备份mysql2023-08-22T00:00:00+08:002023-08-22T00:00:00+08:00http://minsongtao.com/2023/08/22/windows%20%E4%B8%8B%E5%AE%9A%E6%97%B6%E5%A4%87%E4%BB%BDmysql<p>在 Windows 服务器上定时备份 MySQL 数据库,只保存15天的备份,您可以使用 Windows 的任务计划程序来实现。以下是一步步的指南:</p>
<ol>
<li><strong>编写备份脚本</strong>:在您的 Windows 服务器上,创建一个 <code class="language-plaintext highlighter-rouge">.bat</code> 批处理文件,用于执行数据库备份操作。例如,创建一个名为 <code class="language-plaintext highlighter-rouge">backup_script.bat</code> 的文件,内容如下:</li>
</ol>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>@echo off
setlocal
<span class="nb">set </span><span class="nv">BACKUP_DIR</span><span class="o">=</span>C:<span class="se">\b</span>ackup
<span class="k">for</span> /f %%a <span class="k">in</span> <span class="o">(</span><span class="s1">'wmic os get LocalDateTime ^| find "."'</span><span class="o">)</span> <span class="k">do </span><span class="nb">set </span><span class="nv">datetime</span><span class="o">=</span>%%a
<span class="nb">set </span><span class="nv">DATE</span><span class="o">=</span>%datetime:~0,4%%datetime:~4,2%%datetime:~6,2%-%datetime:~8,2%%datetime:~10,2%%datetime:~12,2%
<span class="nb">set </span><span class="nv">MAX_BACKUP_AGE</span><span class="o">=</span>15
<span class="s2">"C:</span><span class="se">\P</span><span class="s2">rogram Files</span><span class="se">\M</span><span class="s2">ySQL</span><span class="se">\M</span><span class="s2">ySQL Server 8.0</span><span class="se">\b</span><span class="s2">in</span><span class="se">\m</span><span class="s2">ysqldump"</span> <span class="nt">-u</span> your_username <span class="nt">-pYourPassword</span> your_database_name <span class="o">></span> %BACKUP_DIR%<span class="se">\y</span>our_database_name_backup_%DATE%.sql
:: 删除超过 MAX_BACKUP_AGE 天的备份
forfiles /p %BACKUP_DIR% /m your_database_name_backup_<span class="k">*</span> /d -%MAX_BACKUP_AGE% /c <span class="s2">"cmd /c del @path"</span>
endlocal
</code></pre></div></div>
<ol>
<li>将以下内容替换为实际信息:
<ul>
<li><code class="language-plaintext highlighter-rouge">C:\backup</code>:您希望保存备份文件的目录路径。</li>
<li><code class="language-plaintext highlighter-rouge">C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqldump</code>:<code class="language-plaintext highlighter-rouge">mysqldump</code> 工具的路径。这是 MySQL 数据库备份工具。</li>
<li><code class="language-plaintext highlighter-rouge">your_username</code>:MySQL 数据库的用户名。</li>
<li><code class="language-plaintext highlighter-rouge">YourPassword</code>:MySQL 数据库用户的密码。</li>
<li><code class="language-plaintext highlighter-rouge">your_database_name</code>:要备份的数据库的名称。</li>
</ul>
</li>
<li><strong>设置任务计划程序</strong>:
<ul>
<li>打开任务计划程序:按下 <code class="language-plaintext highlighter-rouge">Win + R</code> 键,输入 <code class="language-plaintext highlighter-rouge">taskschd.msc</code> 并按回车。</li>
<li>在任务计划程序库中,右键点击 <code class="language-plaintext highlighter-rouge">任务计划程序库</code>,选择 <code class="language-plaintext highlighter-rouge">创建任务</code>。</li>
<li>在 “常规” 标签下,输入任务名称,并勾选 “为不在用户登录时运行的任务配置此任务”。</li>
<li>在 “触发器” 标签下,选择 “新建”,然后配置您希望执行备份的时间和频率。</li>
<li>在 “操作” 标签下,选择 “新建”,在 “程序/脚本” 中输入 <code class="language-plaintext highlighter-rouge">C:\path\to\backup_script.bat</code>,并在 “起始于” 中输入您 <code class="language-plaintext highlighter-rouge">.bat</code> 脚本所在的目录路径。</li>
<li>在 “条件” 标签下,您可以选择一些适当的条件,例如仅在计算机在电源插入时运行任务。</li>
<li>确认并创建任务。</li>
</ul>
</li>
<li><strong>测试任务</strong>:您可以右键点击任务计划程序库中的任务,选择 “运行” 来测试任务是否正常运行。</li>
</ol>
<p>现在,您已经设置了一个定时任务,每天将指定的 MySQL 数据库备份到指定的目录中。请确保您的备份目录具有足够的磁盘空间,并定期检查备份文件以确保备份正常运行。</p>MinSongTao在 Windows 服务器上定时备份 MySQL 数据库,只保存15天的备份,您可以使用 Windows 的任务计划程序来实现。以下是一步步的指南:普通人如何在大模型时代里生活2023-06-01T00:00:00+08:002023-06-01T00:00:00+08:00http://minsongtao.com/2023/06/01/%E6%99%AE%E9%80%9A%E4%BA%BA%E5%A6%82%E4%BD%95%E5%9C%A8%E5%A4%A7%E6%A8%A1%E5%9E%8B%E6%97%B6%E4%BB%A3%E9%87%8C%E7%94%9F%E6%B4%BB<p><strong>大模型重新定义了人机交互</strong></p>
<p>自然语言人机交互会带来提示词革命。未来你的薪酬水平,将取决于你的提示词写得好不好,而不是取决于你的代码写得好不好。10年后,全世界有50%的工作会是提示词工程。提出问题比解决问题更重要。</p>
<p><strong>大模型会重新定义营销和客服</strong></p>
<p>谁拥有最佳的跟客户沟通的方式,谁就会拥有这个客户,换而言之是大模型时代的产品质量水平都会有大幅度的提升,而与客户沟通、建立信任关系则更为重要。</p>MinSongTao大模型重新定义了人机交互自定义注解-比如时间转换2023-05-26T00:00:00+08:002023-05-26T00:00:00+08:00http://minsongtao.com/2023/05/26/%E8%87%AA%E5%AE%9A%E4%B9%89%E6%B3%A8%E8%A7%A3<p>比如我们有一个这样的需求,在返回数据中有个Bean中的字段是Date类型,想把他转成一个 yyyy-MM-dd 格式的字符串,并放到另一个字段中,怎么做呢?</p>
<p>对吧,为了其他地方的方便调用,咱们可以把他封装起来,写成公共方法亦可,但更好的方案是写成一个注解,使用起来就更方便了。那我们来开始吧。</p>
<p>首先,创建一个自定义注解,例如<code class="language-plaintext highlighter-rouge">@DateFormat(format = "yyyy-MM-dd")</code>,用于标记需要转换的字段,并且支持传递新字段的名称。</p>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">java.lang.annotation.ElementType</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">java.lang.annotation.Retention</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">java.lang.annotation.RetentionPolicy</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">java.lang.annotation.Target</span><span class="o">;</span>
<span class="nd">@Retention</span><span class="o">(</span><span class="nc">RetentionPolicy</span><span class="o">.</span><span class="na">RUNTIME</span><span class="o">)</span>
<span class="nd">@Target</span><span class="o">(</span><span class="nc">ElementType</span><span class="o">.</span><span class="na">FIELD</span><span class="o">)</span>
<span class="kd">public</span> <span class="nd">@interface</span> <span class="nc">DateFormat</span> <span class="o">{</span>
<span class="nc">String</span> <span class="nf">format</span><span class="o">();</span>
<span class="nc">String</span> <span class="nf">targetField</span><span class="o">()</span> <span class="k">default</span> <span class="s">""</span><span class="o">;</span>
<span class="o">}</span>
</code></pre></div></div>
<p>接下来,添加一个方法来处理注解和转换日期:</p>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">java.lang.annotation.Annotation</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">java.lang.reflect.Field</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">java.text.SimpleDateFormat</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">java.util.Date</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">java.util.List</span><span class="o">;</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">DateConverter</span> <span class="o">{</span>
<span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">convertDateToString</span><span class="o">(</span><span class="nc">List</span><span class="o"><?></span> <span class="n">objects</span><span class="o">)</span> <span class="kd">throws</span> <span class="nc">IllegalAccessException</span> <span class="o">{</span>
<span class="k">for</span> <span class="o">(</span><span class="nc">Object</span> <span class="n">obj</span> <span class="o">:</span> <span class="n">objects</span><span class="o">)</span> <span class="o">{</span>
<span class="nc">Class</span><span class="o"><?></span> <span class="n">clazz</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="na">getClass</span><span class="o">();</span>
<span class="nc">Field</span><span class="o">[]</span> <span class="n">fields</span> <span class="o">=</span> <span class="n">clazz</span><span class="o">.</span><span class="na">getDeclaredFields</span><span class="o">();</span>
<span class="k">for</span> <span class="o">(</span><span class="nc">Field</span> <span class="n">field</span> <span class="o">:</span> <span class="n">fields</span><span class="o">)</span> <span class="o">{</span>
<span class="nc">Annotation</span> <span class="n">annotation</span> <span class="o">=</span> <span class="n">field</span><span class="o">.</span><span class="na">getAnnotation</span><span class="o">(</span><span class="nc">DateFormat</span><span class="o">.</span><span class="na">class</span><span class="o">);</span>
<span class="k">if</span> <span class="o">(</span><span class="n">annotation</span> <span class="o">!=</span> <span class="kc">null</span> <span class="o">&&</span> <span class="n">field</span><span class="o">.</span><span class="na">getType</span><span class="o">()</span> <span class="o">==</span> <span class="nc">Date</span><span class="o">.</span><span class="na">class</span><span class="o">)</span> <span class="o">{</span>
<span class="n">field</span><span class="o">.</span><span class="na">setAccessible</span><span class="o">(</span><span class="kc">true</span><span class="o">);</span>
<span class="nc">Date</span> <span class="n">date</span> <span class="o">=</span> <span class="o">(</span><span class="nc">Date</span><span class="o">)</span> <span class="n">field</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">obj</span><span class="o">);</span>
<span class="nc">DateFormat</span> <span class="n">dateFormatAnnotation</span> <span class="o">=</span> <span class="o">(</span><span class="nc">DateFormat</span><span class="o">)</span> <span class="n">annotation</span><span class="o">;</span>
<span class="nc">String</span> <span class="n">format</span> <span class="o">=</span> <span class="n">dateFormatAnnotation</span><span class="o">.</span><span class="na">format</span><span class="o">();</span>
<span class="nc">SimpleDateFormat</span> <span class="n">simpleDateFormat</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">SimpleDateFormat</span><span class="o">(</span><span class="n">format</span><span class="o">);</span>
<span class="nc">String</span> <span class="n">dateString</span> <span class="o">=</span> <span class="n">simpleDateFormat</span><span class="o">.</span><span class="na">format</span><span class="o">(</span><span class="n">date</span><span class="o">);</span>
<span class="n">field</span><span class="o">.</span><span class="na">set</span><span class="o">(</span><span class="n">obj</span><span class="o">,</span> <span class="n">dateString</span><span class="o">);</span>
<span class="c1">// Check if the annotation specifies a target field name</span>
<span class="nc">String</span> <span class="n">targetFieldName</span> <span class="o">=</span> <span class="n">dateFormatAnnotation</span><span class="o">.</span><span class="na">targetField</span><span class="o">();</span>
<span class="k">if</span> <span class="o">(!</span><span class="n">targetFieldName</span><span class="o">.</span><span class="na">isEmpty</span><span class="o">())</span> <span class="o">{</span>
<span class="k">try</span> <span class="o">{</span>
<span class="nc">Field</span> <span class="n">targetField</span> <span class="o">=</span> <span class="n">clazz</span><span class="o">.</span><span class="na">getDeclaredField</span><span class="o">(</span><span class="n">targetFieldName</span><span class="o">);</span>
<span class="n">targetField</span><span class="o">.</span><span class="na">setAccessible</span><span class="o">(</span><span class="kc">true</span><span class="o">);</span>
<span class="n">targetField</span><span class="o">.</span><span class="na">set</span><span class="o">(</span><span class="n">obj</span><span class="o">,</span> <span class="n">dateString</span><span class="o">);</span>
<span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="nc">NoSuchFieldException</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span>
<span class="n">e</span><span class="o">.</span><span class="na">printStackTrace</span><span class="o">();</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>
<p>现在,你可以在需要进行日期转换的类中,使用<code class="language-plaintext highlighter-rouge">DateFormat</code>注解并指定<code class="language-plaintext highlighter-rouge">targetField</code>属性的值,来指定要存储转换后日期字符串的新字段的名称。例如:</p>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">public</span> <span class="kd">class</span> <span class="nc">YourClass</span> <span class="o">{</span>
<span class="nd">@DateFormat</span><span class="o">(</span><span class="n">format</span> <span class="o">=</span> <span class="s">"yyyy-MM-dd"</span><span class="o">,</span> <span class="n">targetField</span> <span class="o">=</span> <span class="s">"sdrqstr"</span><span class="o">)</span>
<span class="kd">private</span> <span class="nc">Date</span> <span class="n">sdrq</span><span class="o">;</span>
<span class="kd">private</span> <span class="nc">String</span> <span class="n">sdrqstr</span><span class="o">;</span>
<span class="c1">// other fields and methods...</span>
<span class="o">}</span>
</code></pre></div></div>
<p>在上述示例中,我们在<code class="language-plaintext highlighter-rouge">YourClass</code>类中使用<code class="language-plaintext highlighter-rouge">DateFormat</code>注解,并指定了<code class="language-plaintext highlighter-rouge">targetField</code>属性的值为<code class="language-plaintext highlighter-rouge">sdrqstr</code>,表示将转换后的日期字符串存储到<code class="language-plaintext highlighter-rouge">sdrqstr</code>字段中。</p>
<p>最后,你可以按照之前的方式创建包含需要进行日期转换的对象的<code class="language-plaintext highlighter-rouge">List</code>,并调用<code class="language-plaintext highlighter-rouge">DateConverter.convertDateToString</code>方法,日期转换后的结果将根据注解中指定的新字段名称进行存储</p>MinSongTao比如我们有一个这样的需求,在返回数据中有个Bean中的字段是Date类型,想把他转成一个 yyyy-MM-dd 格式的字符串,并放到另一个字段中,怎么做呢?Mybatis 完整操作一张表的 CURD 的操作2023-03-28T00:00:00+08:002023-03-28T00:00:00+08:00http://minsongtao.com/2023/03/28/Mybatis%20%E5%AE%8C%E6%95%B4%E6%93%8D%E4%BD%9C%E4%B8%80%E5%BC%A0%E8%A1%A8%E7%9A%84%20CURD%20%E7%9A%84%E6%93%8D%E4%BD%9C<p>下面是一个使用 MyBatis 完整操作一张表的 CURD 的操作的示例:</p>
<ol>
<li>创建一张表并插入数据:</li>
</ol>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">CREATE</span> <span class="k">TABLE</span> <span class="k">user</span> <span class="p">(</span>
<span class="n">id</span> <span class="nb">INT</span> <span class="k">PRIMARY</span> <span class="k">KEY</span> <span class="n">AUTO_INCREMENT</span><span class="p">,</span>
<span class="n">name</span> <span class="nb">VARCHAR</span><span class="p">(</span><span class="mi">50</span><span class="p">),</span>
<span class="n">age</span> <span class="nb">INT</span><span class="p">,</span>
<span class="n">email</span> <span class="nb">VARCHAR</span><span class="p">(</span><span class="mi">50</span><span class="p">)</span>
<span class="p">);</span>
<span class="k">INSERT</span> <span class="k">INTO</span> <span class="k">user</span> <span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">age</span><span class="p">,</span> <span class="n">email</span><span class="p">)</span> <span class="k">VALUES</span> <span class="p">(</span><span class="s1">'Alice'</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="s1">'alice@example.com'</span><span class="p">);</span>
<span class="k">INSERT</span> <span class="k">INTO</span> <span class="k">user</span> <span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">age</span><span class="p">,</span> <span class="n">email</span><span class="p">)</span> <span class="k">VALUES</span> <span class="p">(</span><span class="s1">'Bob'</span><span class="p">,</span> <span class="mi">25</span><span class="p">,</span> <span class="s1">'bob@example.com'</span><span class="p">);</span>
</code></pre></div></div>
<ol>
<li>创建一个 User 实体类,对应数据库表中的一行数据:</li>
</ol>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">public</span> <span class="kd">class</span> <span class="nc">User</span> <span class="o">{</span>
<span class="kd">private</span> <span class="nc">Integer</span> <span class="n">id</span><span class="o">;</span>
<span class="kd">private</span> <span class="nc">String</span> <span class="n">name</span><span class="o">;</span>
<span class="kd">private</span> <span class="nc">Integer</span> <span class="n">age</span><span class="o">;</span>
<span class="kd">private</span> <span class="nc">String</span> <span class="n">email</span><span class="o">;</span>
<span class="c1">// getter and setter methods</span>
<span class="o">}</span>
</code></pre></div></div>
<ol>
<li>编写 MyBatis Mapper 接口,定义对 user 表的操作:</li>
</ol>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">public</span> <span class="kd">interface</span> <span class="nc">UserMapper</span> <span class="o">{</span>
<span class="nd">@Select</span><span class="o">(</span><span class="s">"SELECT * FROM user"</span><span class="o">)</span>
<span class="nc">List</span><span class="o"><</span><span class="nc">User</span><span class="o">></span> <span class="nf">getAllUsers</span><span class="o">();</span>
<span class="nd">@Select</span><span class="o">(</span><span class="s">"SELECT * FROM user WHERE id = #{id}"</span><span class="o">)</span>
<span class="nc">User</span> <span class="nf">getUserById</span><span class="o">(</span><span class="nc">Integer</span> <span class="n">id</span><span class="o">);</span>
<span class="nd">@Insert</span><span class="o">(</span><span class="s">"INSERT INTO user (name, age, email) VALUES (#{name}, #{age}, #{email})"</span><span class="o">)</span>
<span class="nd">@Options</span><span class="o">(</span><span class="n">useGeneratedKeys</span> <span class="o">=</span> <span class="kc">true</span><span class="o">,</span> <span class="n">keyProperty</span> <span class="o">=</span> <span class="s">"id"</span><span class="o">)</span>
<span class="kt">void</span> <span class="nf">insertUser</span><span class="o">(</span><span class="nc">User</span> <span class="n">user</span><span class="o">);</span>
<span class="nd">@Update</span><span class="o">(</span><span class="s">"UPDATE user SET name = #{name}, age = #{age}, email = #{email} WHERE id = #{id}"</span><span class="o">)</span>
<span class="kt">void</span> <span class="nf">updateUser</span><span class="o">(</span><span class="nc">User</span> <span class="n">user</span><span class="o">);</span>
<span class="nd">@Delete</span><span class="o">(</span><span class="s">"DELETE FROM user WHERE id = #{id}"</span><span class="o">)</span>
<span class="kt">void</span> <span class="nf">deleteUser</span><span class="o">(</span><span class="nc">Integer</span> <span class="n">id</span><span class="o">);</span>
<span class="o">}</span>
</code></pre></div></div>
<ul>
<li><code class="language-plaintext highlighter-rouge">@Select</code> 注解用于查询操作,其中的 SQL 语句对应数据库的查询语句;</li>
<li><code class="language-plaintext highlighter-rouge">@Insert</code> 注解用于插入操作,其中的 SQL 语句对应数据库的插入语句;</li>
<li><code class="language-plaintext highlighter-rouge">@Options</code> 注解用于指定插入操作的主键生成方式;</li>
<li><code class="language-plaintext highlighter-rouge">@Update</code> 注解用于更新操作,其中的 SQL 语句对应数据库的更新语句;</li>
<li><code class="language-plaintext highlighter-rouge">@Delete</code> 注解用于删除操作,其中的 SQL 语句对应数据库的删除语句。</li>
</ul>
<ol>
<li>编写 MyBatis Mapper XML 文件,定义对 user 表的操作:</li>
</ol>
<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt"><mapper</span> <span class="na">namespace=</span><span class="s">"com.example.mapper.UserMapper"</span><span class="nt">></span>
<span class="nt"><select</span> <span class="na">id=</span><span class="s">"getAllUsers"</span> <span class="na">resultType=</span><span class="s">"com.example.model.User"</span><span class="nt">></span>
SELECT * FROM user
<span class="nt"></select></span>
<span class="nt"><select</span> <span class="na">id=</span><span class="s">"getUserById"</span> <span class="na">resultType=</span><span class="s">"com.example.model.User"</span> <span class="na">parameterType=</span><span class="s">"java.lang.Integer"</span><span class="nt">></span>
SELECT * FROM user WHERE id = #{id}
<span class="nt"></select></span>
<span class="nt"><insert</span> <span class="na">id=</span><span class="s">"insertUser"</span> <span class="na">parameterType=</span><span class="s">"com.example.model.User"</span> <span class="na">useGeneratedKeys=</span><span class="s">"true"</span> <span class="na">keyProperty=</span><span class="s">"id"</span><span class="nt">></span>
INSERT INTO user (name, age, email) VALUES (#{name}, #{age}, #{email})
<span class="nt"></insert></span>
<span class="nt"><update</span> <span class="na">id=</span><span class="s">"updateUser"</span> <span class="na">parameterType=</span><span class="s">"com.example.model.User"</span><span class="nt">></span>
UPDATE user SET name = #{name}, age = #{age}, email = #{email} WHERE id = #{id}
<span class="nt"></update></span>
<span class="nt"><delete</span> <span class="na">id=</span><span class="s">"deleteUser"</span> <span class="na">parameterType=</span><span class="s">"java.lang.Integer"</span><span class="nt">></span>
DELETE FROM user WHERE id = #{id}
<span class="nt"></delete></span>
<span class="nt"></mapper></span>
</code></pre></div></div>
<ul>
<li><code class="language-plaintext highlighter-rouge"><mapper></code> 标签用于定义 MyBatis Mapper;</li>
<li><code class="language-plaintext highlighter-rouge"><select></code> 标签用于查询操作,其中的 SQL 语句对应数据库的查询语句;</li>
<li><code class="language-plaintext highlighter-rouge"><insert></code> 标签用于插入操作,其中的 SQL 语句对应数据库的插入语句;</li>
<li><code class="language-plaintext highlighter-rouge"><update></code> 标签用于更新操作,其中的 SQL 语句对应数据库的更新语句;</li>
<li><code class="language-plaintext highlighter-rouge"><delete></code> 标签用于删除操作,其中的 SQL 语句对应数据库的删除语句;</li>
<li><code class="language-plaintext highlighter-rouge">resultType</code> 属性用于指定查询结果的类型;</li>
<li><code class="language-plaintext highlighter-rouge">parameterType</code> 属性用于指定参数的类型;</li>
<li><code class="language-plaintext highlighter-rouge">useGeneratedKeys</code> 属性用于指定插入操作的主键生成方式;</li>
<li><code class="language-plaintext highlighter-rouge">keyProperty</code> 属性用于指定插入操作的主键属性。</li>
</ul>
<ol>
<li>编写 MyBatis 配置文件,指定 Mapper 文件的位置和数据库连接信息:</li>
</ol>
<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt"><configuration></span>
<span class="nt"><mappers></span>
<span class="nt"><mapper</span> <span class="na">resource=</span><span class="s">"com/example/mapper/UserMapper.xml"</span><span class="nt">/></span>
<span class="nt"></mappers></span>
<span class="nt"><environments</span> <span class="na">default=</span><span class="s">"development"</span><span class="nt">></span>
<span class="nt"><environment</span> <span class="na">id=</span><span class="s">"development"</span><span class="nt">></span>
<span class="nt"><transactionManager</span> <span class="na">type=</span><span class="s">"JDBC"</span><span class="nt">/></span>
<span class="nt"><dataSource</span> <span class="na">type=</span><span class="s">"POOLED"</span><span class="nt">></span>
<span class="nt"><property</span> <span class="na">name=</span><span class="s">"driver"</span> <span class="na">value=</span><span class="s">"com.mysql.cj.jdbc.Driver"</span><span class="nt">/></span>
<span class="nt"><property</span> <span class="na">name=</span><span class="s">"url"</span> <span class="na">value=</span><span class="s">"jdbc:mysql://localhost:3306/mybatis_example"</span><span class="nt">/></span>
<span class="nt"><property</span> <span class="na">name=</span><span class="s">"username"</span> <span class="na">value=</span><span class="s">"root"</span><span class="nt">/></span>
<span class="nt"><property</span> <span class="na">name=</span><span class="s">"password"</span> <span class="na">value=</span><span class="s">"password"</span><span class="nt">/></span>
<span class="nt"></dataSource></span>
<span class="nt"></environment></span>
<span class="nt"></environments></span>
<span class="nt"></configuration></span>
</code></pre></div></div>
<ul>
<li><code class="language-plaintext highlighter-rouge"><mappers></code> 标签用于指定 Mapper 文件的位置;</li>
<li><code class="language-plaintext highlighter-rouge"><mapper></code> 标签的 <code class="language-plaintext highlighter-rouge">resource</code> 属性用于指定 Mapper 文件的路径;</li>
<li><code class="language-plaintext highlighter-rouge"><environments></code> 标签用于指定数据库连接信息;</li>
<li><code class="language-plaintext highlighter-rouge"><transactionManager></code> 标签用于指定事务管理器的类型;</li>
<li><code class="language-plaintext highlighter-rouge"><dataSource></code> 标签用于指定数据源的类型和连接信息;</li>
<li><code class="language-plaintext highlighter-rouge"><property></code> 标签用于指定连接信息的具体值。</li>
</ul>
<ol>
<li>在 Spring Boot 中配置 MyBatis,指定 MyBatis 配置文件的位置和 Mapper 扫描的包:</li>
</ol>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nd">@Configuration</span>
<span class="nd">@MapperScan</span><span class="o">(</span><span class="s">"com.example.mapper"</span><span class="o">)</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">MyBatisConfig</span> <span class="o">{</span>
<span class="nd">@Bean</span>
<span class="kd">public</span> <span class="nc">SqlSessionFactoryBean</span> <span class="nf">sqlSessionFactoryBean</span><span class="o">(</span><span class="nc">DataSource</span> <span class="n">dataSource</span><span class="o">)</span> <span class="o">{</span>
<span class="nc">SqlSessionFactoryBean</span> <span class="n">sqlSessionFactoryBean</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">SqlSessionFactoryBean</span><span class="o">();</span>
<span class="n">sqlSessionFactoryBean</span><span class="o">.</span><span class="na">setDataSource</span><span class="o">(</span><span class="n">dataSource</span><span class="o">);</span>
<span class="nc">ResourcePatternResolver</span> <span class="n">resourcePatternResolver</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">PathMatchingResourcePatternResolver</span><span class="o">();</span>
<span class="k">try</span> <span class="o">{</span>
<span class="n">sqlSessionFactoryBean</span><span class="o">.</span><span class="na">setMapperLocations</span><span class="o">(</span><span class="n">resourcePatternResolver</span><span class="o">.</span><span class="na">getResources</span><span class="o">(</span><span class="s">"classpath*:com/example/mapper/*.xml"</span><span class="o">));</span>
<span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="nc">IOException</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span>
<span class="n">e</span><span class="o">.</span><span class="na">printStackTrace</span><span class="o">();</span>
<span class="o">}</span>
<span class="k">return</span> <span class="n">sqlSessionFactoryBean</span><span class="o">;</span>
<span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>
<ul>
<li><code class="language-plaintext highlighter-rouge">@Configuration</code> 注解用于将该类注册为 Spring 配置类;</li>
<li><code class="language-plaintext highlighter-rouge">@MapperScan</code> 注解用于指定 Mapper 扫描的包;</li>
<li><code class="language-plaintext highlighter-rouge">SqlSessionFactoryBean</code> 用于创建 <code class="language-plaintext highlighter-rouge">SqlSessionFactory</code> 实例;</li>
<li><code class="language-plaintext highlighter-rouge">setDataSource</code> 方法用于指定数据源;</li>
<li><code class="language-plaintext highlighter-rouge">setMapperLocations</code> 方法用于指定 Mapper 文件的位置;</li>
<li><code class="language-plaintext highlighter-rouge">PathMatchingResourcePatternResolver</code> 和 <code class="language-plaintext highlighter-rouge">ResourcePatternResolver</code> 用于扫描 Mapper 文件。</li>
</ul>
<ol>
<li>编写一个测试类,用于验证 MyBatis 的 CURD 操作:</li>
</ol>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nd">@SpringBootTest</span>
<span class="kd">class</span> <span class="nc">UserMapperTest</span> <span class="o">{</span>
<span class="nd">@Autowired</span>
<span class="kd">private</span> <span class="nc">UserMapper</span> <span class="n">userMapper</span><span class="o">;</span>
<span class="nd">@Test</span>
<span class="kt">void</span> <span class="nf">testGetAllUsers</span><span class="o">()</span> <span class="o">{</span>
<span class="nc">List</span><span class="o"><</span><span class="nc">User</span><span class="o">></span> <span class="n">userList</span> <span class="o">=</span> <span class="n">userMapper</span><span class="o">.</span><span class="na">getAllUsers</span><span class="o">();</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">userList</span><span class="o">);</span>
<span class="o">}</span>
<span class="nd">@Test</span>
<span class="kt">void</span> <span class="nf">testGetUserById</span><span class="o">()</span> <span class="o">{</span>
<span class="nc">User</span> <span class="n">user</span> <span class="o">=</span> <span class="n">userMapper</span><span class="o">.</span><span class="na">getUserById</span><span class="o">(</span><span class="mi">1</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">user</span><span class="o">);</span>
<span class="o">}</span>
<span class="nd">@Test</span>
<span class="kt">void</span> <span class="nf">testInsertUser</span><span class="o">()</span> <span class="o">{</span>
<span class="nc">User</span> <span class="n">user</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">User</span><span class="o">();</span>
<span class="n">user</span><span class="o">.</span><span class="na">setName</span><span class="o">(</span><span class="s">"Charlie"</span><span class="o">);</span>
<span class="n">user</span><span class="o">.</span><span class="na">setAge</span><span class="o">(</span><span class="mi">30</span><span class="o">);</span>
<span class="n">user</span><span class="o">.</span><span class="na">setEmail</span><span class="o">(</span><span class="s">"charlie@example.com"</span><span class="o">);</span>
<span class="n">userMapper</span><span class="o">.</span><span class="na">insertUser</span><span class="o">(</span><span class="n">user</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">user</span><span class="o">);</span>
<span class="o">}</span>
<span class="nd">@Test</span>
<span class="kt">void</span> <span class="nf">testUpdateUser</span><span class="o">()</span> <span class="o">{</span>
<span class="nc">User</span> <span class="n">user</span> <span class="o">=</span> <span class="n">userMapper</span><span class="o">.</span><span class="na">getUserById</span><span class="o">(</span><span class="mi">1</span><span class="o">);</span>
<span class="n">user</span><span class="o">.</span><span class="na">setName</span><span class="o">(</span><span class="s">"Alice2"</span><span class="o">);</span>
<span class="n">user</span><span class="o">.</span><span class="na">setAge</span><span class="o">(</span><span class="mi">21</span><span class="o">);</span>
<span class="n">user</span><span class="o">.</span><span class="na">setEmail</span><span class="o">(</span><span class="s">"alice2@example.com"</span><span class="o">);</span>
<span class="n">userMapper</span><span class="o">.</span><span class="na">updateUser</span><span class="o">(</span><span class="n">user</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">userMapper</span><span class="o">.</span><span class="na">getUserById</span><span class="o">(</span><span class="mi">1</span><span class="o">));</span>
<span class="o">}</span>
<span class="nd">@Test</span>
<span class="kt">void</span> <span class="nf">testDeleteUser</span><span class="o">()</span> <span class="o">{</span>
<span class="n">userMapper</span><span class="o">.</span><span class="na">deleteUser</span><span class="o">(</span><span class="mi">1</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">userMapper</span><span class="o">.</span><span class="na">getUserById</span><span class="o">(</span><span class="mi">1</span><span class="o">));</span>
<span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>
<ol>
<li>运行测试类,观察控制台输出,可以看到查询结果和操作结果。</li>
</ol>
<p>完整代码如下:</p>
<p>User.java:</p>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">public</span> <span class="kd">class</span> <span class="nc">User</span> <span class="o">{</span>
<span class="kd">private</span> <span class="nc">Integer</span> <span class="n">id</span><span class="o">;</span>
<span class="kd">private</span> <span class="nc">String</span> <span class="n">name</span><span class="o">;</span>
<span class="kd">private</span> <span class="nc">Integer</span> <span class="n">age</span><span class="o">;</span>
<span class="kd">private</span> <span class="nc">String</span> <span class="n">email</span><span class="o">;</span>
<span class="c1">// getter and setter methods</span>
<span class="o">}</span>
</code></pre></div></div>
<p>UserMapper.java:</p>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">public</span> <span class="kd">interface</span> <span class="nc">UserMapper</span> <span class="o">{</span>
<span class="nd">@Select</span><span class="o">(</span><span class="s">"SELECT * FROM user"</span><span class="o">)</span>
<span class="nc">List</span><span class="o"><</span><span class="nc">User</span><span class="o">></span> <span class="nf">getAllUsers</span><span class="o">();</span>
<span class="nd">@Select</span><span class="o">(</span><span class="s">"SELECT * FROM user WHERE id = #{id}"</span><span class="o">)</span>
<span class="nc">User</span> <span class="nf">getUserById</span><span class="o">(</span><span class="nc">Integer</span> <span class="n">id</span><span class="o">);</span>
<span class="nd">@Insert</span><span class="o">(</span><span class="s">"INSERT INTO user (name, age, email) VALUES (#{name}, #{age}, #{email})"</span><span class="o">)</span>
<span class="nd">@Options</span><span class="o">(</span><span class="n">useGeneratedKeys</span> <span class="o">=</span> <span class="kc">true</span><span class="o">,</span> <span class="n">keyProperty</span> <span class="o">=</span> <span class="s">"id"</span><span class="o">)</span>
<span class="kt">void</span> <span class="nf">insertUser</span><span class="o">(</span><span class="nc">User</span> <span class="n">user</span><span class="o">);</span>
<span class="nd">@Update</span><span class="o">(</span><span class="s">"UPDATE user SET name = #{name}, age = #{age}, email = #{email} WHERE id = #{id}"</span><span class="o">)</span>
<span class="kt">void</span> <span class="nf">updateUser</span><span class="o">(</span><span class="nc">User</span> <span class="n">user</span><span class="o">);</span>
<span class="nd">@Delete</span><span class="o">(</span><span class="s">"DELETE FROM user WHERE id = #{id}"</span><span class="o">)</span>
<span class="kt">void</span> <span class="nf">deleteUser</span><span class="o">(</span><span class="nc">Integer</span> <span class="n">id</span><span class="o">);</span>
<span class="o">}</span>
</code></pre></div></div>
<p>UserMapper.xml:</p>
<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt"><mapper</span> <span class="na">namespace=</span><span class="s">"com.example.mapper.UserMapper"</span><span class="nt">></span>
<span class="nt"><select</span> <span class="na">id=</span><span class="s">"getAllUsers"</span> <span class="na">resultType=</span><span class="s">"com.example.model.User"</span><span class="nt">></span>
SELECT * FROM user
<span class="nt"></select></span>
<span class="nt"><select</span> <span class="na">id=</span><span class="s">"getUserById"</span> <span class="na">resultType=</span><span class="s">"com.example.model.User"</span> <span class="na">parameterType=</span><span class="s">"java.lang.Integer"</span><span class="nt">></span>
SELECT * FROM user WHERE id = #{id}
<span class="nt"></select></span>
<span class="nt"><insert</span> <span class="na">id=</span><span class="s">"insertUser"</span> <span class="na">parameterType=</span><span class="s">"com.example.model.User"</span> <span class="na">useGeneratedKeys=</span><span class="s">"true"</span> <span class="na">keyProperty=</span><span class="s">"id"</span><span class="nt">></span>
INSERT INTO user (name, age, email) VALUES (#{name}, #{age}, #{email})
<span class="nt"></insert></span>
<span class="nt"><update</span> <span class="na">id=</span><span class="s">"updateUser"</span> <span class="na">parameterType=</span><span class="s">"com.example.model.User"</span><span class="nt">></span>
UPDATE user SET name = #{name}, age = #{age}, email = #{email} WHERE id = #{id}
<span class="nt"></update></span>
<span class="nt"><delete</span> <span class="na">id=</span><span class="s">"deleteUser"</span> <span class="na">parameterType=</span><span class="s">"java.lang.Integer"</span><span class="nt">></span>
DELETE FROM user WHERE id = #{id}
<span class="nt"></delete></span>
<span class="nt"></mapper></span>
</code></pre></div></div>
<p>MyBatisConfig.java:</p>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nd">@Configuration</span>
<span class="nd">@MapperScan</span><span class="o">(</span><span class="s">"com.example.mapper"</span><span class="o">)</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">MyBatisConfig</span> <span class="o">{</span>
<span class="nd">@Bean</span>
<span class="kd">public</span> <span class="nc">SqlSessionFactoryBean</span> <span class="nf">sqlSessionFactoryBean</span><span class="o">(</span><span class="nc">DataSource</span> <span class="n">dataSource</span><span class="o">)</span> <span class="o">{</span>
<span class="nc">SqlSessionFactoryBean</span> <span class="n">sqlSessionFactoryBean</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">SqlSessionFactoryBean</span><span class="o">();</span>
<span class="n">sqlSessionFactoryBean</span><span class="o">.</span><span class="na">setDataSource</span><span class="o">(</span><span class="n">dataSource</span><span class="o">);</span>
<span class="nc">ResourcePatternResolver</span> <span class="n">resourcePatternResolver</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">PathMatchingResourcePatternResolver</span><span class="o">();</span>
<span class="k">try</span> <span class="o">{</span>
<span class="n">sqlSessionFactoryBean</span><span class="o">.</span><span class="na">setMapperLocations</span><span class="o">(</span><span class="n">resourcePatternResolver</span><span class="o">.</span><span class="na">getResources</span><span class="o">(</span><span class="s">"classpath*:com/example/mapper/*.xml"</span><span class="o">));</span>
<span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="nc">IOException</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span>
<span class="n">e</span><span class="o">.</span><span class="na">printStackTrace</span><span class="o">();</span>
<span class="o">}</span>
<span class="k">return</span> <span class="n">sqlSessionFactoryBean</span><span class="o">;</span>
<span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>
<p>UserMapperTest.java:</p>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nd">@SpringBootTest</span>
<span class="kd">class</span> <span class="nc">UserMapperTest</span> <span class="o">{</span>
<span class="nd">@Autowired</span>
<span class="kd">private</span> <span class="nc">UserMapper</span> <span class="n">userMapper</span><span class="o">;</span>
<span class="nd">@Test</span>
<span class="kt">void</span> <span class="nf">testGetAllUsers</span><span class="o">()</span> <span class="o">{</span>
<span class="nc">List</span><span class="o"><</span><span class="nc">User</span><span class="o">></span> <span class="n">userList</span> <span class="o">=</span> <span class="n">userMapper</span><span class="o">.</span><span class="na">getAllUsers</span><span class="o">();</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">userList</span><span class="o">);</span>
<span class="o">}</span>
<span class="nd">@Test</span>
<span class="kt">void</span> <span class="nf">testGetUserById</span><span class="o">()</span> <span class="o">{</span>
<span class="nc">User</span> <span class="n">user</span> <span class="o">=</span> <span class="n">userMapper</span><span class="o">.</span><span class="na">getUserById</span><span class="o">(</span><span class="mi">1</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">user</span><span class="o">);</span>
<span class="o">}</span>
<span class="nd">@Test</span>
<span class="kt">void</span> <span class="nf">testInsertUser</span><span class="o">()</span> <span class="o">{</span>
<span class="nc">User</span> <span class="n">user</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">User</span><span class="o">();</span>
<span class="n">user</span><span class="o">.</span><span class="na">setName</span><span class="o">(</span><span class="s">"Charlie"</span><span class="o">);</span>
<span class="n">user</span><span class="o">.</span><span class="na">setAge</span><span class="o">(</span><span class="mi">30</span><span class="o">);</span>
<span class="n">user</span><span class="o">.</span><span class="na">setEmail</span><span class="o">(</span><span class="s">"charlie@example.com"</span><span class="o">);</span>
<span class="n">userMapper</span><span class="o">.</span><span class="na">insertUser</span><span class="o">(</span><span class="n">user</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">user</span><span class="o">);</span>
<span class="o">}</span>
<span class="nd">@Test</span>
<span class="kt">void</span> <span class="nf">testUpdateUser</span><span class="o">()</span> <span class="o">{</span>
<span class="nc">User</span> <span class="n">user</span> <span class="o">=</span> <span class="n">userMapper</span><span class="o">.</span><span class="na">getUserById</span><span class="o">(</span><span class="mi">1</span><span class="o">);</span>
<span class="n">user</span><span class="o">.</span><span class="na">setName</span><span class="o">(</span><span class="s">"Alice2"</span><span class="o">);</span>
<span class="n">user</span><span class="o">.</span><span class="na">setAge</span><span class="o">(</span><span class="mi">21</span><span class="o">);</span>
<span class="n">user</span><span class="o">.</span><span class="na">setEmail</span><span class="o">(</span><span class="s">"alice2@example.com"</span><span class="o">);</span>
<span class="n">userMapper</span><span class="o">.</span><span class="na">updateUser</span><span class="o">(</span><span class="n">user</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">userMapper</span><span class="o">.</span><span class="na">getUserById</span><span class="o">(</span><span class="mi">1</span><span class="o">));</span>
<span class="o">}</span>
<span class="nd">@Test</span>
<span class="kt">void</span> <span class="nf">testDeleteUser</span><span class="o">()</span> <span class="o">{</span>
<span class="n">userMapper</span><span class="o">.</span><span class="na">deleteUser</span><span class="o">(</span><span class="mi">1</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">userMapper</span><span class="o">.</span><span class="na">getUserById</span><span class="o">(</span><span class="mi">1</span><span class="o">));</span>
<span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>MinSongTao下面是一个使用 MyBatis 完整操作一张表的 CURD 的操作的示例:曾国藩是如何走出人生困境2022-09-13T00:00:00+08:002022-09-13T00:00:00+08:00http://minsongtao.com/2022/09/13/%E6%9B%BE%E5%9B%BD%E8%97%A9%E6%98%AF%E5%A6%82%E4%BD%95%E8%B5%B0%E5%87%BA%E4%BA%BA%E7%94%9F%E5%9B%B0%E5%A2%83<p>目前,个体与企业挑战来源于疫情、市场、国际格局变化等诸方面。怎么度过这样极其困难的时刻?希望曾国藩的经历能够给大家提供一些启发。</p>
<p><strong>引子:余平生长进,全在受挫受辱之时</strong></p>
<p>今天的话题先从曾国藩的一首诗说起:</p>
<p><strong>左列钟铭右谤书,人间随处有乘除。</strong></p>
<p><strong>低头一拜屠羊说,万事浮云过太虚。</strong></p>
<p>据说TCL董事长李东生先生特别喜欢这首诗,专门将这首诗挂在了自己办公室里。李东生先生被誉为“左手韦尔奇,右手曾国藩”,是中西合璧的企业家。</p>
<p>这首诗是曾国藩写给弟弟曾国荃的。曾国荃打下南京之后,满心以为清政府会给他大赏,但是没想到清政府反而忌惮他功高震主,追究他的失误和责任。</p>
<p>同时,各种各样的嘲讽、猜忌全部压了过来。重重压力之下,曾国荃不得不以生病为理由辞职回家。这是曾国荃一生最低落的时期。曾国藩特作此诗来开导曾国荃。</p>
<p><strong>“左列钟铭右谤书”</strong>。你立下大功,做成大事,国君为了表示不忘你的功劳,特意铸了一口钟,并列上了你的名字;但是,诽谤你的文书同时已经堆满了国君的桌子。</p>
<p><strong>“人间随处有</strong><strong>乘除”</strong>。这就是人生,这就是世事。有人给你做乘法,就一定会有人给你做除法。遇到顺境,也必须做好转入逆境的准备。</p>
<p><strong>“低头一拜屠羊说,万事浮云过太虚”</strong>。屠羊说的故事出自《庄子·让王》。屠羊说是一个内心坦荡、对于得失成败和功名利禄看得非常淡的人。你低头一看《庄子》屠羊说的故事,就会明白成败得失、兴衰荣辱、顺境逆境,其实都是浮云而已。</p>
<p>这是一种非常坦荡的胸怀。</p>
<p>我为什么从这首诗开始讲呢?因为这首诗里面有一种力量,这种力量来自于曾国藩自己从极困极难之中走出来的经历,这种力量影响了曾国藩的弟弟曾国荃,更在150多年后还影响了李东生这样的优秀企业家。</p>
<p>曾国藩曾讲过自己一生的经历:“余生平吃数大堑,而癸丑六月不与焉。第一次壬辰年发佾生,学台悬牌,责其文理之浅;第二庚戌年上日讲疏,内画一图甚陋,九卿中无人不冷笑而薄之;第三甲寅年岳州靖港败后,栖于高峰寺,为通省官绅所鄙夷;第四乙卯年九江败后,赧颜走入江西,又参抚、臬,丙辰被困南昌,官绅人人目笑存之。”</p>
<p>我这辈子啊,有几次大的困境,咸丰三年六月与湖南官场势同水火,最后被赶出长沙,那次还不算什么。</p>
<p>第一次是道光十二年,当时曾国藩还是秀才。学台(省级教育负责人)公开指责他的文章文理不通;</p>
<p>第二次是道光三十年,当时曾国藩是翰林,给皇帝讲课时画的一个图特别丑,被九卿冷笑瞧不起;</p>
<p>第三次是咸丰四年,曾国藩第一次带兵,在岳州、靖港先后打了败仗,被迫在长沙城外的高峰寺暂时栖身,全省官员和士绅都用鄙夷的眼光看他;</p>
<p>第四次是咸丰五年,他在九江再次战败,最后厚着脸皮进了江西南昌。</p>
<p>接下来他弹劾江西巡抚和省政法负责人,结果第二年自己被困在南昌,官绅人人都兴高采烈地看他的笑话。</p>
<p>这就是曾国藩的“五堑”。</p>
<p><strong>1. 第三大堑</strong></p>
<p>其中第三大堑是靖港之败。当年湘军刚练成,曾国藩也没有作战经验,不太会打仗。曾国藩跟手下制定了一个打湘潭的作战计划,前面5个营由其他将领率领已经先出发了,他准备带剩下的5个营作为后应。</p>
<p>就在他刚要带后面这5个营出发时,有靖港的民团过来报告,说是靖港的太平军防御非常薄弱,而且民团在太平军内部还有内应,所以建议曾国藩去打靖港。</p>
<p>曾国藩认为这是一个捡漏的好机会,就临时改变了湘潭作战计划,率领剩下的5个营兴冲冲地去打靖港。没想到这是个圈套,前面的部队吃了败仗,就开始后退。前军一退,后面的部队见势不好,也掉头就跑。</p>
<p>曾国藩眼看整个部队即将溃散,就在桥上立一杆旗,上书5个大字“过此旗者斩”。没想到湘军看到后,纷纷从旗旁绕了过去,部队很快散完了。</p>
<p>曾国藩本来最瞧不起一打仗就溃散的绿营兵,没想到自己辛辛苦苦练的湘军连绿营都不如。此时他跟长沙官场的关系本来就特别紧张,这样的失败,还不知道会遭到什么样的冷嘲热讽呢。所以非常沮丧,越想越恼,在回去的船上趁人不备,一头扎到河里自杀。</p>
<p>好在手下看出他神色不对,后面偷偷地跟着他,一看不好赶紧跳下河去,七手八脚把他捞了上来。</p>
<p>回到长沙后,果然是各种嘲讽都来了,有人甚至说湘军没用,干脆解散得了。曾国藩没脸进城,躲在城外的高峰寺,给皇帝写了遗折,给家里写了遗书,让弟弟准备好一口棺材,准备再自杀。但就在这时,传来了湘潭大捷的消息,他派出打湘潭的先头部队打了大胜仗回来了。</p>
<p>这样一来,曾国藩也就不用自杀了,总算过了这一关。</p>
<p><strong>2. 第四大堑</strong></p>
<p>曾国藩自己讲的第四堑,是他在江西的经历。曾国藩在江西前期极其困难,一是仗打得不好,二是官场关系也一塌糊涂。用曾国藩自己的话说,已经到了“通国不能相容”的地步。</p>
<p>他在给皇帝的折子中讲过他当时在江西的情况:“每闻春风之怒号,则寸心欲碎;见贼帆之上驶,则绕屋彷徨。”完全是焦头烂额、走投无路。《湘军志》的作者王闿运说,多年后他读到曾国藩给皇帝写的这个折子,不禁还要为曾国藩当年在江西之苦而泪目。</p>
<p><strong>3. 要官未成,反遭罢免</strong></p>
<p>其实上面这些挫折,还都不算什么。曾国藩最大的失败,是咸丰七年跟皇帝要官未成,反遭罢免。</p>
<p>曾国藩在江西南昌时处境极差,他认为原因是自己没有地盘、没有权力,所以他给皇帝写了一个折子,意思是没有巡抚的位子就没办法带兵,即使能带兵也无法筹饷,我现在 “处客寄虚悬之位,又无圆通济变之术”,再这样下去恐怕要给你贻误大局了。言外之意是你再不给我巡抚,那我不干了。</p>
<p>没想到曾国藩高估了自己在皇帝心中的分量,官没有要成,反而被皇帝剥夺了兵权,被迫回家守制一年多的时间,这一年多是他一生真正的至暗时刻。但曾国藩最终还是挺了过来,并且就是在这个过程中大悔大悟、脱胎换骨,迎来一生真正的辉煌。</p>
<p><img src="https://mmbiz.qpic.cn/mmbiz_jpg/c7guRib5toJm8HaoD6FIhT1kWQmkjnMJSU9ia7hzNbtn41ickmibHux07gbYQzMZrqHnrnd9bKjRGJCGGv9ZqhBpicA/640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1" alt="图片" /></p>
<p>今天我们看曾国藩的一生并不平顺,屡战屡败,但他屡败屡战。</p>
<p>梁启超对曾国藩有一段评价,说曾国藩并没有超群绝伦的才华,在同时期的杰出人物中是最笨的一个,一生一直处于逆境,但最后立德、立功、立言,达到了三不朽,其成就震古烁今,无人可比,原因就是“其一生得力,在立志自拔于流俗。而困而知,而勉而行,历百千艰阻而不挫屈,不求近效,铢积寸累。受之以虚,将之以勤,植之以刚,贞之以恒,帅之以诚,勇猛精进,坚苦卓绝,如斯而已,如斯而已!”</p>
<p>在梁启超看来,曾国藩的成就完全是在逆境中困知勉行、锤炼而成。曾国藩自己也讲过一句话:“<strong>吾生平长进,全在受挫受辱之时。</strong>”挫折屈辱,反而变成了曾国藩提升自我的最好机会。</p>
<p>当我们遇到逆境的时候,一般会有两种反应:一种是放弃、沮丧、抱怨、悲观;另一种是积极奋斗、不屈不挠、愈挫愈勇。逆境中最能体现出一个人的领导力水平。</p>
<p>我讲过一句话:<strong>逆境是企业和企业家的成人礼</strong>。人生亦如此,如何看待逆境至关重要。逆境中不同人的不同的反应与选择,往往是不同人生的分水岭。</p>
<p>湘军统帅胡林翼曾经讲过一句话,我非常喜欢:“世自乱而我心自治,斯为正道。”越是在动荡和不确定的环境,就越要找到自己内心确定的东西,从而用从容和定力去应对逆境和不确定。</p>
<p>的确,我们不能改变大的外部环境、不能改变处于逆境的现实,但人是有能动性的,我们可以决定自己的心态与反应,决定应对逆境和困难时的选择。人与人之间的区别其实就在此处,组织和组织之间拉开距离也在此处。</p>
<p>曾国藩究竟是怎么走出极困极难时刻的?4个字:耐、裕、强、悔。这都是他从自身的经历中总结出来的。</p>
<p><strong>耐</strong></p>
<p>第一个字:“耐”。耐就是耐烦,耐得住烦躁,控制好情绪,调整好心态,也就是我们今天讲的情绪管理。</p>
<p>遇到逆境、遇到困难,人本能的反应是什么?就是焦虑、抑郁,情绪化。但是,所有人都可以焦虑,管理者不能焦虑;所有人都可以沮丧,管理者不能沮丧。</p>
<p><strong>相反,管理者必须把信心传递给组织的每个成员。保持情绪稳定、保持良好心态,是管理者做出正确决策的前提,是给团队提供信心的基础。</strong></p>
<p>所以曾国藩讲,“做官以‘耐烦’为第一要义”。耐得住烦躁、控制好情绪,这是管理的首要原则,是管理的入门工夫。<strong>“若遇棘手之际,须从‘耐烦’二字痛下工夫。”</strong>尤其是事情不顺、内心焦躁的时候,一定要在“耐烦”两个字上痛下一番工夫。</p>
<p>曾国藩曾经夫子自道说:“吾服官多年,亦常在‘耐劳忍气’四字上做工夫。”我做了这么多年的官,也要必须随时提醒自己要耐得住劳累、忍得住气恼。在他看来,作为管理者,遇到不顺的时候,最忌讳的就是控制不好情绪,轻易发牢骚。</p>
<p>他讲:“牢骚太甚者,其后必多抑塞。盖无故而怨天,则天必不许;无故而尤人,则人必不服。”</p>
<p>一个人如果牢骚太多,他的前途肯定不会顺利了。因为无缘无故地抱怨老天,老天一定不会允许;无缘无故地怪罪别人,别人一定不会心服。</p>
<p><strong>很简单的道理,怨天尤人不但于事无补,反而使你的心态无法平和,你的决策也就不可能妥当。更重要的是,你经常传播负能量,你的组织也就不可能有信心。</strong>这是领导者在遇到困境时候的大忌,也是考验管理者是否成熟的最根本一条标准。</p>
<p><img src="https://mmbiz.qpic.cn/mmbiz_jpg/c7guRib5toJm8HaoD6FIhT1kWQmkjnMJSogYbrKdOrJlCRAL8KVrtle9XNt4YViadz9FUsLqDdZpbKtkEbjkwYiaw/640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1" alt="图片" /></p>
<p>曾国藩非常喜欢写对联,他经常把自己对人生的体悟写成对联跟朋友和家人分享。</p>
<p>他写的对联往往很通俗,但很深刻、很耐人寻味。他有这样一副对联:“天下断无易处之境遇,人间哪有空闲的光阴”。你看都是大白话,但是非常有味道。<strong>什么叫“天下断无易处之境遇”?天底下哪有那么容易顺的境遇?一个组织之所以需要管理者,一定是需要你来解决问题的。</strong></p>
<p>如果组织没有任何问题,还需要管理者干什么呢?管理者天然就要面对问题、解决问题,这是你的职责所在,也是你的价值所在。从你创业那天开始、从你晋升为管理岗那天开始,这就应该是你的常态、是你必须接受的现实。逆境本来就是管理的组成部分,我们能做的就是要用平和的心态来对待。</p>
<p>他还写过一副对联,是他被皇帝赶回家为父亲守制期间所作,现悬挂在他的旧居思云馆的门口:“不怨不尤,但反身争个一壁静;勿忘勿助,看平地长得万丈高”。</p>
<p>这副对联同样耐人寻味。上联“不怨不尤”,讲的是当人生或事业遇到挫折时,最忌讳的就是怨天尤人、灰心丧气。这样的情绪非但于事无补,反而会自乱阵脚,最后受伤害的一定是自己。逆境是最好的压力测试器。</p>
<p>正确做法是“反身争个一壁静”,借机反省自己,找出自身的问题与不足,积极改进和提升。这样,就可以用平和的心态,在自身或组织的成长发展方面下工夫,从而把不顺和困难变成最好的成长机会,“增益其所不能”。</p>
<p>下联“勿忘勿助”,讲的是千万不要因为一时的不顺就轻易放弃、沮丧、躺平,这是“勿忘”;也不要因为一时的焦躁就轻举妄动、急于求成,这是“勿助”。</p>
<p>世上很少有一帆风顺、一直高开高走的人生,任何一个管理者、组织都会经历困境,哪一个创业者没有经历一般人不愿意承受的煎熬或屈辱?如果你因为不顺心就不耐烦,因为不耐烦就会更加不顺心,你只会越来越焦躁,最终必然一事无成。</p>
<p>“看平地长得万丈高”,只要保持镇定从容的心态,耐心地着眼于自身的成长,总有一天,原本不起眼的小树苗一定会长成参天大树。</p>
<p>这就是曾国藩的心态,就是今天讲的自控力。在他看来,这种在逆境中的自控力、耐烦,是决定一个人成就的关键因素。</p>
<p>所以他曾经讲过,<strong>“观古今来成大功、享全名者,非必才盖一世。大抵能下人,斯能上人;能忍人,斯能胜人”</strong> 。</p>
<p>他发现一个规律,古今获得巨大成功的人,未必是最聪明的人。大致说来,能在别人面前保持低姿态的人,才能领导众人;对人宽容大度、忍耐克制的人,才能胜人一筹。你看,对于管理者来说,才华固然很重要,控制情绪、调整心态更加关键。</p>
<p><strong>因此,在困境之中修炼心态和情绪,这对于领导者而言是一门必修课。</strong>这就是为什么曾国藩提醒管理者要以“耐烦”为第一要义。</p>
<p><strong>裕</strong></p>
<p>第二个字:“裕”。宽裕,就是要放宽心。我们在逆境中为什么会焦虑抑郁?其实是因为对得失、成败看得太重。所以应对逆境非常重要的一条原则,就是要把得失成败放下,从而保持宽广的胸怀、坦荡的心境。</p>
<p>曾国藩曾经讲过一句话:<strong>“宦海风波,极无常态。得时则一岁九迁,失势则一落千丈。”</strong>官场上风波无常,运气来了可能一年连升九级,一旦失势则一落千丈。</p>
<p>曾国藩自己就曾经一年升过四级,但也曾经一下子跌落人生低谷。这种急剧的动荡,对人的心态会造成极大影响,而曾国藩很清楚,官场无常,才是官场的常态。</p>
<p>所以他跟朋友讲:<strong>“宦海之风波,仕途之通塞。非意计所能预期,亦非人谋所可自主。”</strong>个人和组织的发展中很多因素不是自己能够提前预料的,也不是自己能左右的,曾国藩把这些因素归于运气,他说“运气之说,贤者所不屑道,而鄙人则笃信不移”,所以他经常劝人放宽心,耐心等待命运的安排。</p>
<p>他认为,《周易》里的屯卦、否卦、蹇卦、困卦,都是教人“居之以裕,守之以贞”。这几个卦象都是艰难困苦,而卦辞和爻辞中传递的基本含义就是让人放宽心,耐心等待。</p>
<p><img src="https://mmbiz.qpic.cn/mmbiz_jpg/c7guRib5toJm8HaoD6FIhT1kWQmkjnMJSpcFY3Esbw7eEO0nr5FwhD7jsMcSMrWrrnvyTvwrc7icWEAuttKItGLA/640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1" alt="图片" /></p>
<p>《周易》影响了中国人的人生哲学,也深深影响了曾国藩。《周易》一个核心思想是否极泰来、泰极否来。一个人不可能一直顺利,顺利到极致的时候往往就会遇到挫折;一个人也不可能永远处于低谷,大势早晚有一天会往上走,从而帮助我们走出逆境。所以逆境之中这个“裕”字就特别重要。</p>
<p>曾国藩对“裕”这个字非常看重。他说《易经》里的需卦二爻,处险之道曰“衍”。晋卦二爻,处险之道曰“裕”。他认为“衍”和“裕”都是“宽”的意思。</p>
<p>曾国藩的手下陈湜一度发展不顺,处境艰难,他在给陈湜的信中勉励他以“宽”字自养。他说,<strong>如果能够把心放宽,调整好自己的心态,放在宽阔泰然之处,身体就不会孱弱,志气也不会颓废,然后就可以从容不迫地找到走出困境之路。</strong></p>
<p>不管外部环境如何,应该做到<strong>“将此心放得宽,养得灵,有活泼泼之胸襟,有坦荡荡之意境”</strong>。这是曾国藩希望自己和手下在困境中具备的基本心态。</p>
<p>曾国藩还曾经引用过朱熹的一段话,“人之于患难,只有一个处置。尽人谋之后,却须泰然处之”。遇到挫折、遇到困境,我们当然要尽力而为,但自己尽了所有心力以后,结果如何就已经不再是自己所能掌控的,这时候就要学会泰然、释然,接受任何结果,不要心心念念全在结果得失之中。</p>
<p>所以他讲,他自己对于所有事情都守8个字——<strong>“尽其在我,听其在天”</strong>。我该做的事情一定要尽心尽力,全力以赴,但是结果如何就要听其自然。这就是逆境中明智的做法,是坦荡的胸怀。</p>
<p><strong>这其中的核心,就是放下得失成败。如上所言,我们会焦虑、抑郁,往往是因为将得失成败看得太重。</strong></p>
<p>所以曾国藩讲,“于毁誉祸福置之度外,此是根本第一层功夫”。就是把得失成败、面子、别人的评价全部放下。“此处有定力,到处皆坦途”,这方面有了定力,一下子就柳暗花明了。</p>
<p>他的座右铭之一是“莫问收获,只问耕耘。”不要过于关注结果的成败得失,只要把该做的事情踏踏实实做好就够了。</p>
<p>“物来顺应,未来不迎,当时不杂,既过不恋。”曾国藩的这句名言相信很多朋友都知道。事情到来了发生了,那就顺势而为;没有发生的事情,不要牵挂忧虑;今天应该做的事情,要一心一意做好;已经过去的事情,不管结果如何,全部放下。</p>
<p>这样的心态可以让你静下心来实实在在地去做好眼前的每一步。<strong>未来是一个个今天组成的,只要把一个个的今天做好,自然就会有好的未来,自然就可以走出困境。</strong></p>
<p>他还曾经写过一副对联:“战战兢兢,即生时不忘地狱;坦坦荡荡,虽逆境亦畅天怀。”这副对联也写得特别好。越是顺利时,越要提醒自己小心谨慎,因为天堂和地狱只是一步之差;越是在逆境之中,反而越要坦坦荡荡,要舒畅自己的天怀,有一种宽阔的胸怀。</p>
<p>一般人在顺利的时候容易张扬,在逆境中容易抑郁。曾国藩正好相反,顺利的时候提醒自己要学会收敛,逆境中反而要学会开怀。</p>
<p>天下没有过不去的槛,没有克服不了的困难,就算是人生最艰难的时刻,我们也依然可以找到生命的乐趣。这其中的关键,就看你的是心胸与心态。</p>
<p><strong>心大了,事就小了;心小了,事自然就大了。心宽天地宽,要始终保持心境的坦荡。所以曾国藩讲“盛世创业之英雄,以襟怀豁达为第一义”。</strong></p>
<p>心胸开阔、襟怀坦荡,是英雄豪杰的共同特质,也是他们能够创业成功的基础。</p>
<p><strong>强</strong></p>
<p>第三个字是“强”。就是倔强、刚强、坚韧不拔,就是不服输的精神。</p>
<p>曾国藩非常看重“强”这个字。他说自古以来,帝王将相没有一个人不是从自立自强做起来的。所以他给弟弟写信强调,不管做事还是写文章,“倔强”二字绝不能少,否则根本成不了事。</p>
<p>他认为,他和弟弟的性格受母亲影响很大,好处就在于倔强。并且,他的祖父曾玉屏也一直教导曾家子孙“以‘懦弱无刚’四字为大耻”,要求他们“男儿自立,必须有倔强之气”。就是有一种不服输的精神。</p>
<p>曾国藩曾经回顾自己的一生经历说,他办的湘军水师,一败于靖港,再败于湖口。这些都是耻辱性的失败,但是他都咬紧牙关把局面维持了下来,而后终于迎来重振之机。</p>
<p>安庆没有合围时,祁门大营十分危急,黄德的局势也很危险。大家都建议他撤安庆之围,以支援祁门和黄德,但他咬紧牙关不撤,终于打下安庆。此战之后太平天国大势已去。</p>
<p>他还回忆道,南京也是这样,方圆百里大城,易守难攻,他却命曾国荃用一支部队把南京围起来,大家都说恐怕要重蹈清军覆辙,但他咬牙坚持,最后立大功。</p>
<p>所以他总结说,由此可见,<strong>一个人如果刚受挫折,或听到别人不切实际的议论,就心情沮丧,改变计划,那是很难成事的。</strong></p>
<p>战争中,我们通常看到的是士兵在前线厮杀,其实承受最大压力的,是战争的决策者。这种压力对于组织是真正的考验。“强”字就是强大的意志力,是一种坚持。</p>
<p>如果没有曾国藩的倔强,没有困境下依然坚持到底的意志力,很难熬过那么长时间反复拉锯一样的战争。</p>
<p>曾国藩有个幕僚叫李申夫,曾经说曾国藩有个特点,就是跟别人怄气从来不说出来,一直忍耐,然后一步步寻找自强之道,还引用了“好汉打脱牙,和血吞”这句话。</p>
<p>曾国藩说,这就是他咬牙立志的诀窍,没想到被李申夫看破了。他自己当年被京城的权贵、长沙官场、江西官场唾骂,还经历过岳州之败、靖港之败、湖口之败,“盖打脱牙之时多矣,无一次不和血吞之”。</p>
<p>他在给弟弟曾国荃的一封信中说,你来信经常怪运气不好,这不像好汉之言。他要求弟弟“唯有一字不说,咬定牙根,徐图自强”。</p>
<p>他还说过一句名言:<strong>“凡事皆有极困极难之时,打得通的,便是好汉。”</strong>做事总是会遇到极其困难的时候,你挺直了、打通了,就会脱胎换骨,就会成为真正的好汉。</p>
<p>“困心横虑,正是磨炼英雄,玉汝于成。”艰难困苦,正是上天要将你磨炼成英雄的好机会。真正的英雄从哪里来的?一步一步磨炼出来的。所以他相信,天下事只在于人如何去做,到山穷水尽时自然会有路走。<strong>一个人如果经历千磨百折,依然坚持定力,最终一定成功。</strong></p>
<p>这就是曾国藩的性格,一生如此。他有一个人生信条——“成败听之于天,毁誉听之于人。”成败、毁誉,都不是自己所能左右,能做的就是自己有定力,肯坚持。</p>
<p>他曾经跟别人开玩笑说准备写一本书叫《挺经》,“挺”的含义很多,核心含义就是要挺直了,不能趴下。他还跟别人开玩笑,说有朋友说他死了以后,皇帝应该给他一个谥号叫“文韧公”。“韧”,就是坚忍不拔。这是他对于自己性格里面最得意的地方。</p>
<p>丘吉尔人生最后一次演讲是在剑桥大学的毕业典礼上,当时他已经老得几乎说不出话,十多分钟的演讲其实就是反复在讲一句话:“Never give up!”翻译成中文,就是“永不放弃”。</p>
<p>这位老人用自己一生的经历告诉这些即将走向社会的大学生,人生的成功秘诀非常简单,就是永不放弃。</p>
<p>这也就是曾国藩讲的倔强之气、不服输的坚毅精神。所以“强”,就是看明白以后不放弃的定力,这是曾国藩能够走出逆境很重要的一个字。</p>
<p><strong>悔</strong></p>
<p>第四个字,悔。“悔”就是要反思,改过,要看清自己的错误和缺点,把逆境变成一个自我成长和组织提升的机会。</p>
<p>当年曾国荃给他写信,希望哥哥能指点人生。曾国藩回信说,扪心自问这几年为什么做得还行,靠的就是一个“悔”字,也就是自我反思反省。然后他讲,曾经自认为很了不起、无所不能,看到的都是别人的问题。</p>
<p>但是自从丁巳年、戊午年被皇帝赶回家那一年多,他大悔大悟、脱胎换骨,才明白自己没有多大本事,后来遇到问题看到的都是他人正确的方面。之后,他的心态和四十岁以前完全不同。</p>
<p>如果熟悉曾国藩的人生经历,会知道他所说的丁巳年到戊午年大悔大悟,是他一生最大的转折点。他怎么从至暗时刻走出来?除了“强”,就是“悔”。“强”是挺住,<strong>“悔”是成长,就是把逆境变成反思和成长的好机会。</strong></p>
<p>我们今天经常讲一句话:“不要浪费一场好危机”。“悔”的含义就是,千万不要辜负了你的逆境。</p>
<p>平时,组织也好、个人也好,其实都会有惰性。<strong>挑战、压力、逆境会逼着我们脱胎换骨,因为在逆境当中才能更清楚地看出自己的优势和劣势。</strong>所以,一定要把逆境和困难看作人和组织反省自我、提升自我的最好机会。</p>
<p>曾国藩给弟弟曾国荃写信说,“朱子尝言:‘悔’字如春,万物蕴蓄初发。”朱熹说过,在逆境之中要保持生机,而生机就来自于“悔”这个字。所以曾国藩勉励弟弟说,“当此艰危之际,若能以‘硬’字法冬藏之德,以‘悔’字启春生之机,庶几可挽回一二乎?”遇到逆境,要以“硬”字学会收敛,同时以“悔”字开启未来的生机。</p>
<p>“硬”其实就是前面说的“强”,所以曾国藩特别看重把“强”和“悔”两个字一起看。曾国荃有一段时间特别不顺:鲍超和刘铭传争功劳,导致湘军和淮军产生了矛盾,曾国荃和李鸿章之间也因此出现了冲突,所以曾国荃当时遇到的压力特别大。</p>
<p>曾国藩给曾国荃回信说,你现在遇到各种不顺,但是“事已如此,亦只有逆来顺受之法,仍不外‘悔’字诀、‘硬’字诀而已。”这里的“逆来顺受”不是我们通常理解的意思,而是指要坦然经受已经处于逆境的现实。</p>
<p>坦然接受是第一步,接下来要靠“悔”字诀反省自己,靠“硬”字诀坚持住,不要轻易认输。在曾国藩看来,其实这就是一个人突破自我,实现成长的关键。</p>
<p>他曾说,<strong>“圣贤之所以为圣,佛家之所以成佛,所争皆在大难磨折之日”。</strong>大难的折磨,是自我磨练、提升修养、拉开与他人距离的最好机会。</p>
<p><img src="https://mmbiz.qpic.cn/mmbiz_jpg/c7guRib5toJm8HaoD6FIhT1kWQmkjnMJSsqRTflS0WVrdzn474GluJhFPhO9F7ibO4LV3WQr9QxrA7icQiako4xLQw/640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1" alt="图片" /></p>
<p><strong>志之所向,金石为开</strong></p>
<p>耐、裕、强、悔,4个字都很重要,但还不足以解释曾国藩为什么能够走出极困极难时刻。</p>
<p>晚清朱孔彰写的《中兴将帅别传》中对曾国藩的评价是“履危濒死屡矣,有百折不挠之志”。就是说他一生遇到各种各样的危险,甚至一次次濒临死地,但是他的志向目标从来没有动摇过。</p>
<p>民国学者龙梦荪评价曾国藩,“虽极人世艰苦之境,而曾不少易其心;虽遇千挫百折之阻,亦不足以夺其志”。曾国藩这一生遍尝人间最艰苦的逆境,但是他的心从未动摇过;虽然遇到了千难百险各种阻挠,但从来没有令他改变人生志向。</p>
<p>曾国藩相信“志之所向,金石为开”。只要志向足够坚定,再坚固的金石都可以为之打开。胡林翼也讲,“兵可挫而气不可挫,气可偶挫而志不可挫”。</p>
<p>我们做企业和打仗是一个道理,<strong>暂时的失败很正常,企业总是会遇到一些问题,但是记住,士气不能受挫;即便士气偶尔受挫,这也是人之常情,但是志向绝对不能动摇。</strong></p>
<p>上面这4段话,最核心的一个字是什么?是“志”。这是曾国藩走出极困极难时刻最核心的东西。前面我们讲过“强”,“强”不单是性格,更主要的是一种信念。所谓的“志”,就是清晰的人生与组织目标,以及对信念和志向的执着与坚持。</p>
<p><strong>什么叫信念?相信正面的理念一定实现,相信困难和挫折都是暂时的。</strong>曾国藩为什么历经困难不放弃?因为在他看来,他的志向、事业早晚会成功,他深信不疑。</p>
<p>遇到困难时,信念可以充分激发出人在精神层面的力量,使人在挫折之中依然坚持自己的信念,在绝望之中依然相信自己的相信,而且能够把信心传递给组织的每个成员。</p>
<p>事实上,你的信念越坚定,你就越不畏惧更大的逆境,你承受挫折的能力就越强。曾国藩具有强大的心性和意志,背后是他坚定的信念。这是帮助曾国藩走出极困极难时刻最关键的因素。</p>
<p>尼克松在《领导人》这本书里曾经讲过一句话,“一个人要能够经受住领导人必须经受的艰难痛苦,他就非得相信自己的事业不可。他必须相信自己,否则就不能说服别人相信他”。</p>
<p>我想,这是对于所有处于逆境中的领导者来讲最好的提醒。</p>
<p>最后做个总结,曾国藩如何走出了极困极难时刻?</p>
<p><strong>一,“耐”,耐烦;</strong></p>
<p><strong>二,“裕”,宽裕,坦荡的胸怀,得失成败,学会放下;</strong></p>
<p><strong>三,“强”,倔强,不服输的精神,打脱牙和血吞;</strong></p>
<p><strong>四,“悔”,反思、反省;</strong></p>
<p><strong>五,最核心的,是“志”,也就是清晰的目标与信念。</strong></p>
<p>信念是其他4条策略的力量来源,如果没有信念,其他4条只能局限在“术”的层面,不可能真正让你走过极困极难的至暗时刻。而好的领导者,即使是在最黑暗的时刻,也会眼中有光。</p>
<p>这是曾国藩的一生所能给今天的我们的最大启发。</p>MinSongTao目前,个体与企业挑战来源于疫情、市场、国际格局变化等诸方面。怎么度过这样极其困难的时刻?希望曾国藩的经历能够给大家提供一些启发。落日微风2022-08-17T00:00:00+08:002022-08-17T00:00:00+08:00http://minsongtao.com/2022/08/17/%E6%AF%8F%E6%97%A5%E4%B8%80%E6%AD%8C%20%E8%90%BD%E6%97%A5%E5%BE%AE%E9%A3%8E<audio controls="controls" autoplay="autoplay" playsinline="" webkit-playsinline="">
<source src="https://link.hhtjim.com/163/1900247879.mp3" type="audio/mpeg" />
</audio>
<h2 id="歌词">歌词</h2>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>作词:琴路漫漫
作曲:白羽淇
演唱:张德伊玲
OP:海鸟喂鱼
出品:网易飓风
看晨曦吻大地 看落日寻天际
思念藏匿云翳 借微风拥抱你
山河湖屿 花鸟虫鱼 万物相遇
奔向你 不惧季节更替
看长空拥云翼 看碧海涌潮汐
思念倒映海底 潜行在你心里
星芒萤火 鲸吟海啸 万物叹息
追寻着 不负你流光化羽
飞鸟访遍了四季
只为自由的栖息
我在人海 寻寻觅觅
辗辗转转 只为遇见你
鲸鱼游遍了海域
爱上蓝色的神秘
我在人群 欢欢喜喜
只因有了你
你是我 挥之不去的梦呓
也是我 爱不释手的甜蜜
看晨曦吻大地 看落日寻天际
思念藏匿云翳 借微风拥抱你
山河湖屿 花鸟虫鱼 万物相遇
奔向你 不惧季节更替
看长空拥云翼 看碧海涌潮汐
思念倒映海底 潜行在你心里
星芒萤火 鲸吟海啸 万物叹息
追寻着 不负你流光化羽
飞鸟访遍了四季
只为自由的栖息
我在人海 寻寻觅觅
辗辗转转 只为遇见你
鲸鱼游遍了海域
爱上蓝色的神秘
我在人群 欢欢喜喜
只因有了你
你是我 挥之不去的梦呓
也是我 爱不释手的甜蜜
看晨曦吻大地 看落日寻天际
思念藏匿云翳 借微风拥抱你
山河湖屿 花鸟虫鱼 万物相遇
奔向你 不惧季节更替
看长空拥云翼 看碧海涌潮汐
思念倒映海底 潜行在你心里
星芒萤火 鲸吟海啸 万物叹息
追寻着 不负你流光化羽
编曲:张国杭
吉他:潘春宇
和声:白荼
混音/母带:吴润林
统筹:黄伟
制作人:孙斌@子文沐凡
</code></pre></div></div>MinSongTao领导力2022-06-26T00:00:00+08:002022-06-26T00:00:00+08:00http://minsongtao.com/2022/06/26/%E5%A6%82%E4%BD%95%E5%9F%B9%E5%85%BB%E9%A2%86%E5%AF%BC%E5%8A%9B<p>美国一个创业者总结了如何培养领导力,我觉得说得很好。按照下面的四个阶段,就能让自己成为一个优秀的领导者。</p>
<h2 id="熟悉自己的业务知道问题在哪里怎样可以解决">熟悉自己的业务,知道问题在哪里,怎样可以解决</h2>
<p>领导者是给大家指方向的,你必须先知道要走哪个方向,才能带领别人,这是领导力的基础。</p>
<h2 id="培养说服能力能说服他人问题可以按照你说的方式解决">培养说服能力,能说服他人,问题可以按照你说的方式解决</h2>
<p>领导力的表现是,他人愿意服从你。这不能都靠制度压服,而要让他人真心觉得你是对的。如果你可以让他人相信你,你就可以领导。</p>
<h2 id="激发他人的热情让他们产生解决问题的热情">激发他人的热情,让他们产生解决问题的热情</h2>
<p>说服他人的更高境界,是让他们真正投身进来,自觉发挥自己的潜力,全力以赴解决需要解决的问题。好的领导和差的领导,区别就在于能否激励下级,让每个人都知道自己的职责,努力工作</p>
<h2 id="你培养其他人的领导能力">你培养其他人的领导能力</h2>
<p>如果你离开,团队也能正常运作下去,说明一切已经制度化了,你的领导已经成功了。这时,你可以让其他人接管团队,自己去实现下一个目标</p>MinSongTao美国一个创业者总结了如何培养领导力,我觉得说得很好。按照下面的四个阶段,就能让自己成为一个优秀的领导者。图论2021-10-16T00:00:00+08:002021-10-16T00:00:00+08:00http://minsongtao.com/2021/10/16/%E5%9B%BE%E8%AE%BA<h3 id="图论">图论</h3>
<h4 id="七桥问题">七桥问题</h4>
<p>有一条河穿过,河上有两个小岛,有七座桥把两个岛与河岸联系起来(如概述图)。有个人提出一个问题:一个步行者怎样才能不重复、不遗漏地一次走完七</p>
<p>座桥,最后回到出发点?</p>
<p><img src="https://img-blog.csdn.net/20180904225935815?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMTMzMTM1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" alt="这里写图片描述" /></p>
<p>偶数边节点等效为如下一进一出的两条边节点</p>
<p><img src="https://img-blog.csdn.net/20180904223959445?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMTMzMTM1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" alt="这里写图片描述" /></p>
<p>该节点必然是一笔画的<code class="language-plaintext highlighter-rouge">起点</code>(右图形式)或者<code class="language-plaintext highlighter-rouge">终点</code>(左图形式)</p>
<p><img src="https://img-blog.csdn.net/20180904224437296?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMTMzMTM1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" alt="这里写图片描述这里写图片描述" /></p>
<p><img src="https://img-blog.csdn.net/20180904225804940?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMTMzMTM1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" alt="这里写图片描述" /></p>
<p><code class="language-plaintext highlighter-rouge">A、C、D、B节点均为奇数边</code>
故等效为4个起始点,而一个<code class="language-plaintext highlighter-rouge">一笔画的图最多只能有两个起始点</code>。</p>
<p>PS:若要求一笔画的终点和起点重合, 全为偶数边`,这就是十分显然的了</p>
<h4 id="图的表示分为两块">图的表示分为两块</h4>
<p>1、节点</p>
<p>2、边</p>
<p>对于任意某条边,以边e1为例:</p>
<blockquote>
</blockquote>
<p><img src="https://img-blog.csdn.net/20180904231631504?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMTMzMTM1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" alt="这里写图片描述" /></p>
<p>由于任意边节点只有两个,我们不妨记为</p>
<blockquote>
<p><img src="https://img-blog.csdn.net/2018090423172334?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMTMzMTM1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" alt="这里写图片描述" /></p>
</blockquote>
<p><img src="https://img-blog.csdn.net/2018090423132222?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMTMzMTM1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" alt="这里写图片描述" /></p>
<p>以节点\边 的矩阵表示:</p>
<table>
<thead>
<tr>
<th>\</th>
<th>e1</th>
<th>e2</th>
<th>e3</th>
<th>e4</th>
<th>e5</th>
<th>e6</th>
<th>e7</th>
</tr>
</thead>
<tbody>
<tr>
<td>V1</td>
<td>1</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>0</td>
<td>0</td>
<td>1</td>
</tr>
<tr>
<td>V2</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td>V3</td>
<td>0</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>0</td>
</tr>
<tr>
<td>V4</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>1</td>
<td>1</td>
</tr>
</tbody>
</table>
<p><img src="https://img-blog.csdn.net/20180905111831161?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMTMzMTM1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" alt="这里写图片描述" /></p>
<p>FROM/TO 方向矩阵表示:</p>
<table>
<thead>
<tr>
<th>\</th>
<th>V1</th>
<th>V2</th>
<th>V3</th>
<th>V4</th>
</tr>
</thead>
<tbody>
<tr>
<td>V1</td>
<td>0</td>
<td>1</td>
<td>1</td>
<td>0</td>
</tr>
<tr>
<td>V2</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>0</td>
</tr>
<tr>
<td>V3</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>1</td>
</tr>
<tr>
<td>V4</td>
<td>1</td>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
</tbody>
</table>
<h4 id="实际问题">实际问题</h4>
<p>拣货问题:</p>
<p>下图显示了2条走廊,每个走廊有5个搁板/拾取点。 在此,所有架子都表示为图中的节点,地址范围为1-10。 箭头指示允许的行驶方向,双箭头指示您可以两种方式行驶。 很简单,对不对?1->9 最近的路线?</p>
<p><img src="https://img-service.csdnimg.cn/img_convert/ad05cf8f3815e38d7e980966ec20489b.png" alt="Image for post" /></p>
<p><img src="https://img-service.csdnimg.cn/img_convert/3c2f437c4b60044dd283a80c58da0f54.png" alt="Image for post" /></p>MinSongTao图论