博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql+mybatis递归调用
阅读量:4308 次
发布时间:2019-06-06

本文共 4816 字,大约阅读时间需要 16 分钟。

递归调用的应用场景常常出现在多级嵌套的情况,比如树形的菜单。下面通过一个简单的例子来实现mysql+mybatis的递归。

数据模型

private Integer categoryId;    private String categoryName;    private Integer isRoot;    private Integer categoryLevel;    private Integer rootCategoryId;    private Integer parentCategoryId;    private String parentCategoryName;

以上是一个简单的类目的数据实体,主要要注意通过乐parentCategoryId实现了父子的关联。

数据库数据

我们可以很简单的通过父级的id获取其直接子级列表。但是如果我们想要通过某一父级id获取其直接下属和间接下属的(子,孙,曾孙等)列表呢?这就需要用到递归来实现。

实现方法

首先,我们在实体类下面加上这么一个属性。

public List
childList=new ArrayList
();//子Category列表

然后,我们编写xml文件中的ResultMap,如下。

最后一句是关键,它说明了递归所需要调用的方法selectRecursionByParentCategoryId

然后我们来写这个递归方法。

注意这边的resultMap就是上述定义的resultMap.

如果要递归获取所有的TCategory,我们只要获取所有category_type=1(即根类目),然后从根目录递归下去,注意这边的resultMap必须为TreeMap,才会触发递归。

 

 

 

 

 

接下来写后台调用方法。

/**     * 根据特定父类递归查询所有子类     *      * @param categoryId     * @return     */    public List
allCategoryRecursion() { return baseDao .findTList( "TCategoryMapper.selectRecursionAll"); }
/**     * 根据特定父类递归查询所有子类     *      * @param categoryId     * @return */ public List
subCategoryListByParentId(int categoryId) { return baseDao .findTListByParam( "TCategoryMapper.selectRecursionByParentCategoryId", categoryId); }
 
/**     * 根据categoryId获取子孙categoryId的id字符串,用逗号隔开     *      * @param categoryId     * @return     */    public String subCategoryStrByParentId(Integer categoryId) {        String categoryStr = categoryId.toString();        List
categoryList = baseDao .findTListByParam( "TCategoryMapper.selectRecursionByParentCategoryId", categoryId); int size = categoryList.size(); for (int i = 0; i < size; i++) { TCategory category = categoryList.get(i); categoryStr = categoryStr + "," + category.getCategoryId(); if (!category.getChildList().isEmpty()) { Iterator
it = category.getChildList().iterator(); while (it.hasNext()) { categoryStr = categoryStr + "," + it.next().getCategoryId(); } } } return categoryStr; }

其中baseDao的代码如下。

package com.qgranite.dao;import java.io.Serializable;import java.lang.reflect.ParameterizedType;import java.lang.reflect.Type;import java.util.List;import javax.annotation.Resource;import org.mybatis.spring.SqlSessionTemplate;import org.springframework.stereotype.Repository;/** * 所有dao基类 *  * @author xdx * * @param 
* @param
*/@Repository("baseDao")public class BaseDao
{ private Class
enetityClass; @Resource(name = "sqlSessionTemplate") private SqlSessionTemplate sqlSessionTemplate; // 构造方法,根据实例类自动获取实体类型,这边利用java的反射 public BaseDao() { this.enetityClass = null; Class c = getClass(); Type t = c.getGenericSuperclass(); if (t instanceof ParameterizedType) { ParameterizedType p = (ParameterizedType) t; Type[] type = p.getActualTypeArguments(); this.enetityClass = (Class
) type[0]; } } /** * 获取实体 * * @param id * @return */ public T getT(String sql, Object param) { return sqlSessionTemplate.selectOne(sql, param); } /** * 不带查询参数的列表 * @param str * @return * @throws Exception */ public List
findTList(String sql){ return sqlSessionTemplate.selectList(sql); } /** * 带有参数的列表 * * @param str * @param param * @return * @throws Exception */ public List
findTListByParam(String sql, Object param) { return sqlSessionTemplate.selectList(sql, param); } /** * 插入一条数据,参数是t * * @param sql * @param t * @return */ public int addT(String sql, T t) { return sqlSessionTemplate.insert(sql, t); } /** * 修改一条数据,参数是t * @param sql * @param t * @return */ public int updateT(String sql,T t){ return sqlSessionTemplate.update(sql, t); } /** * 删除t,参数是主键 * @param sql * @param t * @return */ public int deleteT(String sql,PK pk){ return sqlSessionTemplate.delete(sql, pk); } /** * 根据param获取一个对象 * @param sql * @param param * @return */ public Object getObject(String sql,Object param){ return sqlSessionTemplate.selectOne(sql,param); }}

 

转载于:https://www.cnblogs.com/roy-blog/p/7080258.html

你可能感兴趣的文章
海龟交易法则14_掌控心魔
查看>>
海龟交易法则16_附原版海龟交易法则
查看>>
克罗谈投资策略01_期货交易中的墨菲法则
查看>>
克罗谈投资策略02_赢家和输家
查看>>
克罗谈投资策略03_你所期望的赌博方式
查看>>
克罗谈投资策略04_感觉与现实
查看>>
通向财务自由之路01_导读
查看>>
通向财务自由之路02_成功的决定因素:你
查看>>
中低频量化交易策略研发01_引言
查看>>
中低频量化交易策略研发06_推进的择时策略
查看>>
史丹·温斯坦称傲牛熊市的秘密
查看>>
期货市场技术分析01_理论基础
查看>>
期货市场技术分析02_趋势的基本概念
查看>>
期货市场技术分析03_主要反转形态
查看>>
期货市场技术分析04_持续形态
查看>>
期货市场技术分析05_交易量和持仓兴趣
查看>>
TB交易开拓者入门教程
查看>>
TB创建公式应用dll失败 请检查用户权限,终极解决方案
查看>>
python绘制k线图(蜡烛图)报错 No module named 'matplotlib.finance
查看>>
talib均线大全
查看>>