项目场景: ClickHouse操作基于Mybatispuls源码扩展开发。解决ClickHouse的修改和删除SQL操作与Mysql不相同。基于Mybatispuls: update、updateById、delete函数 1、SqlMethodDiv。java文件枚举类,对sql脚本定义packagecom。demo。infrastructure。injector。enums;authorliuxiansongpublicenumSqlMethodDiv{删除DELETEBYID(deleteByIdClickHouse,根据ID删除一条数据,),逻辑删除LOGICDELETEBYID(deleteByIdClickHouse,根据ID逻辑删除一条数据,),修改条件主键UPDATEBYID(updateByIdClickHouse,根据ID选择修改数据,),修改条件主键UPDATE(updateClickHouse,根据whereEntity条件,更新记录,);privatefinalStringmethod;privatefinalStringdesc;privatefinalStringsql;SqlMethodDiv(Stringmethod,Stringdesc,Stringsql){this。methodmethod;this。descdesc;this。sqlsql;}publicStringgetMethod(){returnmethod;}publicStringgetDesc(){returndesc;}publicStringgetSql(){returnsql;}} 2、UpdateByIdClickHouse。java类文件,继承AbstractMethod重载injectMappedStatementpackagecom。demo。infrastructure。injector。methods;importcom。baomidou。mybatisplus。core。injector。AbstractMethod;importcom。baomidou。mybatisplus。core。metadata。TableInfo;importcom。baomidou。mybatisplus。core。toolkit。sql。SqlScriptUtils;importcom。demo。infrastructure。injector。enums。SqlMethodDiv;importorg。apache。ibatis。executor。keygen。NoKeyGenerator;importorg。apache。ibatis。mapping。MappedStatement;importorg。apache。ibatis。mapping。SqlSource;authorliuxiansongdate20210520desc通过MybatisPlus源码扩展修改publicclassUpdateByIdClickHouseextendsAbstractMethod{OverridepublicMappedStatementinjectMappedStatement(Classlt;?mapperClass,Classlt;?modelClass,TableInfotableInfo){SqlMethodDivsqlMethodSqlMethodDiv。UPDATEBYID;finalStringadditionaloptlockVersion(tableInfo)tableInfo。getLogicDeleteSql(true,true);StringsqlString。format(sqlMethod。getSql(),tableInfo。getTableName(),this。sqlSet(tableInfo。isWithLogicDelete(),false,tableInfo,false,ENTITY,ENTITYDOT),tableInfo。getKeyColumn(),ENTITYDOTtableInfo。getKeyProperty(),additional);SqlSourcesqlSourcelanguageDriver。createSqlSource(configuration,sql,modelClass);returnthis。addInsertMappedStatement(mapperClass,modelClass,sqlMethod。getMethod(),sqlSource,newNoKeyGenerator(),null,null);}SQL更新set语句paramlogic是否逻辑删除注入器paramew是否存在UpdateWrapper条件paramtable表信息paramalias别名paramprefix前缀returnsqlOverrideprotectedStringsqlSet(booleanlogic,booleanew,TableInfotable,booleanjudgeAliasNull,finalStringalias,finalStringprefix){StringsqlScripttable。getAllSqlSet(logic,prefix);if(judgeAliasNull){sqlScriptSqlScriptUtils。convertIf(sqlScript,String。format(s!null,alias),true);}if(ew){sqlScriptNEWLINE;sqlScriptSqlScriptUtils。convertIf(SqlScriptUtils。unSafeParam(UWRAPPERSQLSET),String。format(s!nullands!null,WRAPPER,UWRAPPERSQLSET),false);}sqlScriptconvertSet(sqlScript);returnsqlScript;}去掉sest和suffixOverrides,代表去掉第一个逗号paramsqlScriptreturnpublicstaticStringconvertSet(finalStringsqlScript){returntrimprefixsuffixOverrides,sqlScripttrim;}} 3、ClickHouseSqlInjector。java注册方法,继承DefaultSqlInjectorpackagecom。demo。infrastructure。injector;importcom。baomidou。mybatisplus。core。injector。AbstractMethod;importcom。baomidou。mybatisplus。core。injector。DefaultSqlInjector;importcom。demo。infrastructure。injector。methods。DeleteClickHouse;importcom。demo。infrastructure。injector。methods。UpdateByIdClickHouse;importcom。demo。infrastructure。injector。methods。UpdateClickHouse;importjava。util。List;注册方法authorliuxiansongpublicclassClickHouseSqlInjectorextendsDefaultSqlInjector{OverridepublicListgetMethodList(Classlt;?mapperClass){这里很重要,先要通过父类方法,获取到原有的集合,不然会自带的通用方法会失效的ListmethodListsuper。getMethodList(mapperClass);添加自定义方法类methodList。add(newUpdateByIdClickHouse());methodList。add(newUpdateClickHouse());methodList。add(newDeleteClickHouse());returnmethodList;}} 4、编写SuperMapper继承BaseMapper,让所有Mapper继承extends、最新面试题整理好了,点击Java面试库小程序在线刷题。packagecom。demo。domain。mapper;importcom。baomidou。mybatisplus。core。conditions。Wrapper;importcom。baomidou。mybatisplus。core。mapper。BaseMapper;importorg。apache。ibatis。annotations。Param;importjava。io。Serializable;authorliuxiansong自定义方法SuppressWarnings(all)publicinterfaceSuperMapperTextendsBaseMapperT{returnDescription:删除并填充删除人信息param:id主键idauther:zpqdate:2020111011:47上午booleanupdateByIdClickHouse(Param(et)Tentity);returnDescription:删除并填充删除人信息param:id主键idauther:zpqdate:2020111011:47上午booleanupdateClickHouse(Param(et)Tentity,Param(ew)WrapperTupdateWrapper);主键删除paramidreturnintdeleteByIdClickHouse(Serializableid);} 5、单元测试看效果 SpringBoot基础就不介绍了,推荐下这个实战教程:https:github。comjavastacksspringbootbestpracticepackagecom。demo。test;importcom。demo。DemoClickHouse;importcom。demo。domain。dataobject。User;importcom。demo。domain。service。UserService;importcom。demo。infrastructure。util。page。PageResult;importorg。junit。Test;importorg。junit。runner。RunWith;importorg。springframework。beans。factory。annotation。Autowired;importorg。springframework。boot。test。context。SpringBootTest;importorg。springframework。test。context。junit4。SpringRunner;RunWith(SpringRunner。class)SpringBootTest(classesDemoClickHouse。class)publicclassUserMapperTest{AutowiredUserServiceuserService;TestpublicvoidfindByIdTest(){UserbyIduserService。findById(1);System。out。println(查询用户ID1信息:byId);}TestpublicvoidpageTest(){UserusernewUser();Integerpage1;Integerlimit2;PageResultUseruserListuserService。page(user,page,limit);System。out。println(查询用户信息分页:userList);}TestpublicvoidcreateTest(){UserusernewUser();user。setUserName(张三);user。setPassWord(123);user。setPhone(12312222);user。setEmail(326427540qq。com);userService。create(user);System。out。println(创建:user);}TestpublicvoidupdateTest(){UserusernewUser();user。setId(1395347901827317761l);user。setUserName(小李飞刀);user。setPassWord(123);user。setPhone(12312222);user。setEmail(326427540qq。com);userService。update(user);System。out。println(创建:user);}TestpublicvoiddeleteTest(){userService。delete(1l);System。out。println(删除:1l);}}