0%

2017年11月7日 下午4:15

概述:

  1. 要学会一下几点
    1. 数学中的知识如何运用在其他地方?
    2. 对算法复杂度进行分析的方法?

PPT主要参考资料

chap02.pdf

数学中的知识如何运用在其他地方?

第一种定义时间复杂度的方法:

第二种定义时间复杂度的方法:

常用的排序算法的时间复杂度和空间复杂度 - CSDN博客
摘要:
并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。

一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。

总结:

  1. 首先需要转化为函数。因为函数是高数的核心研究对象,没有研究对象,高数中的绝大部分定力,公式,性质你是无法使用的。
  2. 其次,确定使用高数知识点。比如这里就是使用极限,比阶这部分的内容。
  3. 最后,脑子完全清零,脱离实际,只从数学的角度去考虑

对算法复杂度进行分析的方法?

我这里知识罗列出来,具体的看ppt
强调:首先明确我们的目标,不论是非递归还是递归,我的最终通过数学等式变换得到的结果是一个和式g(x),然后对这个和式O(g(x)),就是我么想要的时间复杂度。

得到这个和式的方法:

  1. 序列求和

    1. 序列求和的基本公式
      1. 等差数列
      2. 等比数列
      3. 调和级数
    2. 估计序列求和
      1. 放大法求上界
      2. 用积分作和式的渐进上界
  2. 递推方程

    1. 换元法
    2. 迭代法求递推方程
    3. 差消发求化简递推方程
    4. 递归树
    5. 主定理

其中的一个难点:


这道题的背景是:如果我们不使用递归树,而是使用我们前面的换元法,那么没啥不好理解的,就是换元然后再换回来的,一点都不影响本身的值。

遇到的问题:如果我们用递归树去解决相同的问题,同样会出现n=2的k次,但是在这里是我们通过事实来证明的,而不是直接假设出来的。

解决问题:在这道题中,我们假设的对象是递归树的层数(这是最大的不同,在换元法中设的是n=2的k次),设为k。根据数学规律,我们知道最后一层数据的和是n-(2的k-1次),强调:这个是数学规律推出。然后,还有一个数学规律我么要去发现另外一种数学规律去求:最后一层叶子全是1,这是一个满二叉树,那么最后一层的元素个数是(2的n-1次)个。上面的两个等式相等,就可以同样推导出n=2的n次。

2017年11月4日 下午4:15

我对待这种人家的算法比自己的好的情况:我选择直接记住,简单实用的方式

3.最重要的问题:描述思路很模糊,造成写程序的时候模模糊糊,写不出来。
改进的第一步:描述的时候,对于操作对象要使用语言变量(多种)来表示,不能说这个、那个的

我对思路描述的要求:能做到一个不会的人,也能很快的理解写出程序,那么这个思路描述就成功了。
说白了就是说的越详细越好。

应该按这节中的带明确变量的思路描述才是重点。然后按这个思路描述写成完整程序就很简单了。

总结:关于边界条件的是最容易错的,最容易少的。这道题中的关于循环条件的注意点,还是那就话,记住就行了,不要研究为啥
一个原则:条件能多不能少。

总结:在编码阶段出现这些问题,很大程度是由于自己的思路描述没有描述清楚。
现在尝试一下从抽象到具体,分层次的进行描述方法。

现在做一下总体的总结,因为上面的总结的小点多了之后,比较杂乱,不容易记忆。
总体总结:
分两部分:
第一部分:对思路描述的改进
第二部分:易错点的总结(以上总结那么多,其实汇总就是易错点而已。易错点是有他的标志的,抓住标志去解决问题)
(这章完成之后要将这些标志全部总结在一起)

这节的内容默认链表是有序的,这也就是为什么最后要讲排序的原因

要有的几种意识:已有资源的意识,已有资源的意识,设置初始值的意识

整体总结:
这篇thinking的题真的需要你思考
这些题不仅仅需要我们有在practice中总结的思维描述+特征
还加上了一些在完成功能的情况下,如何将代码进行优化,多个步骤的融合(上面这道题)+ 解决问题的技巧(第一道题) + 选择递归(第二题,需要对题进行递归的概括)+不是能完成功能的就是对的(上面这道题)

