纠纷奇闻社交美文家庭
投稿投诉
家庭城市
爱好生活
创业男女
能力餐饮
美文职业
心理周易
母婴奇趣
两性技能
社交传统
新闻范文
工作个人
思考社会
作文职场
家居中考
兴趣安全
解密魅力
奇闻笑话
写作笔记
阅读企业
饮食时事
纠纷案例
初中历史
说说童话
乐趣治疗

mybatismate轻松搞定数据权限

4月8日 小米粒投稿
  0、简介
  mybatismate为mp企业级模块,支持分库分表,数据审计、数据敏感词过滤(AC算法),字段加密,字典回写(数据绑定),数据权限,表结构自动生成SQL维护等,旨在更敏捷优雅处理数据。1、主要功能字典绑定字段加密数据脱敏表结构动态维护数据审计记录数据范围(数据权限)数据库分库分表、动态数据源、读写分离、数据库健康检查自动切换。2、使用2。1依赖导入
  SpringBoot引入自动依赖注解包dependencygroupIdcom。baomidougroupIdmybatismatestarterartifactIdversion1。0。8versiondependency
  注解(实体分包使用)dependencygroupIdcom。baomidougroupIdmybatismateannotationartifactIdversion1。0。8versiondependency2。2字段数据绑定(字典回写)
  例如usersex类型sex字典结果映射到sexText属性FieldDict(typeusersex,targetsexText)privateIprivateStringsexT
  实现IDataDict接口提供字典数据源,注入到Spring容器即可。ComponentpublicclassDataDictimplementsIDataDict{从数据库或缓存中获取privateMapString,StringSEXMAPnewConcurrentHashMapString,String(){{put(0,女);put(1,男);}};OverridepublicStringgetNameByCode(FieldDictfieldDict,Stringcode){System。err。println(字段类型:fieldDict。type(),编码:code);returnSEXMAP。get(code);}}2。3字段加密
  属性FieldEncrypt注解即可加密存储,会自动解密查询结果,支持全局配置加密密钥算法,及注解密钥算法,可以实现IEncryptor注入自定义算法。FieldEncrypt(algorithmAlgorithm。PBEWithMD5AndDES)privateS2。4字段脱敏
  属性FieldSensitive注解即可自动按照预设策略对源数据进行脱敏处理,默认SensitiveType内置9种常用脱敏策略。
  例如:中文名、银行卡账号、手机号码等脱敏策略。
  也可以自定义策略如下:FieldSensitive(typetestStrategy)privateSFieldSensitive(typeSensitiveType。mobile)privateS
  自定义脱敏策略testStrategy添加到默认策略中注入Spring容器即可。ConfigurationpublicclassSensitiveStrategyConfig{注入脱敏策略BeanpublicISensitiveStrategysensitiveStrategy(){自定义testStrategy类型脱敏处理returnnewSensitiveStrategy()。addStrategy(testStrategy,tttest);}}
  例如文章敏感词过滤演示文章敏感词过滤RestControllerpublicclassArticleController{AutowiredprivateSensitiveWordsMappersensitiveWordsM测试访问下面地址观察请求地址、界面返回数据及控制台(普通参数)无敏感词http:localhost:8080info?contenttomsee1age18英文敏感词http:localhost:8080info?contentmy20content20is20tomcatsee1age18汉字敏感词http:localhost:8080info?contentE78E8BE5AE89E79FB3E59490E5AE8BE585ABE5A4A7E5AEB6see1多个敏感词http:localhost:8080info?contentE78E8BE5AE89E79FB3E69C89E4B880E58FAAE78CABtomcatE6B1A4E5A786E587AFE789B9see1size6插入一个字变成非敏感词http:localhost:8080info?contentE78E8BE78CABE5AE89E79FB3E69C89E4B880E58FAAE78CABtomcatE6B1A4E5A786E587AFE789B9see1size6GetMapping(info)publicStringinfo(Articlearticle)throwsException{returnParamsConfig。toJson(article);}添加一个敏感词然后再去观察是否生效http:localhost:8080add观察【猫】这个词被过滤了http:localhost:8080info?contentE78E8BE5AE89E79FB3E69C89E4B880E58FAAE78CABtomcatE6B1A4E5A786E587AFE789B9see1size6嵌套敏感词处理http:localhost:8080info?contentE78E8BE78CABE5AE89E79FB3E69C89E4B880E58FAAE78CABtomcatE6B1A4E5A786E587AFE789B9see1size6多层嵌套敏感词http:localhost:8080info?contentE78E8BE78E8BE78CABE5AE89E79FB3E5AE89E79FB3E69C89E4B880E58FAAE78CABtomcatE6B1A4E5A786E587AFE789B9see1size6GetMapping(add)publicStringadd()throwsException{Longid3L;if(nullsensitiveWordsMapper。selectById(id)){System。err。println(插入一个敏感词:sensitiveWordsMapper。insert(newSensitiveWords(id,猫)));插入一个敏感词,刷新算法引擎敏感词SensitiveWordsProcessor。reloadSensitiveWords();}}测试访问下面地址观察控制台(请求json参数)idea执行resources目录TestJson。http文件测试PostMapping(json)publicStringjson(RequestBodyArticlearticle)throwsException{returnParamsConfig。toJson(article);}}2。5DDL数据结构自动维护
  解决升级表结构初始化,版本发布更新SQL维护问题,目前支持MySql、PostgreSQL。ComponentpublicclassPostgresDdlimplementsIDdl{执行SQL脚本方式OverridepublicListStringgetSqlFiles(){returnArrays。asList(内置包方式dbtagschema。sql,文件绝对路径方式D:dbtagdata。sql);}}
  不仅仅可以固定执行,也可以动态执行!!ddlScript。run(newStringReader(DELETEFROMINSERTINTOuser(id,username,password,sex,email)VALUES(20,Duo,123456,0,Duobaomidou。com);));
  它还支持多种数据源执行!!!ComponentpublicclassMysqlDdlimplementsIDdl{Overridepublicvoidsharding(ConsumerIDdlconsumer){多数据源指定,主库初始化从库自动同步SShardingGroupPropertysgpShardingKey。getDbGroupProperty(group);if(null!sgp){主库sgp。getMasterKeys()。forEach(key{ShardingKey。change(groupkey);consumer。accept(this);});从库sgp。getSlaveKeys()。forEach(key{ShardingKey。change(groupkey);consumer。accept(this);});}}执行SQL脚本方式OverridepublicListStringgetSqlFiles(){returnArrays。asList(dbusermysql。sql);}}2。6动态多数据源主从自由切换
  Sharding注解使数据源不限制随意使用切换,你可以在mapper层添加注解,按需求指哪打哪!!MapperSharding(mysql)publicinterfaceUserMapperextendsBaseMapperUser{Sharding(postgres)LongselectByUsername(Stringusername);}
  你也可以自定义策略统一调兵遣将ComponentpublicclassMyShardingStrategyextendsRandomShardingStrategy{决定切换数据源key{linkShardingDatasource}paramgroup动态数据库组paraminvocation{linkInvocation}paramsqlCommandType{linkSqlCommandType}OverridepublicvoiddetermineDatasourceKey(Stringgroup,Invocationinvocation,SqlCommandTypesqlCommandType){数据源组group自定义选择即可,keys为数据源组内主从多节点,可随机选择或者自己控制this。changeDatabaseKey(group,sqlCommandType,keyschooseKey(keys,invocation));}}
  可以开启主从策略,当然也是可以开启健康检查!!!
  具体配置:mybatismate:sharding:health:trueahrefhttps:www。q578。coml160targetblankclassinfotextkey健康a检测primary:mysql默认选择数据源datasource:mysql:数据库组key:node1。。。key:node2cluster:slave从库读写分离时候负责sql查询操作,主库master默认可以不写。。。postgres:key:node1数据节点。。。2。7分布式事务日志打印
  部分配置如下:p性能分析拦截器,用于输出每条SQL语句及其执行时间Slf4jComponentIntercepts({Signature(typeStatementHandler。class,methodquery,args{Statement。class,ResultHandler。class}),Signature(typeStatementHandler。class,methodupdate,args{Statement。class}),Signature(typeStatementHandler。class,methodbatch,args{Statement。class})})publicclassPerformanceInterceptorimplementsInterceptor{SQL执行最大时长,超过自动停止运行,有助于发现问题。privatelongmaxTime0;SQL是否格式化是否写入日志文件
  true写入日志文件,不阻断程序执行!
  超过设定的最大执行时长异常提示!privatebooleanwriteInLOverridepublicObjectintercept(Invocationinvocation)throwsThrowable{SObjectfirstArginvocation。getArgs()〔0〕;if(Proxy。isProxyClass(firstArg。getClass())){statement(Statement)SystemMetaObject。forObject(firstArg)。getValue(h。statement);}else{statement(Statement)firstA}MetaObjectstmtMetaObjSystemMetaObject。forObject(statement);try{statement(Statement)stmtMetaObj。getValue(stmt。statement);}catch(Exceptione){donothing}if(stmtMetaObj。hasGetter(delegate)){Hikaritry{statement(Statement)stmtMetaObj。getValue(delegate);}catch(Exceptione){}}StringoriginalSif(originalSqlnull){originalSqlstatement。toString();}originalSqloriginalSql。replaceAll(〔s〕,);intindexindexOfSqlStart(originalSql);if(index0){originalSqloriginalSql。substring(index);}计算执行SQL耗时longstartSystemClock。now();Objectresultinvocation。proceed();longtimingSystemClock。now()格式化SQL打印执行结果ObjecttargetPluginUtils。realTarget(invocation。getTarget());MetaObjectmetaObjectSystemMetaObject。forObject(target);MappedStatementms(MappedStatement)metaObject。getValue(delegate。mappedStatement);StringBuilderformatSqlnewStringBuilder();formatSql。append(Time:)。append(timing);formatSql。append(msID:)。append(ms。getId());formatSql。append(ExecuteSQL:)。append(sqlFormat(originalSql,format))。append();if(this。isWriteInLog()){if(this。getMaxTime()1timingthis。getMaxTime()){log。error(formatSql。toString());}else{log。debug(formatSql。toString());}}else{System。err。println(formatSql);if(this。getMaxTime()1timingthis。getMaxTime()){thrownewRuntimeException(TheSQLexecutiontimeistoolarge,pleaseoptimize!);}}}OverridepublicObjectplugin(Objecttarget){if(targetinstanceofStatementHandler){returnPlugin。wrap(target,this);}}OverridepublicvoidsetProperties(Propertiesprop){StringmaxTimeprop。getProperty(maxTime);Stringformatprop。getProperty(format);if(StringUtils。isNotEmpty(maxTime)){this。maxTimeLong。parseLong(maxTime);}if(StringUtils。isNotEmpty(format)){this。formatBoolean。valueOf(format);}}publiclonggetMaxTime(){returnmaxT}publicPerformanceInterceptorsetMaxTime(longmaxTime){this。maxTimemaxT}publicbooleanisFormat(){}publicPerformanceInterceptorsetFormat(booleanformat){this。}publicbooleanisWriteInLog(){returnwriteInL}publicPerformanceInterceptorsetWriteInLog(booleanwriteInLog){this。writeInLogwriteInL}publicMethodgetMethodRegular(C?clazz,StringmethodName){if(Object。class。equals(clazz)){}for(Methodmethod:clazz。getDeclaredMethods()){if(method。getName()。equals(methodName)){}}returngetMethodRegular(clazz。getSuperclass(),methodName);}获取sql语句开头部分paramsqlreturnprivateintindexOfSqlStart(Stringsql){StringupperCaseSqlsql。toUpperCase();SetIntegersetnewHashSet();set。add(upperCaseSql。indexOf(SELECT));set。add(upperCaseSql。indexOf(UPDATE));set。add(upperCaseSql。indexOf(INSERT));set。add(upperCaseSql。indexOf(DELETE));set。remove(1);if(CollectionUtils。isEmpty(set)){return1;}ListIntegerlistnewArrayList(set);Collections。sort(list,Integer::compareTo);returnlist。get(0);}privatefinalstaticSqlFormattersqlFormatternewSqlFormatter();格式sqlparamboundSqlparamformatreturnpublicstaticStringsqlFormat(StringboundSql,booleanformat){if(format){try{returnsqlFormatter。format(boundSql);}catch(Exceptionignored){}}returnboundS}}
  使用:RestControllerAllArgsConstructorpublicclassTestController{privateBuyServicebuyS数据库test表torder在事务一致情况无法插入数据,能够插入说明多数据源事务无效测试访问http:localhost:8080test制造事务回滚http:localhost:8080test?errortrue也可通过修改表结构制造错误注释ShardingConfig注入dataSourceProvider可测试事务无效情况GetMapping(test)publicStringtest(Booleanerror){returnbuyService。buy(null!errorerror);}}2。8数据权限
  mapper层添加注解:测试test类型数据权限范围,混合分页模式DataScope(typetest,value{关联表user别名u指定部门字段权限DataColumn(aliasu,namedepartmentid),关联表user别名u指定手机号字段(自己判断处理)DataColumn(aliasu,namemobile)})Select(selectu。fromuseru)ListUserselectTestList(IPageUserpage,Longid,Param(name)Stringusername);
  模拟业务处理逻辑:BeanpublicIDataScopeProviderdataScopeProvider(){returnnewAbstractDataScopeProvider(){OverrideprotectedvoidsetWhere(PlainSelectplainSelect,Object〔〕args,DataScopePropertydataScopeProperty){args中包含mapper方法的请求参数,需要使用可以自行获取测试数据权限,最终执行SQL语句SELECTu。FROMuseruWHERE(u。departmentidIN(1,2,3,5))ANDu。mobileLIKE1533if(test。equals(dataScopeProperty。getType())){业务test类型ListDataColumnPropertydataColumnsdataScopeProperty。getColumns();for(DataColumnPropertydataColumn:dataColumns){if(departmentid。equals(dataColumn。getName())){追加部门字段IN条件,也可以是SQL语句SetStringdeptIdsnewHashSet();deptIds。add(1);deptIds。add(2);deptIds。add(3);deptIds。add(5);ItemsListitemsListnewExpressionList(deptIds。stream()。map(StringValue::new)。collect(Collectors。toList()));InExpressioninExpressionnewInExpression(newColumn(dataColumn。getAliasDotName()),itemsList);if(nullplainSelect。getWhere()){不存在where条件plainSelect。setWhere(newParenthesis(inExpression));}else{存在where条件and处理plainSelect。setWhere(newAndExpression(plainSelect。getWhere(),inExpression));}}elseif(mobile。equals(dataColumn。getName())){支持一个自定义条件LikeExpressionlikeExpressionnewLikeExpression();likeExpression。setLeftExpression(newColumn(dataColumn。getAliasDotName()));likeExpression。setRightExpression(newStringValue(1533));plainSelect。setWhere(newAndExpression(plainSelect。getWhere(),likeExpression));}}}}};}
  最终执行SQL输出:SELECTu。FROMuseruWHERE(u。departmentidIN(1,2,3,5))ANDu。mobileLIKE1533LIMIT1,10
  目前仅有付费版本,了解更多mybatismate使用示例详见:
  https:gitee。combaomidoumybatismateexamples
  原文链接:https:mp。weixin。qq。comsygzsFpeT2jsjcAgUseHLQg
