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