pageHelper:
配置及简单原理
<https://www.cnblogs.com/billmiao/p/9872158.html
单表联查生成树结构
caategory表
-- auto-generated definition
create table category
(
id varchar(32) not null comment '主键'
primary key,
name varchar(32) not null comment '分类名称',
label varchar(32) null comment '分类标签默认和名称一样',
parentid varchar(32) null comment '父结点id',
isshow char null comment '是否显示',
orderby int(4) null comment '排序字段',
isleaf char null comment '是否叶子'
);
前台所需的数据结构:
{
id: 1,
label: '一级 1',
children: [{
id: 4,
label: '二级 1-1',
children: [{
id: 9,
label: '三级 1-1-1'
}, {
id: 10,
label: '三级 1-1-2'
}]
}]
}, {
id: 2,
label: '一级 2',
children: [{
id: 5,
label: '二级 2-1'
}, {
id: 6,
label: '二级 2-2'
}]
},
结合实际考虑,需要采用左外链接,因为假如某个二级节点下没有子节点,采用内连接的话,这样的二级节点会丢失,看实际需要吧
查询方案:
封装类:
package com.xuecheng.framework.domain.course.ext;
import lombok.Data;
import lombok.ToString;
import java.util.List;
/**
* Created by admin on 2018/2/7.
*/
@Data
@ToString
public class CategoryNode {
String id;
String label;
List<CategoryNode> children;
}
持久层:CategoryMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.xuecheng.manager_course.dao.CategoryMapper">
<resultMap id="categoryMap" type="com.xuecheng.framework.domain.course.ext.CategoryNode">
<id column="c1_id" property="id"/>
<result column="c1_label" property="label"/>
<collection property="children" ofType="com.xuecheng.framework.domain.course.ext.CategoryNode">
<id column="c2_id" property="id"/>
<result column="c2_label" property="label"/>
<collection property="children" ofType="com.xuecheng.framework.domain.course.ext.CategoryNode">
<id column="c3_id" property="id"/>
<result column="c3_label" property="label"/>
</collection>
</collection>
</resultMap>
<select id="findCategories" resultMap="categoryMap">
select c1.id c1_id,c1.label c1_label,
c2.id c2_id,c2.label c2_label,
c3.id c3_id,c3.label c3_label
from category c1
left join category c2 on c1.id = c2.parentid
left join category c3 on c2.id = c3.parentid where c1.id = #{categoryId};
</select>
</mapper>
dao:
@Mapper
public interface TeachplanMapper {
List<TeachplanNode> findPlanTree(String courseId);
}
注意外连接时 on 和 where的区别
1、``on
条件是在生成临时表时使用的条件,它不管on
中的条件是否为真,都会返回左边表中的记录。
2、where
条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left` `join
的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
select *
from teachplan p1
left join teachplan p2
on p1.parentid = 0;//不管``on``中的条件是否为真,都会返回左边表中的记录。