-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
587 lines (389 loc) · 99 KB
/
index.html
File metadata and controls
587 lines (389 loc) · 99 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
<!DOCTYPE html>
<html>
<head><meta name="generator" content="Hexo 3.9.0">
<meta charset="utf-8">
<title>an9527@aliyun.com</title>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta name="keywords" content="basecommon.cn">
<meta property="og:type" content="website">
<meta property="og:title" content="an9527@aliyun.com">
<meta property="og:url" content="http://yoursite.com/index.html">
<meta property="og:site_name" content="an9527@aliyun.com">
<meta property="og:locale" content="zh-tw">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="an9527@aliyun.com">
<link rel="icon" href="/favicon.png">
<link href="//fonts.googleapis.com/css?family=Source+Code+Pro" rel="stylesheet" type="text/css">
<link rel="stylesheet" href="/css/style.css">
</head>
</html>
<body>
<div id="container">
<div id="wrap">
<header id="header">
<div id="banner"></div>
<div id="header-outer" class="outer">
<div id="header-title" class="inner">
<h1 id="logo-wrap">
<a href="/" id="logo">an9527@aliyun.com</a>
</h1>
<h2 id="subtitle-wrap">
<a href="/" id="subtitle">鄙人邮箱欢迎骚扰</a>
</h2>
</div>
<div id="header-inner" class="inner">
<nav id="main-nav">
<a id="main-nav-toggle" class="nav-icon"></a>
<a class="main-nav-link" href="/">Home</a>
<a class="main-nav-link" href="/archives">Archives</a>
</nav>
<nav id="sub-nav">
<a id="nav-search-btn" class="nav-icon" title="Search"></a>
</nav>
<div id="search-form-wrap">
<form action="//google.com/search" method="get" accept-charset="UTF-8" class="search-form"><input type="search" name="q" class="search-form-input" placeholder="Search"><button type="submit" class="search-form-submit"></button><input type="hidden" name="sitesearch" value="http://yoursite.com"></form>
</div>
</div>
</div>
</header>
<div class="outer">
<section id="main">
<article id="spring-cloud与dubbo的区别详解" class="article article-type-spring" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2019/09/18/cloud与dubbo的区别详解/" class="article-date">
<time datetime="2019-09-18T12:51:48.000Z" itemprop="datePublished">2019-09-18</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2019/09/18/cloud与dubbo的区别详解/">Springcloud与dubbo的区别详解</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<p>面试问到的关于spring cloud理解和spring cloud与dubbo的区别详解<br>今天下午面试被问到这个问题,当时没答上来,毕竟之前工作也都只是简单的使用,并没有真正去了解过两个之间的区别<br>晚上自己查了一些文档,有点感悟在这里写一下<br>首先两个都是国内比较火的微服务架构<br>先介绍一下微服务<br><strong>微服务架构是一种架构模式,它将单一应用程序划分成一组小的服务,服务之间互相配合,达到最终的目的</strong></p>
<p>优点是可以将繁杂的代码堆分解,每一个微服务实现单一的功能,并通过接口与其他服务沟通合作<br>每个微服务之间相互独立部署技术使用更加灵活<br>这里先介绍一下我比较熟悉的spring cloud ,它基于Spring Boot实现各种功能</p>
<h3 id="核心为以下五个"><a href="#核心为以下五个" class="headerlink" title="核心为以下五个"></a>核心为以下五个</h3><h4 id="1-Eureka-注册中心——Netflix-Eureka-功能类似于dubbo的注册中心,比如zookeeper。"><a href="#1-Eureka-注册中心——Netflix-Eureka-功能类似于dubbo的注册中心,比如zookeeper。" class="headerlink" title="1.Eureka 注册中心——Netflix Eureka 功能类似于dubbo的注册中心,比如zookeeper。"></a>1.Eureka 注册中心——Netflix Eureka 功能类似于dubbo的注册中心,比如zookeeper。</h4><p>eureka是一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移。服务注册与发现对于微服务架构来说是非常重要的,有了服务发现和注册,只需要使用服务的标识符,就可以访问到服务,而不需要修改服务<br>Eureka server提供服务注册和发现.<br> Eureka Server提供服务注册服务。各个服务提供者节点启动后,会在Eureka Server中进行注册,这样Eureka server中的服务存储可用信息并且可以直观的看到.<br>Service Provider服务提供方将自身服务注册到Eureka,从而使服务消费方能够找到。<br>Service Consumer服务消费方从Eureka获取注册服务列表,从而能够消费服务。</p>
<h4 id="2-客服端负载均衡——Netflix-Ribbon-Feign"><a href="#2-客服端负载均衡——Netflix-Ribbon-Feign" class="headerlink" title="2.客服端负载均衡——Netflix Ribbon/Feign"></a>2.客服端负载均衡——Netflix Ribbon/Feign</h4><p>为了提供并发量,有时同一个服务提供者可以部署多个。这个客户端在调用时要根据一定的负责均衡策略完成负载调用。<br>Ribbon是Netflix发布的云中间层服务开源项目,主要功能是提供客户端负载均衡算法。Ribbon客户端组件提供一系列完善的配置项,如,连接超时,重试等。<br> 比如今天面试就问到了连接超时时间<br> 负载均衡算法最常用的有随机RandomRule和轮询RoundRobinRule两种<br> 代码网上有很多就不一一列出<br> Feign是一个声明式的Web Service客户端,它的目的就是让Web Service调用更加简单,相当于在Ribbon的基础上继续封装了一层,类似于springmvc在servlet的基础上做了一层封装<br> 它 提供了HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义好HTTP请求的参数、格式、地址等信息。会完全代理HTTP请求,<br> 可插拔的注解支持,包括Feign注解和JAX-RS注解;<br>支持可插拔的HTTP编码器和解码器;<br>支持Hystrix和它的Fallback;<br>支持Ribbon的负载均衡;<br>支持HTTP请求和响应的压缩。<br>这看起来有点像我们springmvc模式的Controller层的RequestMapping映射 Feign是用@FeignClient来映射服务的。</p>
<h4 id="3-服务网关——Netflix-Zuul"><a href="#3-服务网关——Netflix-Zuul" class="headerlink" title="3.服务网关——Netflix Zuul"></a>3.服务网关——Netflix Zuul</h4><p>Zuul 是netflix开源的一个API Gateway 服务器, 本质上是一个web servlet应用。<br>Zuul 在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架。Zuul 相当于是设备和 Netflix 流应用的 Web 网站后端所有请求的前门,也要注册入Eureka.<br>前面这一层俗称为“网关层”,其存在意义在于,将”1对N”问题 转换成了”1对1”问题(路由),同时在请求到达真正的微服务之前,可以做一些预处理(过滤),比如:来源合法性检测,权限校验,反爬虫之类…</p>
<h4 id="4-断路器——Netflix-Hystrix"><a href="#4-断路器——Netflix-Hystrix" class="headerlink" title="4.断路器——Netflix Hystrix"></a>4.断路器——Netflix Hystrix</h4><p>在理想状态下,一个应用依赖的服务都是健康可用的,我们可以正常的处理所有的请求,但是天有不测风云<br> 当微服务中某一个服务出问题的时候发生延迟,所有的请求都阻塞在依赖的服务,大多数服务器的线程池就出现阻塞(BLOCK),影响整个线上服务的稳定性<br>高并发的依赖失败时如果没有隔离措施,当前应用服务就有被拖垮的风险<br> Hystrix是保证微服务群健壮框架,做了隔离,熔断,降级等操作.最终达到不会由于某一个服务出问题而导致雪崩现象,让整体群死掉.</p>
<h5 id="资源隔离(限流):"><a href="#资源隔离(限流):" class="headerlink" title="资源隔离(限流):"></a>资源隔离(限流):</h5><p> 包括线程池隔离和信号量隔离,限制调用分布式服务的资源使用,某一个调用的服务出现问题不会影响其他服务调用。<br>(1) 线程池隔离模式:使用一个线程池来存储当前请求,线程池对请求作处理,设置任务返回处理超时时间,堆积的请求先入线程池队列。这种方式要为每个依赖服务申请线程池,有一定的资源消耗,好处是可以应对突发流量(大量流量来临时,处理不完可将数据存储到线程池队里慢慢处理)<br>(2)信号量隔离模式:使用一个原子计数器(或信号量)记录当前有多少个线程在运行,请求来先判断计数器的数值,若超过设置的最大线程个数则丢弃该类型的新请求,若不超过则执行计数操作请求来计数器+1,请求返回计数器-1。这种方式是严格的控制线程且立即返回模式,无法应对突发流量(流量洪峰来临时,处理的线程超过数量,其他的请求会直接返回,不继续去请求依赖的服务)</p>
<h5 id="融断:"><a href="#融断:" class="headerlink" title="融断:"></a>融断:</h5><p> 当失败率达到阀值自动触发降级(如因网络故障/超时造成的失败率高),熔断器触发的快速失败会进行快速恢复。<br> 正常情况下,断路器处于关闭状态(Closed),<br>如果调用持续出错或者超时,电路被打开进入熔断状态(Open),后续一段时间内的所有调用都会被拒绝(Fail Fast),<br>一段时间以后,保护器会尝试进入半熔断状态(Half-Open),允许少量请求进来尝试,<br> 如果调用仍然失败,则回到熔断状态<br> 如果调用成功,则回到电路闭合状态;</p>
<h5 id="降级机制:"><a href="#降级机制:" class="headerlink" title="降级机制:"></a>降级机制:</h5><p> 超时降级、资源不足时(线程或信号量)降级,降级后可以配合降级接口返回托底数据。<br> 所谓降级,就是当某个服务熔断之后,服务器将不再被调用,此时客户端可以自己准备一个本地的fallback回调,返回一个缺省值。<br>这样做,虽然服务水平下降,但好歹可用,比直接挂掉要强,当然这也要看适合的业务场景。</p>
<h5 id="缓存:"><a href="#缓存:" class="headerlink" title="缓存:"></a>缓存:</h5><p> 提供了请求缓存、请求合并实现。</p>
<h4 id="5-分布式配置——Spring-Cloud-Config"><a href="#5-分布式配置——Spring-Cloud-Config" class="headerlink" title="5.分布式配置——Spring Cloud Config"></a>5.分布式配置——Spring Cloud Config</h4><p> 微服务架构中,每个项目都有一个yml配置,管理起来麻烦。spring cloud config主要用来管理这些yml<br> 它支持配置服务放在配置服务的内存中(即本地),也支持放在远程Git仓库中。在spring cloud config 组件中,分两个角色,一是config server,二是config client。<br>今天由于时间有限先介绍下概念,改天再具体将代码实现</p>
<h3 id="接下来说说两者区别"><a href="#接下来说说两者区别" class="headerlink" title="接下来说说两者区别"></a>接下来说说两者区别</h3><p>Dubbo,是阿里巴巴服务化治理的核心框架,在中国被广泛使用;<br>Spring Cloud 是Spring的产品,他们专注开发出通用、开源、稳健的开源框架</p>
<pre><code>对比了网上一些说法总的来说</code></pre><p>社区活跃度spring更加活跃<br>Dubbo有中文文档对中国开发者来说更加友好<br>Dubbo只是实现了服务治理,而Spring Cloud分别覆盖了微服务架构下的方方面面,服务治理只是其中的一个方面,一定程度来说,Dubbo只是Spring Cloud Netflix中的一个子集。但是在选择框架上,方案完整度恰恰是一个需要重点关注的内容。<br>Dubbo晋升为Apache顶级项目对Dubbo将进一步的优化,潜力无限<br> 并且两者之上还有一个进化版本<br> spring-cloud-dubbo</p>
<p> <a href="http://springcloud.cn/view/327" target="_blank" rel="noopener">详情见Spring Cloud中国社区</a></p>
</div>
<footer class="article-footer">
<a data-url="http://yoursite.com/2019/09/18/cloud与dubbo的区别详解/" data-id="ck0ulbmay000294v68foxx1bv" class="article-share-link">Share</a>
</footer>
</div>
</article>
<article id="photo-mybatis" class="article article-type-photo" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2019/05/10/mybatis/" class="article-date">
<time datetime="2019-05-10T15:17:32.000Z" itemprop="datePublished">2019-05-10</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2019/05/10/mybatis/">mybatis中的$与#</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<p>#{}(接收普通参数,预编译,性能好,安全性高)<br>$正好相反他是直接拼接字符串</p>
<ol>
<li>${}</li>
</ol>
<ul>
<li>只能获取的是传过来的对象的一个属性(拼接字符串)<pre><code>select * from product where id= ${id}
-> 危险:有SQL注入的问题
这种方式能不用就不要使用</code></pre></li>
</ul>
<p> 2.#{}</p>
<ul>
<li>#:即可以获取传过来的一个值,也可以获取传过来的对象的属性(占位)<pre><code>select * from product where id= ?
防SQL注入,性能也更好</code></pre></li>
</ul>
</div>
<footer class="article-footer">
<a data-url="http://yoursite.com/2019/05/10/mybatis/" data-id="ck0ulbmak000094v6qvoexfok" class="article-share-link">Share</a>
</footer>
</div>
</article>
<article id="photo-mybatisTwo" class="article article-type-photo" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2018/06/28/mybatisTwo/" class="article-date">
<time datetime="2018-06-28T15:19:33.000Z" itemprop="datePublished">2018-06-28</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2018/06/28/mybatisTwo/">mybatis 的十分详细的入门教程第二弹</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<p><strong>mybatis 的十分详细的入门教程第二弹</strong></p>
<h2 id="步骤-复习"><a href="#步骤-复习" class="headerlink" title="步骤(复习)"></a>步骤(复习)</h2><h3 id="导包"><a href="#导包" class="headerlink" title="导包"></a>导包</h3><p> 核心包</p>
<p>mybatis-3.2.1.jar</p>
<p> 依赖包</p>
<p>asm-3.3.1.jar<br>cglib-2.2.2.jar<br>commons-logging-1.1.1.jar<br>javassist-3.17.1-GA.jar<br>log4j-1.2.17.jar<br>slf4j-api-1.7.2.jar<br>slf4j-log4j12-1.7.2.jar</p>
<p> 数据库依赖包</p>
<p>mysql-connector-java-5.1.26-bin.jar</p>
<h3 id="domain"><a href="#domain" class="headerlink" title="domain"></a>domain</h3><p>数据库建表</p>
<p>domain映射</p>
<p>getset</p>
<p>tostring</p>
<h3 id="配置文件"><a href="#配置文件" class="headerlink" title="配置文件"></a>配置文件</h3><p>拷贝文档</p>
<p>修改为自己的数据库配置</p>
<p>引用数据库四大金刚properties文件</p>
<h3 id="dao"><a href="#dao" class="headerlink" title="dao"></a>dao</h3><p>新建接口</p>
<p>mapper.xml拷贝文档</p>
<p>写入sql查询或其他操作</p>
<p>mybatis配置文件引入mapper.xml</p>
<h3 id="log4j"><a href="#log4j" class="headerlink" title="log4j"></a>log4j</h3><p>拷贝log4j.properties文件</p>
<h3 id="测试"><a href="#测试" class="headerlink" title="测试"></a>测试</h3><h2 id="映射"><a href="#映射" class="headerlink" title="映射"></a>映射</h2><p>(mapper==dao==repostory)</p>
<h3 id="mapper层"><a href="#mapper层" class="headerlink" title="mapper层"></a>mapper层</h3><p>不需要实现类</p>
<p>mapper.xml文件放入mapper包</p>
<p>名字跟接口一致==类名+”mapper”</p>
<p>命名空间 === mapper接口全限定名</p>
<p>方法名 === sql 的 Id</p>
<p>引入mapper.xml</p>
<p>session.getMapper()</p>
<p>自动获取实现类</p>
<h3 id="sql写到类里"><a href="#sql写到类里" class="headerlink" title="sql写到类里"></a>sql写到类里</h3><p>接口查询方法头加注解@select(sql)</p>
<p>其他操作注解与sql一致</p>
<h3 id="高级-模糊查询"><a href="#高级-模糊查询" class="headerlink" title="高级||模糊查询"></a>高级||模糊查询</h3><p>写一个query类写入查询条件</p>
<p>sql传入query对象</p>
<p>sql里拼接字符串的放方法 concat(可变参数,列名随意放,可变参数)</p>
<p>damo</p>
<p><img src="https://img-blog.csdnimg.cn/20190803221210161.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2pjZXRwb29y,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"></p>
<p>mybatis可以进行if判断</p>
<p>demo</p>
<p><img src="https://img-blog.csdnimg.cn/20190803221310928.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2pjZXRwb29y,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"></p>
<h4 id="特殊符号"><a href="#特殊符号" class="headerlink" title="特殊符号"></a>特殊符号</h4><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">&lt; <span class="tag"><</span></span><br><span class="line"><span class="tag">&<span class="attr">gt</span>; ></span></span><br><span class="line"><![CDATA[数据]]> cdata中的数据不会被识别为语法</span><br></pre></td></tr></table></figure>
<h4 id="where查询问题"><a href="#where查询问题" class="headerlink" title="where查询问题"></a>where查询问题</h4><p>demo</p>
<p>[外链图片转存失败(img-QEkuVrdp-1564823219925)(1564712967398.png)]<img src="https://img-blog.csdnimg.cn/20190803221439485.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2pjZXRwb29y,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"></p>
<h4 id="批处理"><a href="#批处理" class="headerlink" title="批处理"></a>批处理</h4><h5 id="批添加"><a href="#批添加" class="headerlink" title="批添加"></a>批添加</h5><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"><!--这里写集合 批量添加--></span></span><br><span class="line"> <span class="tag"><<span class="name">insert</span> <span class="attr">id</span>=<span class="string">"bitchSave"</span> <span class="attr">parameterType</span>=<span class="string">"list"</span>></span></span><br><span class="line"> insert into employee (name, age, sex) values </span><br><span class="line"> <span class="tag"><<span class="name">foreach</span> <span class="attr">collection</span>=<span class="string">"list"</span> <span class="attr">item</span>=<span class="string">"emp"</span> <span class="attr">separator</span>=<span class="string">","</span>></span></span><br><span class="line"> ( #{emp.name},#{emp.age},#{emp.sex})</span><br><span class="line"> <span class="tag"></<span class="name">foreach</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">insert</span>></span></span><br></pre></td></tr></table></figure>
<h5 id="两种批删除"><a href="#两种批删除" class="headerlink" title="两种批删除"></a>两种批删除</h5><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"><!--批删除list--></span></span><br><span class="line"> <span class="tag"><<span class="name">delete</span> <span class="attr">id</span>=<span class="string">"bitchDelete"</span> <span class="attr">parameterType</span>=<span class="string">"list"</span>></span></span><br><span class="line"> delete from employee where id in</span><br><span class="line"> <span class="tag"><<span class="name">foreach</span> <span class="attr">collection</span>=<span class="string">"list"</span> <span class="attr">item</span>=<span class="string">"id"</span> <span class="attr">separator</span>=<span class="string">","</span> <span class="attr">open</span>=<span class="string">"("</span> <span class="attr">close</span>=<span class="string">")"</span>></span></span><br><span class="line"> #{id}</span><br><span class="line"> <span class="tag"></<span class="name">foreach</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">delete</span>></span></span><br><span class="line"> <span class="comment"><!--批删除arr--></span></span><br><span class="line"> <span class="tag"><<span class="name">delete</span> <span class="attr">id</span>=<span class="string">"bitchDeleteByArr"</span> <span class="attr">parameterType</span>=<span class="string">"long[]"</span>></span></span><br><span class="line"> delete from employee where id in</span><br><span class="line"> <span class="tag"><<span class="name">foreach</span> <span class="attr">collection</span>=<span class="string">"array"</span> <span class="attr">item</span>=<span class="string">"id"</span> <span class="attr">separator</span>=<span class="string">","</span> <span class="attr">open</span>=<span class="string">"("</span> <span class="attr">close</span>=<span class="string">")"</span>></span></span><br><span class="line"> #{id}</span><br><span class="line"> <span class="tag"></<span class="name">foreach</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">delete</span>></span></span><br></pre></td></tr></table></figure>
<h5 id="动态修改"><a href="#动态修改" class="headerlink" title="动态修改"></a>动态修改</h5><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"><!--动态修改,<set>可以自动加set关键字去逗号--></span></span><br><span class="line"> <span class="tag"><<span class="name">update</span> <span class="attr">id</span>=<span class="string">"dynamicUpdate"</span> <span class="attr">parameterType</span>=<span class="string">"cn.itsource.domain.Employee"</span> ></span></span><br><span class="line"> update employee</span><br><span class="line"> <span class="tag"><<span class="name">set</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">if</span> <span class="attr">test</span>=<span class="string">"name!=null and name!=''"</span>></span></span><br><span class="line"> name = #{name},</span><br><span class="line"> <span class="tag"></<span class="name">if</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">if</span> <span class="attr">test</span>=<span class="string">"age!=null"</span>></span></span><br><span class="line"> age = #{age},</span><br><span class="line"> <span class="tag"></<span class="name">if</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">if</span> <span class="attr">test</span>=<span class="string">"sex!=null"</span>></span></span><br><span class="line"> sex = #{sex},</span><br><span class="line"> <span class="tag"></<span class="name">if</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">set</span>></span></span><br><span class="line"> where id = #{id}</span><br><span class="line"> <span class="tag"></<span class="name">update</span>></span></span><br></pre></td></tr></table></figure>
<h2 id="映射关系"><a href="#映射关系" class="headerlink" title="映射关系"></a>映射关系</h2><h3 id="多对一-many-to-One"><a href="#多对一-many-to-One" class="headerlink" title="多对一(many to One)"></a>多对一(many to One)</h3><p>== 一对一</p>
<p>新建两个表</p>
<p>多方添加一方的外键</p>
<p>创建😀domain</p>
<p>多方持有一方对象</p>
<p>创建mapper</p>
<p>创建mapper.xml</p>
<p>核心配置文件引入mapper.xml</p>
<h4 id="写保存方法"><a href="#写保存方法" class="headerlink" title="写保存方法"></a>写保存方法</h4><p>多方sql里#{dir.id}点出一方id</p>
<p>多方中保存一方</p>
<p>先保存一方,再保存多方</p>
<p>一方保存后获取id才能添加外键</p>
<figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"><!--添加多方方法,使用#{dir.id}类中的分类点出id存入数据库--></span></span><br><span class="line"> <span class="tag"><<span class="name">insert</span> <span class="attr">id</span>=<span class="string">"save"</span> <span class="attr">parameterType</span>=<span class="string">"cn.itsource._02many2one.Product"</span>></span></span><br><span class="line"> insert into t_product (name, dir_id)</span><br><span class="line"> values (#{name}, #{dir.id})</span><br><span class="line"> <span class="tag"></<span class="name">insert</span>></span></span><br></pre></td></tr></table></figure>
<h4 id="查询所有"><a href="#查询所有" class="headerlink" title="查询所有"></a>查询所有</h4><p>方法与mapper.xml对应</p>
<p>join on</p>
<p>以下三种方式都使用这条sql</p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">select</span> p.id pid, p.name pname, dir.id dirid, dir.name dirname</span><br><span class="line"><span class="keyword">from</span> T_product p</span><br><span class="line"><span class="keyword">join</span> productdir dir <span class="keyword">on</span> dir.id = p.dir_id</span><br></pre></td></tr></table></figure>
<figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"><!--查询所有的sql 引入下面三条ProductResultmap返回--></span></span><br><span class="line"> <span class="tag"><<span class="name">select</span> <span class="attr">id</span>=<span class="string">"findAll"</span> <span class="attr">resultMap</span>=<span class="string">"ProductResultmap"</span>></span></span><br><span class="line"> select p.id pid, p.name pname, dir.id dirid, dir.name dirname</span><br><span class="line"> from T_product p</span><br><span class="line"> join productdir dir on dir.id = p.dir_id</span><br><span class="line"> <span class="tag"></<span class="name">select</span>></span></span><br></pre></td></tr></table></figure>
<p>三种方法从多方查询出一方</p>
<p>第一种官方推荐</p>
<figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"><!--查询所有的resultMap 官方推荐的写法--></span></span><br><span class="line"> <span class="comment"><!--id为标识符 type是多方类型--></span></span><br><span class="line"> <span class="tag"><<span class="name">resultMap</span> <span class="attr">id</span>=<span class="string">"ProductResultmap"</span> <span class="attr">type</span>=<span class="string">"cn.itsource._02many2one.Product"</span>></span></span><br><span class="line"> <span class="comment"><!--分别是属性和列中的名字 id使用<id> 其他属性使用<result>--></span></span><br><span class="line"> <span class="tag"><<span class="name">id</span> <span class="attr">property</span>=<span class="string">"id"</span> <span class="attr">column</span>=<span class="string">"pid"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">result</span> <span class="attr">column</span>=<span class="string">"pname"</span> <span class="attr">property</span>=<span class="string">"name"</span>/></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!--关联 association javaType一方的类型 property 一方在多方类里的属性名--></span></span><br><span class="line"> <span class="tag"><<span class="name">association</span> <span class="attr">property</span>=<span class="string">"dir"</span> <span class="attr">javaType</span>=<span class="string">"cn.itsource._02many2one.ProductDir"</span>></span></span><br><span class="line"> <span class="comment"><!--分别是属性和列中的名字 id使用<id> 其他属性使用<result>--></span></span><br><span class="line"> <span class="tag"><<span class="name">id</span> <span class="attr">property</span>=<span class="string">"id"</span> <span class="attr">column</span>=<span class="string">"dirid"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">result</span> <span class="attr">property</span>=<span class="string">"name"</span> <span class="attr">column</span>=<span class="string">"dirname"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">association</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">resultMap</span>></span></span><br></pre></td></tr></table></figure>
<p>第二种野路子省事</p>
<figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"><!--查询所有的resultMap 省事的野路子--></span></span><br><span class="line"> <span class="tag"><<span class="name">resultMap</span> <span class="attr">id</span>=<span class="string">"ProductResultmap2"</span> <span class="attr">type</span>=<span class="string">"cn.itsource._02many2one.Product"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">id</span> <span class="attr">column</span>=<span class="string">"dirid"</span> <span class="attr">property</span>=<span class="string">"dir.id"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">result</span> <span class="attr">column</span>=<span class="string">"dirname"</span> <span class="attr">property</span>=<span class="string">"dir.name"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">resultMap</span>></span></span><br></pre></td></tr></table></figure>
<p>第三种性能最差发送多条sql能不用则不用</p>
<figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"><!--查询所有的resultMap 嵌套映射 --></span></span><br><span class="line"> <span class="tag"><<span class="name">resultMap</span> <span class="attr">id</span>=<span class="string">"ProductResultmap3"</span> <span class="attr">type</span>=<span class="string">"cn.itsource._02many2one.Product"</span>></span></span><br><span class="line"> <span class="comment"><!--分别是属性和列中的名字 id使用<id> 其他属性使用<result>--></span></span><br><span class="line"> <span class="tag"><<span class="name">id</span> <span class="attr">property</span>=<span class="string">"id"</span> <span class="attr">column</span>=<span class="string">"pid"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">result</span> <span class="attr">column</span>=<span class="string">"pname"</span> <span class="attr">property</span>=<span class="string">"name"</span>/></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!--性能较差,能不用就不要用 select="cn.itsource._02many2one.ProductDirMapper.findOne"是另一条sql column="dirid"是传递过去的参数--></span></span><br><span class="line"> <span class="tag"><<span class="name">association</span> <span class="attr">property</span>=<span class="string">"dir"</span> <span class="attr">javaType</span>=<span class="string">"cn.itsource._02many2one.ProductDir"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">column</span>=<span class="string">"dirid"</span> <span class="attr">select</span>=<span class="string">"cn.itsource._02many2one.ProductDirMapper.findOne"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">resultMap</span>></span></span><br></pre></td></tr></table></figure>
<h3 id="一对多"><a href="#一对多" class="headerlink" title="一对多"></a>一对多</h3><p>== 多对多</p>
<p>关联集合使用collection而不是association</p>
<p>官方推荐方法 一条sql性能比较好 返回</p>
<figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"> <span class="comment"><!--第一种方法--></span></span><br><span class="line"> <span class="tag"><<span class="name">select</span> <span class="attr">id</span>=<span class="string">"findAll"</span> <span class="attr">resultMap</span>=<span class="string">"findAllresultMap2"</span>></span></span><br><span class="line"> select p.id pid, p.name pname, dir.id dirid, dir.name dirname</span><br><span class="line"> from productdir dir</span><br><span class="line"> join t_product p on p.dir_id = dir.id</span><br><span class="line"> <span class="tag"></<span class="name">select</span>></span></span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"><span class="comment"><!--返回格式map--></span></span><br><span class="line"> <span class="comment"><!--第一种方法的resultMap--></span></span><br><span class="line"> <span class="tag"><<span class="name">resultMap</span> <span class="attr">id</span>=<span class="string">"findAllresultMap"</span> <span class="attr">type</span>=<span class="string">"cn.itsource._03one2many.ProductDir"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">id</span> <span class="attr">property</span>=<span class="string">"id"</span> <span class="attr">column</span>=<span class="string">"dirid"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">result</span> <span class="attr">property</span>=<span class="string">"name"</span> <span class="attr">column</span>=<span class="string">"dirname"</span>/></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!--property="products"是一方里的多方属性--></span></span><br><span class="line"> <span class="comment"><!--ofType="cn.itsource._03one2many.Product"是多方属性--></span></span><br><span class="line"> <span class="comment"><!--一对多里使用conlection标签--></span></span><br><span class="line"> <span class="tag"><<span class="name">collection</span> <span class="attr">property</span>=<span class="string">"products"</span> <span class="attr">ofType</span>=<span class="string">"cn.itsource._03one2many.Product"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">id</span> <span class="attr">column</span>=<span class="string">"pid"</span> <span class="attr">property</span>=<span class="string">"id"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">result</span> <span class="attr">column</span>=<span class="string">"pname"</span> <span class="attr">property</span>=<span class="string">"name"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">collection</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">resultMap</span>></span></span><br></pre></td></tr></table></figure>
<p>第二种方式性能差</p>
<figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"> <span class="comment"><!--第二种方法,先查一方,再用多方查询一方发送多条sql--></span></span><br><span class="line"> <span class="tag"><<span class="name">select</span> <span class="attr">id</span>=<span class="string">"findAll"</span> <span class="attr">resultMap</span>=<span class="string">"findAllresultMap2"</span>></span></span><br><span class="line"> select dir.id dirid, dir.name dirname</span><br><span class="line"> from productdir dir</span><br><span class="line"> <span class="tag"></<span class="name">select</span>></span></span><br><span class="line"><span class="comment"><!--返回格式map--></span></span><br><span class="line"> <span class="comment"><!--惯例还有第二种方法 性能最差发送多条sql能不用则不用 column="dirid"是传递过去的参数</span></span><br><span class="line"><span class="comment"> select="cn.itsource._03one2many.ProductMapper.findAllBydirId"是sql的路径</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment">--></span></span><br><span class="line"> <span class="tag"><<span class="name">resultMap</span> <span class="attr">id</span>=<span class="string">"findAllresultMap2"</span> <span class="attr">type</span>=<span class="string">"cn.itsource._03one2many.ProductDir"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">id</span> <span class="attr">property</span>=<span class="string">"id"</span> <span class="attr">column</span>=<span class="string">"dirid"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">result</span> <span class="attr">property</span>=<span class="string">"name"</span> <span class="attr">column</span>=<span class="string">"dirname"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">collection</span> <span class="attr">property</span>=<span class="string">"products"</span> <span class="attr">ofType</span>=<span class="string">"cn.itsource._03one2many.Product"</span> <span class="attr">select</span>=<span class="string">"cn.itsource._03one2many.ProductMapper.findAllBydirId"</span> <span class="attr">column</span>=<span class="string">"dirid"</span> ></span></span><br><span class="line"> <span class="tag"><<span class="name">id</span> <span class="attr">column</span>=<span class="string">"pid"</span> <span class="attr">property</span>=<span class="string">"id"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">result</span> <span class="attr">column</span>=<span class="string">"pname"</span> <span class="attr">property</span>=<span class="string">"name"</span>></span><span class="tag"></<span class="name">result</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">collection</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">resultMap</span>></span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"><!--调用的sql 用一方id查询多方--></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">select</span> <span class="attr">id</span>=<span class="string">"findAllBydirId"</span> <span class="attr">parameterType</span>=<span class="string">"Long"</span> <span class="attr">resultType</span>=<span class="string">"cn.itsource._03one2many.Product"</span>></span></span><br><span class="line"> select * from t_product where dir_id = #{dirid}</span><br><span class="line"> <span class="tag"></<span class="name">select</span>></span></span><br></pre></td></tr></table></figure>
<h3 id="缓存"><a href="#缓存" class="headerlink" title="缓存"></a>缓存</h3><h4 id="自带一级缓存"><a href="#自带一级缓存" class="headerlink" title="自带一级缓存"></a>自带一级缓存</h4><h4 id="二级缓存"><a href="#二级缓存" class="headerlink" title="二级缓存"></a>二级缓存</h4><p>核心配置中加入<cache>标签即可</cache></p>
<p>然后domain必须序列化</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">实现Serializable</span><br></pre></td></tr></table></figure>
</div>
<footer class="article-footer">
<a data-url="http://yoursite.com/2018/06/28/mybatisTwo/" data-id="ck0ulbmc1000594v6yaul00ys" class="article-share-link">Share</a>
</footer>
</div>
</article>
<article id="photo-mybatisOne" class="article article-type-photo" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2018/06/19/mybatisOne/" class="article-date">
<time datetime="2018-06-19T15:14:46.000Z" itemprop="datePublished">2018-06-19</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2018/06/19/mybatisOne/">mybatis 的十分详细的入门教程</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<h2 id="一-mybatis-的十分详细的入门教程"><a href="#一-mybatis-的十分详细的入门教程" class="headerlink" title="一. mybatis 的十分详细的入门教程"></a>一. mybatis 的十分详细的入门教程</h2><h3 id="mybatis起源"><a href="#mybatis起源" class="headerlink" title="mybatis起源?"></a>mybatis起源?</h3><p>MyBatis 本是apache的一个开源项目iBatis,<br>2010年这个项目由apache software foundation 迁移到了google code,<br>并且改名为MyBatis<br>iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。<br>iBATIS提供的持久层框架包括SQL Maps(XML映射配置)和Data Access Objects(Dao)</p>
<h3 id="mybati介绍"><a href="#mybati介绍" class="headerlink" title="mybati介绍"></a>mybati介绍</h3><p>MyBatis 是一个支持普通SQL查询,存储过程( Oracle最后一天)和高级映射的优秀持久层框架。<br>MyBatis 消除了几乎所有的JDBC代码和手工设置参数以及结果集的检索。<br>MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。<br>MyBatis不能自动创建表,如果能够自动建表,必须自己先准备好建表的sql语句。</p>
<h3 id="起步"><a href="#起步" class="headerlink" title="起步"></a>起步</h3><p> 步骤<br>1 导包<br>2 建表(product)<br>3 domain(Product)<br>4 准备dao层(CRUD)<br>5 测试(不是必需的)<br>注意:我们要引哪些包?<br>1 一定要引入驱动包(不要忘了)<br>2 导入mybatis的核心包<br>3 导入mybatis的依赖包</p>
<p>jar包可以去网上下载<br><img src="https://img-blog.csdnimg.cn/20190801210153975.png" alt="导入jar包"></p>
<p>MyBatis-Config.xml配置文件(直接拷贝,后续会讲解)</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br></pre></td><td class="code"><pre><span class="line"><?xml version="1.0" encoding="UTF-8" ?></span><br><span class="line"><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"</span><br><span class="line"> "http://mybatis.org/dtd/mybatis-3-config.dtd"> </span><br><span class="line"></span><br><span class="line"><configuration></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <!--引入配置文件四大金刚--></span><br><span class="line"> <properties resource="db.properties"></properties></span><br><span class="line"></span><br><span class="line"> <!--别名--></span><br><span class="line"> <typeAliases></span><br><span class="line"> <package name="cn.itsource.domain"></package></span><br><span class="line"> </typeAliases></span><br><span class="line"></span><br><span class="line"> <!--环境们--><!--默认环境--></span><br><span class="line"> <environments default="development"></span><br><span class="line"> <!--环境--></span><br><span class="line"> <environment id="development"></span><br><span class="line"></span><br><span class="line"> <transactionManager type="JDBC"></transactionManager></span><br><span class="line"> <!--</span><br><span class="line"> dataSource:数据库,连接池(配置四大金刚:driven,url,username,password)</span><br><span class="line"> type:连接池的类型 UNPOOLED|POOLED|JNDI</span><br><span class="line"> UNPOOLED: 这个数据源的实现是每次被请求时简单打开和关闭连接</span><br><span class="line"> POOLED:这是 JDBC 连接对象的数据源连接池的实现</span><br><span class="line"> JNDI:这个数据源的实现是为了使用如 Spring 或应用服务器这类的容器</span><br><span class="line"> --></span><br><span class="line"> <dataSource type="POOLED"></span><br><span class="line"> <property name="driver" value="${jdbc.driver}"></property></span><br><span class="line"> <property name="url" value="${jdbc.url}"></property></span><br><span class="line"> <property name="username" value="${jdbc.username}"></property></span><br><span class="line"> <property name="password" value="${jdbc.password}"></property></span><br><span class="line"></span><br><span class="line"> </dataSource></span><br><span class="line"> </environment></span><br><span class="line"> </environments></span><br><span class="line"><mappers></span><br><span class="line"> <!--在核心配置文件中找到咱们的SQL映射文件--></span><br><span class="line"> <mapper resource="cn/itsource/dao/Productmaper.xml"></mapper></span><br><span class="line"></mappers></span><br><span class="line"></configuration></span><br></pre></td></tr></table></figure>
<p>properties文件</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">jdbc.driver=com.mysql.jdbc.Driver #数据库驱动</span><br><span class="line">jdbc.url=jdbc:mysql:///mybatis #mybatis改为你的表名</span><br><span class="line">jdbc.username=root #数据库账号</span><br><span class="line">jdbc.password=123456 #数据库密码</span><br><span class="line">#四大金刚</span><br></pre></td></tr></table></figure>
<p>核心文件中有一个mappers,它指向了一个映射文件。映射文件在哪?</p>
<p>,这个xml就是咱们需要的映射文件,它就可以体现出ORM,并且在这里面,也可以愉快的写sql语句</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><?xml version="1.0" encoding="UTF-8"?></span><br><span class="line"><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" </span><br><span class="line">"http://mybatis.org/dtd/mybatis-3-mapper.dtd"></span><br><span class="line"><!-- </span><br><span class="line"> 这个Mapper的主要功能就是写sql</span><br><span class="line"> mapper:根</span><br><span class="line"> namespace:命令空间 (用来确定唯一) 以前这个是可以不加的,现在必需加</span><br><span class="line"> namespace的值,规则的:映射文件XxxMapper.xml所在的包+domain类名+Mapper</span><br><span class="line"> --></span><br><span class="line"><mapper namespace="cn.itsource.mybatis.day1._1_hello.ProductMapper"></span><br><span class="line"> <!-- </span><br><span class="line"> select : 这里面写查询语句</span><br><span class="line"> id:用来确定这条sql语句的唯一</span><br><span class="line"> 以后我们确定唯一,也就是找sql语句 : namespace +.+ id</span><br><span class="line"> 例: cn.itsource.mybatis.day1._1_hello.ProductMapper.get</span><br><span class="line"> parameterType : 传入的参数类型 long:大Long _long:小long (具体的对应请参见文档)</span><br><span class="line"> resultType : 结果类型(第一条数据返回的对象类型) 自己的对象一定是全限定类名</span><br><span class="line"> --></span><br><span class="line"> <select id="get" parameterType="long" resultType="cn.itsource.domain.Product"></span><br><span class="line"> select * from product where id = #{id}</span><br><span class="line"> </select></span><br><span class="line"></mapper></span><br></pre></td></tr></table></figure>
<p>注意事项</p>
<p>我们的映射文件一般情况下是和它对应的domain实体类在同一个层级<br>② 这个映射文件的名称一般叫做 XxxMapper.xml (Xxx代表的是实体类名称)<br>③ namespace的名称为了确定唯一性,请大家根据我的要求取名<br> 如我们有一个类:<br> cn.itsource.domain.Product / cn.itsource.domain.Student<br> 那这里取名应该是:<br> cn.itsource.domain.ProductMapper /cn.itsource.domain.StudentMapper<br>④ 除了MyBatis支持的类型,其它的类型都通通使用全限定名 </p>
<p> 配置完后我们需要了解几个类<br> 2 拿到SqlSessionFactory之前需要读取核心的xml配置文件<br> 3 需要构造者(SqlSessionFactoryBuilder)来创建它</p>
<p>咱们说过,需要通过它去拿到一个SqlSession对象(相当于JDBC的连接)<br>必需要有SqlSession这个对象,我们才可以去执行相应的Sql</p>
<h2 id="这里使用一个简单的类与数据库表来测试一下"><a href="#这里使用一个简单的类与数据库表来测试一下" class="headerlink" title="这里使用一个简单的类与数据库表来测试一下"></a>这里使用一个简单的类与数据库表来测试一下</h2><p> <img src="https://img-blog.csdnimg.cn/20190801211818911.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2pjZXRwb29y,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述">省略getset方法与tostring<br> 表<br> <img src="https://img-blog.csdnimg.cn/20190801211925878.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2pjZXRwb29y,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><!--命名空间--></span><br><span class="line"><mapper namespace="cn.itsource.dao.Productmaper"></span><br><span class="line"></span><br><span class="line"><!--查找所有--></span><br><span class="line"> <select id="findAll" resultType="Product"></span><br><span class="line"> select * from product</span><br><span class="line"> </select></span><br></pre></td></tr></table></figure>
<p> 写一个工具类</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line">public class MyBatisUtil {</span><br><span class="line"> private static SqlSessionFactory factory;</span><br><span class="line"></span><br><span class="line"> /**</span><br><span class="line"> * 静态代码块加载对象</span><br><span class="line"> */</span><br><span class="line"> static {</span><br><span class="line"> try {</span><br><span class="line"> //读取配置文件</span><br><span class="line"> Reader resourceAsReader = Resources.getResourceAsReader("mybatis-config.xml");</span><br><span class="line"> //创建工厂</span><br><span class="line"> factory = new SqlSessionFactoryBuilder().build(resourceAsReader);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> } catch (Exception e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> System.err.println(e.getMessage()+"配置文件可能出错");</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> /**</span><br><span class="line"> * 获取sqlSession对象</span><br><span class="line"> * @return</span><br><span class="line"> */</span><br><span class="line"> public static SqlSession getSqlSessionInstance(){</span><br><span class="line"> return factory.openSession();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p> 测试类<br> <figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">@Test</span><br><span class="line"> public void testutil2() throws Exception {</span><br><span class="line"> SqlSession sqlSessionInstance = MyBatisUtil.getSqlSessionInstance();</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> List<Product> list = sqlSessionInstance</span><br><span class="line"> .selectList("cn.itsource.dao.Productmaper.findAll");</span><br><span class="line"> System.out.println(list);</span><br><span class="line"></span><br><span class="line"> }</span><br></pre></td></tr></table></figure></p>
<p> 测试无误<br> <img src="https://img-blog.csdnimg.cn/20190801212419633.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2pjZXRwb29y,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述">`接下来写dao层crud</p>
<p> 接口<br> <figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"> package cn.itsource.dao;</span><br><span class="line"></span><br><span class="line">import cn.itsource.domain.Product;</span><br><span class="line"></span><br><span class="line">import java.util.List;</span><br><span class="line"></span><br><span class="line">/**</span><br><span class="line"> * Product CRUD</span><br><span class="line"> */</span><br><span class="line">public interface IProductDao {</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> void delete(Long id);</span><br><span class="line"></span><br><span class="line"> void update(Product product);</span><br><span class="line"></span><br><span class="line"> void add(Product product);</span><br><span class="line"></span><br><span class="line"> List<Product> findall();</span><br><span class="line"></span><br><span class="line"> Product findOne(Long id);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">`</span><br></pre></td></tr></table></figure></p>
<p> 实现类<br> <figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br></pre></td><td class="code"><pre><span class="line"> package cn.itsource.dao.impl;</span><br><span class="line"></span><br><span class="line">import cn.itsource.dao.IProductDao;</span><br><span class="line">import cn.itsource.domain.Product;</span><br><span class="line">import cn.itsource.utils.MyBatisUtil;</span><br><span class="line">import org.apache.ibatis.session.SqlSession;</span><br><span class="line"></span><br><span class="line">import java.util.List;</span><br><span class="line"></span><br><span class="line">/**</span><br><span class="line"> * CRUD </span><br><span class="line"> */</span><br><span class="line">public class ProductDaoImpl implements IProductDao {</span><br><span class="line"> public static final String NAMESPACE = "cn.itsource.dao.Productmaper.";</span><br><span class="line"></span><br><span class="line"> @Override</span><br><span class="line"> public void delete(Long id) {</span><br><span class="line"> SqlSession session = MyBatisUtil.getSqlSessionInstance();</span><br><span class="line"> try {</span><br><span class="line"> session.delete(NAMESPACE + "delete", id);</span><br><span class="line"> session.commit();</span><br><span class="line"> } catch (Exception e) {</span><br><span class="line"> session.rollback();</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> } finally {</span><br><span class="line"> session.close();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> @Override</span><br><span class="line"> public void update(Product product) {</span><br><span class="line"> SqlSession session = MyBatisUtil.getSqlSessionInstance();</span><br><span class="line"> try {</span><br><span class="line"> session.update(NAMESPACE + "update", product);</span><br><span class="line"> session.commit();</span><br><span class="line"> } catch (Exception e) {</span><br><span class="line"> session.rollback();</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> } finally {</span><br><span class="line"> session.close();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> @Override</span><br><span class="line"> public void add(Product product) {</span><br><span class="line"> SqlSession session = MyBatisUtil.getSqlSessionInstance();</span><br><span class="line"> try {</span><br><span class="line"> session.insert("cn.itsource.dao.Productmaper.add", product);</span><br><span class="line"> session.commit();</span><br><span class="line"> } catch (Exception e) {</span><br><span class="line"> session.rollback();</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }finally {</span><br><span class="line"> session.close();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> @Override</span><br><span class="line"> public List<Product> findall() {</span><br><span class="line"> try {</span><br><span class="line"> return MyBatisUtil.getSqlSessionInstance().selectList("cn.itsource.dao.Productmaper.findAll");</span><br><span class="line"> } catch (Exception e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"> return null;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> @Override</span><br><span class="line"> public Product findOne(Long id) {</span><br><span class="line"> try {</span><br><span class="line"> return MyBatisUtil.getSqlSessionInstance().selectOne("cn.itsource.dao.Productmaper.findOne", id);</span><br><span class="line"> } catch (Exception e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"> return null;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<p>在配置文件中写sql</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br></pre></td><td class="code"><pre><span class="line"><?xml version="1.0" encoding="UTF-8" ?></span><br><span class="line"><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"</span><br><span class="line"> "http://mybatis.org/dtd/mybatis-3-mapper.dtd"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><!--命名空间--></span><br><span class="line"><mapper namespace="cn.itsource.dao.Productmaper"></span><br><span class="line"></span><br><span class="line"><!--查找一个--></span><br><span class="line"> <select id="findOne" parameterType="long" resultType="cn.itsource.domain.Product"></span><br><span class="line"> select * from product where id = #{id}</span><br><span class="line"> </select></span><br><span class="line"><!-- 查询所有 的sql --></span><br><span class="line"> <select id="findAll" resultType="Product"></span><br><span class="line"> select * from product</span><br><span class="line"> </select></span><br><span class="line"><!-- 添加sql --></span><br><span class="line"> <!--useGeneratedKeys="true" keyColumn="id" keyProperty="id" 添加后获取主键 --></span><br><span class="line"> <insert id="add" parameterType="cn.itsource.domain.Product" useGeneratedKeys="true" keyColumn="id" keyProperty="id"></span><br><span class="line"> INSERT INTO product</span><br><span class="line"> (productName,dir_id,salePrice,supplier,brand,cutoff,costPrice)</span><br><span class="line"> values</span><br><span class="line"> (#{productName},#{dir_id},#{salePrice},#{supplier},#{brand},#{cutoff},#{costPrice})</span><br><span class="line"> </insert></span><br><span class="line"><!-- 删除sql --></span><br><span class="line"> <delete id="delete" parameterType="long"></span><br><span class="line"> delete from product where id = #{id}</span><br><span class="line"> </delete></span><br><span class="line"><!-- 更新sql --></span><br><span class="line"> <update id="update" parameterType="cn.itsource.domain.Product"></span><br><span class="line"> update product</span><br><span class="line"> set productName = #{productName},</span><br><span class="line"> dir_id = #{dir_id},</span><br><span class="line"> salePrice = #{salePrice},</span><br><span class="line"> supplier = #{supplier},</span><br><span class="line"> brand = #{brand},</span><br><span class="line"> cutoff = #{cutoff},</span><br><span class="line"> costPrice = #{costPrice}</span><br><span class="line"> where id = #{id}</span><br><span class="line"> </update></span><br><span class="line"></span><br><span class="line"></mapper></span><br></pre></td></tr></table></figure>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br></pre></td><td class="code"><pre><span class="line"> 测试类</span><br><span class="line">package cn.itsource.Test;</span><br><span class="line"></span><br><span class="line">import cn.itsource.dao.IProductDao;</span><br><span class="line">import cn.itsource.dao.impl.ProductDaoImpl;</span><br><span class="line">import cn.itsource.domain.Product;</span><br><span class="line">import cn.itsource.utils.MyBatisUtil;</span><br><span class="line">import org.apache.ibatis.io.Resources;</span><br><span class="line">import org.apache.ibatis.session.SqlSession;</span><br><span class="line">import org.apache.ibatis.session.SqlSessionFactoryBuilder;</span><br><span class="line">import org.junit.Test;</span><br><span class="line"></span><br><span class="line">import java.io.Reader;</span><br><span class="line">import java.util.List;</span><br><span class="line"></span><br><span class="line">public class MybatisimplTest {</span><br><span class="line"> @Test</span><br><span class="line"> public void test() throws Exception {</span><br><span class="line"> IProductDao productDao = new ProductDaoImpl();</span><br><span class="line"> List<Product> findall = productDao.findall();</span><br><span class="line"> findall.forEach( v -> System.out.println(v));</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> @Test</span><br><span class="line"> public void testfindone() throws Exception {</span><br><span class="line"> IProductDao productDao = new ProductDaoImpl();</span><br><span class="line"> Product one = productDao.findOne(1L);</span><br><span class="line"> System.out.println(one);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"> @Test</span><br><span class="line"> public void testadd() throws Exception {</span><br><span class="line"> IProductDao productDao = new ProductDaoImpl();</span><br><span class="line"> Product one1 = productDao.findOne(2L);</span><br><span class="line"> one1.setId(null);</span><br><span class="line"> productDao.add(one1);</span><br><span class="line"> System.out.println(one1);</span><br><span class="line"> }</span><br><span class="line"> @Test</span><br><span class="line"> public void testupdate() throws Exception {</span><br><span class="line"> IProductDao productDao = new ProductDaoImpl();</span><br><span class="line"> Product one1 = productDao.findOne(1L);</span><br><span class="line"> one1.setProductName("张扬");</span><br><span class="line"> productDao.update(one1);</span><br><span class="line"> }</span><br><span class="line"> @Test</span><br><span class="line"> public void testdelete() throws Exception {</span><br><span class="line"> IProductDao productDao = new ProductDaoImpl();</span><br><span class="line"> productDao.delete(1L);</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>crud注意事项</p>
<p>下面的点都很重要,是大家在使用MyBatis的时候经常出现的点。希望大家引起重视。出现问题的时候心态放平,不要狂躁,慢慢的找。基本咱们使用MyBatis中出的错都在这里。<br>使用框架的时候配置信息变多,在配置里写的都是字符串,而且经常是要对应的。因为,这里希望大家要切记:写的时候细心,出现错误找字符串要耐心,<br> 1 主配置中未配置相应的mapper(当然,这个路径也可能写错)<br> 2 在代码中调用Sql的时候路径写错<br> 3 Sql写错,这个应该还好找<br> 4 当我们在配置文件中很多地方如果写错,即便是你还没有使用也可能会报错<br> 5 写Sql的标签不需要全部一致(如添加不一定必需使用insert),但是它的属性会不同<br> 6 在传入与返回参数时全限定类名写错<br> 在开发的时候,要边做边测试。 在某一步出现错误后,删除新加的代码看有没有问题,如果删除部分代码后运行成功,就相应的可以缩小排错的范围。</p>
<h4 id="SqlSessionFactoryBuilder"><a href="#SqlSessionFactoryBuilder" class="headerlink" title="SqlSessionFactoryBuilder"></a>SqlSessionFactoryBuilder</h4><p>建造者模式:我们最后拿到的这个对象是非常复杂的. 用这个建造者就它先为我们把这些复杂的代码完成.<br>这个类可以被实例化,使用和丢弃。一旦你创建了SqlSessionFactory后,这个SqlSessionFactoryBuilder类就不需要存在了。因此SqlSessionFactoryBuilder实例的最佳范围是方法范围(也就是本地方法变量)。<br>你可以重用SqlSessionFactoryBuilder来创建多个SqlSessionFactory实例,但是最好的方式是<br>不需要保持它一直存在来保证所有XML解析资源,因为还有更重要的事情要做。<br> <strong>总结来说就是用完可以随意丢弃且只用一次,</strong></p>
<h4 id="SqlSessionFactory-类似于jpa的EntityMangerFactory"><a href="#SqlSessionFactory-类似于jpa的EntityMangerFactory" class="headerlink" title="SqlSessionFactory(类似于jpa的EntityMangerFactory)"></a>SqlSessionFactory(类似于jpa的EntityMangerFactory)</h4><p> 一旦被创建,SqlSessionFactory应该在你的应用执行期间都存在。没有理由来处理或重新创建它。使用SqlSessionFactory的最佳实践是在应用运行期间不要重复创建多次<br>** 是一个重量级对象 , 我们使用静态代码块单例模式**</p>
<h4 id="SqlSession"><a href="#SqlSession" class="headerlink" title="SqlSession"></a>SqlSession</h4><p>每个线程都应该有它自己的SqlSession实例。SqlSession的实例不能被共享,也是线程不安全的。因此最佳的范围是请求或方法范围。<br><strong>绝对不能将SqlSession实例的引用放在一个类的静态字段甚至是实例字段中。<br>也绝不能将SqlSession实例的引用放在任何类型的管理范围中,比如Serlvet架构中的HttpSession。</strong></p>
<p>如果你现在正用任意的Web框架,要考虑SqlSession放在一个和HTTP请求对象相似的范围内。换句话说,基于收到的HTTP请求,你可以打开了一个SqlSession,然后返回响应,就可以关闭它了。关闭Session很重要, </p>
<h3 id="列名与属性名不对应的解决方案-resultMap"><a href="#列名与属性名不对应的解决方案-resultMap" class="headerlink" title="列名与属性名不对应的解决方案 resultMap"></a>列名与属性名不对应的解决方案 resultMap</h3><p>大家应该有注意到,前面咱们做映射文件的时候,只做了表与对象之间的联系。并没有做列与字段之间的联系。那么它们之间是怎么联系上的呢?<br>由于之前咱们的列名与属性名是一样的,因此框架进行了自动的识别。<br>那么:如果咱们的列名与属性名不一致了(对应不上),这时候应该怎么办呢?<br>这时候,就需要我们开发人员告诉MyBatis,我们需要把哪些列名与属性名对应上。</p>
<p><img src="https://img-blog.csdnimg.cn/20190801213637960.png" alt="在这里插入图片描述"></p>
</div>
<footer class="article-footer">
<a data-url="http://yoursite.com/2018/06/19/mybatisOne/" data-id="ck0ulbmdc000694v6s5n15kee" class="article-share-link">Share</a>
</footer>
</div>
</article>
<article id="post-部分的知识" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2017/07/02/部分的知识/" class="article-date">
<time datetime="2017-07-02T12:53:52.000Z" itemprop="datePublished">2017-07-02</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2017/07/02/部分的知识/">关于注解部分的知识</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<p>所有关于注解的文章都绕不开这四个注解,我们也不例外<br>@Target<br>@Retention<br>@Documented<br>@Inherited<br>接下来就一个个的介绍<br>首先是 <strong>@Target</strong><br>这个注解用来标志当前定义的注解是打在哪个位置的,比如类上,方法上,字段上,可以写多个<br>通过源码我们可以看到内部是一个数组,所有可以写多个</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">@Documented</span><br><span class="line">@Retention(RetentionPolicy.RUNTIME)</span><br><span class="line">@Target(ElementType.ANNOTATION_TYPE)</span><br><span class="line">public @interface Target {</span><br><span class="line"> /**</span><br><span class="line"> * Returns an array of the kinds of elements an annotation type</span><br><span class="line"> * can be applied to.</span><br><span class="line"> * @return an array of the kinds of elements an annotation type</span><br><span class="line"> * can be applied to</span><br><span class="line"> *数组表示此属性可以写多个值</span><br><span class="line"> */</span><br><span class="line"> ElementType[] value();</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>它可以使用的值有以下这些<br><img src="https://img-blog.csdnimg.cn/20190913031812404.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2pjZXRwb29y,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"><br>ElementType是一个枚举类内部就是上面列举出的几个属性当然,也可以不用这个枚举,直接写字符串效果是一样的<br>那么他们分别代表什么呢<br>TYPE:类、接口(包括注解类型) 或enum声明。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"> FIELD:字段声明(包括enum常量).,也就是打在字段上</span><br><span class="line"></span><br><span class="line"> METHOD:方法声明。</span><br><span class="line"></span><br><span class="line"> PARAMTER:形式参数声明。,方法的形参上</span><br><span class="line"></span><br><span class="line"> CONSTRUCTOR:构造函数声明。constructort上</span><br><span class="line"></span><br><span class="line"> LOCAL_VARIABLE:局部变量声明。方法内变量</span><br><span class="line"></span><br><span class="line"> ANNOTATION_TYPE:注解类型声明。打在注解上</span><br><span class="line"></span><br><span class="line"> PACKAGE:包声明</span><br><span class="line"></span><br><span class="line"> TYPE_PARAMETER:参数类型声明</span><br><span class="line"></span><br><span class="line"> TYPE_USE:使用一个类型,详见:java.lang.annotation.ElementType</span><br></pre></td></tr></table></figure>
<p><strong>@Retention 注解</strong><br>指的是注解的生命周期<br>即会保留到哪个阶段。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">SOURCE:源码级别保留,编译后即丢弃。</span><br><span class="line">CLASS:编译级别保留,编译后的class文件中存在,在jvm运行时丢弃,这是默认值。</span><br><span class="line">RUNTIME: 运行级别保留,编译后的class文件中存在,在jvm运行时保留,可以被反射调用。</span><br></pre></td></tr></table></figure>
<p><strong>@Documented 注解</strong><br>能被javadoc此类的工具文档化 无值<br><strong>@Inherited注解</strong><br>当你想让你的自定义注解被继承时,可以使用这个注解,也没有参数取值</p>
</div>
<footer class="article-footer">
<a data-url="http://yoursite.com/2017/07/02/部分的知识/" data-id="ck0ulbmb2000394v6clmqh9eq" class="article-share-link">Share</a>
</footer>
</div>
</article>
<article id="page-oop" class="article article-type-page" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2017/04/21/oop/" class="article-date">
<time datetime="2017-04-21T12:40:43.000Z" itemprop="datePublished">2017-04-21</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2017/04/21/oop/">JAVA面向对象</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<h2 id="JAVA面向对象的思维"><a href="#JAVA面向对象的思维" class="headerlink" title="JAVA面向对象的思维"></a>JAVA面向对象的思维</h2><pre><code>面向对象三大基本特征:封装、继承、多态。而面向对象的过程就是围绕对象进行工作的过程。
类是一种数据类型
对象则是这种类型的一个具体实例</code></pre><p>对象分为两个部分,动态部分【行为】与静态部分[描述]。</p>
<p>①静态部分:顾名思义就是不能动的部分,这个部分被称为“属性”,任何对象都会具备其自身属性,如一个人,它包括高矮、胖瘦、性别、年龄等属性。<br>②动态部分:具有这些属性的人会执行哪些动作这个人可以哭泣、微笑、说话、行走,这些是这个人具备的行为(动态部分),<br>.Java语言的设计思想:希望将现实生活中的,对象与对象之间的关系在计算机系统得以体现,从而构建计算机系统<br> 对于事物的思考:需要类,需要对象【万事万物皆对象 万事万物皆可分类】<br> 类:对于类思考:万事万物简单思考:<br> 类:具备两大特性【属性】<br> 1.静态属性:信息描述,学生,姓名,年龄 ,身高<br> 2.动态行为:处理数据,人来说:会走,会跑……</p>
<p><strong>封装</strong><br>通过给类中的成员(字段,方法,构造方法)添加访问权限来实现访问控制</p>
<p><strong>继承</strong><br>(1)泛化和特化<br> <em>①泛华:在多个子类的基础上面抽取共有属性的行为到一个父类中去<br> ②特化:在一个父类的基础上拓展子类特有的属性和行为,生成一个新的子类<br> ③原则:父类存放共性,子类存放特性</em><br>(2)Java中类的继承特点<br> <em>①Java中类的继承是单继承<br> ②可以支持多重继承每一个类都//也就是间接继承<br> ③有一个直接父类,如果没有看到显示的继承代码,那么就隐式继承就Object</em><br>(3)继承到父类的那些东西<br> <em>①非私有的字段及方法<br> ②父类特性<br> ③静态方法不能被覆写</em><br>1)如果是父类装子类对象调父类和子类都有的静态方法,会调用父类方法</p>
<p><strong>多态</strong><br>(1)一种事物的多种形态<br>(2)使用aml:装入子类对象存在多种可能性:<br>(3)编译是看的是Animal类型【只看类型不看值】<br>(4)运行时看的是实际存放的对象【真实类型】<br>(5)官方概念:编译时跟运行时类型不一致就产生了多态<br>(6)民间理解:父类类型的变量,存放子类类型的对象,可能存放子类类型的对象有多种可能<br>(7)多态存在的前提:必须有继承关系<br>(8)多态应用<br>①方法参数传递:方法形参父类类型,允许传子类类型对象<br>②方法返回值<br>(9)多态的好处:<br>①屏蔽了不同子类之间实现的差异<br>(10)加强面向对象编程思想:<br>①此处体现java语言设计思想,希望将现实生活中的对象与对象之间的关系在计算机系统得以体现</p>
</div>
<footer class="article-footer">
<a data-url="http://yoursite.com/2017/04/21/oop/" data-id="ck0ulbmb3000494v6pb8glrs2" class="article-share-link">Share</a>
</footer>
</div>
</article>
<article id="post-JAVA中-与equals的区别" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2017/03/21/JAVA中-与equals的区别/" class="article-date">
<time datetime="2017-03-21T12:56:06.000Z" itemprop="datePublished">2017-03-21</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2017/03/21/JAVA中-与equals的区别/">JAVA中==与equals的区别</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<p> == 和 equals 都是比较是否相等,请问它们到底有什么区别呢?<br>相等 :<br> 传统的理解一般都是数字值是否相等;<br>在程序中任何东西都是数据,都会比较是否相等[ 对象 ]<br> == 比较运算符<br>基本数据类型变量: 比较的就是值是否相等;<br>引用数据类型变量: 比较的是对象的地址是否一样;(排除特殊 String)<br> equals 方法[最初定义在根类Object中的,比较对象是否相等]<br> 基本数据类型 : 不能够使用! 基本数据类型不是对象,不能够调用Object中的方法<br> 引用数据类型 : 但是在Object的源码中定义的就是 == 进行比较比较<br>定义好的类没有覆写过equals方法,则会直接调用到了Object中的equals方法,那么本质还是在使用==比较<br>在实际开发中,自定义类:一般比较对象,都是通过对象的属性值进行比较,所以自定义类,会经常覆写Object中的此方法,把自己的比较规则写在方法里面;<br>⑫覆写equals方法的意义:定义类,覆写equals方法,自己制定规则,比较自定义类对象的静态属性<br>(5)打印过程实际上调用了toString方法</p>
</div>
<footer class="article-footer">
<a data-url="http://yoursite.com/2017/03/21/JAVA中-与equals的区别/" data-id="ck0ulbmav000194v68uz7kje6" class="article-share-link">Share</a>
</footer>
</div>
</article>
</section>
<aside id="sidebar">
<div class="widget-wrap">
<h3 class="widget-title">Archives</h3>
<div class="widget">
<ul class="archive-list"><li class="archive-list-item"><a class="archive-list-link" href="/archives/2019/09/">九月 2019</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2019/05/">五月 2019</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2018/06/">六月 2018</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2017/07/">七月 2017</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2017/04/">四月 2017</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2017/03/">三月 2017</a></li></ul>
</div>
</div>
<div class="widget-wrap">
<h3 class="widget-title">Recent Posts</h3>
<div class="widget">
<ul>
<li>
<a href="/2019/09/18/cloud与dubbo的区别详解/">Springcloud与dubbo的区别详解</a>
</li>
<li>
<a href="/2019/05/10/mybatis/">mybatis中的$与#</a>
</li>
<li>
<a href="/2018/06/28/mybatisTwo/">mybatis 的十分详细的入门教程第二弹</a>
</li>
<li>
<a href="/2018/06/19/mybatisOne/">mybatis 的十分详细的入门教程</a>
</li>
<li>
<a href="/2017/07/02/部分的知识/">关于注解部分的知识</a>
</li>
</ul>
</div>
</div>
</aside>
</div>
<footer id="footer">
<div class="outer">
<div id="footer-info" class="inner">
© 2019 an9527<br>
</div>
</div>
</footer>
</div>
<nav id="mobile-nav">
<a href="/" class="mobile-nav-link">Home</a>
<a href="/archives" class="mobile-nav-link">Archives</a>
</nav>
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>
<link rel="stylesheet" href="/fancybox/jquery.fancybox.css">
<script src="/fancybox/jquery.fancybox.pack.js"></script>
<script src="/js/script.js"></script>
</div>
</body>
</html>