书中的算法:自己是肯定想不出来,我们不可能去推理证明这种算法的正确性,直接背会。
这些算法是其实是需要严格的理论证明,才可以使用的。
给我的感觉就是一道高数题,让你证明这个理论是正确的。

第三章:栈和队列

他们两个都是两种实现方式:顺序表+链表

原则:不管是栈还是队列,能用顺序表就用顺序表,因为链表操作起来要复杂不少。特别是队列的链表,有少地方需要特殊处理。

记忆的重点:他们的判空、判满条件+增加/删除的操作步骤。(这个是要直接背会的,除了队列的链表)

所以:以前说的特征+思路描述 + 背算法这三个肯定是重中之重,但是,易错点也是特别需要留心的。程序这东西错一点就完蛋,这种一般都是没有专门来考虑引来的祸

基本思想
实现步骤

这些题就不要想自己能不能设计出一种算法来解决问题。
是要问自己,别人想好了算法,你能不能实现。
这里锻炼的其实不是你的创造性思维,其实是考验你的实现已知算法的基本功。
考验的还是基本功!!!!!
当然,前提是你要将这个特定的算法步骤,理解并背会!!!

总结:
一般检查的点有:
边界

只有一个时

结构体:我一开始想的是用双向链表,然后分别front[2] rear[2],这么做是为了方便的链表的增加和删除
但是我一看答案,人家用的是顺序表,不是链表!!!!!
shit,自己给自己增加难度!!!
像这种没有具体场景的题,他其实是让你根据基本的数据结构,来设计更加复杂的数据结构或者操作。
这时最先想的是:判空+判满条件

整体总结:
第一层:算法设计不出来。这个没办法。指的是脱离代码实现的一种算法构想。
第二层:事件的基本规律原则没有总结出来。这些规律原则是本事事件的属性,但是我们常常发现不了。
第三层:基本步骤的缺失不完整。其实就是步骤描述的注释少东西
第四层:语法出错。当程序不按自己的期望走时,很多时候都是自己的语法有问题,自己的意思和程序的意思是两张皮。

总结:
当递归算法代码中只有一个递归语句,并且在程序的最后的话,可以直接改写成循环形式

dp + 回溯+分治教会了我们怎样的思考问题的方式(这里我是回忆了刘汝佳的入门白皮书,因为有好几道题是用递归解决的,我的思路上有问题)
1.有些问题我们发现他的特点是:问题在某一个特定的情况下特别简单,特定的情况一般都是指的元素个数少(比如说两个数进行排序)等等,弱者都会的问题。但是当相同的问题,横向
扩充后,就会变得异常复杂。这时,我们能不能将问题在变回原来弱智的问题去解决?这就需要我们从内—>外去解决,让问题变成一个个弱者的问题,然后就轻松的解决了。
那么,递归就给了我们一个进入到内部的方式。(新的解决问题的思路:新的分解问题的方式,这里的分解是重点,他的可行性验证就是最内部的是否可以简单求解)
2.而回溯,其实就是一种循环。他的步骤中每次循环(一层递归)都维持着解的一部分(这是他与1的最大的思路的不同的点),这也就是为啥我把他也称作是循环。

当做一个题的时候,我们可能会因为想不出第一层的算法,而做不出题。这个是硬伤,没办法。
但是,又有很多时候,我们能表述出来我的的思想,但是就是没法下手,然后思想很有可能就走神了。
出现这种”我知道,但是我就是写不出来“的问题,我总结下来,很多时候都是自己的数据结构没有设计出来。
数据结构(结构体,数组,树,图,众多的变量…)这些其实是一个算法的实现起来的核心,
当数据结构设计出来的时候,也就是说明你的思维依托于代码已近走过一遍了,心中有谱了
因此,数据结构是代码实现的精髓。
当我们需要去记住一个算法的时候,他的数据结构设计一定是我们首先搞定的。

