95 lines
45 KiB
JavaScript
95 lines
45 KiB
JavaScript
import{_ as p}from"./chunks/ArticleMetadata.Sb1DYAHo.js";import{_ as k,D as e,o as n,c as r,I as d,w as g,k as t,a as A,R as y,b as D,e as o}from"./chunks/framework.FVQzxbLi.js";import"./chunks/md5.RtphNWHi.js";const c="/assets/202012252222518.NuHgzb-4.png",C="/assets/202012252222738.C7DVlB95.png",F="/assets/202012252222812.iiofTbtP.png",B="/assets/202012252223067.opMNs8lD.png",E="/assets/202012252223708.IWGOIhc6.png",N=JSON.parse('{"title":"快速入门","description":"","frontmatter":{"title":"快速入门","author":"查尔斯","date":"2020/12/25 14:49","categories":["MyBatis快速入门"],"tags":["MyBatis","ORM框架"]},"headers":[],"relativePath":"courses/mybatis/01-MyBatis基础/01-快速入门.md","filePath":"courses/mybatis/01-MyBatis基础/01-快速入门.md","lastUpdated":1660404656000}'),m={name:"courses/mybatis/01-MyBatis基础/01-快速入门.md"},u=t("h1",{id:"快速入门",tabindex:"-1"},[A("快速入门 "),t("a",{class:"header-anchor",href:"#快速入门","aria-label":'Permalink to "快速入门"'},"")],-1),b=y('<p>我们将通过一个简单的 Demo 来阐述 MyBatis 的强大功能,在此之前,笔者假设你已经:</p><ul><li>拥有 Java 开发环境以及相应 IDE(本 Demo 采用 Eclipse 作为IDE)</li><li>熟悉 Java Web 开发流程</li><li>熟悉至少一个关系型数据库(本 Demo 采用 MySQL 作为数据库)</li></ul><h2 id="数据库准备" tabindex="-1">数据库准备 <a class="header-anchor" href="#数据库准备" aria-label="Permalink to "数据库准备""></a></h2><p>现有一张 <code>User</code> 表,其表结构如下:</p><table><thead><tr><th style="text-align:center;">主键</th><th style="text-align:center;">姓名</th><th style="text-align:center;">年龄</th><th style="text-align:center;">邮箱</th></tr></thead><tbody><tr><td style="text-align:center;">1</td><td style="text-align:center;">Jone</td><td style="text-align:center;">18</td><td style="text-align:center;"><a href="mailto:Jone@126.com" target="_blank" rel="noreferrer">Jone@126.com</a></td></tr><tr><td style="text-align:center;">2</td><td style="text-align:center;">Jack</td><td style="text-align:center;">20</td><td style="text-align:center;"><a href="mailto:Jack@126.com" target="_blank" rel="noreferrer">Jack@126.com</a></td></tr><tr><td style="text-align:center;">3</td><td style="text-align:center;">Tom</td><td style="text-align:center;">28</td><td style="text-align:center;"><a href="mailto:Tom@126.com" target="_blank" rel="noreferrer">Tom@126.com</a></td></tr><tr><td style="text-align:center;">4</td><td style="text-align:center;">Sandy</td><td style="text-align:center;">21</td><td style="text-align:center;"><a href="mailto:Sandy@126.com" target="_blank" rel="noreferrer">Sandy@126.com</a></td></tr><tr><td style="text-align:center;">5</td><td style="text-align:center;">Billie</td><td style="text-align:center;">24</td><td style="text-align:center;"><a href="mailto:Billie@126.com" target="_blank" rel="noreferrer">Billie@126.com</a></td></tr></tbody></table><p>其对应的数据库 结构 脚本如下:</p><div class="language-sql vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki shiki-themes github-light github-dark-dimmed vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;">-- 创建并切换数据库</span></span>\n<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">CREATE</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> DATABASE</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;"> mybatis_demo_db</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">;</span></span>\n<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">USE</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> mybatis_demo_db;</span></span>\n<span class="line"></span>\n<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;">-- 创建用户数据表</span></span>\n<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">CREATE</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> TABLE</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> `</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;">user</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">` (</span></span>\n<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;"> `id`</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> bigint</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">20</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">NOT NULL</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> AUTO_INCREMENT COMMENT </span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">'主键ID'</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">,</span></span>\n<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;"> `name`</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> varchar</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">30</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">CHARACTER</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> SET</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> utf8 </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">COLLATE</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> utf8_general_ci </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">NULL</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> DEFAULT</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> NULL</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> COMMENT </span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">'姓名'</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">,</span></span>\n<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;"> `age`</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> int</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">11</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">NULL</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> DEFAULT</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> NULL</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> COMMENT </span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">'年龄'</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">,</span></span>\n<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;"> `email`</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> varchar</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">50</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">CHARACTER</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> SET</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> utf8 </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">COLLATE</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> utf8_general_ci </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">NULL</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> DEFAULT</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> NULL</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> COMMENT </span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">'邮箱'</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">,</span></span>\n<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> PRIMARY KEY</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> (</span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">`id`</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">USING</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> BTREE</span></span>\n<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">) ENGINE </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> InnoDB AUTO_INCREMENT </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;"> 1</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> CHARACTER</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> SET</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> utf8 </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">COLLATE</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> utf8_general_ci COMMENT </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;"> '用户表'</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> ROW_FORMAT </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Compact;</span></span></code></pre></div><p>其对应的数据库 数据 脚本如下:</p><div class="language-sql vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki shiki-themes github-light github-dark-dimmed vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;">-- 清空用户表数据</span></span>\n<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">TRUNCATE</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> TABLE</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> user;</span></span>\n<span class="line"></span>\n<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;">-- 向用户表插入测试数据</span></span>\n<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">INSERT INTO</span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;"> `user`</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> VALUES</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> (</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">1</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">'Jone'</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">18</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">'Jone@126.com'</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">);</span></span>\n<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">INSERT INTO</span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;"> `user`</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> VALUES</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> (</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">2</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">'Jack'</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">20</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">'Jack@126.com'</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">);</span></span>\n<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">INSERT INTO</span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;"> `user`</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> VALUES</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> (</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">3</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">'Tom'</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">28</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">'Tom@126.com'</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">);</span></span>\n<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">INSERT INTO</span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;"> `user`</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> VALUES</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> (</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">4</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">'Sandy'</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">21</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">'Sandy@126.com'</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">);</span></span>\n<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">INSERT INTO</span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;"> `user`</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> VALUES</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> (</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">5</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">'Billie'</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;">24</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">'Billie@126.com'</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">);</span></span></code></pre></div><h2 id="下载依赖" tabindex="-1">下载依赖 <a class="header-anchor" href="#下载依赖" aria-label="Permalink to "下载依赖""></a></h2><p>要使用 MyBatis 框架,第一步就是下载好 MyBatis 的 jar 包,我们可以从 <a href="https://github.com/mybatis/mybatis-3/releases" target="_blank" rel="noreferrer">MyBatis</a> 在 GitHub 上的开源地址下载。</p><p><img src="'+c+'" alt="202012252222518"></p><p>笔者下载了 MyBatis 的核心压缩包(mybatis-x.x.x.zip)及其源码包(mybatis-x-mybatis-x.x.x.zip)。</p><p><img src="'+C+'" alt="202012252222738"></p><p>解压开 <strong>mybatis-3.5.6.zip</strong> 压缩包,目录结构如下:</p><p><img src="'+F+'" alt="202012252222812"></p><div class="tip custom-block"><p class="custom-block-title">笔者说</p><p>如果 GitHub 下载太慢,可以前往 <a href="https://hub.fastgit.org/mybatis/mybatis-3/releases/tag/mybatis-3.5.6" target="_blank" rel="noreferrer">FastGit</a> 进行下载,它是 GitHub 的镜像地址,网站界面等各方面与 GitHub 几乎一模一样。 但是注意它仅仅是一个镜像网站,可以用于克隆或下载 GitHub 资源,但登录之类的功能是不可用的。</p></div><h2 id="创建项目" tabindex="-1">创建项目 <a class="header-anchor" href="#创建项目" aria-label="Permalink to "创建项目""></a></h2><p>下载好依赖之后,我们通过 Eclipse,创建一个动态 Web 项目,并将刚才下载的 jar 包和指定数据库驱动包添加到 WebConent\\WEB-INF\\lib 目录,效果如下:</p><p><img src="'+B+`" alt="202012252223067"></p><div class="tip custom-block"><p class="custom-block-title">笔者说</p><p>本次我们不会使用到 Servlet API,所以创建一个普通 Java 工程也没问题。</p></div><h2 id="创建pojo类" tabindex="-1">创建POJO类 <a class="header-anchor" href="#创建pojo类" aria-label="Permalink to "创建POJO类""></a></h2><p>在 DAO 模式开发中,第一步就是要创建实体类,而在 MyBatis 项目中,实体类"弱化"为了 POJO,这种类型是专门用于和数据库做映射的 Java 类型,数据表中的列与 POJO 类型的属性一 一对应。</p><div class="language-java vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki shiki-themes github-light github-dark-dimmed vp-code"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">package</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> com.example.pojo;</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;">/**</span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> * 用户POJO类(它是Java和关系数据库表映射的类型)</span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> * </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">@author</span><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> Charles7c</span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> */</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">public</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> class</span><span style="--shiki-light:#6F42C1;--shiki-dark:#F69D50;"> User</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> {</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> private</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Long</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> id;</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> private</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> String</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> name;</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> private</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Integer</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> age;</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> private</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> String</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> email;</span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> // 省略getter/setter方法</span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> // 省略toString方法</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">}</span></span></code></pre></div><div class="tip custom-block"><p class="custom-block-title">笔者说</p><p>POJO(Plain Old Java Objects,普通老式 Java 对象)。一般来讲,将 POJO 简单理解为实体类也无伤大雅。</p></div><h2 id="创建sql映射文件" tabindex="-1">创建SQL映射文件 <a class="header-anchor" href="#创建sql映射文件" aria-label="Permalink to "创建SQL映射文件""></a></h2><p>在 DAO 模式开发中,实体类创建完之后就是要编写 BaseDao、以及不同实体的 Dao 接口和 Dao 实现类。但这一切的繁琐过程,在现在都被 MyBatis 解决了。</p><p>现在,我们只需要按照 MyBatis 的要求创建好一个编写 SQL 的映射文件,在映射文件中编写好数据库的 CRUD 操作即可。</p><div class="language-xml vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">xml</span><pre class="shiki shiki-themes github-light github-dark-dimmed vp-code"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"><?</span><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;">xml</span><span style="--shiki-light:#6F42C1;--shiki-dark:#6CB6FF;"> version</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">"1.0"</span><span style="--shiki-light:#6F42C1;--shiki-dark:#6CB6FF;"> encoding</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">"UTF-8"</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">?></span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"><!</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">DOCTYPE</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;"> mapper</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">"http://mybatis.org/dtd/mybatis-3-mapper.dtd"></span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"><!-- namespace:命名空间,在同一个项目中保持唯一 --></span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"><</span><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;">mapper</span><span style="--shiki-light:#6F42C1;--shiki-dark:#6CB6FF;"> namespace</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">"userMapper"</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">></span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> <!-- SQL 操作(根据 CRUD 的不同选择不同的标签编写 SQL 操作)</span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> id:SQL 操作标识</span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> resultType: 结果集类型(全类名)</span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> 下方设定等价于编写了一个方法:List<User> selectList();</span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> --></span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> <</span><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;">select</span><span style="--shiki-light:#6F42C1;--shiki-dark:#6CB6FF;"> id</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">"selectList"</span><span style="--shiki-light:#6F42C1;--shiki-dark:#6CB6FF;"> resultType</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">"com.example.pojo.User"</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">></span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> SELECT * FROM \`user\`</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> </</span><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;">select</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">></span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"></</span><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;">mapper</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">></span></span></code></pre></div><div class="tip custom-block"><p class="custom-block-title">笔者说</p><p>SQL 映射文件的命名风格为:POJO类名Mapper.xml,就像命名以前的 Dao接口 一样,你可以将 SQL 映射文件理解为是以前的 Dao 实现类。</p></div><h2 id="创建核心配置文件" tabindex="-1">创建核心配置文件 <a class="header-anchor" href="#创建核心配置文件" aria-label="Permalink to "创建核心配置文件""></a></h2><p>MyBatis 为我们简化了非常多的操作,但是一些必须由我们自定义的配置还是少不了的。在 classpath 下创建一个核心配置文件命名为:<code>mybatis-config.xml</code>。</p><div class="language-xml vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">xml</span><pre class="shiki shiki-themes github-light github-dark-dimmed vp-code"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"><?</span><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;">xml</span><span style="--shiki-light:#6F42C1;--shiki-dark:#6CB6FF;"> version</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">"1.0"</span><span style="--shiki-light:#6F42C1;--shiki-dark:#6CB6FF;"> encoding</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">"UTF-8"</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">?></span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"><!</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">DOCTYPE</span><span style="--shiki-light:#005CC5;--shiki-dark:#6CB6FF;"> configuration</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">PUBLIC "-//mybatis.org//DTD Config 3.0//EN"</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">"http://mybatis.org/dtd/mybatis-3-config.dtd"></span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"><</span><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;">configuration</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">></span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> <!-- 环境配置:</span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> 可以配置多个,但生效的只有一个</span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> default属性:指定生效的环境的id</span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> --></span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> <</span><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;">environments</span><span style="--shiki-light:#6F42C1;--shiki-dark:#6CB6FF;"> default</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">"develop"</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">></span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> <!-- 单个环境配置 --></span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> <</span><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;">environment</span><span style="--shiki-light:#6F42C1;--shiki-dark:#6CB6FF;"> id</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">"develop"</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">></span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> <!-- 事务管理配置 --></span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> <</span><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;">transactionManager</span><span style="--shiki-light:#6F42C1;--shiki-dark:#6CB6FF;"> type</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">"JDBC"</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">/></span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> <!-- 数据源配置 --></span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> <</span><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;">dataSource</span><span style="--shiki-light:#6F42C1;--shiki-dark:#6CB6FF;"> type</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">"POOLED"</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">></span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> <</span><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;">property</span><span style="--shiki-light:#6F42C1;--shiki-dark:#6CB6FF;"> name</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">"driver"</span><span style="--shiki-light:#6F42C1;--shiki-dark:#6CB6FF;"> value</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">"com.mysql.jdbc.Driver"</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">/></span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> <</span><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;">property</span><span style="--shiki-light:#6F42C1;--shiki-dark:#6CB6FF;"> name</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">"url"</span><span style="--shiki-light:#6F42C1;--shiki-dark:#6CB6FF;"> value</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">"jdbc:mysql://localhost:3306/mybatis_demo_db"</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">/></span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> <</span><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;">property</span><span style="--shiki-light:#6F42C1;--shiki-dark:#6CB6FF;"> name</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">"username"</span><span style="--shiki-light:#6F42C1;--shiki-dark:#6CB6FF;"> value</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">"root"</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">/></span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> <</span><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;">property</span><span style="--shiki-light:#6F42C1;--shiki-dark:#6CB6FF;"> name</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">"password"</span><span style="--shiki-light:#6F42C1;--shiki-dark:#6CB6FF;"> value</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">"root"</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">/></span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> </</span><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;">dataSource</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">></span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> </</span><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;">environment</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">></span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> </</span><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;">environments</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">></span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> </span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> <!-- 指定要加载的SQL映射文件 --></span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> <</span><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;">mappers</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">></span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> <!-- 注意:该地址不是全类名!!! --></span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> <</span><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;">mapper</span><span style="--shiki-light:#6F42C1;--shiki-dark:#6CB6FF;"> resource</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">"com/example/mapper/UserMapper.xml"</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">/></span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> </</span><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;">mappers</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">></span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"></</span><span style="--shiki-light:#22863A;--shiki-dark:#8DDB8C;">configuration</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">></span></span></code></pre></div><h2 id="添加日志配置文件" tabindex="-1">添加日志配置文件 <a class="header-anchor" href="#添加日志配置文件" aria-label="Permalink to "添加日志配置文件""></a></h2><p>在 MyBatis 中,采用的日志框架是 log4j,所以为了能够查看到日志输出,我们需要在 classpath 下添加一个 log4j.properties 文件。</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark-dimmed vp-code"><code><span class="line"><span>###############################################################</span></span>
|
||
<span class="line"><span># 输出到控制台 #</span></span>
|
||
<span class="line"><span>###############################################################</span></span>
|
||
<span class="line"><span># log4j.rootLogger日志输出类别和级别:只输出不低于该级别的日志信息DEBUG < INFO < WARN < ERROR < FATAL</span></span>
|
||
<span class="line"><span># DEBUG:日志级别 CONSOLE:输出位置自己定义的一个名字</span></span>
|
||
<span class="line"><span>log4j.rootLogger=DEBUG,CONSOLE</span></span>
|
||
<span class="line"><span># 配置CONSOLE输出到控制台</span></span>
|
||
<span class="line"><span>log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender </span></span>
|
||
<span class="line"><span># 配置CONSOLE设置为自定义布局模式</span></span>
|
||
<span class="line"><span>log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout </span></span>
|
||
<span class="line"><span># 配置CONSOLE日志的输出格式 [demo] 2019-08-22 22:52:12,000 %r耗费毫秒数 %p日志的优先级 %t线程名 %C所属类名通常为全类名 %L代码中的行号 %x线程相关联的NDC %m日志 %n换行</span></span>
|
||
<span class="line"><span>log4j.appender.CONSOLE.layout.ConversionPattern=[demo] %d{yyyy-MM-dd HH:mm:ss,SSS} - %-4r %-5p [%t] %C:%L %x - %m%n</span></span></code></pre></div><h2 id="测试" tabindex="-1">测试 <a class="header-anchor" href="#测试" aria-label="Permalink to "测试""></a></h2><p>当一切准备好之后,完整的项目目录结构如下:</p><p><img src="`+E+`" alt="202012252223708"></p><p>创建好一个单元测试类,测试一下:</p><div class="language-java vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki shiki-themes github-light github-dark-dimmed vp-code"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">class</span><span style="--shiki-light:#6F42C1;--shiki-dark:#F69D50;"> TestMyBatis</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> {</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> @</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">Test</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> void</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;"> testSelectList</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">throws</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> IOException {</span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> // 1.从classpath加载核心配置文件,构建SqlSession工厂对象</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> InputStream</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> is</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> Resources.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;">getResourceAsStream</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">"mybatis-config.xml"</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">);</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> SqlSessionFactory</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> sqlSessionFactory</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> new</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;"> SqlSessionFactoryBuilder</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">().</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;">build</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(is);</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> </span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> // 2.获取SqlSession对象</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> try</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> (SqlSession</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> sqlSession</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> sqlSessionFactory.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;">openSession</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">()){</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> </span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> // 3.执行SQL语句 根据要执行的SQL语句选择合适的API</span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> // p1:SQL语句唯一地址 (SQL映射文件的namespace值.SQL语句的id值)</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> List</span><span style="--shiki-light:#24292E;--shiki-dark:#F69D50;"><</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">User</span><span style="--shiki-light:#24292E;--shiki-dark:#F69D50;">> </span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">userList</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> sqlSession.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;">selectList</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#96D0FF;">"userMapper.selectList"</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">);</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> </span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#768390;"> // 4.遍历数据</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> userList.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;">forEach</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">(System.out</span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">::</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">println);</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F47067;">catch</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> (Exception </span><span style="--shiki-light:#E36209;--shiki-dark:#F69D50;">e</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">) {</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> e.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#DCBDFB;">printStackTrace</span><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">();</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> }</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;"> }</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ADBAC7;">}</span></span></code></pre></div><p><strong>控制台输出:</strong></p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark-dimmed vp-code"><code><span class="line"><span>User [id=1, name=Jone, age=18, email=Jone@126.com]</span></span>
|
||
<span class="line"><span>User [id=2, name=Jack, age=20, email=Jack@126.com]</span></span>
|
||
<span class="line"><span>User [id=3, name=Tom, age=28, email=Tom@126.com]</span></span>
|
||
<span class="line"><span>User [id=4, name=Sandy, age=21, email=Sandy@126.com]</span></span>
|
||
<span class="line"><span>User [id=5, name=Billie, age=24, email=Billie@126.com]</span></span></code></pre></div><h2 id="后记" tabindex="-1">后记 <a class="header-anchor" href="#后记" aria-label="Permalink to "后记""></a></h2><p><strong>C:</strong> 好了,与 MyBatis 的第一次约会结束了。怎么样?约会体验如何?使用步骤是不是还挺简单的?</p><p>虽然是在学习一个新技术,但是一定要时刻想想当初 DAO 模式你是怎么一个开发步骤,这样对比着会发现 MyBatis 就是在简化、优化原来的每个环节而已。根本上还是那么回事,多想想,脑子里就能留下使用思路。</p><div class="info custom-block"><p class="custom-block-title">笔者说</p><p>对于技术的学习,笔者一贯遵循的步骤是:先用最最简单的 demo 让它跑起来,然后学学它的最最常用 API 和 配置让自己能用起来,最后熟练使用的基础上,在空闲时尝试阅读它的源码让自己能够洞彻它的运行机制,部分问题出现的原因,同时借鉴这些技术实现来提升自己的代码高度。</p><p>所以在笔者的文章中,前期基本都是小白文,仅仅穿插很少量的源码研究。当然等小白文更新多了,你们还依然喜欢,后期会不定时专门对部分技术的源码进行解析。</p></div>`,47);function q(s,v,S,L,_,T){const l=p,h=e("ClientOnly");return n(),r("div",null,[u,d(h,null,{default:g(()=>{var i,a;return[(((i=s.$frontmatter)==null?void 0:i.aside)??!0)&&(((a=s.$frontmatter)==null?void 0:a.showArticleMetadata)??!0)?(n(),D(l,{key:0,article:s.$frontmatter},null,8,["article"])):o("",!0)]}),_:1}),b])}const M=k(m,[["render",q]]);export{N as __pageData,M as default};
|