A:首先先看下一个简单的面试题
斐波那契数列
计算数组{1,1,2,3,5,8.......} 第30位值
规律:1 1 从第三项开始,每一项都是前两项之和
有两种实现方式
第一种方式:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public class TestOne { public int TestSelf( int n){ if (n< 0 ){ throw new IllegalArgumentException( "n不能为负数" ); } else if (n<= 2 ){ return 1 ; } else { return TestSelf(n- 2 )+TestSelf(n- 1 ); } } @Test public void Test(){ System.out.println(TestSelf( 30 )); } } |
打印结果832040
第二种方式:利用数组
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public int TestSelfTwo( int n){ if (n< 0 ){ throw new IllegalArgumentException( "n不能为负数" ); return 1 ; } int [] nums = new int [n+ 1 ]; //30位从零开始 nums[ 0 ]= 1 ; nums[ 1 ]= 1 ; for ( int i = 2 ;i<n;i++){ nums[i] = nums[i- 2 ]+nums[i- 1 ]; } return nums[n- 1 ]; } @Test public void Test(){ System.out.println(TestSelfTwo( 30 )); } |
公式:f(n) = f(n-2)+f(n-1) f代表方法 n代表多少 位
1
2
|
sql语句:select * from type where pid = 0 ; 首次指定pid值为 0 ,然后下次根据pid为 0 的cid 作为下次查询的pid public List<Category> getCategory(Integer pid); //接口层方法 |
映射文件配置
1
2
3
4
5
6
7
8
9
10
11
|
<mapper namespace= "dao.CateGoryDao" > <resultMap id= "getSelf" type= "entity.Category" > <id column= "cid" property= "cid" ></id> <result column= "cname" property= "cName" ></result> <collection property= "categorySet" select= "getCategory" column= "cid" ></collection> //这里可以不用指定oftype 使用反向查询select从另一个maper文件中取出数据时必须用ofType <!--查到的cid作为下次的pid--> </resultMap> <select id= "getCategory" resultMap= "getSelf" > select * from category where pid=#{pid} </select> </mapper> |
mybatis的javaType和ofType
都是指定对象的类型 不同的是当使用反向查询select从另一个maper文件中取出数据时必须用ofType
都可以为collection和association是指定对象的类型,
都不是必须写的, 只有反向select时需要ofType;
实体类:
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
|
package entity; import java.util.HashSet; import java.util.Set; /** * Created by zhangyu on 2017/7/12. */ public class Category { private Integer cid; private String cName; private Integer pid; private Set<Category> categorySet = new HashSet<Category>(); @Override public String toString() { return "Category{" + "cid=" + cid + ", cName='" + cName + '\ '' + ", pid=" + pid + ", categorySet=" + categorySet + '}' ; } public Integer getCid() { return cid; } public void setCid(Integer cid) { this .cid = cid; } public String getcName() { return cName; } public void setcName(String cName) { this .cName = cName; } public Integer getPid() { return pid; } public void setPid(Integer pid) { this .pid = pid; } public Set<Category> getCategorySet() { return categorySet; } public void setCategorySet(Set<Category> categorySet) { this .categorySet = categorySet; } } |
测试类:
1
2
3
4
5
6
7
8
9
|
//测试自连接 @Test public void TestSelf(){ CateGoryDao dao = MyBatis.getSessionTwo().getMapper(CateGoryDao. class ); List<Category> list = dao.getCategory( 0 ); for (Category item:list ) { System.out.println(item); } } |
打印结果:
1
2
|
Category{cid= 1 , cName= '图书' , pid= 0 , categorySet=[Category{cid= 5 , cName= '期刊报纸' , pid= 1 , categorySet=[]}, Category{cid= 3 , cName= '青年图书' , pid= 1 , categorySet=[Category{cid= 6 , cName= '读者' , pid= 3 , categorySet=[Category{cid= 7 , cName= '12月份' , pid= 6 , categorySet=[]}]}]}, Category{cid= 4 , cName= '少儿图书' , pid= 1 , categorySet=[]}]} Category{cid= 2 , cName= '服装' , pid= 0 , categorySet=[]} |
以上所述是小编给大家介绍的MyBatis之自查询使用递归实现 N级联动效果,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!
原文链接:http://www.cnblogs.com/zhangyu0217----/archive/2017/07/12/7155219.html