@[toc]虽然我们在实际开发中很少直接使用flowable中的用户系统,但是完全不用的可能性不大。毕竟这东西是官方设计出来的,存在一定是合理的,所以今天松哥还是来和大家聊一聊我们如何在SpringBoot项目中增删改查一个用户或者组。1、准备工作首先我们创建一个SpringBoot项目,引入Web依赖和MySQL驱动,如下:创建完成后,我们手动添加flowable依赖,如下:org.flowableflowable-spring-boot-starter6.7.2然后在属性文件中配置数据库连接信息:spring.datasource.username=rootspring.datasource。password=123spring.datasource.url=jdbc:mysql:///flowable-idm?serverTimezone=Asia/Shanghai&useSSL=false&nullCatalogMeansCurrent=true好了,准备工作就完成了。2、用户操作在SpringBoot中,flowable已经默认为我们配置好了IdentityService对象,我们只需要将其注入到项目中即可使用。让我们看几个例子。2.1添加用户@AutowiredIdentityServiceidentityService;@TestvoidcontextLoads(){UserEntityImpluser=newUserEntityImpl();user.setId("javaboy");user.setDisplayName("江南小雨");user.setPassword("123");user.setFirstName("java");user.setLastName("男孩");user.setEmail("javaboy@qq.com");user.setRevision(0);identityService.saveUser(user);}这些字段很容易理解。和之前松哥在网页上添加用户字段时说的差不多。需要注意的是revision的值为0,表示这是一个新添加的用户。添加后,我们可以在数据库的ACT_ID_USER表中看到新增的数据:2.2修改用户如果要修改用户密码,可以调用如下方法:@Testvoidtest02(){UserEntityImpluser=newUserEntityImpl();用户.setId("javaboy");user.setPassword("666");user.setRevision(1);identityService.updateUserPassword(user);}这个方法虽然名字是updateUserPassword,但是实际上可以修改其他属性。这里有个问题,就是用户使用的是乐观锁,所以在修改的时候,一定要把revision写对,否则修改会失败。但是,我们往往记不住修改次数,所以最好先查询再修改。如下:@Testvoidtest03(){Useru=identityService.createUserQuery().userId("javaboy").singleResult();u.setDisplayName("itboy");identityService.updateUserPassword(u);}如果是强行给一个Unmatchedrevisions,执行的时候会报如下错误:当然你也可以在修改用户的时候调用saveUser方法。该方法会根据用户id查询用户。如果用户已经存在,则直接修改(修改password以外的其他属性),否则添加。2.3删除用户比较简单。可以根据用户id删除一个用户:@Testvoidtest05(){identityService.deleteUser("javaboy");}2.4查询用户查询的方式有很多种,可以通过用户的各种属性进行查询。比如查询所有姓张的用户:@Testvoidtest06(){Listlist=identityService.createUserQuery().userDisplayNameLike("Zhang%").orderByUserId().asc().list();for(Useruser:list){System.out.println("user.getDisplayName()="+user.getDisplayName());}}查询所有用户:@Testvoidtest07(){Listlist=identityService.createUserQuery().列表();for(Useruser:list){System.out.println("user.getId()="+user.getId());}}当然还有其他的方法,包括排序、分页等,基本看名字和意思,就不一一演示了。如果觉得这些方法调用起来麻烦,也可以直接使用SQL,这是MyBatis底层数据库操作使用的,所以这个SQL中的参数可以按照MyBatis中的参数来写:@Testvoidtest08(){Listlist=identityService.createNativeUserQuery().sql("select*fromACT_ID_USERwhereDISPLAY_NAME_like#{name}").parameter("name","李%").list();for(Useruser:list){System.out.println("user.getId()="+user.getId());}}有时候,如果不记得表名,可以按照类名查询类对应的表名,如下:@Testvoidtest08(){Listlist=identityService.createNativeUserQuery().sql("select*from"+idmManagementService.getTableName(User.class)+"whereDISPLAY_NAME_like#{name}").parameter("name","Li%").list();for(Useruser:list){System.out.println("user.getId()="+user.getId());}}好了,user的增删改查差不多了。如果用户理解了这些,下一步就很容易了。3、组操作3.1添加组组属性比较少,添加方法和user类似:@Testvoidtest09(){GroupEntityImplg=newGroupEntityImpl();g.setName("组长");g.setId("领导者");g.setRevision(0);identityService.saveGroup(g);}添加后,群组信息保存在ACT_ID_GROUP表中,如下图:根据松哥之前在flowable-ui中演示的,创建群组后,用户需要加入群组如下:identityService.createMembership("zhangsan","leader");identityService.createMembership("lisi","leader");这是为了设置zhangsan和lisi是组长(注意用户和组的关联表中有外键,所以需要保证两个参数都是真实的)。添加关联关系后,我们查看ACT_ID_MEMBERSHIP表,如下:使用如下方法删除关联关系:identityService.deleteMembership("zhangsan","leader");3.2修改组如下,更新id为leader的组名为leader,如下:Groupg=identityService.createGroupQuery().groupId("leader").singleResult();g.setName("leader");identityService.saveGroup(g);3.3删除组删除组的方法如下:identityService.deleteGroup("leader");删除群组时,也会删除群组与用户的关系,但不用担心用户被删除。3.4查询群组可以根据id或者name查询群组或者群组成员信息://根据id查询群组信息Groupg1=identityService.createGroupQuery().groupId("leader").singleResult();System.out.println("g1.getName()="+g1.getName());//根据name查询组信息Groupg2=identityService.createGroupQuery().groupName("GroupLeader").singleResult();System.out.println("g2.getId()="+g2.getId());//根据用户查询组信息(该用户包含在组中)Listlist=identityService.createGroupQuery().groupMember("zhangsan").list();for(Groupgroup:list){System.out.println("group.getName()="+group.getName());}4.查看表详情如果需要查看表详情,可以通过如下方式查看:@Testvoidtest15(){//获取系统信息,实际读取ACT_ID_PROPERTY表的信息Mapproperties=idmManagementService.getProperties();System.out.println("属性="+属性);//获取表TableMetaData的详细信息tableMetaData=idmManagementService.getTableMetaData(idmManagementService.getTableName(User.class));//获取表名System.out.println("tableMetaData.getTableName()="+tableMetaData.getTableName());//获取列名System.out.println("tableMetaData.getColumnNames()="+tableMetaData.getColumnNames());//获取列类型System.out.println("tableMetaData.getColumnTypes()="+tableMetaData.getColumnTypes());}好了,就是这样,如果我们想使用自己的用户系统,又不想放弃吧如果你是flowable用户,你可以通过上面的方式在添加本地系统用户的时候添加/更新用户到flowable。