From e547f645a6e490ac2d2a6ff3a50d6fd2c52cd55c Mon Sep 17 00:00:00 2001 From: iqudoo Date: Fri, 17 Apr 2026 03:54:01 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=EF=BC=9A=20=E4=B9=90?= =?UTF-8?q?=E8=A7=82=E9=94=81=E6=94=AF=E6=8C=81=E9=85=8D=E7=BD=AE=EF=BC=8C?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=AD=97=E6=AE=B5=E7=BA=A7=E6=97=A5=E5=BF=97?= =?UTF-8?q?=EF=BC=8C=E6=85=A2SQL=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 45 +-- ...-mybatis-generator-plugin-1.0-SNAPSHOT.jar | Bin 38186 -> 38828 bytes .../TapeRepositoryGeneratorPlugin.java | 269 ++++++++++++++---- .../mybatis/TapeRepoviewGeneratorPlugin.java | 8 +- 4 files changed, 236 insertions(+), 86 deletions(-) diff --git a/README.md b/README.md index f2f8772..4f1c971 100644 --- a/README.md +++ b/README.md @@ -132,8 +132,8 @@ - + @@ -142,10 +142,10 @@ - + - + @@ -161,25 +161,26 @@ ### 3. 配置参数说明 -| 参数名 | 说明 | 默认值 | 必需 | -|----------------------------|-------------------------------|---------------------------------------------------------|------| -| `targetProject` | 生成代码的目标项目路径 | `src/main/java` | 否 | -| `modelPackage` | Model 类的包路径 | `com.iqudoo.platform.application.database.model` | 是 | -| `mapperPackage` | Mapper 接口的包路径 | `com.iqudoo.platform.application.database.mapper` | 是 | -| `facadeRepositoryPackage` | Repository 接口的包路径 | `com.iqudoo.platform.application.facade.repository` | 否 | -| `domainRepositoryPackage` | Repository 实现类的包路径 | `com.iqudoo.platform.application.domain.repository` | 否 | -| `facadeRepoviewPackage` | RepoView 接口的包路径 | `com.iqudoo.platform.application.facade.repoview` | 否 | -| `snowflakeUtilClass` | 雪花算法ID生成工具类 | `com.iqudoo.framework.tape.modules.utils.SnowflakeUtil` | 否 | -| `snowflakeUtilGenId` | 雪花算法ID生成方法 | `SnowflakeUtil.nextId()` | 否 | -| `changeLogContextClassPackage` | 变更日志上下文包路径 | `com.iqudoo.platform.application.domain.changeLog` | 否 | -| `changeLogContextClassName` | 变更日志上下文类 | `ChangeLogContext` | 否 | -| `changeLogEnable` | 变更日志监听开关 | `false` | 否 | -| `slowQueryLoggerTime` | 慢查询日志时间阈值 | `300` | 否 | -| `slowQueryLoggerLevel` | 慢查询日志类型:error,warn,debug,info | `error` | 否 | -| `priorityPrimaryKeyOffset` | 优先查询主键偏移阈值 | `0` | 否 | -| `ignorePageSize` | 忽略分页阈值 | `10000` | 否 | -| `startPageNum` | 分页开始页码 | `1` | 否 | -| `maxPageSize` | 最大每页数量 | `100` | 否 | +| 参数名 | 说明 | 默认值 | 必需 | +|--------------------------------|-------------------------------|---------------------------------------------------------|------| +| `targetProject` | 生成代码的目标项目路径 | `src/main/java` | 否 | +| `mapperPackage` | Mapper 接口的包路径 | `com.iqudoo.platform.application.database.mapper` | 是 | +| `modelPackage` | Model 类的包路径 | `com.iqudoo.platform.application.database.model` | 是 | +| `facadeRepositoryPackage` | Repository 接口的包路径 | `com.iqudoo.platform.application.facade.repository` | 否 | +| `domainRepositoryPackage` | Repository 实现类的包路径 | `com.iqudoo.platform.application.domain.repository` | 否 | +| `facadeViewRepositoryPackage` | RepoView 接口的包路径 | `com.iqudoo.platform.application.facade.repoview` | 否 | +| `domainViewRepositoryPackage` | RepoView 实现类的包路径 | `com.iqudoo.platform.application.domain.repoview` | 否 | +| `guidGeneratorClass` | GUID生成工具类 | `com.iqudoo.framework.tape.modules.utils.SnowflakeUtil` | 否 | +| `guidGeneratorCode` | GUID生成方法 | `SnowflakeUtil.nextId()` | 否 | +| `changeLogContextClassPackage` | 变更日志上下文包路径 | `com.iqudoo.platform.application.domain.changeLog` | 否 | +| `changeLogContextClassName` | 变更日志上下文类 | `ChangeLogContext` | 否 | +| `changeLogEnable` | 变更日志监听开关 | `false` | 否 | +| `slowQueryLoggerTime` | 慢查询日志时间阈值 | `300` | 否 | +| `slowQueryLoggerLevel` | 慢查询日志类型:error,warn,debug,info | `error` | 否 | +| `optimisticLockEnable` | 乐观锁开关 | `true` | 否 | +| `ignorePageSize` | 忽略分页阈值 | `10000` | 否 | +| `startPageNum` | 分页开始页码 | `1` | 否 | +| `maxPageSize` | 最大每页数量 | `100` | 否 | ## 变更日志监听 diff --git a/releases/tape-mybatis-generator-plugin-1.0-SNAPSHOT.jar b/releases/tape-mybatis-generator-plugin-1.0-SNAPSHOT.jar index 4f1d0afca859ec29d70bf2dc58a0e59c9ee02461..44a4e020dcf878ed053ede731fd1fd18ea5debfc 100644 GIT binary patch delta 22922 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 Mh@N;Q{PXsI00*F0+yDRo delta 22271 zcmZ6S1x(&C*SB$ZcZLsVxVv-X?(Xie0e@VFGu*jxcOCBT?mFCt4cWWr$@}I@zN9@@ ze(h=6G-=bOJyo?(6%|mZDhkjrI1msB2oPV9;uBE;=>H&|8rt_CTFC#4Roed`84{B1 zzvP7E{V$y%h5zH6TnEYUUv5E){FmfVhM52S4Gxvp5(xw#AjwBSu~hOO-Z{VgBF< zK`l5f2)7XgxpOLlrmd7hcVlD<6-v3n%@lvk!6J*-XY6%gh&vq>?k1VoQtR~Odq@M6 zcs0gs1`%ioH7ZPau~9GXs5en#0>!blD9ngb9>2Z^s!i9xd0=~N5t;4TFlF0h5+Sd^ znk#+_%dD`oKPU)A+rorfz>=S&N#T?Xj#{^=s-a$;#X!_vpe%f#Y3@5SQ7ogjVwSwQ zvh7t0_SU|)wfmtSvJ?}7EYAPi3Hlt!v@v8e$Q$m6hxAQqe&K{Z4?yT#)6tJ+l}qSX zI4k6eO;qUuf5D6!RIplWc9W)E>rpa=?Rtb_M{DVy6sPM4CyEJs#e?&iz)=rYVEzSK|zX?{8;_WhN zfiI!FnCDkZAXOL%vkQq$9JENXgkok&|1^6ej_X3Ph5~KX&y?hl`2HnoHX0_lJY?a< zVHKW1sP38@lhM(Qb&|^@SF~NJUPX{d7mFc{(f+%f|9JwH4I107C~qVRfS0ywmh=f_ z!Z}KS`5O{@Q1T4)(qZnYvd1URg;Y3mP7cN03dAXA@HCre__=+Nkq!zb`XZqUx@zdY zBW3ybBQ?wfj-okPl0FGp(iqq*jJx}jwa|)8RzDM;iQM3JevbvyK(rzL3$R2kT8Jk> z1vIls6WW1i`bC(;9veCd;M9xhLM`PRJ))Dzi9t*O43?;aEH2J{I5;8HW&zdLz_U!oJW z1W$DgK2|Z!txGS@In_%JzFq5+Ei%}Afir+$lp|jnbJ=Wnock4qJS5L5{%ZyAE4o4U zVqFS|U(S+OsjiNw4WA`sLdYcyQoCQ1R@`ysWLQSrv*1stTjzy~pBHbFM@bzaWPp7n zWpHDmFlNj!@#vE{z?Ee5b(pAa7*t)c`Ftcy@)Y7kBfE{zs*L5%OHx_1x?>7Ok!HnswHNs^=_?}B`U4S(GC}*} z(4c{?8)`v1fc@|UQ_EqZyxMo7$P;xha#Pz%HFL8Bw%PZdF+B&BwO@hEXDv{BS99K< zAzz9KI~~s6Zhm*A-`6x_1=R<7JLStlKf8r?sK8%^qPH>67MQShNA~+kn~=#XOD!IQ zsvAe>?I3SQMo^}wm4^XuH$g#{q8I2z84f<1nf9wO0QwEtKgfOSj+7Zy3NH-a3XqXp z*fU33#bR{`QVvTFSRNl15J2t@WEHyk0ckwIQ|)9JCl|VG6>+flVt4MQoWs@9P)K6B z(o(g|_q8qIMgaN)dMCz%E2WNuY@PO@_zTYZA57DD?(ZH@&AS|p6EE z{mvn0aLE_&7~L=i3E?{Wh_2C=`sC z$iw(?jumCM{aO_FTF*){>_xLAqwJ;`Iv>QNubv6M93|9PdlY#p?T#Wlqy2 z2yLk4v!GgJO!kOazt&Un;T=qK2i+!L9w-=S7 zu5Qup)>bc>ICJpRv*l6&9OT%3pAy`oI75GymE{ggM`!$MVaX%@h!X_n~8hCMeUJ`)p{wa}uuV{~L()+;gyWr}6iD21k}98MOYc*#&~ z#kkY+o{}R?Lu3Al%bi=D6#&64!0JgbH zx`i{@7}cmtC&+Tvvuu0%^q}!~#Tj~-z-pxsDFNh*Av4S^{NwaVQworp{}sGI?F!JV?>;9DT!2h7g8f@o1>=E@hqS{i{meG1Caz zG#uh`%NH1};xqViX+y6Et0D;60E1mAyuBe5(>%MmZ|Ol1F-AFG=|anQ7ZRiUol5Gk z5!6QQXmHT1WV+*Iu+Nk13SOYT1cU{RAPsmI-{Pix4wtKt0N+l*BIb}e?;`q8PKojV z7*Biw^to(H=zSW3N+Z=)iKAF(#`?ctW|YpkjsD!98`klZjl{+QTNC-<0lBfe$|XwJ zYBous{i7nsw(g2AGh8=<6dLHADtLt%W{4fgCggR6s!!aYYkL_T&ogLTncH)J{3T(((D7nT^JxyU54{l( z2y;dpFMlwy-}Uqn3e$5N1$gZ_6l;8^cbcr!kBL#c5S>d#J&{E9UEDr~{-#eWMlBQi z#Hd8ksKT}OO!Yp9pRu43DcFcL^!3ID#~wK^sIN&!pP@nXAWCn|myuLmvEMlLReX!d zFZQ66@~RDbYW}2PMM~cQkK(5i+9Jh0ml_QoCF8zH^k8QsmP-_}0(K9~An|nDnJMHF z9l3Ah#8T6um@;C(qj}sn86bmV2>ON-6hC2XZJBWMBc>YVKrD=kj71L9{pWjw5&y8Zn1E=I6g+kif-5n?*WAM$fKBqf`E#HxDvvDZ> z3B}KtWT!)7Lblu$m}?&DMYq)6+9z5!6qJ>+eOkOZZR&P09F_0$d`khd#)nB#;^bpm zLiQcGL-%0NsbAucRtXZ>f>*SJ36nFB4PYB z-+eMuOKhFiktO`$#~P}k+aW)wL$Nv|uF#_*UD^a@N>G&m*6Pqdtah)TBYg4F1>4IL zBkCSfIzWGF(GuB-6N35@RHJ?=NrqK~*5g_V$>}PnrAB}3>4MBz(A|kA2RuTB@#G%F zUG4Hd<@Wu_G^r}t?26ACF@{H@lF(}Tq$LUNeVMecbFfkg7mp#`NWmz#seN0Hz?mdI zH{BnqR3EJX!d3i#=;qaHg;;Mw&k3yXNpx@|9C60~jt@Xiw;NAbQyqJHwWctHr;K+~(l z(K>xuDdcUC&a|vddLU84UA7R;!JdL#|ih6f;#f6Tr99Nc=OD zG9e$Vb*h#$$>2$AG$rqpxK0rxKPjnWtx@cyc&+);FkNOgr9_&6bLN1aSf(}ih=sf| z+8|s8GzyjL;j?CXawm!NV36RWen(hTPf1pAvMfU7mbMYjN;#*nry-P3 z)kpZF;u7jigp;$0GruwFP7x;~*>2G(x&f@Gmv8W_&qOlGI!m}z{xeC!c8v?y)%}$m zV569vwE6f{xF!&5MTwZ@#{z@jsDiq|%+g2ueL>V=4cQgCT7w;T?TPw zRk0*3PN7suRr9*wK?t`c?K zcKAY4gZKmbj8#O#fZ&Bo2q^_6XDbaNAU4u(;wNvTD?UqRSy#071qb!vZm8g1D4GB9 zsm{FB7tKa_YU+p28j@F6pOWm=u-OQxn`voH4u=+u6+~T1aG{~A%N^Y+V`Vv}RCi(%3dx}{QfrgwuQ^;gL7*w~nOpO{n{MiwX8H6jE5eYYC`M|8VGa`nV;x}zxJE_d z&w;E2qpyQJyy~;thdX*wa41kp8YiOM=YR8es*zmDO&BYhRDv>5^cRY1>qXdT*vSnd zX4QoV(y&-WoFCK2qg{Q2_u(3>k|=4I+u4LV>5pQMQg>habD}sc#+$gMI41N!L{rR% zMNP&qhqmdz=Qc)PDZg|{D(DakQ3pu^4LzdB`5HADG{PD*$-<== z#7$@gL`Nv`z95>CNyzBIz^F>^1QmHe?g^irzyFt#TP04c|7G;zHjT`tVyBi}s3MhJ zV71Kr&Ut>Tt<2oUSL*loChZiAvxVHGywXN^OdX^8X);<2P@!UOd1Du_A80N#gk??} z1rl1VJCRM^DnfY2HX}wIEnSYw%(G72bu&g=!b#>MqcdhkK7@^i8YjrYj8-$jMgOi+ z_U%^zlInqNwv*)xQFSbEFUiEoSNWgkUHT$gEG3iGuup_>@ zrPdbfn$@KAARDI^N+NG~ok*S@F54I)h>jS#P<;#8KPy_-qGgt8i{}n21&Kw`RMq#` zTThvJE&+v1Q9NB1z1B|M4qqyaG1*qEBBjoRL-SObQodxzTtyFHpu;PW`YTy#4|6H< zTuPs6yAT2YZBl%I4Fob=L@@ytZ))RP2%F(-<40RbyKq|=PhSax;&$i3U(VsxcL8!b( zgW2-Z+i)18uuVcFbi;(RT8(Fy19elk&?|*$;jdGH#z+DE;OWjLKh-38bzdH&zfGn5 zrC1Cy7h2Kej@sD_)Oi>Mt4<43Q~8Pj>{CLd z&LH52Z!|P_Z8n1v0ZAgWq7Z3;d>YT9Ixo$ko_v!5?c?}=J@ zTB?w&>SK`#*OS$YSm1>KM1iy1-94nfRuYh#dmqBS$d7edF8ZXO>fweFZ!dY5VgQ^8 zgtZ(xb#Y4&(wuREyw)&3MQLLHcO z#`cWEIk)Bdzf%2m2OaU zqehN#rWoG2f2LvTgq-WX3HvsI9Cf^zCyUW}bnO__tt4A2##Qm#oCn*NM%_;A%O!-y zAv*{9mEXVS+pxPYU((+)mLJLEsZV;~f+mh)21xYRmrRBdfB0<$)v{@$TniJPOI3Ba5(12ruePRRpQuCMJMLr9p@W&@ERxcIA{ax zrsdg{F^^A|Mrqb){2mY`0Uw6~lNudl6}w3!km*WQY;Mb;HDm{4kt!2>xMAzQ9mM8D z>@Gbt+xu36w@`8mj=FYeUj*dk_pk`lzCN|25n)2>PoA2{aBM5Angygv+Wvaics@Lt z%KB36_BSwU+#(kq^A1`;vJOkZjrfQ$XsDnBVvIDQhGIKx9>fn2m?|UlGU>wPe0n*X z))dc0i4(oi!cQY1D|S(Glhx0iCU4FAnsL$kH%~CfS=z*`U3t#P$r6~Jmnk;j2g2Ex zxg~$QH?7dy7A6u!K-$i7JHA4RW&NQ^1kG61^HE?Km=F`h>06eO+++3ERR3(M|G_zZ zg9~k3U`WZwmdm2pacI_S--NvZ2Oe~ZWca+JGGa|=nHu+!S~Z2^aP~%;xY_)uHj37E z9Tm$LJNxkl9V#}zAqyP06wO31?10d)67K7Hzc##hD2RNdjGtWoaZR!u_Z3n8aZ~~) z8^|gJF_zQ84EehmV@i4}XZrw zdvG1k5K@r&PbL`RVC4RXeNUHqrdN;>e9R6N{AA*7?RQJM9-oX3?Ut)tT9jx??#KS=sYa-MZ1?5P9@ z^kldi)ckfoOH%?i`^ftJHn(@)^5$D_Dxi09##VMc((jXKSZuRD&la(e2V8>>#{YiE zoDX1nobrg>S_ZRU7Q6Z6m&;&+SJILSSkMC$6; zc-QYCiHFw?Hoiq(H%|a_^W2xsJMRE!@5u6Jif?~dJ427{_1=VQL+%XD)AkN|k7ueJ zg$&J^fqpCDu~@zUaZ9g1>^ucE={jhUr%&OCBc&<*BYJ*G z>)REc$wH)#rO3;@8j!Y$OD%738`>Lp*fvW79RBp}&CK0h8adO~OqOk6K-1Q%#9u-# zXNkEx9UMx%aLqq2v)UaFiXFYVEb`lP{L9pN@CN*L&Wi%i-4?soE-Nu4!SMCRI(p4C zTn(`{lJ@B4i(e`G>B)Ag4!+flz1j5CUG7}y&r&%n@-;dNd90XxoDIC~vrfEWqaXBt z(F?hUminrbqgT}}J0y8mdc1EhiK1)V%-17=t$?t+v6z^>WN}P696>@U{Gw5DnVtHb zRujn8%+d=NLqxi5tZMCbJ?D-eY>iE17SSSP5tfmg-T%pPsBL|Wbl=jhJ)ta6fF3Cl z2{{}0F;xHr)d+iDmedH8+vj$msjQfJl2+A7EP1wd#A&VEp7HA%TK6+`JQjl|V4Xyn z)2^0PMdm%F_uzW_4Q9TMGE6%5kn!UkdjWdrhDh%3=LIsRPPGphpC>On$^PIUAJ<0o z_iqNB7c{YXr#-NN*}R_~>SRo>a?edIOs~=(RE*LEOoc#tbhJx;znwF1@~LcQqf)mB z`9<;nIBWlsQ<#DlIh64J97M(z`gPo9t*8JW6u7N|2w9CC%L&44p4P+fC|uS&mj<%K zo|AteCf{$0{&nNa(pN)Ipz16uJ(iujv)_u6K#!^Xbt)$$Fy_U2wn1F-`A7pg?cf_e zo@3xoBp$J)Y*aQ!ArNa9Y6<=pS|ee?`Y{-9J&Y6Cf*cyS z<1QEnFq$Xg#pR@5+yL*s+ay(?)&V_rvZhW6SN!9hak-r)A0)XO0mCHBtyaS%+D@0> z`K~s@IADgPb(+Q-OiZ1iA3PI_I%c=}JXVaiA4)q3ws6Ng#XDja4AFg8Lawkp@Dsct zJM6)oYQEa?-U`2*BD;viy%kQK(0yCsx0s7M6Yrd;x47mE+q)P`J0*TOB>`Q@xu)xO zOy!6s+IQ%tuUjV6eD}Nra0{mBypetdx!HeIRo&SCX~MpJplo+u-`L+t1(b^&J(@-9!pSq-*C{S&E5NlQ*~Fa0AGz&I#v1FI%$H zAM4XrReSiHhG;?`HrQ1qylocOg|RO5V;Wtl)Lk8fPU#JZP6hC-s1D%|?X3$UQ+4H_ zM(^!ve!~imC!@0j$p<4oQI2o3hPPDK@7- z>xr(Rfa}W}s1SdocYsXp%p2EpnWxv@axF=CL(UoJHI~{x_4LCTSDw=C{Ry1QRemyN z5*&oqJWGa$k-$tVB=foZJU`pO1BetyAu=Hx92>zpEQ{#1bRpP88tE%?K@vnR9XNM^ za|mh#3u&d>HC@~$a*IyTefxFT3k#$Cy-lPT7wOw9NvploA~0`L!pIf$#*%qW?f9vA zlheLPOPm>fiZo1S?A9YGUz%|VE)kbCkioI81zGH>noV*;lNf4^TG`o==Zu31fzz5) zUYeT}7ods^!pHq|r8NKVHAFFDDj><~Oi7Z8yDyb*Tut1)Ux$27M5?5ZyO+)qrn0s7 zWa_3mPjDBW7`Pp!c6Cj9F131Y*Q^L)E_VZXuDSb``Gf~iM<)yd($Z1K4ukt6Sj2+K zI;5^i8Yl8u$Xhl7Ni*ltz~>C7Zvkn`--W_PIL&(xH%bH^x?S4h2-)wsc)R z1=>4swOfa{j9ng{g`z7*#+DW`n_A$*?!@XJdcPFN0E)lrX_+vw&jJh;%LM2aIano} z9r?HTa%xHzs!!pfP8;5I?K+rFJant8StrJL6mF*)p06mMzrGs{t(+g8Pj#WxCRb{^ zKIj=lAk?gVI1F*=&*C%Yu2qj^ULIyvw^`{ML?G3K@2D7{3TPK`)r2Qk7PJxJt(XSe z$BD?e0#o(wQ?{}8amn^^`{#j$25}tv;ivWF1PPT!7ws2OQ@K*d`wR?7I+y3Mj zyl1rk;UFHl&YrBLySjTHT%8M6k6Jp zDi@;l;Kc>LCS1{nW;51)k8Bg+X`jl4yc_oEApQozeIR5qFd`kD%<|{n7j6hLYl%HX zE!eCz$Q$a)pwd+{pH$|slU2+cL4nwY;mTbpFXFDjtH881{~MxjSVq>Y{Q&WWkWcbE zlCvvo*OWl7Ko?`z%xgb<7edR8=?z659Qkd?uDKC%-VOhAHcub^+vn$`JUHW9t{X1r zaOdZo8)g8a`$TyF{mt?@5r7c6HQuwHLhi94-PNvUd=ra$)v87iBMvXqq*y=`ty#)1 zVU~_>!STFAn4GT>ul1s{0_>IZ3xs0$))`mDULgeR^2}=(@%?L{E)I#pa}25KW9$Y0 z7%tRx+M_+XFc0R|P`S{p*se}^qCI*UM*7xpt*&@-Ji2eiz8kXcPuHNk1fHu;di#e+ z)$G)-UiJrFDe3I9^s9LjqPfKn_gzKt4hlhgyUz?1TuHTczJ4Y-285xXT=F6;uaCT3lzz9lB$XmC3f{XkSYuut+4joMs8!vO zgs2PA9dOPtWMAnH#_cPk_0M*e^~E(2&2x))4RnU6>jZX|_uVyD>pFIXU2@-47)!O# z0KLkUVb#iV)#SU&y{($)g`k z@uNoS?y@59N@@iBy!yAznQ_{ur*mP!d_r`r6}t|+Kc2dtsx1U=CHF#lwC^c2XOw-& z&ix3cQa=$10o30X(8CrL5wTNkAS*}3yB!HB@zPJf5onUot92eAz1N`n zU@iF#u7H-++*0U{@+C#+Bh!^E?2kRd(Ul#C7oyTAeCMJY-u0|!-~-mRbP4@{MJZ%iG-b#bh<(Y>hDb?*e+ ztJtj;l^xkbSJih-BF95&JZKH%aI8r6n_x5v&)kT!7Z^Eo>% zqOaYD*C0{`W0Fj+?klHY_((5$8`MXy`CROXDOzsi)-5$jAl(6mAgs(@IWM8|0G|&( z%OJ;%2_T4#KGYcb$Du<2UVFdYhbA|IXa8mOJN_>8;yp@D|H`fS8wP8?vkTWpcpA9E zb~6*j%1)6hBtvgt(xhaWj6GdyqN?P-Sz&R<>D=r;}GmiJ?c35MZ;gu4He*BZj zg@_>H8)j7^o`cTHd<_E;g0r&=Jy?I9J(+TtJ?y=L-#3jGv;MxysvH4J-*x6nj?5wtcsDO$N(RSUm_Vz3qC4|fx5>k8u z9qG@YzbqfA_kQTzZMb+*J<`_?y?AF3zw5fX=fUJ}KWQyt|B@>*&^d?5U4Ke;qDn~ePw+F~Al42+&AM^2k8EKcj64f^vrmvn7#}dg{HX;BgK9B%dsu`_z~xrR`QK!1q}J5d@S3A>M4uAss>V_S zozt3_;7R0`1(0XBt4G`->0znST1gMv-kr#amnX-wBfQ26XL7t``@>t^Y)YFL89BKr z38jmw;OCo!xm%8~$%)fAf5t1;2|d-z{pVW7c)GsUjMd=hFiw;oR}N6N=%+?Hd@ZrH zqMey4J{3xGX)*8iU-GQ!xGJrIpKXr32_j8txN`Ufs_;Wb@gwHn6PU%`34`)OAKrgu zLv5X<{roXFE#pEHfWos&hjWtGpYu%UFg&xz@dhQZm$r)C(;x86g|~1l2-7pb{ubZ# z;jsWpeTdLsCU?>W+JH@^b_bf)lRY;^uS8I>Uh`lbN*i1g!1$36Dk7KMG<3QpiI?Z%oK%-()$;}HVmp6eVx)}B#|cvqsG)yR)iyaQ}l^PcXYoT}|U zE8Tb{1>mq)^yYl(;=87P?OlDNru&choXSj~^mX;6qP>4atHLTd-mon5LAXVaTRZsM z)N+Uea+jo!WvaopW#Q?MDaNWFHESI)I)|Ee_4bPodY(Ux44pMrvU1M!OS5-IoIHOy z{p@g3S=m_PdU<2<{25VW)y=!QUx6h_-Z}GcEutNxm!Cs=K^I$m9VB{8=clmq+{568iL>hLlXLhSwtj_UH}H9Je3zM< zq$RS)Y)IM!of~PSZmtcTI0Si3$6#`J&(}e)#sd46og1;%61Oc*ad>0R$cMagaAXzd zEnRbO#ev~tu;h!$LdLXJ9hw8}`LIgSBn7QD%As`r@uNB2}si`bKyXg zE$i*v*hX#&M%wTf*bgv2 z6HUbzQPdy}gg7(gUC9=VX~4o%XAG}Tx`n{V3iCN^iNgHhm!;~YC29&h3CLFzWuzWv zxk0+hT;T@hE}e0e9jchtFN;(>zlo&BJfhy{!eu#vbPQ=#)qzcHhU|iXJG|Ni_d+MQ z>Hr}#&RWciQZ;)}$%L+PVU7NR){Eg=P|omnekb~B#)Z2V-YdF57Lc6gA|k+wXryBu zw1SA|W0(lTTBR6-f1L}%YDa%lmG2C(mkj_J4 zY}IB#1m6Qv3XrmRu=J3TJgA~w^eLlC&=?z35)hF*u%EVZ0)5mW_7(rt{hvtEJLC~3 z3^zFPUS^nDl5()vDIE;}aRJldZDV!b-`}D=Dwhsd#j{%Gux1<71FgW2|NhuyifHK; zQB%7*1ueh`aCw(k${041V88mbbR3rf_TM}&%YHd&Jqdf}rHF%#a<&T3_Hv|_20Bwu zOZHR2%LDIn)*KVWhSBQ-6uU}Zs1C&VQ61iy&;Ft8Ci#xz-5a?LvKN-z9)5^kR2~LW zzkDbP4x~ckDhnbFK?uHxnxHh*ArHP{7wul%3wfQ9n&6GKrNepqT~#k;zwsI%#Ci3> zrjFPJq7(DUipP|zlMvg1nZ>eo_vJ#XD}75Ep`EO?!RpwQc#Y-4OKbSbgld)63!^ic z*}}UX&WlHX_=-ZZD-GjT*bA;R&#;%wB&`8{jq8GC>$LsDVc+ev(`Oi~s78(hsw2?99PrvsxQAbD)p z8K#&Pe9T**mQQ09ykxxhyV`o1C<7d-QbS-r@V zHWQmPA zLX-l{GKb*D$ZW00NG`ySGKF6d^+USs{Ie%%QO(gAzmXwbg?(7Zm8GM5sfD;b`Ob#v z1cPTzNezb=LZdZbm{Jb|%5@gvz-2I)>WQ2!I^h*p{7M_K-58)c49H1%MHRo|F-7}^ zjMw13=krLGJ-r=qPx#~Kg@pKZ{I2lh7r|lSAnUc#8?INB04yLb(LZRPmD$V0*i`$G ztKfx)H^@H*^+Ld4_(MYWL&&HjEsLo=(qN|DP$mW#^WbP z=k!vgn}7&&SjjBWof_QyG?-KR-&mt|KS*}*ZT>O}Ze@vn@OK&IP_@#j4r;?_wxD-$ z^^}Mjseh{F6Em{E3^A;3X07F-o3($G%(_m#^PUek>SjdS zmvAB2L6y1Ra>XJKSAQm(&x=SeX_`)}thzs9IQIkE<(Hh`QWgF#RFNy~+9YDK-2xGX zM(jXEwt3xUD-tlw_tAtNy671+)mHL==R7hj;I!!icTf}5^__*Fsjq6`4PI2+?n>^M zT{+(C4dHkkI zfnMbV;sMF?}_Q)`Cdn-)?z|IT{MMfV(3nAi9f zZi}(ho1&NTCT-`6_P(=L-5>$xe%id&~_sj9mMPjk%{H3n8F*yZ~5T7 z-i5d_#bYy3J9Mj>zDS215#y#hYv^=;q1@v6!?4qa=&WU|=S8vOk{qA19+1B3x|2h5(e!Y3*MB zHyxkvDb4Z;$xaGXQ>K-@D=QjV0^AyN;wM zEYYh z$~Bd7PoCd9x^Z*_GQ9+IY=AEb03xBI$ zj(+!aa(A3a$?G5W@s;bA=%Q|`B$P@=5h+I+ITj`5#GKsR+)uC1?Qw-%p4p=_-e54} z(nEjKqDM2;ZPPn0_6MY{DYEXKL_@!fO0P)x+#7b;eqNvOo4ZbbPvF2ynhVKaB&7r6 z0pB-$dBGk98X&1|{ZF{Br&{u&S|&KPTn>7g6I)Jg)xVnFVFr*iO?#6IdlyA|O~iS` zroXUOTV(~;8OxdWB=>)O3Udq_;0iq83|-)aJFz7)0Jndn^pk-C4o(4Mm zH^+GbHr_!+u|3Z_+@l?uUZ(!iX<~b6e518Csm4!xKq?M%&-mtRr|caUw_D8q`u7CI ziyG}lk<*0!5oeFMp0#X>${`ftZY4u!&6Nk+Z0@r2OWXIcTW?DPk)Dz4`l9SPaovwV z^Q(x(2TV_YkYS!|mO^!$NOjFj#rgd-A4hk`rw06`2TMeXR} zKeo9vDOiS#TjB3N#o0Q+Zhl^x-O{u63B)jqS;jTg}6R;Jk>siL8vlB4= zv5fpQ_w^u14+7uDpRM9(Ppz7jtl(kbp!vfG=xE`{twrsHZ}RgKXY4&`7WXq`?0;%D zdjkU;LxK zvPo!7VqNwT%pL7t9BUb7+yZgx*lj_S1 zL#d5M-qipw*A2;&GsMjE-=GsTm?QkDzwo(#k#}E~j8SqM5e1(pZZ^|;-O++h44`Iw zVRB!weaJ+2eLn>OCt@(UVo)F-U=d6%Doidsw$Ctv-~mi7BGimD)C>(wt^%T98m137rVp9;ZhLm`y$aOK0D>So z-Hl*y@4YP4Oc8=$JnfBOc&|Hb&`CW^?#Mq+bSi@Nba&+BV1Wd@MsVVZ%A%{^BWrexCkv;As#P@Aq>VYbXt%G(yazbhXdQkgH?nQ3N<3R-=`loQd@={D; zV=Qt@=zPOMTh0xpy(Hun|HfTRIPcq#FEG#WE3OHtgDN?*Aax#vnrTXK0niIn{E&fW z`sg7vA^I4Ce1vN6i#dd2O(gCDIo%+&_f;Ok)v5>n6oY)ECA?)us%xe1-7bLmmIiep zgjDxL-z%ICu^|rmNCCSlgJVLj9_as1(8I1;KyG5nGiX<2l^{#z5_v=uT-{=bn_Q8;5B2}#vawccO}S2c-U1f-c{JyLo=7qn7>?* zv>&X^OXPI1QH?kqc=$pn+l5xVb~J6#%M9p@`+AMXcFUpXc&ZC*q>K-(az`jEJQkgT z2?yg1@35O@3LR#SiO&k8Zp6jy4T((d<8f0v0UP%xvu~F+9|UNQ+2qYb^Js~G;s0Ow z@4t}U#sE=DV$}b{?v94L#WN5>K#(O@>&pQeOG_drG|5lwz7E)8(kjDsG|3iF!JiRf zC?F*Vh!9ZQJVv`hgT_GFVGw53uX?S^unvY5)ywPAT39I+%`JKxcKRE3mCIKx>r$O- zTGatP?mJm&8B7=#cSrHQPut$td?&g00uw)3cl@sRWTI?ZS{4+&bgcl>&*IXYQgsSri*HnN}Q)Q1>F5)Zexl>aP5yS`n+agNpZk>=w?0b z55#uF$4)$y7%g>G8}|qWzi}4}MUU{JTfzMWP-ac!#&!57qo65pk|P&;u{0C40;6Ju z+6E{hnN;hmCVTymodWW%IPKCb3a#_FJP-B0t^K#m^1?1#mz!pq{mZ#HB5N~4sTie^ zFQh!2Y7};gMN4GUgY%`LsWiZ<6))=SS6f=#NQ-~LT@gxw7W!_+5}_2-7=^wmXYw{I zVICDiWh1}MuZn$Xr|?+?C~b?e>K(O0)^%yio1AA6GTf8okZm#ZQ`K%-N_&&X;VFS# z*&&lF)rtkPlDYRCf~J)6I)QAM6U&?Y$Y%PGKJ_mIv8{AnP1#z%n&ttpW>aSQS$=M| zoQ!#SrsuO^mh7M!h@Vo5op8HP!>IdEIgLLHd>dn zK5v=;yZ@pB{fMY1!U+12W?@!OTFJ4e(qXddp4o#jd1o#;8Y(!-a-SXnWmfXFu7B4= zK+vZ{1^IufxC*GKp7u>HT`G#Oq`H6zE8X240s@j!ONU4=mlWw(LYiGtT1r7ukQA0h zO1irRrTO^r`=9TBzBy;+x#yX8&YgMBoS8fKo%0w=4DIX?e2;%oZa_u7n8zK86s43I zFE`PFqf!CqJhYPVv0)(z1;{ehMHW@VLHk14oZh~~!U;B!R)Q)B-7Q3Kc*H5^6!{@f zB_7=0lb^XCD|d!ZBghtI(gGWX*FInan?IOH+SsIkB`!oe(xl9cK^k@6j#H8pJ+AWG zz(%ylQ9SLgmmi$8b3$>aPxg&Gf7Wq?{hCs)ju6OWuo&sD^)NU(#HWug)SzG};R3qXdauqQ4!pfl~5%_36>$-!iO@SB$RhI&L+SuExB40XokFUmTIK-!J#zS`hBgF_R2NmAmi^(0BD+7;t!u?XJs+`K2>ZeahzEFgzpw z39xzNNM$Lh*tg*oo>>qH2%U-uKY*j%zQhX|D}gnN_VR|opwSh5-#09;hbX9mrt%JY z`h*?_Xgm&x%}&Z;%s4{5=bSXQEa2_^QZ>4|u18 z{-x+w#%b&9JhSv8jx&B@W40-3X`LNcZ=iuB$sOp>ZSs7>gW>Fb0c*7x-a=6!o4x%q zMxSu&nO@B1OAaw=TTAJY2qM1_e`Y?sIkQrx{rQ;zxs13XwKuRWrSI;vAhJU14_{EL z$erD%qdU4k98|md@QC8XwprT6GM_UcVrk{8IlZdVu0O@ti;%6nje$}v^yUXOUVvOM z#d`zZ{{8$YzdcM1p?Py`eY+5!U=(-AP@?O}ZxPEA9Pl?hH4p`)LL zShms>0TtIfl*Xp$D)W$AL@y-HoOY@4{fodn579NrI~Nk>uU!&iqIrC3Crt7?#>(^Q z7~cL_AmstyQ!F>=oPR{QlCIBX(g=9Rv@hkCb5S(i#CSW{Cn_@+U8@g}A$T~vn$LYu za@O$CbZbtMaW0VTiO?4f9$}_7PLONHcL^sRBb!63hy2eQA4kfDw!cX0n)=3tU2jnr zZ>~+2L?=d{FYAOlB{np(aMvOQ9*;p~d#S>7MUxM9$RadK)hbpgy`_p&gn<%Ia0O)N zqK8*4o4uRERuv@2@b+rN8eb90&%rAF3 z>+SZ16nK#Fg8-+iqv!K`>YTgVDtl~|#e|to`*ssrIt8w&Urt<3NtwMt?%#w#0FBQ; z+N0%7xj7fwX%N{c0p&I?HxLS%%<2oC4qAc)A+4Fu>}4`IwCuyS4@PC%NHzFX_MNM0gTSsd!p)~a)jZD>c7(;f zw#=&ocwOz$IM8m-$cbNSB!?e$gMZi^{2cyTvV|MuY-m8oMxqOV-mwtGuClw-9kvO_9h9oG%1GmOd@%-#?o~9xp2SK^q=i~ zpXc}xyQTPh2(Sh~K(sQ#$%O2;sHw%HdzRy2VHN2=ON6}4qxAQD$2;)1%coR9 zyO#<>9w)`@2DKS>KI-aN_unZ(hJz|x3Ea7#mX%2P)~slWs7grVZ6|+hinaRGInAuZKWqN4=FL@W(9&Mtr=@m_eECUezFWcpXktAwa5 zFW&Uc$Wza&+Ci@m{;U9KL0)RDryrFp_BIx}wVUOq3`3l^YRNMG^ zQ^&^GN4CR!JeTRphdq5a3_-Sc)+j&bk6AwVhT20NM9n|wn0*lFi6T(DO7z7v@CU2N ztiktpB>)zODm{b#@^iATc7Hk9;X4StDwF_|E(6c0MMFF7C^8l&!T=I8ku$r!LNIC< z&&YkM9q@x|b?3$WMTjXbL&>)eZUm#?Y3a8Syn)q$;_Q{zXmefv?D#V3_UwBm;$cIZ z>wTX(a($m78!l>l=ayZ5dA<8}p8dYDEN02^%^^V0=u7)88vWtoSzZg53agynYj;~4 zuui>fAMHbe?3Qly#swS!vu+$c3P@I!|RPwyPI8c4V2aL(MR!MUd-gAiH_o za}9`?m9O8m;&b{ql_f3k)eX~Ci0m0BLuQ*DR(f33^;RCb97^_XOZkL48pijud0Lua zl?4-N{l)Fba-AKIe@8Dyk^*$Mj-OIMuC+IlhNV-mI&?w{EZwr^erRZ4xM$*Z&te2H zQhq|T{YvB^(0w!fSiq8)VfyXN@6T`U`2lie#}tTb_UsZ-z1Zkx%fqi1P~l!HfnR2V zcnbX~WM|j~33Gz{cjDNUS<{!dhbT3Wt_~x7@fhOeM2D(mA%p&d`?H+KlaXp`5RMJw z^7HgNP74OALJyN$cnvL?IR9^6uBbN$!V^@Q}i);7Z`|BN68%o__sx5^ib zMXQRJ?e?_dv)T2Fho;t(iQz>lX~AOgzB`*qY^|DTa9@fFDpIoAu+S%GUX;Pok#{dGBIGildDbh4?ODO1WGrto^v}ez5HD}oLTjJcM&6w zZ=^qM@;1_c*p?e~yh|cvU5as3=V*G+iXUm8kS;D?4z_K5tFKZj2jKEMg{tZ)D7>~x zvhN2uz~0rg3p~}@V#Vk1`zYcaXjA`ZxD3uGdcrhN;s0J^gz#16*3^(t;vDe>=u?`C zV?ksrauci#X+WtZ0!CVkXfOUVj$)b6Mi!c*(GX=fC?{n(2u`*hqutDX_Go0nXr69# z+GzdN@bu;oQmlu4G=>t?J1#_x2hR$P(uL3Z9zlv{ z@s1=yO|_1b>KvOv7LS6R6^7L&R)tE63`dl@f6@jnbp$GAYUG>nrE(Qbf=f*-Tny+! z>cemTO=Fg?{W9t2-errGwtuRt4%aZ#ZqAwXL=^c#6;PVMuz}CKyzN|6NpppoK=A4d z?)-=9Bs~Pf0hG`@&<7+H#Gu5AXj091<)wqfc8H#;u{3TN`y>^NnoT)M*)P>!gg-Vs z)3VM@VEW{5K0<136n6xl?Q!bM-J%hOL*1RQP*LCYX=;LXmZmTHjp1C!CJ{LdjV1NZ zz4nc4hn7fzGl^L2<5k}^b?x0Fx-4n>Oiwg-@D<7)uzrb#|#x|k%WltqIy|)WQ z9h&t5_GCR$6}Ccd?pGiCbcLP$r?m4MOq4hvqero+|ZHQ@p zR@+}L>sS&e&c;=5JyD&ILg{Pj0Sbaqsmq5uY}^Fi+vAX2JwgpH*j>zF;GA{3Tp5e2 zxNjj970 z>L+rZ!{V;MJ=W%HfSbKp;K z0G+U@$YV<>A@AcK36_vIl(@bp(P-v%vTpxJlw2OJ73s?$KZ7i`WxrBoqYdal!j`r9 zKn4Gl;7AbL8Oh(qpi6hTdpK1P+{R=NqUm{^&BFe5md3;iWE?i^CB}B$ULcy7t;GL!aQSYPXRG1OJk$n6jfG{HDq!-h~*bgQ0EJ#dlVcqDiJnsBWK6Ea;o;k_5 z|HJS__3F54LvFbEA>Y2-a~))HNow;c69uUU{)A@umCrIZ!%w5Wg6iC)?nQMdqv5M< zXh2}x=0e`(_b_q)=ri##vu&+sE9|jK1!4n*6CEqLFQ+?_rCWgFM$V8%A@IBykO1_|VpA=_MB7?$-e`X7X@nzsFigDQQNbCWI zq-`Y52i#0(+}z3Ro3;k9L=y>kPX2NK#I2dJU~ZW$6H#a+9Y$vNt6k5?(^Xy-f0%`- zyK+EoXoPv{&7|ApGxMc8lSKn#u>@Dyg-HSg98K}|5uP|*DoO~KWdV1g3Kei-HhGeO0;zqVOl7;v}2Yuv+3m2pnUMQz)zpEy9iSaH!`~G z^cAUx+%D`Lw^aQ5T0Fth%j}($$kUZ%@uo>-Rp`XW#~JLz1TnE;J{T&zv7>z>z~b6b zt8c4jwqD<+P6Q3a4F2|5^MPb1KNk%@*VQZ4pt%nHHrw@anLg=i548_aYYV_)pGRLVx z#p0`m^u0yOxo-aHe%=%A>|V_Sw+m9V4ov))LONY$&H#$K+;K5LU~3sR;1>M5=ILX< zs&LkO!BJdE>@r0OzF<{Ej+T1}bi2DR zaS8V9xrbcb!keXvGX3?kGX3RNBz?I*Jsf%HKDs`H>;H-Z@cfS5(ySNTHQEgL$35<2 zxcbIWlCXC9M$A&&4|a$hP&JBg5=Z7Yn^O*_5YzwFVYa(aId4Fr;~cC@t;jB!koEU? zlI48!eJhe`)4KDcOCD@>@6Y~k{J8z7^V5}MihZcDLMyd`JXan=z$I6D3yWroNSujjinY*W80Ql%$fu zOx|4LJ!_W7iguDY;b(_9)?uC_zCZ1r0?J`5(3!jeJzB;%Ub%98f|$xY-a4NW+TI}? zCyB1eb+Pn<(b7j}0qJF&LmD~)zQ5{L`X^;FH4N(RM{w%FGUV{DQIITv_HD~0+}k2Z z!&Ivc>(ii%nm%Ob5}I*TeyxdU;TJ=g;vh_k5vCx7DLKLv8(~U>FeO8n;v!5*5T*o( z05GH(yHxUqr$Ee}nDN_%EM2l7VCoE)YT|f5A}i^sx^zrgaaZxnioQn2i5? zbV~dp8&*=KX!%N76aF{Y)8pda>j6%_V3(VzQ|=yCHcY!>oG*u4c}KzTQ>4D?6~+Gq zTZ}Q!0?R&-VqtaBV`1^#=%X^#XuWM9{YP50hBTNH=k`G?G>r&1*E_6cB4z>SR$a9z z{`)P4Cj6_m+Lgd}tHyen0KG+MqQEV}5~XgjG*Rgm|0HVMwo^oi{M#O(d5dERC-VPQ zYei@$nKS)Eol%zK_0eKsB}!mniDUhL$`4u>M_`gvZ;k#NDH6lNy0QCj$`2wlyfJ!& zFiU2??LbsA9S*`B!TnYMF`IllOvKI&1qW`ZCkUxv3WP+;zqEP^9Zq@BE$te5=f-Q; zIQMY>)u_F31)}PvS~&`VL_iQ^u}=^*siaIdGPK4Ee2l^dH?MznlePZa4J@quAkNtT QGiE_Vr_zFc$Np3MA0u4&CIA2c diff --git a/src/main/java/com/iqudoo/framework/mybatis/TapeRepositoryGeneratorPlugin.java b/src/main/java/com/iqudoo/framework/mybatis/TapeRepositoryGeneratorPlugin.java index a615782..518e68c 100644 --- a/src/main/java/com/iqudoo/framework/mybatis/TapeRepositoryGeneratorPlugin.java +++ b/src/main/java/com/iqudoo/framework/mybatis/TapeRepositoryGeneratorPlugin.java @@ -19,7 +19,6 @@ public class TapeRepositoryGeneratorPlugin extends PluginAdapter { // 固定配置项 private String slowQueryLoggerTime = "300"; private String slowQueryLoggerLevel = "error"; - private String priorityPrimaryKeyOffset = "0"; private String facadeRepositoryPackage = "com.iqudoo.platform.application.facade.repository"; private String domainRepositoryPackage = "com.iqudoo.platform.application.domain.repository"; private String guidGeneratorClass = "com.iqudoo.framework.tape.modules.utils.SnowflakeUtil"; @@ -27,6 +26,7 @@ public class TapeRepositoryGeneratorPlugin extends PluginAdapter { private String changeLogContextClassPackage = "com.iqudoo.platform.application.domain.changeLog"; private String changeLogContextClassName = "ChangeLogContext"; private String changeLogEnable = "false"; + private String optimisticLockEnable = "true"; private String modelPackage = "com.iqudoo.platform.application.database.model"; private String mapperPackage = "com.iqudoo.platform.application.database.mapper"; private String targetProject = "src/main/java"; @@ -48,12 +48,12 @@ public class TapeRepositoryGeneratorPlugin extends PluginAdapter { } private void resolveConfiguration() { + targetProject = stringConfig("targetProject", targetProject); slowQueryLoggerTime = stringConfig("slowQueryLoggerTime", slowQueryLoggerTime); slowQueryLoggerLevel = stringConfig("slowQueryLoggerLevel", slowQueryLoggerLevel); if (!UtilTools.inArray(new String[]{"error", "warn", "debug", "info"}, slowQueryLoggerLevel)) { slowQueryLoggerLevel = "error"; } - priorityPrimaryKeyOffset = stringConfig("priorityPrimaryKeyOffset", priorityPrimaryKeyOffset); guidGeneratorClass = stringConfig("guidGeneratorClass", guidGeneratorClass); guidGeneratorCode = stringConfig("guidGeneratorCode", guidGeneratorCode); facadeRepositoryPackage = stringConfig("facadeRepositoryPackage", facadeRepositoryPackage); @@ -61,9 +61,9 @@ public class TapeRepositoryGeneratorPlugin extends PluginAdapter { changeLogContextClassPackage = stringConfig("changeLogContextClassPackage", changeLogContextClassPackage); changeLogContextClassName = stringConfig("changeLogContextClassName", changeLogContextClassName); changeLogEnable = stringConfig("changeLogEnable", changeLogEnable); - modelPackage = stringConfig("modelPackage", modelPackage); + optimisticLockEnable = stringConfig("optimisticLockEnable", optimisticLockEnable); mapperPackage = stringConfig("mapperPackage", mapperPackage); - targetProject = stringConfig("targetProject", targetProject); + modelPackage = stringConfig("modelPackage", modelPackage); } private boolean isChangeLogEnable() { @@ -77,6 +77,17 @@ public class TapeRepositoryGeneratorPlugin extends PluginAdapter { return false; } + private boolean isOptimisticLockEnable() { + try { + boolean b = Boolean.parseBoolean(optimisticLockEnable); + if (b) { + return true; + } + } catch (Throwable ignored) { + } + return false; + } + private String stringConfig(String key, String defaultValue) { String v = properties.getProperty(key); if (StringUtility.stringHasValue(v)) { @@ -397,11 +408,11 @@ public class TapeRepositoryGeneratorPlugin extends PluginAdapter { generateBatchInsertMethod(implClass, modelClassName, mapperFieldName, introspectedTable); generateUpdateMethod(implClass, modelClassName, exampleClassName, mapperFieldName, introspectedTable, hasBLOBColumns); generateUpdateByExampleSelectiveMethod(implClass, modelClassName, exampleClassName, mapperFieldName, introspectedTable, hasBLOBColumns); - generateDeleteByIdMethod(implClass, modelClassName, mapperFieldName); + generateDeleteByIdMethod(implClass, modelClassName, exampleClassName, mapperFieldName); generateDeleteAllMethod(implClass, modelClassName, exampleClassName, mapperFieldName); - generateTrashByIdMethod(implClass, modelClassName, mapperFieldName); + generateTrashByIdMethod(implClass, modelClassName, exampleClassName, mapperFieldName); generateTrashAllMethod(implClass, modelClassName, exampleClassName, mapperFieldName); - generateRecoverByIdMethod(implClass, modelClassName, mapperFieldName); + generateRecoverByIdMethod(implClass, modelClassName, exampleClassName, mapperFieldName); generateRecoverAllMethod(implClass, modelClassName, exampleClassName, mapperFieldName); generateFindValidOneMethod(implClass, modelClassName, exampleClassName); generateFindTrashOneMethod(implClass, modelClassName, exampleClassName); @@ -587,7 +598,15 @@ public class TapeRepositoryGeneratorPlugin extends PluginAdapter { method.addBodyLine("aDo.setCreateTime(new Date());"); method.addBodyLine("aDo.setUpdateTime(new Date());"); + method.addBodyLine("long startTime = new Date().getTime();"); method.addBodyLine("int count = " + mapperFieldName + ".insert(aDo);"); + method.addBodyLine("long useTime = new Date().getTime() - startTime;"); + method.addBodyLine("if (useTime > " + slowQueryLoggerTime + ") {"); + method.addBodyLine("LOGGER." + slowQueryLoggerLevel + "(\"[SQL] insert " + modelClassName + " long time\" +"); + method.addBodyLine(" \"\\n\\t|-> use time:\" + useTime + \"ms\" +"); + method.addBodyLine(" \"\\n\\t|-----------------------------------\""); + method.addBodyLine(");"); + method.addBodyLine("}"); method.addBodyLine("if (count > 0) {"); method.addBodyLine("// optimistic locking with data version and guid"); method.addBodyLine("record.setGuid(aDo.getGuid());"); @@ -646,7 +665,15 @@ public class TapeRepositoryGeneratorPlugin extends PluginAdapter { method.addBodyLine("batch.add(aDo);"); method.addBodyLine("}"); + method.addBodyLine("long startTime = new Date().getTime();"); method.addBodyLine("int count = " + mapperFieldName + ".batchInsert(batch);"); + method.addBodyLine("long useTime = new Date().getTime() - startTime;"); + method.addBodyLine("if (useTime > " + slowQueryLoggerTime + ") {"); + method.addBodyLine("LOGGER." + slowQueryLoggerLevel + "(\"[SQL] batch insert " + modelClassName + " long time\" +"); + method.addBodyLine(" \"\\n\\t|-> use time:\" + useTime + \"ms\" +"); + method.addBodyLine(" \"\\n\\t|-----------------------------------\""); + method.addBodyLine(");"); + method.addBodyLine("}"); method.addBodyLine("if (count == batch.size()) {"); if (isChangeLogEnable()) { method.addBodyLine("for (" + modelClassName + " aDo : batch) {"); @@ -697,29 +724,41 @@ public class TapeRepositoryGeneratorPlugin extends PluginAdapter { method.addBodyLine("}"); } method.addBodyLine(exampleClassName + " updateWhere = new " + exampleClassName + "();"); - method.addBodyLine("Integer lockDataVersion = record.getDataVersion();"); - method.addBodyLine("if (lockDataVersion == null) {"); - method.addBodyLine("lockDataVersion = aDo.getDataVersion();"); - method.addBodyLine("}"); - method.addBodyLine("updateWhere.createCriteria()"); - method.addBodyLine(" .andGuidEqualTo(aDo.getGuid())"); - method.addBodyLine(" .andDataVersionEqualTo(lockDataVersion);"); + if (isOptimisticLockEnable()) { + method.addBodyLine("Integer lockDataVersion = record.getDataVersion();"); + method.addBodyLine("if (lockDataVersion == null) {"); + method.addBodyLine("lockDataVersion = aDo.getDataVersion();"); + method.addBodyLine("}"); + method.addBodyLine("updateWhere.createCriteria()"); + method.addBodyLine(" .andGuidEqualTo(aDo.getGuid())"); + method.addBodyLine(" .andDataVersionEqualTo(lockDataVersion);"); + } else { + method.addBodyLine("updateWhere.createCriteria()"); + method.addBodyLine(" .andGuidEqualTo(aDo.getGuid());"); + } method.addBodyLine("aDo.setDataVersion(aDo.getDataVersion() + 1);"); method.addBodyLine("aDo.setUpdateTime(new Date());"); method.addBodyLine("// update data version"); method.addBodyLine("record.setDataVersion(aDo.getDataVersion());"); method.addBodyLine("record.setUpdateTime(aDo.getUpdateTime());"); + + method.addBodyLine("long startTime = new Date().getTime();"); String updateMethod = hasBLOBColumns ? "updateByExampleWithBLOBs" : "updateByExample"; + method.addBodyLine("int update = " + mapperFieldName + "." + updateMethod + "(aDo, updateWhere);"); + method.addBodyLine("long useTime = new Date().getTime() - startTime;"); + method.addBodyLine("if (useTime > " + slowQueryLoggerTime + ") {"); + method.addBodyLine("LOGGER." + slowQueryLoggerLevel + "(\"[SQL] update " + modelClassName + " long time\" +"); + method.addBodyLine(" \"\\n\\t|-> use time:\" + useTime + \"ms\" +"); + method.addBodyLine(" \"\\n\\t|-----------------------------------\""); + method.addBodyLine(");"); + method.addBodyLine("}"); if (isChangeLogEnable()) { - method.addBodyLine("int update = " + mapperFieldName + "." + updateMethod + "(aDo, updateWhere);"); method.addBodyLine("if (update > 0 && !changeDiff.isEmpty()) {"); method.addBodyLine(changeLogContextClassName + ".addLog(\"" + modelClassName + "\","); method.addBodyLine(" \"update\", aDo.getGuid(), changeDiff);"); method.addBodyLine("}"); - method.addBodyLine("return update;"); - } else { - method.addBodyLine("return " + mapperFieldName + "." + updateMethod + "(aDo, updateWhere);"); } + method.addBodyLine("return update;"); implClass.addMethod(method); } @@ -744,10 +783,7 @@ public class TapeRepositoryGeneratorPlugin extends PluginAdapter { method.addBodyLine("return 0;"); method.addBodyLine("}"); method.addBodyLine("example = new " + exampleClassName + "();"); - method.addBodyLine("example.createCriteria()"); - method.addBodyLine(" .andIsDeleteEqualTo(0)"); - method.addBodyLine(" .andIsHiddenEqualTo(0)"); - method.addBodyLine(" .andGuidIn(guidList);"); + method.addBodyLine("example.createCriteria().andGuidIn(guidList);"); if (isChangeLogEnable()) { String selectByExampleMethod = hasBLOBColumns ? "selectByExampleWithBLOBs" : "selectByExample"; method.addBodyLine("List<" + modelClassName + "> recordList"); @@ -771,16 +807,32 @@ public class TapeRepositoryGeneratorPlugin extends PluginAdapter { method.addBodyLine("diffGroup.put(aDo.getGuid(), changeDiff);"); method.addBodyLine("}"); } - method.addBodyLine("// reset data version to 100, with optimistic locking"); - method.addBodyLine("record.setDataVersion(100);"); + if (isOptimisticLockEnable()) { + method.addBodyLine("// reset data version, with optimistic locking"); + method.addBodyLine("record.setDataVersion((int) (new Date().getTime() % 1000));"); + } method.addBodyLine("// It is not supported to directly modify the following columns"); method.addBodyLine("record.setUpdateTime(new Date());"); method.addBodyLine("record.setIsHidden(null);"); method.addBodyLine("record.setIsDelete(null);"); method.addBodyLine("record.setDeleteToken(null);"); method.addBodyLine("record.setCreateTime(null);"); + + method.addBodyLine("long startTime = new Date().getTime();"); + method.addBodyLine("int update = " + mapperFieldName + ".updateByExampleSelective(record, example);"); + method.addBodyLine("long useTime = new Date().getTime() - startTime;"); + method.addBodyLine("if (useTime > " + slowQueryLoggerTime + ") {"); + method.addBodyLine("String exampleString = \"\";"); + method.addBodyLine("if (example.getWhereString() != null) {"); + method.addBodyLine("exampleString += \"\\n\\t|-> where: \" + example.getWhereString();"); + method.addBodyLine("}"); + method.addBodyLine("LOGGER." + slowQueryLoggerLevel + "(\"[SQL] updateByExampleSelective " + modelClassName + " long time\" +"); + method.addBodyLine(" \"\\n\\t|-> use time:\" + useTime + \"ms\" +"); + method.addBodyLine(" exampleString +"); + method.addBodyLine(" \"\\n\\t|-----------------------------------\""); + method.addBodyLine(");"); + method.addBodyLine("}"); if (isChangeLogEnable()) { - method.addBodyLine("int update = " + mapperFieldName + ".updateByExampleSelective(record, example);"); method.addBodyLine("if (update > 0) {"); method.addBodyLine("for (Map.Entry> diffEntry : diffGroup.entrySet()) {"); method.addBodyLine("if (diffEntry.getValue() != null && !diffEntry.getValue().isEmpty()) {"); @@ -789,14 +841,12 @@ public class TapeRepositoryGeneratorPlugin extends PluginAdapter { method.addBodyLine("}"); method.addBodyLine("}"); method.addBodyLine("}"); - method.addBodyLine("return update;"); - } else { - method.addBodyLine("return " + mapperFieldName + ".updateByExampleSelective(record, example);"); } + method.addBodyLine("return update;"); implClass.addMethod(method); } - private void generateDeleteByIdMethod(TopLevelClass implClass, String modelClassName, String mapperFieldName) { + private void generateDeleteByIdMethod(TopLevelClass implClass, String modelClassName, String exampleClassName, String mapperFieldName) { Method method = new Method("deleteById"); method.addAnnotation("@Override"); method.setVisibility(JavaVisibility.PUBLIC); @@ -811,9 +861,30 @@ public class TapeRepositoryGeneratorPlugin extends PluginAdapter { method.addBodyLine("if (release) {"); method.addBodyLine("return " + mapperFieldName + ".deleteByPrimaryKey(aDo.getGuid());"); method.addBodyLine("}"); + method.addBodyLine(exampleClassName + " updateWhere"); + method.addBodyLine(" = new " + exampleClassName + "();"); + method.addBodyLine("Integer lockDataVersion = aDo.getDataVersion();"); + if (isOptimisticLockEnable()) { + method.addBodyLine("updateWhere.createCriteria()"); + method.addBodyLine(" .andGuidEqualTo(aDo.getGuid())"); + method.addBodyLine(" .andDataVersionEqualTo(lockDataVersion);"); + } else { + method.addBodyLine("updateWhere.createCriteria()"); + method.addBodyLine(" .andGuidEqualTo(aDo.getGuid());"); + } + method.addBodyLine("aDo.setDataVersion(aDo.getDataVersion() + 1);"); method.addBodyLine("aDo.setIsDelete(1);"); method.addBodyLine("aDo.setUpdateTime(new Date());"); - method.addBodyLine("int update = " + mapperFieldName + ".updateByPrimaryKey(aDo);"); + + method.addBodyLine("long startTime = new Date().getTime();"); + method.addBodyLine("int update = " + mapperFieldName + ".updateByExampleSelective(aDo, updateWhere);"); + method.addBodyLine("long useTime = new Date().getTime() - startTime;"); + method.addBodyLine("if (useTime > " + slowQueryLoggerTime + ") {"); + method.addBodyLine("LOGGER." + slowQueryLoggerLevel + "(\"[SQL] deleteById " + modelClassName + " long time\" +"); + method.addBodyLine(" \"\\n\\t|-> use time:\" + useTime + \"ms\" +"); + method.addBodyLine(" \"\\n\\t|-----------------------------------\""); + method.addBodyLine(");"); + method.addBodyLine("}"); if (isChangeLogEnable()) { method.addBodyLine("if (update > 0) {"); method.addBodyLine(changeLogContextClassName + ".addLog(\"" + modelClassName + "\","); @@ -824,7 +895,7 @@ public class TapeRepositoryGeneratorPlugin extends PluginAdapter { implClass.addMethod(method); } - private void generateTrashByIdMethod(TopLevelClass implClass, String modelClassName, String mapperFieldName) { + private void generateTrashByIdMethod(TopLevelClass implClass, String modelClassName, String exampleClassName, String mapperFieldName) { Method method = new Method("trashById"); method.addAnnotation("@Override"); method.setVisibility(JavaVisibility.PUBLIC); @@ -836,23 +907,43 @@ public class TapeRepositoryGeneratorPlugin extends PluginAdapter { method.addBodyLine("if (aDo == null) {"); method.addBodyLine("return 0;"); method.addBodyLine("}"); + + method.addBodyLine(exampleClassName + " updateWhere"); + method.addBodyLine(" = new " + exampleClassName + "();"); + method.addBodyLine("Integer lockDataVersion = aDo.getDataVersion();"); + if (isOptimisticLockEnable()) { + method.addBodyLine("updateWhere.createCriteria()"); + method.addBodyLine(" .andGuidEqualTo(aDo.getGuid())"); + method.addBodyLine(" .andDataVersionEqualTo(lockDataVersion);"); + } else { + method.addBodyLine("updateWhere.createCriteria()"); + method.addBodyLine(" .andGuidEqualTo(aDo.getGuid());"); + } + method.addBodyLine("aDo.setDataVersion(aDo.getDataVersion() + 1);"); method.addBodyLine("aDo.setIsHidden(1);"); method.addBodyLine("aDo.setDeleteToken(aDo.getGuid() + \"\");"); method.addBodyLine("aDo.setUpdateTime(new Date());"); + + method.addBodyLine("long startTime = new Date().getTime();"); + method.addBodyLine("int update = " + mapperFieldName + ".updateByExampleSelective(aDo, updateWhere);"); + method.addBodyLine("long useTime = new Date().getTime() - startTime;"); + method.addBodyLine("if (useTime > " + slowQueryLoggerTime + ") {"); + method.addBodyLine("LOGGER." + slowQueryLoggerLevel + "(\"[SQL] trashById " + modelClassName + " long time\" +"); + method.addBodyLine(" \"\\n\\t|-> use time:\" + useTime + \"ms\" +"); + method.addBodyLine(" \"\\n\\t|-----------------------------------\""); + method.addBodyLine(");"); + method.addBodyLine("}"); if (isChangeLogEnable()) { - method.addBodyLine("int update = " + mapperFieldName + ".updateByPrimaryKey(aDo);"); method.addBodyLine("if (update > 0) {"); method.addBodyLine(changeLogContextClassName + ".addLog(\"" + modelClassName + "\","); method.addBodyLine(" \"trashById\", aDo.getGuid(), new HashMap<>());"); method.addBodyLine("}"); - method.addBodyLine("return update;"); - } else { - method.addBodyLine("return " + mapperFieldName + ".updateByPrimaryKey(aDo);"); } + method.addBodyLine("return update;"); implClass.addMethod(method); } - private void generateRecoverByIdMethod(TopLevelClass implClass, String modelClassName, String mapperFieldName) { + private void generateRecoverByIdMethod(TopLevelClass implClass, String modelClassName, String exampleClassName, String mapperFieldName) { Method method = new Method("recoverById"); method.addAnnotation("@Override"); method.setVisibility(JavaVisibility.PUBLIC); @@ -867,19 +958,38 @@ public class TapeRepositoryGeneratorPlugin extends PluginAdapter { method.addBodyLine("if (aDo.getIsDelete() == 1) {"); method.addBodyLine("return 0;"); method.addBodyLine("}"); + + method.addBodyLine(exampleClassName + " updateWhere"); + method.addBodyLine(" = new " + exampleClassName + "();"); + method.addBodyLine("Integer lockDataVersion = aDo.getDataVersion();"); + if (isOptimisticLockEnable()) { + method.addBodyLine("updateWhere.createCriteria()"); + method.addBodyLine(" .andGuidEqualTo(aDo.getGuid())"); + method.addBodyLine(" .andDataVersionEqualTo(lockDataVersion);"); + } else { + method.addBodyLine("updateWhere.createCriteria()"); + method.addBodyLine(" .andGuidEqualTo(aDo.getGuid());"); + } + method.addBodyLine("aDo.setDataVersion(aDo.getDataVersion() + 1);"); method.addBodyLine("aDo.setIsHidden(0);"); method.addBodyLine("aDo.setDeleteToken(\"VALID\");"); method.addBodyLine("aDo.setUpdateTime(new Date());"); + method.addBodyLine("long startTime = new Date().getTime();"); + method.addBodyLine("int update = " + mapperFieldName + ".updateByExampleSelective(aDo, updateWhere);"); + method.addBodyLine("long useTime = new Date().getTime() - startTime;"); + method.addBodyLine("if (useTime > " + slowQueryLoggerTime + ") {"); + method.addBodyLine("LOGGER." + slowQueryLoggerLevel + "(\"[SQL] recoverById " + modelClassName + " long time\" +"); + method.addBodyLine(" \"\\n\\t|-> use time:\" + useTime + \"ms\" +"); + method.addBodyLine(" \"\\n\\t|-----------------------------------\""); + method.addBodyLine(");"); + method.addBodyLine("}"); if (isChangeLogEnable()) { - method.addBodyLine("int update = " + mapperFieldName + ".updateByPrimaryKey(aDo);"); method.addBodyLine("if (update > 0) {"); method.addBodyLine(changeLogContextClassName + ".addLog(\"" + modelClassName + "\","); method.addBodyLine(" \"recoverById\", aDo.getGuid(), new HashMap<>());"); method.addBodyLine("}"); - method.addBodyLine("return update;"); - } else { - method.addBodyLine("return " + mapperFieldName + ".updateByPrimaryKey(aDo);"); } + method.addBodyLine("return update;"); implClass.addMethod(method); } @@ -903,21 +1013,34 @@ public class TapeRepositoryGeneratorPlugin extends PluginAdapter { method.addBodyLine("if (guidList.isEmpty()) {"); method.addBodyLine("return 0;"); method.addBodyLine("}"); + method.addBodyLine("example = new " + exampleClassName + "();"); + method.addBodyLine("example.createCriteria().andGuidIn(guidList);"); method.addBodyLine(modelClassName + " " + lowerFirst(modelClassName) + " = new " + modelClassName + "();"); + if (isOptimisticLockEnable()) { + method.addBodyLine("// reset data version, with optimistic locking"); + method.addBodyLine(lowerFirst(modelClassName) + ".setDataVersion((int) (new Date().getTime() % 1000));"); + } method.addBodyLine(lowerFirst(modelClassName) + ".setIsDelete(1);"); method.addBodyLine(lowerFirst(modelClassName) + ".setUpdateTime(new Date());"); + + method.addBodyLine("long startTime = new Date().getTime();"); + method.addBodyLine("int update = " + mapperFieldName + ".updateByExampleSelective(" + lowerFirst(modelClassName) + ", example);"); + method.addBodyLine("long useTime = new Date().getTime() - startTime;"); + method.addBodyLine("if (useTime > " + slowQueryLoggerTime + ") {"); + method.addBodyLine("LOGGER." + slowQueryLoggerLevel + "(\"[SQL] deleteAll " + modelClassName + " long time\" +"); + method.addBodyLine(" \"\\n\\t|-> use time:\" + useTime + \"ms\" +"); + method.addBodyLine(" \"\\n\\t|-----------------------------------\""); + method.addBodyLine(");"); + method.addBodyLine("}"); if (isChangeLogEnable()) { - method.addBodyLine("int update = " + mapperFieldName + ".updateByExampleSelective(" + lowerFirst(modelClassName) + ", example);"); method.addBodyLine("if (update > 0) {"); method.addBodyLine("for (Long guid : guidList) {"); method.addBodyLine(changeLogContextClassName + ".addLog(\"" + modelClassName + "\","); method.addBodyLine(" \"deleteAll\", guid, new HashMap<>());"); method.addBodyLine("}"); method.addBodyLine("}"); - method.addBodyLine("return update;"); - } else { - method.addBodyLine("return " + mapperFieldName + ".updateByExampleSelective(" + lowerFirst(modelClassName) + ", example);"); } + method.addBodyLine("return update;"); implClass.addMethod(method); } @@ -937,22 +1060,35 @@ public class TapeRepositoryGeneratorPlugin extends PluginAdapter { method.addBodyLine("if (guidList.isEmpty()) {"); method.addBodyLine("return 0;"); method.addBodyLine("}"); + method.addBodyLine("example = new " + exampleClassName + "();"); + method.addBodyLine("example.createCriteria().andGuidIn(guidList);"); method.addBodyLine(modelClassName + " " + lowerFirst(modelClassName) + " = new " + modelClassName + "();"); + if (isOptimisticLockEnable()) { + method.addBodyLine("// reset data version, with optimistic locking"); + method.addBodyLine(lowerFirst(modelClassName) + ".setDataVersion((int) (new Date().getTime() % 1000));"); + } method.addBodyLine(lowerFirst(modelClassName) + ".setIsHidden(1);"); method.addBodyLine(lowerFirst(modelClassName) + ".setDeleteToken(" + guidGeneratorCode + " + \"\");"); method.addBodyLine(lowerFirst(modelClassName) + ".setUpdateTime(new Date());"); + + method.addBodyLine("long startTime = new Date().getTime();"); + method.addBodyLine("int update = " + mapperFieldName + ".updateByExampleSelective(" + lowerFirst(modelClassName) + ", example);"); + method.addBodyLine("long useTime = new Date().getTime() - startTime;"); + method.addBodyLine("if (useTime > " + slowQueryLoggerTime + ") {"); + method.addBodyLine("LOGGER." + slowQueryLoggerLevel + "(\"[SQL] trashAll " + modelClassName + " long time\" +"); + method.addBodyLine(" \"\\n\\t|-> use time:\" + useTime + \"ms\" +"); + method.addBodyLine(" \"\\n\\t|-----------------------------------\""); + method.addBodyLine(");"); + method.addBodyLine("}"); if (isChangeLogEnable()) { - method.addBodyLine("int update = " + mapperFieldName + ".updateByExampleSelective(" + lowerFirst(modelClassName) + ", example);"); method.addBodyLine("if (update > 0) {"); method.addBodyLine("for (Long guid : guidList) {"); method.addBodyLine(changeLogContextClassName + ".addLog(\"" + modelClassName + "\","); method.addBodyLine(" \"trashAll\", guid, new HashMap<>());"); method.addBodyLine("}"); method.addBodyLine("}"); - method.addBodyLine("return update;"); - } else { - method.addBodyLine("return " + mapperFieldName + ".updateByExampleSelective(" + lowerFirst(modelClassName) + ", example);"); } + method.addBodyLine("return update;"); implClass.addMethod(method); } @@ -972,22 +1108,35 @@ public class TapeRepositoryGeneratorPlugin extends PluginAdapter { method.addBodyLine("if (guidList.isEmpty()) {"); method.addBodyLine("return 0;"); method.addBodyLine("}"); + method.addBodyLine("example = new " + exampleClassName + "();"); + method.addBodyLine("example.createCriteria().andGuidIn(guidList);"); method.addBodyLine(modelClassName + " " + lowerFirst(modelClassName) + " = new " + modelClassName + "();"); + if (isOptimisticLockEnable()) { + method.addBodyLine("// reset data version, with optimistic locking"); + method.addBodyLine(lowerFirst(modelClassName) + ".setDataVersion((int) (new Date().getTime() % 1000));"); + } method.addBodyLine(lowerFirst(modelClassName) + ".setIsHidden(0);"); method.addBodyLine(lowerFirst(modelClassName) + ".setDeleteToken(\"VALID\");"); method.addBodyLine(lowerFirst(modelClassName) + ".setUpdateTime(new Date());"); + + method.addBodyLine("long startTime = new Date().getTime();"); + method.addBodyLine("int update = " + mapperFieldName + ".updateByExampleSelective(" + lowerFirst(modelClassName) + ", example);"); + method.addBodyLine("long useTime = new Date().getTime() - startTime;"); + method.addBodyLine("if (useTime > " + slowQueryLoggerTime + ") {"); + method.addBodyLine("LOGGER." + slowQueryLoggerLevel + "(\"[SQL] recoverAll " + modelClassName + " long time\" +"); + method.addBodyLine(" \"\\n\\t|-> use time:\" + useTime + \"ms\" +"); + method.addBodyLine(" \"\\n\\t|-----------------------------------\""); + method.addBodyLine(");"); + method.addBodyLine("}"); if (isChangeLogEnable()) { - method.addBodyLine("int update = " + mapperFieldName + ".updateByExampleSelective(" + lowerFirst(modelClassName) + ", example);"); method.addBodyLine("if (update > 0) {"); method.addBodyLine("for (Long guid : guidList) {"); method.addBodyLine(changeLogContextClassName + ".addLog(\"" + modelClassName + "\","); method.addBodyLine(" \"recoverAll\", guid, new HashMap<>());"); method.addBodyLine("}"); method.addBodyLine("}"); - method.addBodyLine("return update;"); - } else { - method.addBodyLine("return " + mapperFieldName + ".updateByExampleSelective(" + lowerFirst(modelClassName) + ", example);"); } + method.addBodyLine("return update;"); implClass.addMethod(method); } @@ -1043,7 +1192,7 @@ public class TapeRepositoryGeneratorPlugin extends PluginAdapter { method.addBodyLine("List<" + modelClassName + "> result = null;"); method.addBodyLine("long startTime = new Date().getTime();"); if (hasBLOBColumns) { - method.addBodyLine("if (example.getRows() != null && example.getOffset() != null && example.getOffset() > " + priorityPrimaryKeyOffset + ") {"); + method.addBodyLine("if (example.getRows() != null && example.getOffset() != null) {"); method.addBodyLine("List primaryKeyList = " + mapperFieldName + ".selectPrimaryKeyByExample(example);"); method.addBodyLine("if (primaryKeyList == null || primaryKeyList.isEmpty()) {"); method.addBodyLine("return new ArrayList<>();"); @@ -1060,7 +1209,7 @@ public class TapeRepositoryGeneratorPlugin extends PluginAdapter { method.addBodyLine("if (example.getLimitString() != null) {"); method.addBodyLine("exampleString += \"\\n\\t|-> limit: \" + example.getLimitString();"); method.addBodyLine("}"); - method.addBodyLine("LOGGER." + slowQueryLoggerLevel + "(\"[SQL] select " + modelClassName + " valid list primary key use long time\" +"); + method.addBodyLine("LOGGER." + slowQueryLoggerLevel + "(\"[SQL] select " + modelClassName + " valid list primary key long time\" +"); method.addBodyLine(" \"\\n\\t|-> use time:\" + findPrimaryKeyTime + \"ms\" +"); method.addBodyLine(" exampleString +"); method.addBodyLine(" \"\\n\\t|-----------------------------------\""); @@ -1095,7 +1244,7 @@ public class TapeRepositoryGeneratorPlugin extends PluginAdapter { method.addBodyLine("if (example.getLimitString() != null) {"); method.addBodyLine("exampleString += \"\\n\\t|-> limit: \" + example.getLimitString();"); method.addBodyLine("}"); - method.addBodyLine("LOGGER." + slowQueryLoggerLevel + "(\"[SQL] select " + modelClassName + " valid list use long time\" +"); + method.addBodyLine("LOGGER." + slowQueryLoggerLevel + "(\"[SQL] select " + modelClassName + " valid list long time\" +"); method.addBodyLine(" \"\\n\\t|-> use time:\" + useTime + \"ms\" +"); method.addBodyLine(" exampleString +"); method.addBodyLine(" \"\\n\\t|-----------------------------------\""); @@ -1120,7 +1269,7 @@ public class TapeRepositoryGeneratorPlugin extends PluginAdapter { method.addBodyLine("List<" + modelClassName + "> result = null;"); method.addBodyLine("long startTime = new Date().getTime();"); if (hasBLOBColumns) { - method.addBodyLine("if (example.getRows() != null && example.getOffset() != null && example.getOffset() > " + priorityPrimaryKeyOffset + ") {"); + method.addBodyLine("if (example.getRows() != null && example.getOffset() != null) {"); method.addBodyLine("List primaryKeyList = " + mapperFieldName + ".selectPrimaryKeyByExample(example);"); method.addBodyLine("if (primaryKeyList == null || primaryKeyList.isEmpty()) {"); method.addBodyLine("return new ArrayList<>();"); @@ -1137,7 +1286,7 @@ public class TapeRepositoryGeneratorPlugin extends PluginAdapter { method.addBodyLine("if (example.getLimitString() != null) {"); method.addBodyLine("exampleString += \"\\n\\t|-> limit: \" + example.getLimitString();"); method.addBodyLine("}"); - method.addBodyLine("LOGGER." + slowQueryLoggerLevel + "(\"[SQL] select " + modelClassName + " trash list primary key use long time\" +"); + method.addBodyLine("LOGGER." + slowQueryLoggerLevel + "(\"[SQL] select " + modelClassName + " trash list primary key long time\" +"); method.addBodyLine(" \"\\n\\t|-> use time:\" + findPrimaryKeyTime + \"ms\" +"); method.addBodyLine(" exampleString +"); method.addBodyLine(" \"\\n\\t|-----------------------------------\""); @@ -1172,7 +1321,7 @@ public class TapeRepositoryGeneratorPlugin extends PluginAdapter { method.addBodyLine("if (example.getLimitString() != null) {"); method.addBodyLine("exampleString += \"\\n\\t|-> limit: \" + example.getLimitString();"); method.addBodyLine("}"); - method.addBodyLine("LOGGER." + slowQueryLoggerLevel + "(\"[SQL] select " + modelClassName + " trash list use long time\" +"); + method.addBodyLine("LOGGER." + slowQueryLoggerLevel + "(\"[SQL] select " + modelClassName + " trash list long time\" +"); method.addBodyLine(" \"\\n\\t|-> use time:\" + useTime + \"ms\" +"); method.addBodyLine(" exampleString +"); method.addBodyLine(" \"\\n\\t|-----------------------------------\""); @@ -1204,7 +1353,7 @@ public class TapeRepositoryGeneratorPlugin extends PluginAdapter { method.addBodyLine("if (example.getOrderByClause() != null) {"); method.addBodyLine("exampleString += \"\\n\\t|-> order by: \" + example.getOrderByClause();"); method.addBodyLine("}"); - method.addBodyLine("LOGGER." + slowQueryLoggerLevel + "(\"[SQL] select " + modelClassName + " valid count use long time\" +"); + method.addBodyLine("LOGGER." + slowQueryLoggerLevel + "(\"[SQL] select " + modelClassName + " valid count long time\" +"); method.addBodyLine(" \"\\n\\t|-> use time:\" + useTime + \"ms\" +"); method.addBodyLine(" exampleString +"); method.addBodyLine(" \"\\n\\t|-----------------------------------\""); @@ -1254,7 +1403,7 @@ public class TapeRepositoryGeneratorPlugin extends PluginAdapter { method.addBodyLine("if (example.getOrderByClause() != null) {"); method.addBodyLine("exampleString += \"\\n\\t|-> order by: \" + example.getOrderByClause();"); method.addBodyLine("}"); - method.addBodyLine("LOGGER." + slowQueryLoggerLevel + "(\"[SQL] select " + modelClassName + " trash count use long time\" +"); + method.addBodyLine("LOGGER." + slowQueryLoggerLevel + "(\"[SQL] select " + modelClassName + " trash count long time\" +"); method.addBodyLine(" \"\\n\\t|-> use time:\" + useTime + \"ms\" +"); method.addBodyLine(" exampleString +"); method.addBodyLine(" \"\\n\\t|-----------------------------------\""); diff --git a/src/main/java/com/iqudoo/framework/mybatis/TapeRepoviewGeneratorPlugin.java b/src/main/java/com/iqudoo/framework/mybatis/TapeRepoviewGeneratorPlugin.java index 214f505..4827c57 100644 --- a/src/main/java/com/iqudoo/framework/mybatis/TapeRepoviewGeneratorPlugin.java +++ b/src/main/java/com/iqudoo/framework/mybatis/TapeRepoviewGeneratorPlugin.java @@ -45,6 +45,7 @@ public class TapeRepoviewGeneratorPlugin extends PluginAdapter { } private void resolveConfiguration() { + targetProject = stringConfig("targetProject", targetProject); slowQueryLoggerTime = stringConfig("slowQueryLoggerTime", slowQueryLoggerTime); slowQueryLoggerLevel = stringConfig("slowQueryLoggerLevel", slowQueryLoggerLevel); if (!UtilTools.inArray(new String[]{"error", "warn", "debug", "info"}, slowQueryLoggerLevel)) { @@ -52,9 +53,8 @@ public class TapeRepoviewGeneratorPlugin extends PluginAdapter { } facadeViewRepositoryPackage = stringConfig("facadeRepoviewPackage", facadeViewRepositoryPackage); domainViewRepositoryPackage = stringConfig("domainRepoviewPackage", domainViewRepositoryPackage); - modelPackage = stringConfig("modelPackage", modelPackage); mapperPackage = stringConfig("mapperPackage", mapperPackage); - targetProject = stringConfig("targetProject", targetProject); + modelPackage = stringConfig("modelPackage", modelPackage); } private String stringConfig(String key, String defaultValue) { @@ -296,7 +296,7 @@ public class TapeRepoviewGeneratorPlugin extends PluginAdapter { method.addBodyLine("if (example.getOrderByClause() != null) {"); method.addBodyLine("exampleString += \"\\n\\t|-> order by: \" + example.getOrderByClause();"); method.addBodyLine("}"); - method.addBodyLine("LOGGER." + slowQueryLoggerLevel + "(\"[SQL] select " + modelClassName + " view list use long time\" +"); + method.addBodyLine("LOGGER." + slowQueryLoggerLevel + "(\"[SQL] select " + modelClassName + " view list long time\" +"); method.addBodyLine(" \"\\n\\t|-> use time:\" + useTime + \"ms\" +"); method.addBodyLine(" exampleString +"); method.addBodyLine(" \"\\n\\t|-----------------------------------\""); @@ -330,7 +330,7 @@ public class TapeRepoviewGeneratorPlugin extends PluginAdapter { method.addBodyLine("if (example.getOrderByClause() != null) {"); method.addBodyLine("exampleString += \"\\n\\t|-> order by: \" + example.getOrderByClause();"); method.addBodyLine("}"); - method.addBodyLine("LOGGER." + slowQueryLoggerLevel + "(\"[SQL] select " + modelClassName + " view count use long time\" +"); + method.addBodyLine("LOGGER." + slowQueryLoggerLevel + "(\"[SQL] select " + modelClassName + " view count long time\" +"); method.addBodyLine(" \"\\n\\t|-> use time:\" + useTime + \"ms\" +"); method.addBodyLine(" exampleString +"); method.addBodyLine(" \"\\n\\t|-----------------------------------\"");