总结:
1.涉及链表的操作中,malloc创建节点,初始化节点,连接节点,这三步是永远不会少的
2.关于malloc生产数组,可以直接通过[]来使用,和我们平常的数组使用起来一模一样。
3.-> . 不要混了。操作对象是指针才用->,在这里我就没有想M是个啥,下意识的使用->。以后要专门注意一下函数的参数类型是不是指针
4.最重要的
建立十字链表最核心内容:在遍历的时候,怎么样能让新malloc出来的节点之间正确的连接?

这里的思路是:
    先提出问题,能总结出自己的问题也是水平
    这时不要想程序怎么写,依然还是在现实中寻找思路
    找到思路之后,然后再想怎样用程序实现

这个思路和我以前总结的四层的关系?
    当我们在第三层写完注释,开始遍码的时候,就会觉得那里难住了,无法下手
    这时我们就需要上面的思路,走出编码,先去寻找思路
    也就是说,这个思路是我们遇到问题,解决问题的方法。
    而四层,是我们所有题的基本方法,这个思路是我们在进行四层时遇到问题的解决方案

递归:
新的解决问题的范式:新的分解问题的方式,他的可行性验证就是最内部的是否可以简单求解

注意:这道题虽然是两层循环,但是实际上仅对数组进行了一次遍历,此时时间复杂度为o(n)

递归:
新的解决问题的方式:新的分解问题的方式,他的可行性验证就是最内部的是否可以简单求解

总结:
解决不了这个问题的按照我的“一个方法”,其实是我的算法有问题,不是简简单单的打点补丁就可以了。也就是说,需要我返回最开始的第一层去完全重新开始
明白,有些问题就是需要我们从头开始,不要怕浪费时间,大家都是这样

总结:
我一开始读完题,错误的以为是要在本身数组上进行操作,那么必定涉及到顺序表位置的大量移动
我这就是自己给自己添加难度,有病
还有,我有一个特殊情况没有考虑进去,就是连个表数据相加可能为0

再次递归总结:
1.将整个问题分成两部分:当前位置元素(1个)+后面所有元素(n-1个)———-整体的思想
2.尾部中解决一个就删除一个———–简化思想,处理的问题规模越来越小
3.永远解决的都是最后一个相同的问题————最终的目的

(6-1) p139
作为程序的编写者,我们要按着程序运行的步骤去想问题

原则:程序是我们表达思想的一种方式。先有思想,然后才有程序。递归依然也要遵从这样的步骤。
容易犯的毛病是:我要套用哪个程序模板,比如说这里的三种遍历树的方式。这种顺序就是反的

拿这个例子来说:
脱离程序,我解决问题的思路是:从左下角开始,我们先站在”+”的位置上,计算”b”+”c”。计算结果之后我将结果保存在”+”所在的位置,然后”b”和”c”删掉。
第一个问题就解决了。由于每回都删掉最后一个,所以每回的操作其实是一样的。

写这个函数的时候我提醒自己要站在图中”+”的位置去想如何去操作,
其实我说的就是废话:一个函数,首先要确定的是:输入参数有啥,输出参数最后是啥。
这里的参数是BTNode *p,这个参数就限定了我要处理问题的要站的位置。
输出参数是输入参数位置下所代表的值

么这个函数的完成内容也就知道了:求当前位置下的最后结果值。
当明确我们的需求的时候写起来也就快的多了。

总结:
将上面所说的全部连起来的以后,就会发现:
1.如何判断可否使用递归?
1.将整个问题分成两部分:当前位置元素(1个)+后面所有元素(n-1个)———-整体的思想
2.尾部中解决一个就删除一个———–简化思想,处理的问题规模越来越小
3.永远解决的都是最后一个相同的问题————最终的目的
2.在能使用递归之后,如何真正的去写这个递归函数具体内容?
1.其实我说的就是废话:一个函数,首先要确定的是:输入参数有啥,输出参数最后是啥。
2.有哪些并列的情况,这个问题的答案就是函数的主体算法

总结:
与前几个题比较:这个题的特点是他的问题与二叉树的遍历是互不影响的,也就是说,在完成功能的时候可以先完成遍历,然后在遍历的基础上去添加上这个计数的功能。
而前几个呢?他提出的问题,让解决的问题,都是不能独立在遍历的基础上添加的,这时就需要我们利用完全理解遍历的知识点,然后去完全依据现实的思路去完成功能
最简单的办法是:先试试遍历上加能不能行,不行在就算,能行最好

