- 1、本文档共4页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
使用Java代码实现列表排序功能--第1页
使⽤Java代码实现列表排序功能
说起排序,应该是每个程序员的最基本功底了,⾄少冒泡排序都会吧,但今天讲的和那些排序算法没多⼤关系。主要是最近做⼀个客服系统,需要
对常见问题进⾏排序,要求可以拖拽修改顺序,这种功能确实烂⼤街了啊,像这样⼦输⼊数字改变排序的:
showdoc排序.png
还有像这样拖拽改变顺序的:
拖拽排序.png
,事实上常见问题就是像这样的:
常见问题.png
在后台看上去⼤概是这样:
使用Java代码实现列表排序功能--第1页
使用Java代码实现列表排序功能--第2页
常见问题后台.png
需求是这样的:
需求.png
拿到需求⽂档的那⼀刻我脑海⾥马上冒出了上家公司拖拽排序**规则的样式,⼼⾥也⼤概有谱了,其实很简单,不管你怎么拖拽,我只管拿到全部
的guid/id的List(按顺序排好的)然后全量去修改排序的这个字段就好了 ,但也带来了⼏个问题:第⼀:⽆法避免的⾼并发情况下出现的排序混乱
风险,当然幸好⼀般这种需求都不会涉及到⾼并发场景,更何况我现在只想着这么实现这个功能先,不过在同事的指导下,有了使⽤SQL完成该功
能的⽅法,这个后⾯再讲;第⼆:全量更新带来的性能问题,相信很多⼈知道怎么批量插⼊,但不知道批量修改吧,像我上家公司就很蠢的⽤for
循环⼀遍⼀遍⽤id对应去更新,真的很蠢,就像我在《做程序员到现在踩过的坑》中讲到的:别在for循环⾥⼀遍⼀遍查数据库...原因当然很简单,
数据量⼀旦很多,数据库连接就会爆掉的,想象⼀下,你有⼏百万数据需要更新就去执⾏⼏百万条SQL,建⽴⼏百万条数据库连接,那场景太美我
不敢想,所以能⽤⼀条SQL解决的就⽤⼀条SQL解决,能只建⽴⼀次数据库连接,就不要重复建⽴⽆关紧要的数据库连接,当然慢SQL不在此列。
这⾥贴⼀下批量插⼊和批量更新的SQL,希望有借鉴意义:
image.png
使用Java代码实现列表排序功能--第2页
使用Java代码实现列表排序功能--第3页
好了,讲了这么多废话,讲讲我的解决思路吧,⾸先我不要前端排好的序列,⽽是只要修改的那条常见问题和要改到哪个位置,然后代码逻辑如
下:
排序.png
看代码,思路应该很清晰了吧?就是把要改变位置的那条记录从数据库查出来的列表⾥先排除出去,然后,将剩下的队列以⽬标位置分为两个部分
将要改变位置的那条记录插⼊⽬标位置组成全新的队列,重新⽣成序号然后⽤⼀条SQL批量更新序号字段,新增的话就是这样:
新增.png
使用Java代码实现列表排序功能--第3页
使用Java代码实现列表排序功能--第4页
修改就是直接组对象调sort⽅法就可以了,删除我是先删除,然后全部查出来重新排序修改就可以了,像这样:
删除.png
接下来将考虑使⽤同事提到的利⽤SQL原⼦性⽅法来实现同样的功能:
UPDATE table
set LEVEL =
(
CASE
WHEN (LEVEL>3 AND LEVEL<=6) THEN LEVEL-1
WHEN LEVEL=3 THEN 6
ELSE LEVEL END
)
UPDATE table
set LEVEL =
(
CASE
WHEN (LEVEL<6 AND LEVEL>=3) THEN LEVEL+1
WHEN LEVEL=6 THEN 3
ELSE LEVEL END
)
使用Java代码实现列表排序功能--第4页
文档评论(0)