MyBatis之自查询,使用 递归实现 N级联动
A:首先先看下一个简单的面试题
斐波那契数列
计算数组{1,1,2,3,5,8.......} 第30位值
规律:1 1 从第三项开始,每一项都是前两项之和
有两种实现方式
第一种方式:
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
第二种方式:利用数组
public int TestSelfTwo(int n){
if(n<0){
throw new IllegalArgumentException("n不能为负数");
}else if(n<=1){ //递归前两个数 不管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代表多少 位
B:在MyBatis中利用递归实现n级联动

sql语句:select * from type where pid = 0; 首次指定pid值为0,然后下次根据pid为0的cid 作为下次查询的pid
public List<Category> getCategory(Integer pid); //接口层方法
映射文件配置
<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;
实体类:
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;
}
}
测试类:
//测试自连接
@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);
}
}
打印结果:
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级联动的更多相关文章
- Mybatis之关联查询
一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...
- Mybatis多条件查询
在Mybatis多条件查询中: 1.参数如果是多条件,则需要将将添加到Map集合中进行传入. 2.就是将其参数用有序数字进行代替. Mybatis单个String类型参数传递 mysql文如下,传入参 ...
- 【转载】Mybatis多参数查询映射
转载地址:http://www.07net01.com/zhishi/402787.html 最近在做一个Mybatis的项目,由于是接触不久,虽然看了一下资料,但在实际开发中还是暴 露了很多问题,其 ...
- Mybatis包分页查询java公共类
Mybatis包分页查询java公共类 分页----对于数据量非常大的查询中.是不可缺少的. mybatis底层的分页sql语句因为须要我们自己去手动写.而实现分页显示的时候我们须要依据分页查询条 ...
- mybatis的collection查询问题以及使用原生解决方案的结果
之前在springboot+mybatis环境的坑和sql语句简化技巧的第2点提到,数据库的一对多查询可以一次查询多级数据,并且把拿到的数据按id聚合,使父级表和子级表都有数据. 但是这种查询,必然要 ...
- SpringBoot+Mybatis实现关联查询
SpringBoot+Mybatis实现关联查询 今天学习了下Mybatis的动态查询,然后接着上次的Demo改造了下实现表的关联查询. 话不多说,开始今天的小Demo 首先接着上次的项目 https ...
- MyBatis实现模糊查询的几种方式
在学习MyBatis过程中想实现模糊查询,可惜失败了.后来上百度上查了一下,算是解决了.记录一下MyBatis实现模糊查询的几种方式. 数据库表名为test_student,初始化了几条记录,如图: ...
- MyBatis多对多查询
-------------------siwuxie095 MyBatis 多对多查询 以订单和商品为例,即 一个订单可 ...
- Mybatis之关联查询及动态SQL
前言 实际开发项目中,很少是针对单表操作,基本都会联查多表进行操作,尤其是出一些报表的内容.此时,就可以使用Mybatis的关联查询还有动态SQL.前几篇文章已经介绍过了怎么调用及相关内容,因此这里只 ...
随机推荐
- 测试类异常Manual close is not allowed over a Spring managed SqlSession
在用Spring 和mybatis整合的 写测试类的时候报出解决办法:在全局配置文件 class="org.mybatis.spring.SqlSessionTemplate" ...
- Mysql 单表主从同步
先配主从同步,后将主库表老数据传输到从库 说明:api-server的数据库为主,其他harbor为从 1.master 配置文件更改 [mysqld] log-bin = mysql-bin ser ...
- C#中的Split用法以及详解
一.String.Split方法提供了如下6个重载函数: 名称 说明 String.Split (Char[]) 返回包含此实例中的子字符串(由指定 Char 数组的元素分隔)的 String 数组. ...
- python 抓取网页(一)
#-------PYTHON获取网页内容-------------# import sys, urllib url = "http://www.baidu.com" #网页地址 w ...
- VMware提示无法打开内核设备 \\.\Global\vmx86: 系统找不到指定的文件解决方案
1.右键单击[我的电脑],选择[管理] 2.在[服务]中找到VMware Workstation Server服务右键启动
- .net web 应用程序C#
简介 开发环境:VS2015 ASP.NET:可以开发出几乎所有运行在Windows上的应用程序:.NET是一种架构,一种新的API:引入程序集代替DLL: ADO.NET:一组.NET组件提供对数据 ...
- Android连接SQLServer详细教程(数据库+服务器+客户端)
摘星 标签: android连接sql http://blog.csdn.net/haoxingfeng/article/details/9111105
- KMP的原理和代码实现(详细注释|参考多个博客总结|可作为模板)
KMP算法解决的问题是字符匹配,是由Knuth–Morris–Pratt共同开发出来的,这个算法把字符匹配的时间复杂度缩小到O(m+n),而空间复杂度也只有O(m),n是target的长度,m是pat ...
- HDU 5179 beautiful number 数位dp
题目链接: hdu: http://acm.hdu.edu.cn/showproblem.php?pid=5179 bc(中文): http://bestcoder.hdu.edu.cn/contes ...
- java锁有哪些类(转)
转载来源:http://www.cnblogs.com/lxmyhappy/p/7380073.html 1.Java都有哪些锁? 公平锁/非公平锁 可重入锁 独享锁/共享锁 互斥锁/读写锁 乐观锁/ ...