我对层次遍历的思路总结:
1.这里不是用递归!
2.如何解决他们遍历的顺序问题?
1.我们要求的是每一层从左到右
2.在某一层中,当我们从左向右遍历这一层时,每遍历一个我就将这个节点的左右子节点依次放入到队列中,方便下次使用
3.那第一层从哪里来呢?
1.我们手工设置第一层,后面就是自动得了
注意:这点是最重要的难点,最常见的问题就是你不知道怎样开始,然后就卡住不动了。因此:我们有时别太注意一个一个的步骤,就像纠结第一步做啥。这时我们要提高一个高度,从众多的步骤抽离出来,得到一个看似“笼统”方案。

出现这个问题是因为从抽象–>具体的过程中,跳跃性有点强,导致思维的混乱。
一个规律:出现这种情况时,很多都是如果是当做数学题的做,很简单,但是转换成程序的时候,

假如让你发明一个算法,该如何发明呢?就像线索二叉树一样。
首先你要提出一个设想,我希望改进成什么样子,eg:线索二叉树中希望将二叉树更改成类似链表一样,直接就能够找到前驱和后继节点。
然后,我们去尝试,这里的尝试可以吸取其他算法的经验,去达到我们想要的目标。eg:线索二叉树中就首先更改了节点的内部结构。
然后最重要的一步是:用你改进之后的结构,去尝试解决问题,判断是否可以走通。
最难的一步:将能走通的结构和想法,将这种想法汇总总结成步骤,最后写成程序

总结:
如何去解决我上面提出“解决将能够走通的想法,转换成代码实现很困难(尤其在树中)”
在书中p146-149就给出了很好的示范!!
在整理思路的时候,他举一个具体的例子,并且画了图。在这基础上他还1.2.3…具体的描述了在图中分析问题思路的步骤。
这里的问题是:这是一个具体的例子,而我们需要的是一个通用的程序。
这是我们就需去将1.2.3…这样的步骤抽象:将1.2.3..中的每一步当做一个单位,去‘对比’出一个单位分为哪些步骤,这些单位有哪些异同,结果合并和一个交集。记住:我们要的是一个通式!!

两个不管:
前驱从哪来的不管
左右子树怎样操作的我不管

总结:
在1-5章,他的操作题就两种顺序表和链表这两大类,求解的问题一般都是空间移动,统计,增删改查啥的,难题集中在算法你不知道,你设计不出来一套合适的算法
而在第六章,求解的问题很多都设计到记录的保存,和递归,他的题的共性是:给你当做数学题做太简单,当成程序题太难。原因就是前面说的转换能力不行。
好在我已经总结写出了解决的方法。

求解过程就是仿照p147页的过程:举例,画图,写步骤,抽象总结。

总结:
我这这里就没有想到用递归去解决,使用递归这种思考方式,可以省去很多细节上的考虑。
先总结一下这个递归的思路:站在一个节点的角度,去给这个节点赋值,最后返回一下

做事总是一步一步的,缺少整体的宏观的思维,是我想不到递归的本质原因。

递归的难点:在于如何去分割这两个数组
循环的难点:在于如何记录他们之间的关系,保证正确的链接。

我要将当前节点(AGraph *G,int v)的相连的所有边都要遍历(p = p->nextarc)
树的当前节点(BTNode *bt) 遍历的是(bt->lchild bt->rchild)
对比总结:
这一对比就体现出了树和图在struct类型定义时最大的不同:如何去找节点?
图中的节点是放在数组中的,我们想拿就必须通过数组下标。数组下标是int类型,所以我们在DFS函数传参只能是int类型。
如果一个图不是用int类型的数字去标识一个节点的话,例如使用A,B,C等,这些不能直接转换成图。或者说要在生成树的时候就必须人为的给他们编号。
总之,图中的每个节点必须从0开始编号!!!

总结树和图的不同(链式存储):
树是以节点为单位的,图是以边为单位的
树可以直接寻找下一个节点,图必须以数组下标去寻找下一个节点,但图也可以直接通过当前边寻找下一条边。

