今天需要做一个功能,根据专业,有不同的章节,章节下面有对应的习题,

由于只有这么两级,可以不用使用递归,直接查询父集,之后foreach查询子集放入对应的list集合。

虽然实现了,感觉毕竟,太low。

有同事跟我说可以使用mybatis的递归实现,就学习了下。

对应的bean里面需要有对应的list<bean> lists的引用。

直接上代码

对应的sql语句

CREATE TABLE `goods_category` (
`goodscateid` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`parentid` int(11) DEFAULT NULL,
`description` varchar(255) DEFAULT NULL,
`displayorder` int(11) DEFAULT NULL,
`commissionrate` double DEFAULT NULL,
`enabled` int(11) DEFAULT NULL,
PRIMARY KEY (`goodscateid`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8; /*Data for the table `goods_category` */
insert into `goods_category`(`goodscateid`,`name`,`parentid`,`description`,`displayorder`,`commissionrate`,`enabled`) values (1,'java',0,'',NULL,NULL,NULL),(2,'spring',1,'',NULL,NULL,NULL),(3,'springmvc',1,'',NULL,NULL,NULL),(4,'struts',1,'',NULL,NULL,NULL),(5,'jdbc',0,'',NULL,NULL,NULL),(6,'hibernate',5,'',NULL,NULL,NULL),(7,'mybatis',5,'',NULL,NULL,NULL),(8,'jdbctemplate',5,'',NULL,NULL,NULL),(9,'beanfactory',3,'',NULL,NULL,NULL),(10,'factorybean',3,'',NULL,NULL,NULL);

实体类

@JsonIgnoreProperties({"displayorder","commissionrate","enabled"})
public class GoodsCategoryVo {
private Integer goodscateid;
private String name;
private Integer parentid;
private String description;
private Integer displayorder;
private Double commissionrate;
private Integer enabled;
private List<GoodsCategoryVo> catelist;
get 。。。 set。。。 tostring。。。

dao层

public interface GoodsMapper {
List<GoodsCategoryVo> getCategory(Integer pid);
}

mapper.xml

<resultMap id="getSelf" type="com.bscc.beans.GoodsCategoryVo">
<id column="goodscateid" property="goodscateid"></id>
<result column="name" property="name"></result>
<collection property="catelist" select="getCategory"
column="goodscateid"></collection>
<!--查到的cid作为下次的pid -->
</resultMap> <select id="getCategory" resultMap="getSelf">
select * from goods_category where parentid=#{pid}
ORDER BY displayorder,goodscateid
</select>

之后直接访问对应的方法,即可查询出来

@RequestMapping("/getGoodsList")
@ResponseBody
public List<GoodsCategoryVo> getGoodsList(){
// pid指定为0
List<GoodsCategoryVo> list = goodsMapper.getCategory(0);
return list;
}

结果,可以使用json在线工具

[
{
"goodscateid": 1,
"name": "java",
"parentid": 0,
"description": "111",
"catelist": [
{
"goodscateid": 2,
"name": "spring",
"parentid": 1,
"description": "222",
"catelist": []
},
{
"goodscateid": 3,
"name": "springmvc",
"parentid": 1,
"description": "333",
"catelist": [
{
"goodscateid": 9,
"name": "beanfactory",
"parentid": 3,
"description": "999",
"catelist": []
},
{
"goodscateid": 10,
"name": "factorybean",
"parentid": 3,
"description": "000",
"catelist": []
}
]
},
{
"goodscateid": 4,
"name": "struts",
"parentid": 1,
"description": "444",
"catelist": []
}
]
},
{
"goodscateid": 5,
"name": "jdbc",
"parentid": 0,
"description": "555",
"catelist": [
{
"goodscateid": 6,
"name": "hibernate",
"parentid": 5,
"description": "666",
"catelist": []
},
{
"goodscateid": 7,
"name": "mybatis",
"parentid": 5,
"description": "777",
"catelist": []
},
{
"goodscateid": 8,
"name": "jdbctemplate",
"parentid": 5,
"description": "888",
"catelist": []
}
]
}
]

mybatis递归就是这么的简单。

说下mybatis一对多实现

对应的bean

public class Dept {
private Integer id;
private String deptName;
private String locAdd;
private List<Emp> emps
@JsonIgnoreProperties("dept")
public class Emp {
private Integer id;
private String name;
private Dept dept;

dao层

public interface DeptMapper {
public Dept getDeptById(Integer id);
}
public interface EmpMapper {
public Emp getEmpByDeptId(Integer deptId);
}

mapper.xml文件

<mapper namespace="com.bscc.mapper.DeptMapper">
<resultMap id="DeptResultMap" type="com.bscc.beans.Dept">
<id property="id" column="id"/>
<result property="deptName" column="deptName"/>
<result property="locAdd" column="locAdd"/>
<!-- private List<Emp> emps; column="id"写被集合对象主键,select按照外键键查询,通过deptid查出emp给dept-->
<collection property="emps" column="id" ofType="Emp" select="com.bscc.mapper.EmpMapper.getEmpByDeptId"/>
</resultMap>
<select id="getDeptById" parameterType="Integer" resultMap="DeptResultMap">
select * from tbl_dept where id=#{id}
</select>
</mapper>
<mapper namespace="com.bscc.mapper.EmpMapper">
<resultMap id="EmpResultMap" type="com.bscc.beans.Emp">
<id property="id" column="id"/>
<result property="name" column="name"/>
</resultMap>
<select id="getEmpByDeptId" parameterType="Integer" resultMap="EmpResultMap">
select * from tbl_emp where deptId=#{deptId}
</select>
</mapper>

对应的controller方法

@RequestMapping("/getDeptById")
@ResponseBody
public Dept getDeptById() {
Dept deptById = deptMapper.getDeptById(1);
return deptById;
}

无非就是比简单查询复杂一些罢了。

代码目录

OK!!!

对应的github地址

https://github.com/chywx/MavenProject6oneToMany

mybatis递归,一对多代码示例的更多相关文章

  1. mybatis 04: mybatis对象分析 + 测试代码简化 + 配置优化

    MyBatis对象分析 测试代码示例 package com.example.test; import com.example.pojo.Student; import org.apache.ibat ...

  2. Python实现各种排序算法的代码示例总结

    Python实现各种排序算法的代码示例总结 作者:Donald Knuth 字体:[增加 减小] 类型:转载 时间:2015-12-11我要评论 这篇文章主要介绍了Python实现各种排序算法的代码示 ...

  3. Delphi之通过代码示例学习XML解析、StringReplace的用法(异常控制 good)

    *Delphi之通过代码示例学习XML解析.StringReplace的用法 这个程序可以用于解析任何合法的XML字符串. 首先是看一下程序的运行效果: 以解析这样一个XML的字符串为例: <? ...

  4. RSA加密传输代码示例

    RSA加密传输代码示例 涉及敏感数据的传输,双方最好约定使用加密解密.那RSA非对称加密就大有作为了.服务端可以保留自己的私钥,发给客户端对应的公钥.这样就可以互相加解密了.php中rsa加解密实现: ...

  5. mybatis的一对多,多对一,以及多对对的配置和使用

    1.本文章是无意中看见易百教程的Mybatis教程才注意到这个问题,平时都仅仅是在用CRUD,忽略了这方面的问题,真实十分羞愧   2.首先我们开始对mybatis的一对多的探究   根据这个应用场景 ...

  6. 回顾一下MyBatis逆向工程——自动生成代码

    前言 最近做的项目(SSM+Shiro)的数据库表已经创建完成,一共有15张表,如果我们一个个去写pojo/bean的代码以及各种sql语句的话未免太过麻烦而且很容易出错,这个时候我们就需要MyBat ...

  7. (转)MyBatis框架的学习(七)——MyBatis逆向工程自动生成代码

    http://blog.csdn.net/yerenyuan_pku/article/details/71909325 什么是逆向工程 MyBatis的一个主要的特点就是需要程序员自己编写sql,那么 ...

  8. H5+ 分享到微信、朋友圈代码示例

    h5+分享到微信.朋友圈代码示例 在使用分享功能的时候会莫名的分享失败,debug时发现是图片过大的问题. 图片过大时ios平台上返回错误码-8,安卓上返回错误码-3(我测试是这样) 因此如果第一次分 ...

  9. 高级渲染技巧和代码示例 GPU Pro 7

    下载代码示例 移动设备正呈现着像素越来越高,屏幕尺寸越来越小的发展趋势. 由于像素着色的能耗非常大,因此 DPI 的增加以及移动设备固有的功耗受限环境为降低像素着色成本带来了巨大的压力. MSAA 有 ...

随机推荐

  1. 26 THINGS I LEARNED IN THE DEEP LEARNING SUMMER SCHOOL

    26 THINGS I LEARNED IN THE DEEP LEARNING SUMMER SCHOOL In the beginning of August I got the chance t ...

  2. 给APP增加RSA签名

    RSA签名,Google主要用于APP的来源控制与结算.所谓的结算,也是就是控制了APP只有使用现在机子上登录的Google账户从Google市场曾经下载过该APP的才能够使用,这样也就达到了app销 ...

  3. JAVA多线程提高三:线程范围内共享变量&ThreadLocal

    今天我们学习的是如何在线程自己的范围内达到变量数据的共享,而各个线程之间又是互相独立开来,各自维护的,即我们说的ThreadLocal的作用. 一.概念 可以将每个线程用到的数据与对应的线程号存放到一 ...

  4. 压缩JS时生成source_map

    @echo off :: 当前目录 src/test set currDir=src/test/ set sourceMapFileName=test.js.map set inputList=%in ...

  5. zepto.js 实现原理解析

    zepto 是移动端常用的 dom 库,代码轻巧,操作方式类同 jquery.那么 zepto 的核心实现原理是什么呢?

  6. 全文搜索引擎 Elasticsearch 介绍

    全文搜索属于最常见的需求,开源的 Elasticsearch (以下简称 Elastic)是目前全文搜索引擎的首选. 它可以快速地储存.搜索和分析海量数据.维基百科.Stack Overflow.Gi ...

  7. 对Feign的请求url 重写

    需求:对当前请求的 url 重新构建 debug feign 的执行可知,重写 LoadBalancerFeignClient 类中的 execute 方法即可控制当前请求的url 代码分析 当引入  ...

  8. [LeetCode] Intersection of Two Linked Lists 两链表是否相交

    Write a program to find the node at which the intersection of two singly linked lists begins. For ex ...

  9. Balanced and stabilized quicksort method

    The improved Quicksort method of the present invention utilizes two pointers initialized at opposite ...

  10. offset宏的讲解【转】

    转自:http://blog.csdn.net/tigerjibo/article/details/8299584 1.offset宏讲解 #define offsetof(TYPE, MEMBER) ...