Ставьте палец вверх, если вам это нравится!
исходный код
вводить
Когда я вижу некоторые комментарии, как показано ниже. Мне интересно, как реализована эта функция. Проверив информацию, я обнаружил, что на самом деле это рекурсивная операция MySQL. Позвольте мне показать вам, как реализовать рекурсивный запрос в MySQL.
База данных проектов
Наблюдая за этой структурой базы данных, вы обнаружите, что она имеет родительский узел на всем пути к корневому узлу, поэтому, когда мы проектируем базу данных, мы должны установить поле parentid. Итак, мы можем получить следующую базу данных.
SQL-скрипт выглядит следующим образом
CREATE TABLE digui(
id INT(11) NOT null auto_increment,
msg VARCHAR(255) not NULL COMMENT '评论的内容',
parentid int(11) not null COMMENT '上一条',
PRIMARY KEY(id)
)ENGINE=INNODB auto_increment = 100 DEFAULT CHARSET=utf8mb4;
INSERT into `digui`(msg, parentid) VALUES ('A', 0);
INSERT into `digui`(msg, parentid) VALUES('B', 1);
INSERT into `digui`(msg, parentid) VALUES('D', 3);
INSERT into `digui`(msg, parentid) VALUES('C', 2);
На самом деле существует много способов реализовать рекурсивный запрос в MySQL.
- Использование хранимых процедур MySQL
- Рекурсия кода прикладного уровня
- Тег коллекции MyBatis
Схема 1 Рекурсия кода прикладного уровня
//应用层递归查询
@Override
public List<Digui> getAll(int parent) {
List<Digui> deptVosList=new ArrayList<>();
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.eq("parentid", parent);
List<Digui> list1 = list(queryWrapper);
for (Digui digui: list1) {
Digui digui1 = new Digui();
digui1.setId(digui.getId());
digui1.setMsg(digui.getMsg());
digui1.setParentid(digui.getParentid());
// 此处递归调用赋值
digui1.setDiguiList(getAll(digui.getId()));
deptVosList.add(digui1);
}
return deptVosList;
}
Схема 2 Этикетка коллекции MyBatis
<resultMap id="RecursiveMap" type="com.example.lsbdigui.entity.Digui">
<result property="id" column="id"/>
<result property="msg" column="msg"/>
<result property="parentid" column="parentid"/>
<collection property="diguiList" ofType="com.example.lsbdigui.entity.Digui"
select="com.example.lsbdigui.mapper.DiguiMapper.getAllBySQL"
column="id"/>
</resultMap>
<select id="getAllBySQL" resultMap="RecursiveMap">
select *
from digui
where parentid = #{parent}
</select>
использовать<collection>
,<select>
Теги реализуют рекурсивный запрос sql.
результат
{
"code": 200,
"msg": "正确返回",
"date": [
{
"id": 100,
"msg": "A",
"parentid": 0,
"diguiList": [
{
"id": 101,
"msg": "B",
"parentid": 100,
"diguiList": [
{
"id": 103,
"msg": "C",
"parentid": 101,
"diguiList": [
{
"id": 102,
"msg": "D",
"parentid": 103,
"diguiList": []
}
]
}
]
}
]
}
]
}
В сравнении
предположение
Прикладной уровень может запрашивать все данные одновременно, а затем рекурсивно находить необходимые данные, что позволяет сократить количество запросов к базе данных и повысить производительность.