有向图和无向图,他们的遍历方式一样吗?
一样!
是否有向,只影响图的建立过程,不影响遍历过程。

1+1+1 = 3

重要总结:
我以前总结的(4+1) + 递归 + 想法转换成步骤
首先强调:要将思路和编程实现分开来思考
1.“想法转换成步骤”属于思路上的,他的目的是通过不断地测试,普通取样,特殊取样等等,最后找到所谓的“思路上的通解步骤”
2.“1”同样也是属于思路上的,他作为“想法转换成步骤”补充,因为:“1”是当出现问题难点的时候,解决问题的技巧,同样强调这是思路上的解决,尽量的联系上已知学过的简单知识点,把难点编程知识点的拼凑或者简单变形
3.最后编码时才会去落实“4”,“4”能很大程度上减少我们的错误。这时出现问题,要跳出代码,返回1,2 去重新思考。

我现在对“把思路转换成步骤”,这一步比较有经验了,主要有以下几点
1.要特意的去考虑特殊情况
2.先找见一个的比较大众,包含性强的情况去解决,然后在加上其他的特殊情况。(这样就条例很多了)

2017年10月20日 下午9:47

UEditor在JavaWeb中的应用 - LingDu - CSDN博客
EL表达式 ${}中能有${}吗 - ITeye问答
JSTL 判断对象是否为空 - 笑剑钝 - 博客园
jsp+jquery+ajax+json 实例 - u012843873的博客 - CSDN博客
js函数传参 - super-d2 - 博客园

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
if($('#username').val().length==0){    
$('.hint').text("用户名不能位空").css({"background-color":"green"});
}
else{
alert($('#username').val());
$.ajax({
type: "get",//使用post方法访问后台
dataType: "json",//返回json格式的数据
url: "Output.jsp",//要访问的后台地址
contentType: "application/json;charset=utf-8",
data: {username:$('#username').val()},//要发送的数据
beforeSend: function() {
$("span").html("<font color='red'>ajax数据处理中,请稍后...</font>");},

complete :function(){$("span").html("<font color='red'>ajax数据处理完毕</font>");},//AJAX请求完成时
success: function(data){//data为返回的数据,在这里做数据绑定
//jsonArray数组 用each遍历
$.each(data.jsonArray,function(index){
$.each(data.jsonArray[index],function(key,value){
alert(key+":"+value)
$('body').append("<div>"+key+"---"+value+"</div>").css("color","red");
});
});
//单个字符串输出
$('body').append("<div>"+data.account+"</div>").css("color","red");
},
error: function(XMLResponse) {alert(XMLResponse.responseText)}
});
}

2017年10月12日 下午4:10

概述

  1. 全部的复习资料有
    1. bear中的笔记
    2. 个人学习笔记中_实训_中期实训全部资料 这里有老师的全部代码
  2. 注意,里面的中文全是乱码。自己粘贴复制一下

2017年10月11日 下午2:26

概述:

  1. SpringMVC是servlet的封装,目的是为了简化servlet的使用
    1. 最直观的就是request不用写了,获取值特别方便
  2. 注解开发
  3. 一些名字都不能瞎写了,是有要求的

2017年10月9日 下午4:15

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
二叉排序树的基本算法p280
数据结构:
typedef struct BTNode
{
int key;
struct BTNode *lchild;
struct BTNdoe *rchild;
}BTNdoe;


基本思路:
这个递归的任务是:我给你一棵树,和一个值key,你给我看看能不能找见。能找见你把节点返回给我,若果没有你告我null就行了。

特殊情况有:
1.正好相等当前bt->key,走了狗屎运巧了
2.去左边找去
3.去右边找去
4.没找到(这时传入的bt == null,返回null就行了)

BTNdoe * BSTSearch(BTNdoe *bt,int key){
if(bt != NULL){
if(bt->key == key){
return bt;
}
else if(bt->key < key){
return BSTSearch(bt->lchild,key);
}
else if(bt->key > key){
return BSTSearch(bt->rchild,key);
}
}
else{
return NULL;
}
}