投诉 评论 转载

新能源汽车最近几年越来越多的企业进入电动汽车这个行业,这是一个好现象。这让我想到苹果4出来以后开启的山寨机时代,那时的农村,那时的华强北,非常精彩,经过几年的洗牌,尤其是小米手机的……温室反季节蔬菜种植,病虫害与湿度有关,识别与防治是有窍门的导读:对于温室种植蔬菜来讲,大部分的种植户都知道温室的湿度是引发一些病虫害发生的关键性因素。但在实际的种植过程中还是难以避免,这一过程主要是还对于温室大棚的应用、温室大棚的管理……景区安装监控摄像头监督游客的不文明行为,有没有必要?3月10日上午,云南昆明海埂大坝的工作人员接到了举报照片,照片中一名戴着白色帽子的女士伸手抓住了一只海鸥,工作人员发现情况后立即上前制止。虽然每个景区都会提示大家禁止不文明游玩……苹果华为与小米,科技公司造车的三条路或终是殊途同归,但谁能走到最后?文Toretto小米造车的热度还没有过去,华为计划推出自有品牌电动车的消息再起。华为很快做出回应:不造车,帮助车企造车好车。……java线程暂停恢复线程的suspend、resume方法暂停的时间点不可控,也早就不推荐使用。可以通过interrupt实现线程安全的暂停、恢复。可以把中断标志位当做一个普通的属性,……科学瘦身快速燃脂,麦瑞克诠释智能科技健身,教你练就性感好身材不知道大家最近这些年有没有发现这样一个问题,过去我们买东西不少人都喜欢选择国外的大品牌,除了以前确实部分国外品牌的产品更好之外,这其中也不乏盲目跟风的人群。但是最近这些年,国内……兄弟联手抢地,撑起朱氏家族隐秘商业帝国朱孟依兄弟名下公司将近万亿土储,不过是朱氏家族生意版图的一角,家族旗下公司业务交叠、交叉持股,覆盖地产、基建、能源、金融、医药等,庞大的隐形财富不为外人所知。本文由无冕财……元宇宙玫瑰,还是荆棘经过近30年的发展,互联网的演变正站在互联网3。0的门槛上。与互联网1。0和互联网2。0一样,正是领先的技术推动着互联网3。0不断进化,目前它正在试图创建利用人工智能和分布式计……为什么双耳戴助听器会听得特别清楚?对于言语的理解,立体声效果是最佳,而双耳佩戴助听器可达到立体声的效果;还有声源定位能力,有益于辨别方向;减少头颅对高频声的阻碍,提高言语清晰度;提高总体声音响度,保护残余听力,……解读自动驾驶涉及的关键技术昨天文章我们从技术层面介绍了自动驾驶是如何替代人工驾驶的,今天,小编将为大家解读自动驾驶涉及的关键技术有哪些。01环境感知车载传感设备(视觉传感设备和车载雷达)等智……这3种灾难恢复方式,企业最常用【新网云资讯】2020年至今,全球勒索事件、数据泄漏等安全事件层出不穷,呈现逐年上升趋势。据不完全统计,受损失的企业达到数万家,造成的直接经济损失数以亿计。越来越多的网络……mybatismate轻松搞定数据权限0、简介mybatismate为mp企业级模块,支持分库分表,数据审计、数据敏感词过滤(AC算法),字段加密,字典回写(数据绑定),数据权限,表结构自动生成SQL维护等,……
百万英里电池来了特斯拉已开始向部分投资者发送电池日活动邀请函DEX回归,交易量有望创下新纪录中国首艘油电混合动力游轮大湾区一号正式投入运营,搭载宁德时代箩筐技术公司宣布对易图通100股权收购完成交割特斯拉发布4680新型电池续航提高16,成本降低14!特斯拉电池日猜想进一步升温,从新型电池到电力供应应有尽有5G联合水利助力智慧水务早日来临特斯拉电池日倒计时无极耳饼干盒技术提高产量十几倍OPPO副总裁国内高端手机市场,只有华为和苹果两个玩家OPPOK9电视测评UI操控,全场最佳?特斯拉你的Model3高性能全轮驱动版可以漂移了麦肯锡2021年德国或成为全球最大电动汽车生产国
小学二年级下册《泉水》教学反思qq付费入群是真的吗qq付费入群是什么详细介绍宝宝摩擦性苔藓样疹的症状让生命重新绽放中国股市这6家氢能源企业,才是氢能源行业的核心龙头互联网产品经理应该做什么?再读诗人刘健鹰《要是您老还活着》更适造句用更适造句大全依法保障稳外资有哪些重要意义?小儿大动脉转位需要做哪些检查远方来的优秀教师美女科学家回归祖国,华为,稳了

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找美丽时装彩妆资讯历史明星乐活安卓数码常识驾车健康苹果问答网络发型电视车载室内电影游戏科学音乐整形