一 事情缘由
Spring Security有5张表 ,分别是 用户表,角色表,权限表和2张关联表
我们做权限处理时没用关联表,所有在数据库存储时角色对应的权限是
用逗号分隔的字符串
在做表关联查询时,需要把改字符串用逗号切割,来匹配权限表的id,
这不就是切割字符串吗?博主微微一笑,简单!
先获取字符串,返回String类型,用java的String.split(",");
切好后存入集合,
在xml里用<foreach></foreach>
搞定!
功能是完成了但是非常辣眼睛.
后来老大教的mysql数据有
FIND_IN_SET(str,strlist)
函数可以切割逗号字符串
改成了
SELECT
*
from user
where FIND_IN_SET(id, ('1,2,3,4,5,6'));
大功告成!
二 MySQL手册中find_in_set函数的语法:
FIND_IN_SET(str,strlist)
str 要查询的字符串
strlist 字段名 参数以”,”分隔 如 (1,2,6,8)
select * from treenodes where FIND_IN_SET(id, ‘1,2,3,4,5’);
使用find_in_set函数一次返回多条记录
id 是一个表的字段,然后每条记录分别是id等于1,2,3,4,5的时候
有点类似in (集合)
select * from treenodes where id in (1,2,3,4,5);
三 find_in_set()和in的区别:
创建一张简单的表:
CREATE TABLE `tb_test` (
`id` int(8) NOT NULL auto_increment,
`name` varchar(255) NOT NULL,
`list` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO `tb_test` VALUES (1, 'name', 'daodao,xiaohu,xiaoqin');
INSERT INTO `tb_test` VALUES (2, 'name2', 'xiaohu,daodao,xiaoqin');
INSERT INTO `tb_test` VALUES (3, 'name3', 'xiaoqin,daodao,xiaohu');
使用IN查询:
SELECT id,name,list from tb_test WHERE 'daodao' IN(list); -- (一)
发现这样不行,只有当list字段的值等于’daodao’时(和IN前面的字符串完全匹配),查询才有效,否则都得不到结果
再来看看这个:
SELECT id,name,list from tb_test WHERE 'daodao' IN ('libk', 'zyfon', 'daodao'); -- (二)
这样是可以的。
这两条到底有什么区别呢?为什么第一条不能取得正确的结果,而第二条却能取得结果。原因其实是(一)中 (list) list是变量, 而(二)中 (‘libk’, ‘zyfon’, ‘daodao’)是常量。
所以如果要让(一)能正确工作,需要用find_in_set():
SELECT id,name,list from tb_test WHERE FIND_IN_SET('daodao',list); -- (一)的改进版
总结:
所以如果list是常量,则可以直接用IN, 否则要用find_in_set()函数。