插入关键字的算法:
基本思路:先找见再插入,如果本来就有就不用插了,如果没有就在null的位置上插入
你可能会问为啥说在null的位置上插入就行?你去给我举100个🌰,你看有例外的吗!
反过来说就是:能不能找到一个能走到的null的位置,这个位置不能插入当前的这个key。
答案是:不能。只要是走到null,那么一定是要插入key元素的位置

这道题在测试阶段有四中情况
1.当前节点正好是
2.比当前节点小
3.比当前节点大
4.找到空都没有找到

这里只不过将前三种和第四种右划分了一次而已。

int BSTInsert(BTNdoe *&bt,int key){
if(bt == NULL){
// 如果找到则插入
// 新建一个节点,放入key
bt = (BTNdoe *)malloc(sizeof(BTNdoe));
bt->key = key;
bt->lchild = NULL;
bt->rchild = NULL;

return 1
}
else{

if(bt->key == key){
return 0;
}
else if(bt->key < key){
// 告诉左边的树,你去办吧,你如果插入了那个值,你就说1,如果本身就有,你就说0
return BSTSearch(bt->lchild,key);
}
else if(bt->key > key){
return BSTSearch(bt->rchild,key);
}
}
}

总结:
这道题我在做的时候也坑了一下,我一直想的是:要先找到位置,然后在找到的这个位置中插入。
所以,在我看到这里的他把找位置和插入写一起了,大跌眼镜。
最后我把这种情况总结为:递归特有的思维,他能够将这种前后的逻辑关系打破,变成并列的结构。

以前我总结过“把思路转换成步骤”的两个技巧,一个是考虑特殊情况,一个是先抓主干去思考,然后再去找枝干。
现在这了的枝干有一种情况值得专门的去注意一下,就是这里的并列情况。
采用递归就要专门的思考一下,关于这点我在思路总结的那篇文章中说的比较具体。


二叉排序树的构造算法

void CreateBST(BTNdoe *&bt,int key[],int n){
int i ;
bt = NULL;
for(i = 0; i < n;i++){
BSTInsert(bt,key[i]);
}
}


总结:
以前我总是问,如何建立一个树,书中讲了用前序+中序的方法来建立树
这里可以算是这本书建立的第二棵树,但是这回的建立树是在“查询的基础上”建立起来的方法。
也就是将”建立一棵树“转换成”查询一个树的“+”在一棵树中插入一个节点去解决“


平衡二叉树:
首先需要说明的是:这节的内容不涉及代码,关键在于掌握人间的思路。
我总计的方式是从回答问题入手。
我提出的问题有:(按这个顺序走,前后有关系)
1.平衡二叉树和二叉排序树的联系?
平衡二叉树一定满足二叉排序树,这一点在整个平衡二叉树中都需要保证
2.如何去找失去平衡的最小子树?
距离插入节点最近,且以平衡因子绝对值大于1的节点作为跟的子树
3.如何去计算一个节点的平衡因子?
左子树的高度-右子树的高度
4.如何判定是那种类型
1.找到插入节点b
2.找到最小子树节点a
3.从a出发看如何经过如何的步骤能找到b
4.这里的步骤只有LL,RR,LR,RL四种
5.四种类型的理解
1.LL:新插入的节点落在最小不平衡子树根节点的左(L)孩子的左(L)子树上
2.LR:新插入的节点落在最小不平衡子树根节点的左(L)孩子的右(R)子树上
6.这节要我们掌握什么?
1.学会分辨四中类型 LL RR LR RL
2.学会手工处理四中类型



二叉排序树的删除算法
这个情况就比较多了,书中没有给出答案,得去严版中去找

2017年10月9日 下午4:01

注:高级框架开始我就要放水了,😝

概述:

  1. 就是一个小框架,属于数据持久层,简化和数据库的交互。
  2. 学习方式:参考文档 + 源码(myBatis + myBatis1)
  3. 就是一个小框架,不用担心。

参考文档:

  1. mybatis - naruto_Mr的专栏 - CSDN博客
  2. MyBatis3.2.2中文官方文档.pdf

源码:

归档.zip
注:数据库用的student,bear中有

提醒(零星听到的几个)

新的模块要加载
模糊查询不能字符串
数据库连接字符集要设置
insert要提交