From 23fa10212e6af7f5ef00b898261082c4d106779a Mon Sep 17 00:00:00 2001 From: luoxiang <2806718453@qq.com> Date: Mon, 7 Jan 2019 23:21:42 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0README.md=20=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pictures/spring-druid-mybatis-annotation.png | Bin 0 -> 17218 bytes pictures/spring-druid-mybatis.png | Bin 0 -> 17545 bytes pictures/spring-jdbc-annotation.png | Bin 0 -> 17422 bytes pictures/spring-jdbc.png | Bin 0 -> 19322 bytes pictures/spring-mybatis-annotation.png | Bin 0 -> 18977 bytes pictures/spring-mybatis.png | Bin 0 -> 18061 bytes .../spring-druid-mybatis-annotation/README.md | 235 +++------------ .../heibaiying/config/DataSourceConfig.java | 6 - .../src/main/resources/mysql.properties | 2 +- spring/spring-druid-mybatis/README.md | 142 +++------ .../src/main/resources/jdbc.properties | 2 +- spring/spring-dubbo-annotation/README.md | 2 +- spring/spring-dubbo/README-副本.md | 279 ------------------ spring/spring-dubbo/README.md | 2 +- spring/spring-jdbc-annotation/README.md | 274 +++-------------- .../heibaiying/config/DataSourceConfig.java | 5 - ...ServletConfig.java => DatabaseConfig.java} | 3 +- .../config/DispatcherServletInitializer.java | 22 -- .../src/main/resources/mysql.properties | 4 +- .../java/com/heibaiying/dao/MysqlDaoTest.java | 5 +- .../com/heibaiying/dao/OracleDaoTest.java | 5 +- spring/spring-jdbc/README.md | 238 ++------------- .../src/main/resources/jdbc.properties | 4 +- spring/spring-mybatis-annotation/README.md | 240 +++------------ .../heibaiying/config/DataSourceConfig.java | 5 - ...ServletConfig.java => DatabaseConfig.java} | 2 +- .../config/DispatcherServletInitializer.java | 22 -- .../src/main/resources/mysql.properties | 4 +- .../java/com/heibaiying/dao/MysqlDaoTest.java | 6 +- .../com/heibaiying/dao/OracleDaoTest.java | 6 +- spring/spring-mybatis/README.md | 204 +++---------- .../src/main/resources/jdbc.properties | 4 +- 32 files changed, 263 insertions(+), 1460 deletions(-) create mode 100644 pictures/spring-druid-mybatis-annotation.png create mode 100644 pictures/spring-druid-mybatis.png create mode 100644 pictures/spring-jdbc-annotation.png create mode 100644 pictures/spring-jdbc.png create mode 100644 pictures/spring-mybatis-annotation.png create mode 100644 pictures/spring-mybatis.png delete mode 100644 spring/spring-dubbo/README-副本.md rename spring/spring-jdbc-annotation/src/main/java/com/heibaiying/config/{ServletConfig.java => DatabaseConfig.java} (93%) delete mode 100644 spring/spring-jdbc-annotation/src/main/java/com/heibaiying/config/DispatcherServletInitializer.java rename spring/spring-mybatis-annotation/src/main/java/com/heibaiying/config/{ServletConfig.java => DatabaseConfig.java} (98%) delete mode 100644 spring/spring-mybatis-annotation/src/main/java/com/heibaiying/config/DispatcherServletInitializer.java diff --git a/pictures/spring-druid-mybatis-annotation.png b/pictures/spring-druid-mybatis-annotation.png new file mode 100644 index 0000000000000000000000000000000000000000..7cd1c10b6011fa44abeaf8bf6653e677281e471e GIT binary patch literal 17218 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 RzW)NGD61kXPjEo4pvtds9 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∓Rr%#oRo6GtZNY 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 Q-y$GcNkxfrF~h+B1uJDaRsaA1 literal 0 HcmV?d00001 diff --git a/pictures/spring-jdbc-annotation.png b/pictures/spring-jdbc-annotation.png new file mode 100644 index 0000000000000000000000000000000000000000..a291c22c25f006bc3acfd258e19c7c6c543a7596 GIT binary patch literal 17422 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 literal 0 HcmV?d00001 diff --git a/pictures/spring-jdbc.png b/pictures/spring-jdbc.png new file mode 100644 index 0000000000000000000000000000000000000000..d8d23ea6bcf2b3c8fc86d989adb330de689ddfbb GIT binary patch literal 19322 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 YSLz3JJ$f(=cy1Phr>mdKI;Vst087?;j{pDw literal 0 HcmV?d00001 diff --git a/pictures/spring-mybatis-annotation.png b/pictures/spring-mybatis-annotation.png new file mode 100644 index 0000000000000000000000000000000000000000..3b1119e01b19af21adb64816d6a6c8ca85b567ec GIT binary patch literal 18977 zcma%j1zc5M*X9KTX}ENEmmm!S0+*IC(ba!`43S2E{#_>#D%pl)OC;0*n222%g@!4_)oV5UzvvH${6f#e|K z8ZM~^3m$QJ=V>n8GOXi)p?=HhYzJGRX8>? zODqS4jHD$jGwbr$vY%k=;2(_;{0|C^-!r_QzPN42*D7FXJBIT zfQNfkEd43{si>)6Q~F0RL3_+!n&%}p{6B+^>Iye+2_h*(k`chF;fk(1xrxaO&uOxM z;5fB8M$<~rgw~)8AA-QDRTbDcs{8-ZO^FhTV2WcWFGP%$17A!y$ym_A?Ay6?fR_u7R(NPlFIR zIRxu9o$Tq9AH#1wcc0=f?Xqez=vbZ(`cwXZ{c!i9H6#SLh>}?JdMINpV9OcA8P@k? z4a2($?Ly10RFcHD%G!gFzT@4}#6K?{&v4z3JMvF&5H9Z#ltdg^A}KrwLFL9~Hkw;y zlfW(ioYfi{|B2U5oG<%f<=^IUsN3x7PLnR|8oE`~%rRemPX$aSc2nJwZ=$vvnu(^6 zO$V;c6gLT3XG@sHN+5d;g)&|%q0NUNV7l$``FF z*BdN#J%-IBr=$8H&^NC`c(w=Q9h#LbzwxziDjmbIMXmD@zm$Z@WujX5h-V`sB38D? zo$YRRES3w)c+7ctE>?nET$b}(9@-wN_FM54Bid@rOHQ{aZRWj~L@(Kn=d0>>Upx{# z7c2easj$UfUvT?rzR3}p-_dDm8c8*Uc+mW~puxhV;~FguhMM;UZNxCR!D6&ah0jkx z>{JH7X0Me(0NVMC&2ZeWkK&%V^=@h-Jw`tlhQaven>X3uquQK53VbA`7bS=a86Ib~ z2jpG+hvstw*`n7Y5sBmJb%l&qAiseZzPIz7wSC)YXc>5}wZ{D8a$JMcX7v}-17+{2 zrEa4wb{FGY_U(4s`jvefGP-IoNEX%Io9}Oz*477befaU`#m1(T!tO&m zdcCg1F>90H1Ea0KDY_odi1`A?sFd37A;z;8a&NGp?hN8pT!35NEpuA? zE+g7WTGsZqwq9Eg`RMLe7zC>GaMqt9KjC%fKU|my$o<^}LWct(X+NT0wm4#6!j*@? zh6)T#>h#BI-EmJxAIw{cgeW>NEFMARzp++ZmD)Lq`5nl*Jr+a{K(8$;G~J7ul)ent z;6%3Ga#Z#nrNVGl^X!Ie)G#RFRSyc8{h>>_X#yYA5Z5~9*dA7=1nx$JXYPBg1h(c+ zEt4A&+T)n>R_B0?c>A@DsmZ1%V5|(3E_U#2q%VY}(cB=hiO~B?%a~h)&CY!(eBFk{ zX8)LebK@fc|Hmt`+E3Rg35`KE?>qy=(V=4>eou0}TwhWmX8@*FbLooms*my!yJ^XV z{B%?VtElyl7)zt=8;ud&j2k@AX>TxPQ>Mt-D3;b#>C$^nS$Zk^iSCg84f({*nmTtv z6H3qE=ZCk?!+{l>yML4#RBkw!j1U5BtF;@_2c)lgZ|owg@(%spQT9%l!L-h+YAzCv zTo?EJQE*vE6sLJ}Dn~AwzP#V2Z&r|B^V^qpKW_*7V$6W8U0b|`&AY$RD zd7At2{9|RppPhkLV(Mr3p@$nfLhk$z7E3A*HSA*TEjp380RfY9mj>G7qwUfz0}Th3CwS7@i&DP?Re zORdv7^~238@F0am$CX7En*?lLU>0%hN~%#)o_mG{J*ViLui6s)O>wjJyyB>&<(r5b zW@&t@!7pxqQ2G6Up@6fxbK4)1TCwY}LK|sdT&8hJ#0a1Sy=ya2`;_5fFL1H66mHnk zF~5M_>N8KMh{}RBJ)t?fHfSMgD!eJXsTXq4^?=`0{71Oiewzxk{FU2+n%Ywcr_K0s z(3T)%y@%*_d#!L3g=bTHfA@MgHbFnjHRs5_{`21F$n{`L4P|Qg`xvAB6JW^}x{e3rTee8ZLKOJ{pZV?cZh;wP)(3p|tBBx2 zzAuAuwamUCG-@#TU#({`$HOf&!+?<{^s5}~(|!J|2NjJai&8`g(}fQ5f9fP&_`@>1 za<=y>lfG|YS;q;UR(xE@l^y3a$3Nb>--KgvnMq(OlYir*$fGTstz5kGl7Dxb z(P8<$;XZ_|0@uyW0uB^dCl*EjJ1TMJ3yGQ)N6*_)FTLj#H<3_l_Bm&QLqlgwX+F`Y z*88lB`W!oEf6$oS9FdR`Dcbx)dyxg-X7{bL$pHCOH%c|mDWy)I)86yi+(j$#rJ~uo zl_T!$Af9k1tiZ+Hs|*BhuJA9;WS#eWLUz!AAeRRduyBR*!iMPMELnHp!Pc^<9m&l_ zB1@^`@%1J5&YEA@T6cxyx6cNDDwil*TM=;cM!R!#w|IX@LQ2|sZ{Uh4w-Eq44GV71 zw>>Y4NUHa$5d3W?En{DN(95ay9rrTq=_w?)4PYT=N?Be5Bg*%k zKxmGPAlub#IQOd?Ol7XS<8yKWyEE?wbzD^F)~Z6q#|n}7+DEm6m=4ad zl*h1v$1=5Yk4FkNIfToSq)?0zv1WVD%6oxn4vtGgPcqV4%D%UDcnW+-_W?Qw=aiij z2B(yB(+?KqBms|^-jm4+6_d7U3j5uQJ>PXI|6~@iw_QFv5;L_(v3gt_s;Jv;LGlQM zb01xCjcU!%<;}=z!V>jZsweH@Z5>@cjob4=-2CZ`8uxf%Z`)=y2y3XvWnTLtu!B=I z%KQ!ICMo3B^)xX;h%m#??03oN!1W5q{jL*qOzdcrkq|N-^yEp8q@))`E{hkLsNEP|!+*f|yb##v= z^T_>e>jvZ_VkRVvVMR#U87rLLQ9cvW(voOW#mz}1eVe|RwZ{iuqEe}@_zUkg4K-52%eLM@)LJNqaW+%ll+4Na@+;Dy42-U!-& z8PY{b86zp$^Z%IIhf#s{#Uc~A&@P|P6VJ~bk<1dgl|vud9Kzs!hmrLK9!v){0hT_X zM6zQ@I9T$-koIhAJveN0x&4&77n!nPFh{~g5>!6*>%p!W{gje7TyjRpf+1m;>-R1J zmT}mgSJU#P1DVHtlTS}#@)ifLkR93``u(CzgZ(pi^W0k9j4h1A)s<7{jZb+$E_KJh z$e*{NuSIh=F77!yJ3cZQ)IMBQF7dLPC|~^OOOo{hLH#>k9cY9Fn2 z^E)OM~4OY7E~r@9$aIk95>7u6?UpIK0%*L;gnVHqJ)UidcbZ&h_$zl*=P-!QGN+ zYs81`}rfV@?Y_j{Tsn zsqa*k3jqAWreSOF9dZxORl2#dRGwA$FXoZr{V!!NGqPk#wwQWuULCzlZM!gg>{{Br zjH;U!)o@F<)OF_flgYox|LOUP&fhC60lKF0@Uo+E2ylpk_2q+?8uQX)lXH(A=r&6x zkvXYrMMNcuG)~4gN7Z-MgIlw$CBH90t8AxB;(k^V<7?b8^^(nA{DFjqku4WJ?@VSI zKUvI$Ce1XBJaD1xsRsG!wAhi0e{w&4>^{ixgMUnW3Rd+C_vX z9A>lptQG5aYc;j;(Oz%b>d`uB>)q!*+nu)W_s_Y4mDp0MNV_mfQ95Vq9)%{CefCDh z)IQ%Ll%?;G-#0WjniwWc7k#;4dp44`aO|0%aBdJ;b6ZqzCAT)%tg6z1HIaI^#tnVA zWg7U>oU8HZPLc89+g(JV^u61mo;!2x@T~f(w4wkn_1W`6(hDPpE=5VpVL_tBZP)#5 zX96G;QZ9;}0MS(IRWQaqo9{Ru5N%WNeU{k%v~}&h(Z2tgWG=eA-*`QaeQ1G6>XN*2 z;8yOq@P@6cBaqizH|sU!QkHiRqusbzYy^+QASNw=uvq-xJ8dhjT52!Y?I<50St% zA^lOve*2z#AAxqzegHE#53t(@j;kD#@%Qud+uqwdU6_W!f;u`n%9Z6H8i`|QD`R8W z($dnQp-@9ZO5i`7Jd>%+C0PvA$iCer!{QPm+j9iT)NKZNdnY@yU zw#c;D!@fTsS~?;RQT-L2LVsxNvKGP5SBDJm%|ru7UK#Dbw5%lGg!;Wyk`Vu_>I&Q= z-E~OvyT{hSp}Ii|8$_l1y~8t8+Z$U2JA^5nCUmqkTu#V_(Bf=7x{9jLYW)>PLhPjO&g`epx1!w2xrqjO3 zRU;xJ3zx=}&#lxY%3d|4CA|Tm(gVs4L4QBt-{QedhqS@G#8O2Q-hO3 zX*-c-?B3%=9f(Ztf5KJ`xN7QkJRt>Z(Zr_`e^w68*Qy`|zeEoWM(ruZmVSvoh`Z|V zUCxMLIYGK@nlFbehcCU%16?{P_7ab0_jRcbH^QIP$9VC;4nDta*!-FyXScos^#ADIXw~^32Kq`2$ zW>M7HpN;RypmbfCgZ?6Nq3|Wzen^>lhQ-@NG%W13v=Z-fLa9_l_vPZo5XfC62E^Ql zy_vEbj|Dr00#3-XvS^ZiN(|&u2TZ=8Dby>@>xCk(b-b6P^rpVBeW@@>$L2qrGc-+Z zfU=W1xWlIU)zG7H}p+}3rnS51~W+0}nY-f$RwHZ3T z+?Ig-%51V0_Gz_xpD5ltHh*>_*kQ{|%!kgwSqN8$VTBdAX~~roXu`I)HQF9fGB;ct zRVjwNNM&JYTG$+pjK8BX5uWOv33ajh_pZzlfsaB!bH$L^jn;=MU5_yy?fDAx47N_^ zZTV%Il5ehJOC4OLy==?i=b*}b5s;-Rdh42uf|~z%jv2Gwmm>vEJKbLQNFBq~@K99e zc9vRqGC>DthFLu!qy~n+FOMQ;VoZVM!wZ_1PXa&CUs23Na9eY1r@Q2Iwa9iwv}2V z{+R|ok{(=R={q>>+*`B~*pwl$?C<-7=Sbh+ejVx{OOEAp=Ie5goZZ{&He%{)jFp9M z7$)K|Wn(T}>k?+2y$g_xr4skg)*0#vrNQa%JSHb;xcoY1k|6=h>hezb8CA}M(0{`Z z&wTJUb^2EwDnj8roc37Oo>RLf{yjcElbWZP=E~=WgUA3*x(H-HA(yM*ql_*_n(=;3 zs1zcx8{HOhmR8oPHw#KAJomEvRHg!s_Wh4aU|@0bx#jNHCu2B&4Cc;}YDJn5ey1<^ zBs#UIUi-v88yL$J^kX0|v=k`2bS=&LFgAuzFsBJ+_24MWf5DX0P`pj$AA0${r zrG8Gzx?jc{K#^ZdZb`3~C1gzDdAE}sX*IBgOe&j*_&(&#xw`FRFV%Y#)0g4u@3qJQ0Xo}XOH`O>M0|jWpGu4J3gM6SW z5Cbx>bhO*`V|l_E%VYxZ0q<%sr|(_DBV%?ilsY_L8oz6V2SMuaes$&UFwi5D;`4V{?G zPZ$_}sHpD?1sp>1zW_JQ2TNh+)1nXJ5EW~%WEO;u(Px{lObYlmHa3DXsiQ_F36RWC z(Y09c$21hTaR6Tuu*=uS$&`Ka*FG*0Pv!$0_y1SdW;MUriDF}k$Bie?4JuF;=i~KG ze}ly0MV!=2EaT6G7k|tkc@U5wOABBF563DuNxNP!^ok!i~Sc$DQ4S`!@d~FDEmFDoutqh>a%|~vLsxwrRxKFCVvZz%scC$;GqGm|%>Kh`g25ne zxgD|z94Z##_0J!aLqirgCN3%;@7ujGv!#KVq;lqJ{?kh;`L4E2pt(Sz5p$tt-g5v( zj~JRy+g9iW6;R*UQcvAwlF-ailfj+}2;j`#H-4Wt6HsC8CE1no3Nmx~I`}Od8q_~m zjhW4`^;PwLY;sphXlIf`e&I^<;vOc=H1GRuAC1u}Z>cTrOv_Xf^|j+aNx^8eqcbJ7 z$3Hr48My0FuwzDYsnO(+ldYCg-&(v@U%4*c;iZi#5dWq-u{p=kESE_Av_Z}ZbhC}w z{PDz*CUcOuOqLW!meNL!FOTx!1bBZS<78bhM&mu3VIHIjqvFMuc?uKFRzTSJ?}P9b za)G%`>m%5S>;_auMt<7t*|GDr;{9g9m7j9zL{2(bGl*8Aa6tVw^7~`WcPRjx83+mm zKENVZD_Uyq4D4sn^X2TpGZ#j!l;YS_HYzcAu__I3KQ8DX7gz#eJCHm`dg#!C>;YT( zK=`n(=NfupINL~$S3FOyMsL2XX;O}@rn%_;NJ|tXR_yW!9Q|kWmh$@3*HrxcgZL6w z@&+mQxV$0kSFF}s(O(_3o5c@85z2_XNRSL@a|-tb&V06Rqr`}MBF`Rsh0EIDLEjv9 zHQaX+jtI%sFI=o`Lcjt!JTFUbf6P(H_-n*>TKNi3Jd%Dt zqUgncyd=LGB)=rU7jH9x55aMrAG#xDi7nm96@=$O$l~cj_x=o@=6>mTs-!9MTY=0f ze*mXLLlmkd#f9KWzeX2_ojO(`)Z@z-dfe6!h=bH_BTWO2O zoC3Q6Y$gXRPEB2&Q;pH#D7ieP9?Hj_x*>`+nZyHI1|8aB2TvXbW|eBXSS^+~Cb`m> zWaI)Fh#CP^FzU-BwcEGD;{22!Dq0nO!)D~uWHhKP;ZK5cW4;!ziL9tip9^o5qkqmu zr)H+g_z*A6!S3s$J>HF9SYQb(M1ygJDNy~B4;R7+ovR8_brdK8Ajb;DRD0Epf_pkR9;AP03F`)*i z-M{PB%4SrDugIut&?1ow7)o##@to1!3ZJ1-YnGgMrpOm7krSi4Suzkv6w2=f@Z*=x zr;1C2=@?UVr6)(ikPBGY2^UR?`a@A~7FhW$CUPT*EYRIT;el&CeM1*2i^rC|t4SkU zz)3c6+9JYI6X`4w3onsIbb+#k ztP1!A@GtLUhJj|?Xw}M1H@I@z zwqL&-{47pV+o7UYm1=wGorB-GPKdgpNt9_?ixmt!l|ZSAqNa(9dP=C>3~pYp25%sL z4MLzugB?VccP$%@Jrb&nNdV-_MgE=g{$B%qQ}4&amA;I5A9bLV;GbFm4%d$>cVFu3 z_k3?iBL9?`sNSvsAsy-Y^KlpqR(|1puoy<3loeQ`JZbra1hTTI!^6Wf%gV3{GzzJ= zX6~ndKQ*7m)KTp(bMukAeDavTbUEc%ASf_hhmqi zENtF+R^{NhM@Fyu|HTsOCcs?%ov{Cp4&c#wfdRDO@%okEayX($$mClA8f)x8T5wI| zOa!uml-b4kc|awdD7YqJ24BKi<3~yh(e9WE_m65I6oPc?BqC!AYsw4w&zN@J&QGd* zg@ek{`^KW<540Z@9Z0f!(1!j1&TDh1mo7opXV;&m-uT>arV%_wjRrVgVNPbhbf26g zOpE;ODID3~P}v5apJr-%Sn@1~eswM3EN{08YHc9n_(N8J95Tr4$-n6G9XEP1m_}!~ z<~8#H3rQm;IZ`xUX2S&-10fnhmnlvVtMZaqpg~qkMePR@6Elkb^BmNd5}`LLGX^EV zV9Ip}B--DhlZxPwU2m~^7#>~q;^t!E;hVZARujgIY#1q9AWHItDcMS{Jg3+E%})Rc zEuT@0SWqj#OL$?pc)VlV$De+D&r-m|iE>?RBpFbM;El}tkFQmQs;ChJ*39BoYN%2I zC`9$$QZNnM6Cow~(y=kgM-vx4!X(Rph7mlYLroi#eA0U7Ft$fGq80vOjY&T8 z#E4_n?yhMq8C7L45%aMoS!mPVD-yl?eVtqPLiX#l#jj4-GE? zp~cF~QqK1oAhg8et3o<;D-HdVwcy<77zm>}Uil~iWN0#L58t{@BE33Cq*FnH+q)Qg zMadc}JM(=umKYwgVoZ%5qL1G7rd#+g0hBcRM~ESi9M;9bH%$en3*$^inMNSp`WRH% zR#Hv47*V6E&OlXO9Jv0aeIG{;pSCk{?l8?P8@j4^n`Y`Ae3}F7cvQtLix`Kl!1o|m zBK?l@DkRzee{nhjOE)Px#LxuDguL4cnnP@+WPctPwZ82Ehl^VXh(!#r9K%XyF<6}g zoki9pofaTsU;9}Eb3D-08V(>OKD3>|D}LjUwJ6w=fcZE2{lmZhTLOWl(KiKLyRsV#u1kiufc_(4;Mp4ZC-?ls|3YqW*af(hL`X#>q) z=zy7iBLVZNooCLq7V<3No9M-%sEPLm1Eub@)a z#kT;-h{(G;?3)HPK_?&o&G$VkQK#KHO608PG&m@rY=4Rh!oV!rlmj0chD=GnQUru; zaj`H0UNA6(lg*~@^``^w%XewYm@C81GF>0$Q7v~Jm6IGXNL-6!l8^ybzde=72noKp zoC6sthhgB$X@5@RNKroshkxJVt`|fS6u`+qG5kQ`EF$QSW|6Vk?6k7~%NF)k(uL>t z7JI}fkdMCF^uas?Jx4!kHdqbIh$y-k`PHdgW}gLS(GdK4aZ)K`;k`;G_0HFZH+V=- z?tj1FkKyCq>6JW8&z<)V^XP?4Ra@U^5RhUwY^vU#vHj5t8SevT%RSeM!&9^xE5%@b zueo-or{(H;OceO=6Rw-|qAZ+Dfuq34TTC5HQ*l&M@bAtJPv zqDm3J^-hmSaHS~!Dzs(b|GjSRe^t=!{}JpYGIqg@Ap}?{?k5*@dP{T_79DSDAtL0d zNF8Jo{}n~Z1Mrh(|M-Uk&Hj|pPvbov=EDB_V*_va96amcF$K=Wl?OM4KXO9D>BatFkSB%z88 zU^^Yr<^sa)(S{Q_hkoBcNN>83#Ta)qDpZ_6MK!48H0AP6`5aY=eYM1!B+4K*U9 zx`utK=EM&5wY4O}g$DBPRDyJWWz9)J0Ga7Ogo5;PMzG~u9vSmw{oGf=SFE_`W*jc; z5_a&ZbZ5Z`a7R8qDjMMd<-@$j#2n0Nfpq=Rj@pH3`BdsWu?Vl^oB=Mah7gDTS#bPD z^qm7_qu7WkTgc9mjCLh}Urq%N+-NQ$VS>p2p|s(<;0Am2a3}UK84if^%x93IgP9av z6CNQeA0F7bU?-Qa{3>!1Lf@(OP`zQf4u5jA)qa{3d$?Aij81Cof=~Gsnx7|N1QtF+ z$YMe!H2-LiZbQQoMcet!$OTuGbCE3sC6FJCxHefo%+(x{|LQMjFnCIt{99aY@6YZH zRe(hFfT7(HUNf;JMmu+n$)OV1>Y~n4i(@|@IPaK40nAnWMXEdrRVy3wgX*)tvP8-k zR_&k(x*9M+XRze~jgATSR}M*R({_BE_^)Rw2?L|%5$@F>zpQ*v86dXIKo!RGBoiDh z@U4U5q<{EI6^HD0fT55n!di_FL@|P&Ps8gS8jM6HV^b`P@IJ5I;<|>LCBtqK86gG^BjFGKIy?8cQYBPSDbKD=`b0 ztOu;yeo!$;N|hzNo)hKRs`4%>n?p$5SN)N1>ONvoo01WEiGc6`qX#b3`*|{OLJ-AR zX+Yz|V$(v4YXdJx6O_Ieqdu_af#qG?)92wLkZ2! z(&neyA#sosZ;b7-#59hL9@$uaHDVkL0G<5UXL8e-q%7TqpNu)%Lw5TL?EC`&6D2d9 zgAhon;nr!n*c%U%T?$*q&z^Pi z>>L8PZ9O44_MJxRYz3`!I{`SQ9#p?PS09SUq6Bm=OGCYHyvE7+wK+rZ)sSA&Yzpm0 zba91e>pbehfV!96%WDmcY6mAyhd>;`vT|9KL^o)LwgR~q*(L!p=@P&`J31q`qZbfW zQB4ZA^n#ZY_qJ}!wlyW=PbHB-?@9>n{eL?og7#yE>|Wq*t8Z-v9{5lhLm}IE5zh%a zk*!*2WG9n>6&os5PHc&umYvXN`CmY3W3)p3al9>^8N(!#?-G%SS6IA+mFe$*tuJsQIspZ>obsV z3iZ!<4R)-b05$(Eu|IEmF%d7^+oBJ6FWVBAkC9iEfh%6t%(-)@H^up8<=D0PYf&B; zeL!UfGJBFPH9{ktBp`jqY7)^|`TxQ?d;6s==9;>Urd&=VdSFAQtU<5zq6P`!cj$?Q zRJ;+jH8?&3-fE3>5f86YgJZvccuTOkos&rnABhjKR(DbxPqBwptFWZ~HH#&Fv(>yr zK-#wlEw&K{C$J1D5fR!?GFtGXM=` z1n`fE3oaN9Y8nA6e5ocB)L0gw;h^}&KN;ngRlSGhOdWXTcILbfOFtP(1_Y$!GQW2a9CXOBM)`%0W5f5;mQUThAUr0+#&AJ^;Bw zv6Uj;sm#il7ms~^qq?n%(}-#D!QI9-29UIqX-S4DR%AO4uG4V;5+(xz41{#Y^Miyi z_(b`$l7!2(#Yi=e(_1!qrc+VeF)B1UCSn71YkD$pZT=jfnD|rZ{#rFS6OPHyd?X7Z zj?w3&^r>&F)$<1rg@)o9g*`T*qxCRXK!PH84W~n4~(Suzn zENCJp6xpxGV`bky4~|`*tK+Qix2CjxjMFBJ>juV;!|{_ub&Y(H$CGFkGTv3d^*@ur zPZ8m^l%)$ehT?B%TATd#e^Jd}IE{jD*linaA71IrJBs7FN?OIV)F3wf#_CypZ}P*hZR1d+8`F)uVI2KR zUq1+b_F?i%#);{*mjNHKRjax`LABbJ*a{%Gr9_I53RZv@2E6?QBscN+{8}Z0MIf_|+mG{09-@G!Se$4(`zSr&NssO;j%p(= zABdvFZn_07gM*XVodRr4ukf2sPD-;EiLuEi%hLrt&Z{~T#tQ0VbpyINnkixF}c zm+kSvwR0Xen{sfx6Wb@_tA0TJS-(z!jz}R1i4WGN*0cXrXWJ2gCeky;;Y+Ajk8Sno zM(eAaK)5gr0W0#L3mBKcoeDo+StCWtc*yThN4;Y|*v(hEIQeWydP9HPNNfKqoBgC5 z*eEPeWYHjl(&`VgQhd&}zkP4ge0P$fmR3o9u=Mp|2`G5J{%g!q?@MXYT_UbEV=8+NaSTUwu~w z-Yzhh-7j5l;qlFappGssqJW6zs_`YaZTZUTMFN^0nz5YW>NgFAScL+E<--nw#|R35 zaj~k`<9m!mMD10QFOKVHlfsP9_zdF)#oYA|fdMg3({{e!?fxiyxl&tLnu_?_*-I;*Wk?O<2sDxA7D1&piVmA#QuH6@iAl ztpI%=KiZmZ6(|m;sU+M3r#-?eJlarv*&w>@(Qs>YKJdZEyinS@<;DS+$@WFw&)nO-3*91Z!Zyz<>Sdu(tYyx_ zO215s-QG=2doGjA-yxv(n^teiY3O|X@DZ%0V6>5|0uiQoD7mGy=We3BlB}rxY!Pp^ z*%Gbv4@OoYU1lNYGV08$@*dQBmIcFN!-L(U^L9xmucPODh-U40hfP>mrDy51^`r53 z`eQCoYIO1MotfsT*CwFuHN)_V)_X=Syu;sZ~U`7g2&Nh%3(gU6eR-6#Knpf@!n%F^da8UzvXjq z-0y4!u~N(hJx91O@L~VPb?vIXR9tW}i1$g~3y~vb{yAv-Eue{Pbr08{XE)Rz=HjK7 zH0I-7z>+0ym9(4wEK4qYtFSE9oI$%_pWQlSxYJhwJ` zU7h?kH@K;}S>*~0QF~1>R%!m?1^KihraIyOPvRb>Gt1-KmB=YHrp@b6i|l6k^;b6t zPwN#KG`!jIRS@BlU3EZ$1?U1s zzgux#{-oiy{!VY+JmTW((c81V>X!>o`w896DX3prjk9`Tzp+K^Q#7o@${wZQnzE4C zTfE==MHBiPj#XLx9hBPI-iCY>deuMBesJ`&6?9{m`)4E-4FpnW817qg-wbN~wOZ=m zFk+aM)vj4YY7tZArNz7(=ErWP71+H$S73%c z*IpM=Z$wUiCPx~M|2jxUO<{fM))gcFjLGb%!*Nge4@ij>76AgR)fRm=(J%0(S;_6=nFNTGb9+UU12{x;NjzN(zYwV^DOY|4+c_c4vyTu zS9z~iKvkG|Db4N^z-ext>MUw-U&qMhx-J{RzAoeLjA@Oc^HPlI^+4;jt=REa?x6&% zT|~;p^u3x9wkE<7DK8lsH07Ob@@3f-&dv+Y^KkAzdz6bi^K8t{Z@`Sz`J{D7Y&yH7 znQ<-8o#)0=g)=%!LZIkv{wLJ38`g~!+*%RqCbFdX$r>!dEZZ%r3d=SL)eT`{f*tm! zCKCmDt8Mp}dkSPw3iV`N5Wj^2#OwxHPRzg`fn=3} z=#d!41pr2gwBM;!N))L3ET*L|RY%~xM>Z7+DJ zGl8A-kAAEF-=}H-0j-B3gEkxth%?t~!JG_lS(`(kiadabVUqc9%%IRwI67=- z87i)XhY2W|gl}Db{n+DLi!G@)&$D80O&dCvedZfNv<^96s-s*z>Q*RYkgi&wdo?S%MzUS8xcTkY?qTdil z14YXB3C7S@k;uRGm{t@;6?TN50*N$d9O4OWx^Lln zjbel}#3C*mgBnCw_$*Xv3XvJVOkanFvw#Lj5}yFI6WA`NqFS%k(_@`hYlDP_!Li)N zm8BKBw8ODzb#Hy->P1*GxP;BqXNY!x? zBM=W|1w3K5%{U^}9iS{|b^R^R{DS>2hLavWwDGhgbpE}h&v^pqm*_13aj`UEuiBOv zt>uRUWu%GVkCGE1g4hHO@ZKkm^j>)M#dsbtEk0h+iE@2_Z}k{QcXzs&Gt{CaE9GRQ&`m zF)}E6JMCBpTPSq^HKmBvMz0l7qaA_zUj`bt4;bXmJBv4Qn)ToXtt#R|@SrIQT|G`MsW)b|Ta-<2^949$u5Ux)*e3x`k1 z1s0c$C?;1LFN6yVHv0Q}?e843lr*S{3V5A{cf0&jhUc+4 zyMv)wSRj#m6*_X)hODHgDkv&eHyOK-bczi6D~xRf@9grQU|t2_oMU1YUUK7}A?1{w zLKz%tIUI))-#yEx^i$^hP!>Glu5PV8`0~vT&A`|AK-H|`X~-(GR)9+40S!aV zpMHQS)u~@hhZ4&L${_wEMJMOG5{^3T%f|eG){b=1_k9AJi8~YZa0r3S9|!Jz%ocK& zE1!ydir5`c(?0Exj~L&+XdwHPb|Ws*k&C7yPX6>7e+XmE{iSlT3X>u)RR{?WQ@^bD zl2m8r177;~Z0!7Ee3cDLxQ- znjgAC@J7;Sw?pV6kundp%th9W$^0NRS=`i)qgqwnJ$bbgvD8O8dXEY!--9VH1HSaj0q_Q}rt;znC0#!}s5LYc? z^Fv%w!M7jT;d!RH2Iz5_Qh*-PeBJ4_I#xvMV!vgd4r?pl6xO-AX06!MR@RtG&%coL zxdfAp@(LEsY-^RWM513)=t^JhHn=ef?^s;26{%9y!UH0|jn1&iW z2G6Q-X@wtv@&RZJmVE?$4EN?nGOGJAsz3tJvQIn#%h0OWMwn z7wlb0r<-f@qn@qre*=%zox_~Rm!%Dv#H8`6>gM}!f_Jx4v&7_j|8!m8JL8qDGHZ#l z;CynxM)g{$z^g3ufSE&rNlMI0!8l-E)W3NxNiww>;&LWh!?6TGXm76?=TxZ1(MlY1aCO@JxtNv;ia*1 zgxJ*R9NRGeUy0rqEgtMk8LO9@)+i5p==d#fJ8MYztKyg`UJcovpPxe=9Pog5baWaW zK2+VTBcr~Eo%paVfdda=N~(VReDzOp%ByQgHnja=Ct)H$Y};7WP$zDT7E_?C=)*V} z`-h8d=6RfzoiO}kQ})P%U$B#VW>1@h*o?5?XFNd3g?u0kk6APo{IA!C09*QK6kaLW zC;){DuXJg9!0GrEKeAf3ou$JROTgzB03E5Q(!KFnIQJ|f07Y4AR9Jse5$K)GPF=YP)-%@!`9st)~+ z&17MSjg4gx*r~MQG!x5nYe6qH=0M>!ubY%yzBo&IC~0<|SgPt_t2Aj7gClT~V1-Az zh|1)jW=l%=UPf6dLDmw^Tdv_5+Izs}y>rNfm)|W}OE{X|)J)eatzEb7pU1)Z-7B1~ zusqp4(XCIMQwvC z7TY@T0Q}Nlpd}GXIOZ(T<}qi7)J?zT`TzBF(f6zWpVv3tp#F8k_4nD0sVhq)o2EG| z%iuk<;*uh_mCCwm4_~pWipjU*Yac2-e|_HSSy*Msg|4$9^6#H(eP~uSa&LL}VOdr9 zf}gwh|F*t=egF5p?;oyT@AE59Th4Np;7pI_Yp(hO*Xc^`5_xvwAb7?55B-0)rU9*4 zGkbM~_s{E-vKDPCmFm28WJjxc?(J>7`Z7N_`uF{7e13X*qJp+oz#Jx3r?UmWLgZyP zg|gVT#(Qn%2zq0xv*%^?{onIGvoiSG{ZzU1zrU+;{)~u!34tz)5xeamW=PgZ16WMwm)$~k3K+N{;DFWCOyIpu#$>!Jh8AM9h9P=T2MmL2dsQ^WxU5{ZGGZb6ZYgIyA58*4H+x&RuD`iSlj&K|2+eEpX7h z{*?LkjbF=t9DQ#;oh@Y{aOP#-b+20`^XD%Nx*{{rNusRc^7j3Ib8CLzzQ68mf@ZFm zvTAmp(3^{Wrkh^!&p0RAF0-=1cGil7BTw$%-?O30#=I;Cocy>~*!T|LJsQUB2*Pnf%`u?msT} z*FC9x%bz~KY5lzNRi8uqR-~N~Y|sm@e_mnZH2oE?lhpbI4bP?&9*6b2CUkhHoHC0` zeG%+1n`i1Gwako)$@e=x6h8L#049!k>y>~ltn(){CN}v0n80WHV)>$36BcLP;#pEs=j)8v_g>Gsm9j#_G+1x?>D;@! zOv}&Pet&Z4!`$~Z>feFH@<-R3Q$!5e5B!{TX{R&xXW37hvm45V+;; c-hcijFDLft37wP#9`D59>FVdQ&MBb@01w(P`2YX_ literal 0 HcmV?d00001 diff --git a/pictures/spring-mybatis.png b/pictures/spring-mybatis.png new file mode 100644 index 0000000000000000000000000000000000000000..eb2f781fda7c26391a24c54bd81a41b67f196520 GIT binary patch literal 18061 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 R+HwE@002ovPDHLkV1ng9ZCwBW literal 0 HcmV?d00001 diff --git a/spring/spring-druid-mybatis-annotation/README.md b/spring/spring-druid-mybatis-annotation/README.md index b69852a..34694ca 100644 --- a/spring/spring-druid-mybatis-annotation/README.md +++ b/spring/spring-druid-mybatis-annotation/README.md @@ -1,112 +1,48 @@ -# spring +druid+ mybatis(注解配置方式) +# spring +druid+ mybatis(注解方式) -1、创建标准web maven工程,导入依赖 +### 项目目录结构 + +![spring-druid-mybatis](D:\spring-samples-for-all\pictures\spring-druid-mybatis-annotation.png) + +#### 1、创建maven工程,除了Spring基本依赖外,还需要导入mybatis和druid的相关依赖 ```xml - - - 4.0.0 - - com.heibaiying + + + org.springframework spring-jdbc - 1.0-SNAPSHOT - - 5.1.3.RELEASE - - - - - - org.springframework - spring-context - ${spring-base-version} - - - org.springframework - spring-beans - ${spring-base-version} - - - org.springframework - spring-core - ${spring-base-version} - - - org.springframework - spring-web - ${spring-base-version} - - - org.springframework - spring-webmvc - ${spring-base-version} - - - javax.servlet - javax.servlet-api - 4.0.1 - provided - - - org.projectlombok - lombok - 1.18.4 - provided - - - - org.springframework - spring-jdbc - ${spring-base-version} - - - mysql - mysql-connector-java - 8.0.13 - - - - junit - junit - 4.12 - test - - - org.springframework - spring-test - ${spring-base-version} - test - - - com.oracle - ojdbc6 - 11.2.0.3.0 - - - - org.mybatis - mybatis-spring - 1.3.2 - - - org.mybatis - mybatis - 3.4.6 - - - - com.alibaba - druid - 1.1.12 - - - - + ${spring-base-version} + + + mysql + mysql-connector-java + 8.0.13 + + + com.oracle + ojdbc6 + 11.2.0.3.0 + + + + org.mybatis + mybatis-spring + 1.3.2 + + + org.mybatis + mybatis + 3.4.6 + + + + com.alibaba + druid + 1.1.12 + ``` -2、新建 DispatcherServletInitializer.java继承自AbstractAnnotationConfigDispatcherServletInitializer,等价于我们在web.xml中配置的前端控制器 +#### 2、新建 DispatcherServletInitializer.java继承自AbstractAnnotationConfigDispatcherServletInitializer,等价于我们在web.xml中配置的前端控制器 ```java public class DispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { @@ -125,18 +61,11 @@ public class DispatcherServletInitializer extends AbstractAnnotationConfigDispat } ``` -3、基础servlet 3.0的支持,可以采用注解的方式注册druid的servlet和filter +#### 3、基础servlet 3.0的支持,可以采用注解的方式注册druid的servlet和filter -​ 注:关于servlet 注解支持可以查看[Servlet 规范文档](https://github.com/heibaiying/spring-samples-for-all/blob/master/referenced%20documents/Servlet3.1%E8%A7%84%E8%8C%83%EF%BC%88%E6%9C%80%E7%BB%88%E7%89%88%EF%BC%89.pdf)中**8.1小节 注解和可插拔性** +​ 注:关于servlet 更多注解支持可以查看[Servlet 规范文档](https://github.com/heibaiying/spring-samples-for-all/blob/master/referenced%20documents/Servlet3.1%E8%A7%84%E8%8C%83%EF%BC%88%E6%9C%80%E7%BB%88%E7%89%88%EF%BC%89.pdf)中**8.1小节 注解和可插拔性** ```java -package com.heibaiying.config.druid; - -import com.alibaba.druid.support.http.StatViewServlet; - -import javax.servlet.annotation.WebInitParam; -import javax.servlet.annotation.WebServlet; - /** * @author : heibaiying * @description : 配置监控页面用户名密码 @@ -153,12 +82,6 @@ public class DruidStatViewServlet extends StatViewServlet { ``` ```java -package com.heibaiying.config.druid; - -import com.alibaba.druid.support.http.WebStatFilter; - -import javax.servlet.annotation.WebFilter; -import javax.servlet.annotation.WebInitParam; /** * @author : heibaiying @@ -175,7 +98,7 @@ public class DruidStatFilter extends WebStatFilter { ``` -4、在resources文件夹下新建数据库配置文件mysql.properties、oracle.properties +#### 4、在resources文件夹下新建数据库配置文件mysql.properties、oracle.properties ```properties # mysql 数据库配置 @@ -193,21 +116,9 @@ oracle.username=用户名 oracle.password=密码 ``` -5、在新建数据库配置映射类DataSourceConfig.java +#### 5、在新建数据库配置映射类DataSourceConfig.java ```java -package com.heibaiying.config; - -import lombok.Data; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.PropertySource; - -/** - * @author : heibaiying - * @description : - */ - @Configuration @PropertySource(value = "classpath:mysql.properties") @Data @@ -226,30 +137,9 @@ public class DataSourceConfig { ``` -6、新建ServletConfig.java,进行数据库相关配置 +#### 6、新建ServletConfig.java,进行数据库相关配置 ```java -package com.heibaiying.config; - -import com.alibaba.druid.pool.DruidDataSource; -import org.mybatis.spring.SqlSessionFactoryBean; -import org.mybatis.spring.mapper.MapperScannerConfigurer; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.io.support.PathMatchingResourcePatternResolver; -import org.springframework.jdbc.datasource.DataSourceTransactionManager; -import org.springframework.transaction.annotation.EnableTransactionManagement; -import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; -import org.springframework.web.servlet.config.annotation.EnableWebMvc; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -import java.io.IOException; -import java.sql.SQLException; - -; - - /** * @author : heibaiying */ @@ -351,7 +241,7 @@ public class ServletConfig implements WebMvcConfigurer { ``` -7、新建mybtais 配置文件 更多settings配置项可以参考[官方文档](http://www.mybatis.org/mybatis-3/zh/configuration.html) +#### 7、新建mybtais 配置文件,按需要进行额外参数配置, 更多settings配置项可以参考[官方文档](http://www.mybatis.org/mybatis-3/zh/configuration.html) ```xml @@ -374,7 +264,7 @@ public class ServletConfig implements WebMvcConfigurer { ``` -8、新建查询接口及其对应的mapper文件 +#### 8、新建查询接口及其对应的mapper文件 ```java public interface MysqlDao { @@ -421,25 +311,9 @@ public interface OracleDao { ``` -9.新建测试controller进行测试 +#### 9.新建测试controller进行测试 ```java -package com.heibaiying.controller; - -import com.heibaiying.bean.Relation; -import com.heibaiying.dao.MysqlDao; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RestController; - -import java.util.List; - -/** - * @author : heibaiying - * @description : - */ - @RestController public class MysqlController { @@ -455,19 +329,6 @@ public class MysqlController { ``` ```java -package com.heibaiying.controller; - -import com.heibaiying.dao.OracleDao; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RestController; - -/** - * @author : heibaiying - * @description : - */ - @RestController public class OracleController { @@ -482,7 +343,7 @@ public class OracleController { ``` -10、druid 监控页面访问地址http://localhost:8080/druid/index.html +#### 10、druid 监控页面访问地址http://localhost:8080/druid/index.html ![druid控制台](https://github.com/heibaiying/spring-samples-for-all/blob/master/pictures/druid%E6%8E%A7%E5%88%B6%E5%8F%B0.png) diff --git a/spring/spring-druid-mybatis-annotation/src/main/java/com/heibaiying/config/DataSourceConfig.java b/spring/spring-druid-mybatis-annotation/src/main/java/com/heibaiying/config/DataSourceConfig.java index 51dd508..1c73d88 100644 --- a/spring/spring-druid-mybatis-annotation/src/main/java/com/heibaiying/config/DataSourceConfig.java +++ b/spring/spring-druid-mybatis-annotation/src/main/java/com/heibaiying/config/DataSourceConfig.java @@ -15,12 +15,6 @@ import org.springframework.context.annotation.PropertySource; @Data public class DataSourceConfig { - /** - * 感觉这种注入的方式并不够好 - * 没有spring-boot中使用@ConfigurationProperties(prefix = "config")指定前缀注入的方式优雅 - */ - @Value("${mysql.driverClassName}") - private String driverClassName; @Value("${mysql.url}") private String url; @Value("${mysql.username}") diff --git a/spring/spring-druid-mybatis-annotation/src/main/resources/mysql.properties b/spring/spring-druid-mybatis-annotation/src/main/resources/mysql.properties index e860927..973f6a0 100644 --- a/spring/spring-druid-mybatis-annotation/src/main/resources/mysql.properties +++ b/spring/spring-druid-mybatis-annotation/src/main/resources/mysql.properties @@ -1,4 +1,4 @@ # mysql ݿ -mysql.url=jdbc:mysql://localhost:3306/mysql +mysql.url=jdbc:mysql://localhost:3306/mysql?characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false mysql.username=root mysql.password=root diff --git a/spring/spring-druid-mybatis/README.md b/spring/spring-druid-mybatis/README.md index a7a243b..9b84fff 100644 --- a/spring/spring-druid-mybatis/README.md +++ b/spring/spring-druid-mybatis/README.md @@ -1,112 +1,48 @@ # spring +druid+ mybatis(xml配置方式) -#### 1、创建标准web maven工程,导入依赖 +### 项目目录结构 + +![spring-druid-mybatis](D:\spring-samples-for-all\pictures\spring-druid-mybatis.png) + +#### 1、创建maven工程,除了Spring基本依赖外,还需要导入mybatis和druid的相关依赖 ```xml - - - 4.0.0 - - com.heibaiying + + + org.springframework spring-jdbc - 1.0-SNAPSHOT - - 5.1.3.RELEASE - - - - - - org.springframework - spring-context - ${spring-base-version} - - - org.springframework - spring-beans - ${spring-base-version} - - - org.springframework - spring-core - ${spring-base-version} - - - org.springframework - spring-web - ${spring-base-version} - - - org.springframework - spring-webmvc - ${spring-base-version} - - - javax.servlet - javax.servlet-api - 4.0.1 - provided - - - org.projectlombok - lombok - 1.18.4 - provided - - - - org.springframework - spring-jdbc - ${spring-base-version} - - - mysql - mysql-connector-java - 8.0.13 - - - - junit - junit - 4.12 - test - - - org.springframework - spring-test - ${spring-base-version} - test - - - com.oracle - ojdbc6 - 11.2.0.3.0 - - - - org.mybatis - mybatis-spring - 1.3.2 - - - org.mybatis - mybatis - 3.4.6 - - - - com.alibaba - druid - 1.1.12 - - - - + ${spring-base-version} + + + mysql + mysql-connector-java + 8.0.13 + + + com.oracle + ojdbc6 + 11.2.0.3.0 + + + + org.mybatis + mybatis-spring + 1.3.2 + + + org.mybatis + mybatis + 3.4.6 + + + + com.alibaba + druid + 1.1.12 + ``` -#### 2、在web.xml 进行如下配置 +#### 2、在web.xml 中配置spring前端控制器、druid监控台servlet和filter ```xml @@ -302,7 +238,7 @@ oracle.password=密码 ``` -#### 5、新建mybtais 配置文件 更多settings配置项可以参考[官方文档](http://www.mybatis.org/mybatis-3/zh/configuration.html) +#### 5、新建mybtais 配置文件,按需要进行额外配置,更多settings配置项可以参考[官方文档](http://www.mybatis.org/mybatis-3/zh/configuration.html) ```xml diff --git a/spring/spring-druid-mybatis/src/main/resources/jdbc.properties b/spring/spring-druid-mybatis/src/main/resources/jdbc.properties index e633488..525186b 100644 --- a/spring/spring-druid-mybatis/src/main/resources/jdbc.properties +++ b/spring/spring-druid-mybatis/src/main/resources/jdbc.properties @@ -1,5 +1,5 @@ # mysql ݿ -mysql.url=jdbc:mysql://localhost:3306/mysql +mysql.url=jdbc:mysql://localhost:3306/mysql?characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false mysql.username=root mysql.password=root diff --git a/spring/spring-dubbo-annotation/README.md b/spring/spring-dubbo-annotation/README.md index bf9d8fb..75b8e75 100644 --- a/spring/spring-dubbo-annotation/README.md +++ b/spring/spring-dubbo-annotation/README.md @@ -16,7 +16,7 @@ ## 二、项目依赖 -**在父工程的项目中同一导入依赖dubbo依赖的的jar包** +**在父工程的项目中统一导入依赖dubbo依赖的的jar包** 这里需要注意的是ZooKeeper 3.5.x 和 ZooKeeper 3.4.x 是存在不兼容的情况 详见官网解释[ZooKeeper Version Compatibility](https://curator.apache.org/zk-compatibility.html), zookeeper 3.5 目前是beta版本,所以zookeeper 我选择的版本是 zookeeper-3.4.9 作为服务端。但默认情况下 curator-framework自动引用的最新的3.5的版本客户端,会出现 KeeperException$UnimplementedException 异常 diff --git a/spring/spring-dubbo/README-副本.md b/spring/spring-dubbo/README-副本.md deleted file mode 100644 index 085b046..0000000 --- a/spring/spring-dubbo/README-副本.md +++ /dev/null @@ -1,279 +0,0 @@ -# spring 整合 dubbo(xml配置方式) - -## 一、 项目结构说明 - -1.1 按照dubbo 文档推荐的服务最佳实践,建议将服务接口、服务模型、服务异常等均放在 API 包中,所以项目采用maven多模块的构建方式,在spring-dubbo下构建三个子模块: - -1. dubbo-common 是公共模块,用于存放公共的接口和bean,被dubbo-provider和dubbo-provider在pom.xml中引用; -2. dubbo-provider 是服务的提供者,提供商品的查询服务; -3. dubbo-provider 是服务的消费者,调用provider提供的查询服务。 - -1.2 本项目dubbo的搭建采用zookeeper作为注册中心, 关于zookeeper的安装和基本操作可以参见我的手记[Zookeeper 基础命令与Java客户端](https://github.com/heibaiying/LearningNotes/blob/master/notes/%E4%B8%AD%E9%97%B4%E4%BB%B6/ZooKeeper/ZooKeeper%E9%9B%86%E7%BE%A4%E6%90%AD%E5%BB%BA%E4%B8%8EJava%E5%AE%A2%E6%88%B7%E7%AB%AF.md) - -
- - - -## 二、项目依赖 - -**在父工程的项目中同一导入依赖dubbo依赖的的jar包** - -这里需要注意的是ZooKeeper 3.5.x 和 ZooKeeper 3.4.x 是存在不兼容的情况 详见官网解释[ZooKeeper Version Compatibility](https://curator.apache.org/zk-compatibility.html), zookeeper 3.5 目前是beta版本,所以zookeeper 我选择的版本是 zookeeper-3.4.9 作为服务端。但默认情况下 curator-framework自动引用的最新的3.5的版本客户端,会出现 KeeperException$UnimplementedException 异常 - -```xml - -com.alibaba -dubbo -2.6.2 - - - org.apache.curator - curator-framework - 4.0.0 - - - org.apache.zookeeper - zookeeper - - - - - org.apache.zookeeper - zookeeper - 3.4.13 - -``` - - - -## 三、公共模块(dubbo-common) - -- api 下为公共的调用接口; -- bean 下为公共的实体类。 - -
- -## 四、 服务提供者(dubbo-provider) - -
- -#### 4.1 productService是服务的提供者( 商品数据用模拟数据展示) - -注:这里实现的接口IProductService来源于公共模块 - -```java -/** - * @author : heibaiying - * @description : 产品提供接口实现类 - */ -@Service -public class ProductService implements IProductService { - - private static List productList = new ArrayList<>(); - - static { - for (int i = 0; i < 20; i++) { - productList.add(new Product(i, "产品" + i, i / 2 == 0, new Date(), 66.66f * i)); - } - } - - public Product queryProductById(int id) { - for (Product product : productList) { - if (product.getId() == id) { - return product; - } - } - return null; - } - - - public List queryAllProducts() { - return productList; - } -} -``` - -#### 4.2 在dubbo.xml暴露服务 - -```xml - - - - - - - - - - - - - - - - - - -``` - -## 五、服务消费者(dubbo-consumer) - -
- -#### 1.在dubbo.xml调用远程的服务 - -```xml - - - - - - - - - - - - - - - - - - - - -``` - -#### 2.消费服务 - -```java -@Controller -@RequestMapping("sell") -public class SellController { - - @Autowired - private IProductService productService; - - @RequestMapping - public String productList(Model model) { - List products = productService.queryAllProducts(); - model.addAttribute("products", products); - return "products"; - } - - @RequestMapping("product/{id}") - public String productDetail(@PathVariable int id, Model model) { - Product product = productService.queryProductById(id); - model.addAttribute("product", product); - return "product"; - } -} -``` - -## 六、项目构建的说明 - -因为在项目中,consumer和provider模块均依赖公共模块,所以在构建consumer和provider项目前需要将common 模块安装到本地仓库,**依次**对**父工程**和**common模块**执行: - -```shell -mvn install -Dmaven.test.skip = true -``` - -consumer中 pom.xml如下 - -```xml - - - - spring-dubbo - com.heibaiying - 1.0-SNAPSHOT - - 4.0.0 - - dubbo-consumer - - - - com.heibaiying - dubbo-common - 1.0-SNAPSHOT - compile - - - - -``` - -provider中 pom.xml如下 - -```xml - - - - spring-dubbo - com.heibaiying - 1.0-SNAPSHOT - - 4.0.0 - - dubbo-provider - - - - com.heibaiying - dubbo-common - 1.0-SNAPSHOT - compile - - - - -``` - -## 七、关于dubbo新版本管理控制台的安装说明 - -安装: - -```sh -git clone https://github.com/apache/incubator-dubbo-ops.git /var/tmp/dubbo-ops -cd /var/tmp/dubbo-ops -mvn clean package -``` - -配置: - -```sh -配置文件为: -dubbo-admin-backend/src/main/resources/application.properties -主要的配置有 默认的配置就是127.0.0.1:2181: -dubbo.registry.address=zookeeper://127.0.0.1:2181 -``` - -启动: - -```sh -mvn --projects dubbo-admin-backend spring-boot:run -``` - -访问: - -``` -http://127.0.0.1:8080 -``` \ No newline at end of file diff --git a/spring/spring-dubbo/README.md b/spring/spring-dubbo/README.md index 52b799b..bc4bc80 100644 --- a/spring/spring-dubbo/README.md +++ b/spring/spring-dubbo/README.md @@ -16,7 +16,7 @@ ## 二、项目依赖 -**在父工程的项目中同一导入依赖dubbo依赖的的jar包** +**在父工程的项目中统一导入依赖dubbo依赖的的jar包** 这里需要注意的是ZooKeeper 3.5.x 和 ZooKeeper 3.4.x 是存在不兼容的情况 详见官网解释[ZooKeeper Version Compatibility](https://curator.apache.org/zk-compatibility.html), zookeeper 3.5 目前是beta版本,所以zookeeper 我选择的版本是 zookeeper-3.4.9 作为服务端。但默认情况下 curator-framework自动引用的最新的3.5的版本客户端,会出现 KeeperException$UnimplementedException 异常 diff --git a/spring/spring-jdbc-annotation/README.md b/spring/spring-jdbc-annotation/README.md index e13afda..9bdfa08 100644 --- a/spring/spring-jdbc-annotation/README.md +++ b/spring/spring-jdbc-annotation/README.md @@ -1,114 +1,41 @@ -# spring 整合 jdbc template(注解配置方式) +# spring 整合 jdbc template(注解方式) -1、创建标准web maven工程,导入依赖 +## 1.说明 + +#### 1.1 项目目录结构 + +1. 数据源配置位于config目录下的DatabaseConfig.java和DataSourceConfig.java +2. 项目以单元测试的方法进行测试 + +![spring-jdbc-annotation](D:\spring-samples-for-all\pictures\spring-jdbc-annotation.png) + + + +#### 1.2 项目依赖 ```xml - - - 4.0.0 - - com.heibaiying + + + org.springframework spring-jdbc - 1.0-SNAPSHOT - - 5.1.3.RELEASE - - - - - - org.springframework - spring-context - ${spring-base-version} - - - org.springframework - spring-beans - ${spring-base-version} - - - org.springframework - spring-core - ${spring-base-version} - - - org.springframework - spring-web - ${spring-base-version} - - - org.springframework - spring-webmvc - ${spring-base-version} - - - javax.servlet - javax.servlet-api - 4.0.1 - provided - - - org.projectlombok - lombok - 1.18.4 - provided - - - - org.springframework - spring-jdbc - ${spring-base-version} - - - mysql - mysql-connector-java - 8.0.13 - - - - junit - junit - 4.12 - test - - - org.springframework - spring-test - ${spring-base-version} - test - - - com.oracle - ojdbc6 - 11.2.0.3.0 - - - - + ${spring-base-version} + + + mysql + mysql-connector-java + 8.0.13 + + + com.oracle + ojdbc6 + 11.2.0.3.0 + + ``` -2、新建 DispatcherServletInitializer.java继承自AbstractAnnotationConfigDispatcherServletInitializer,等价于我们在web.xml中配置的前端控制器 +## 二、spring 整合 jdbc template -```java -public class DispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { - - protected Class[] getRootConfigClasses() { - return new Class[0]; - } - - protected Class[] getServletConfigClasses() { - return new Class[]{ServletConfig.class}; - } - - protected String[] getServletMappings() { - return new String[]{"/"}; - } -} -``` - -3、在resources文件夹下新建数据库配置文件mysql.properties、oracle.properties +#### 2.1 在resources文件夹下新建数据库配置文件mysql.properties、oracle.properties及其映射类 ```properties # mysql 数据库配置 @@ -126,21 +53,7 @@ oracle.username=用户名 oracle.password=密码 ``` -4、在新建数据库配置映射类DataSourceConfig.java - ```java -package com.heibaiying.config; - -import lombok.Data; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.PropertySource; - -/** - * @author : heibaiying - * @description : - */ - @Configuration @PropertySource(value = "classpath:mysql.properties") @Data @@ -159,27 +72,13 @@ public class DataSourceConfig { ``` -5、新建ServletConfig.java,进行数据库相关配置 +#### 2.2 新建数据库配置类DatabaseConfig.java ```java -package com.heibaiying.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.datasource.DataSourceTransactionManager; -import org.springframework.jdbc.datasource.DriverManagerDataSource; -import org.springframework.transaction.annotation.EnableTransactionManagement; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -/** - * @author : heibaiying - */ @Configuration @EnableTransactionManagement // 开启声明式事务处理 等价于xml中 @ComponentScan(basePackages = {"com.heibaiying.*"}) -public class ServletConfig implements WebMvcConfigurer { +public class DatabaseConfig { /** * 配置数据源 @@ -194,6 +93,7 @@ public class ServletConfig implements WebMvcConfigurer { return dataSource; } + /** * 配置jdbcTemplate * @param dataSource 这个参数的名称需要保持和上面方法名一致 才能自动注入,因为 @@ -217,36 +117,12 @@ public class ServletConfig implements WebMvcConfigurer { } } + ``` -6、新建查询接口及其实现类,这里我查询的表是mysql和oracle中的字典表 +#### 2.3 新建查询接口及其实现类,这里我查询的表是mysql和oracle中的字典表 ```java -public interface MysqlDao { - - List get(); -} -``` - -```java -package com.heibaiying.dao; - -import com.heibaiying.bean.Relation; -import com.heibaiying.dao.impl.MysqlDao; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.core.RowMapper; -import org.springframework.stereotype.Repository; - -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.List; - -/** - * @author : heibaiying - * @description : - */ - @Repository public class MysqlDaoImpl implements MysqlDao { @@ -274,42 +150,9 @@ public class MysqlDaoImpl implements MysqlDao { ``` -```mysql -package com.heibaiying.dao.impl; -import com.heibaiying.bean.Flow; -import java.util.List; - -/** - * @author : heibaiying - * @description : - */ -public interface OracleDao { - - List get(); -} - -``` ```java -package com.heibaiying.dao; - -import com.heibaiying.bean.Flow; -import com.heibaiying.dao.impl.OracleDao; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.core.RowMapper; -import org.springframework.stereotype.Repository; - -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.List; - -/** - * @author : heibaiying - * @description : - */ - @Repository public class OracleDaoImpl implements OracleDao { @@ -338,30 +181,11 @@ public class OracleDaoImpl implements OracleDao { ``` -7、新建测试类进行测试 +#### 2.4 新建测试类进行测试 ```java -package com.heibaiying.dao; - -import com.heibaiying.bean.Relation; -import com.heibaiying.config.DispatcherServletInitializer; -import com.heibaiying.config.ServletConfig; -import com.heibaiying.dao.impl.MysqlDao; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringRunner; - -import java.util.List; - -/** - * @author : heibaiying - * @description : - */ - @RunWith(SpringRunner.class) -@ContextConfiguration(classes = {DispatcherServletInitializer.class, ServletConfig.class}) +@ContextConfiguration(classes = {ServletConfig.class}) public class MysqlDaoTest { @Autowired @@ -380,28 +204,8 @@ public class MysqlDaoTest { ``` ```java -package com.heibaiying.dao; - -import com.heibaiying.bean.Flow; -import com.heibaiying.config.DispatcherServletInitializer; -import com.heibaiying.config.ServletConfig; -import com.heibaiying.dao.impl.OracleDao; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringRunner; - -import java.util.List; - -/** - * @author : heibaiying - * @description : - */ - @RunWith(SpringRunner.class) -@ContextConfiguration(classes = {DispatcherServletInitializer.class, ServletConfig.class}) +@ContextConfiguration(classes = {ServletConfig.class}) public class OracleDaoTest { /*注入接口时: 如果接口有多个实现类 可以用这个指定具体的实现类*/ diff --git a/spring/spring-jdbc-annotation/src/main/java/com/heibaiying/config/DataSourceConfig.java b/spring/spring-jdbc-annotation/src/main/java/com/heibaiying/config/DataSourceConfig.java index 51dd508..295ae2d 100644 --- a/spring/spring-jdbc-annotation/src/main/java/com/heibaiying/config/DataSourceConfig.java +++ b/spring/spring-jdbc-annotation/src/main/java/com/heibaiying/config/DataSourceConfig.java @@ -7,7 +7,6 @@ import org.springframework.context.annotation.PropertySource; /** * @author : heibaiying - * @description : */ @Configuration @@ -15,10 +14,6 @@ import org.springframework.context.annotation.PropertySource; @Data public class DataSourceConfig { - /** - * 感觉这种注入的方式并不够好 - * 没有spring-boot中使用@ConfigurationProperties(prefix = "config")指定前缀注入的方式优雅 - */ @Value("${mysql.driverClassName}") private String driverClassName; @Value("${mysql.url}") diff --git a/spring/spring-jdbc-annotation/src/main/java/com/heibaiying/config/ServletConfig.java b/spring/spring-jdbc-annotation/src/main/java/com/heibaiying/config/DatabaseConfig.java similarity index 93% rename from spring/spring-jdbc-annotation/src/main/java/com/heibaiying/config/ServletConfig.java rename to spring/spring-jdbc-annotation/src/main/java/com/heibaiying/config/DatabaseConfig.java index 43face4..c6a3105 100644 --- a/spring/spring-jdbc-annotation/src/main/java/com/heibaiying/config/ServletConfig.java +++ b/spring/spring-jdbc-annotation/src/main/java/com/heibaiying/config/DatabaseConfig.java @@ -7,7 +7,6 @@ import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.jdbc.datasource.DriverManagerDataSource; import org.springframework.transaction.annotation.EnableTransactionManagement; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; /** * @author : heibaiying @@ -15,7 +14,7 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration @EnableTransactionManagement // 开启声明式事务处理 等价于xml中 @ComponentScan(basePackages = {"com.heibaiying.*"}) -public class ServletConfig implements WebMvcConfigurer { +public class DatabaseConfig { /** * 配置数据源 diff --git a/spring/spring-jdbc-annotation/src/main/java/com/heibaiying/config/DispatcherServletInitializer.java b/spring/spring-jdbc-annotation/src/main/java/com/heibaiying/config/DispatcherServletInitializer.java deleted file mode 100644 index 7ed14d2..0000000 --- a/spring/spring-jdbc-annotation/src/main/java/com/heibaiying/config/DispatcherServletInitializer.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.heibaiying.config; - -import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; - -/** - * @author : heibaiying - */ - -public class DispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { - - protected Class[] getRootConfigClasses() { - return new Class[0]; - } - - protected Class[] getServletConfigClasses() { - return new Class[]{ServletConfig.class}; - } - - protected String[] getServletMappings() { - return new String[]{"/"}; - } -} diff --git a/spring/spring-jdbc-annotation/src/main/resources/mysql.properties b/spring/spring-jdbc-annotation/src/main/resources/mysql.properties index e8ab06b..27b2bdc 100644 --- a/spring/spring-jdbc-annotation/src/main/resources/mysql.properties +++ b/spring/spring-jdbc-annotation/src/main/resources/mysql.properties @@ -1,5 +1,5 @@ # mysql ݿ -mysql.driverClassName=com.mysql.jdbc.Driver -mysql.url=jdbc:mysql://localhost:3306/mysql +mysql.driverClassName=com.mysql.cj.jdbc.Driver +mysql.url=jdbc:mysql://localhost:3306/mysql?characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false mysql.username=root mysql.password=root diff --git a/spring/spring-jdbc-annotation/src/test/java/com/heibaiying/dao/MysqlDaoTest.java b/spring/spring-jdbc-annotation/src/test/java/com/heibaiying/dao/MysqlDaoTest.java index ef3b774..0423637 100644 --- a/spring/spring-jdbc-annotation/src/test/java/com/heibaiying/dao/MysqlDaoTest.java +++ b/spring/spring-jdbc-annotation/src/test/java/com/heibaiying/dao/MysqlDaoTest.java @@ -1,8 +1,7 @@ package com.heibaiying.dao; import com.heibaiying.bean.Relation; -import com.heibaiying.config.DispatcherServletInitializer; -import com.heibaiying.config.ServletConfig; +import com.heibaiying.config.DatabaseConfig; import com.heibaiying.dao.impl.MysqlDao; import org.junit.Test; import org.junit.runner.RunWith; @@ -18,7 +17,7 @@ import java.util.List; */ @RunWith(SpringRunner.class) -@ContextConfiguration(classes = {DispatcherServletInitializer.class, ServletConfig.class}) +@ContextConfiguration(classes = {DatabaseConfig.class}) public class MysqlDaoTest { @Autowired diff --git a/spring/spring-jdbc-annotation/src/test/java/com/heibaiying/dao/OracleDaoTest.java b/spring/spring-jdbc-annotation/src/test/java/com/heibaiying/dao/OracleDaoTest.java index a4cd513..8d6cc4d 100644 --- a/spring/spring-jdbc-annotation/src/test/java/com/heibaiying/dao/OracleDaoTest.java +++ b/spring/spring-jdbc-annotation/src/test/java/com/heibaiying/dao/OracleDaoTest.java @@ -1,8 +1,7 @@ package com.heibaiying.dao; import com.heibaiying.bean.Flow; -import com.heibaiying.config.DispatcherServletInitializer; -import com.heibaiying.config.ServletConfig; +import com.heibaiying.config.DatabaseConfig; import com.heibaiying.dao.impl.OracleDao; import org.junit.Test; import org.junit.runner.RunWith; @@ -19,7 +18,7 @@ import java.util.List; */ @RunWith(SpringRunner.class) -@ContextConfiguration(classes = {DispatcherServletInitializer.class, ServletConfig.class}) +@ContextConfiguration(classes = {DatabaseConfig.class}) public class OracleDaoTest { /*注入接口时: 如果接口有多个实现类 可以用这个指定具体的实现类*/ diff --git a/spring/spring-jdbc/README.md b/spring/spring-jdbc/README.md index 9d92447..e2e1498 100644 --- a/spring/spring-jdbc/README.md +++ b/spring/spring-jdbc/README.md @@ -1,124 +1,38 @@ # spring 整合 jdbc template(xml配置方式) -1、创建标准web maven工程,导入依赖 +## 一、说明 + +#### 1.1 项目结构 + +![spring-jdbc](D:\spring-samples-for-all\pictures\spring-jdbc.png) + +#### 1.2 项目依赖 ```xml - - - 4.0.0 - - com.heibaiying + + + org.springframework spring-jdbc - 1.0-SNAPSHOT - - 5.1.3.RELEASE - - - - - - org.springframework - spring-context - ${spring-base-version} - - - org.springframework - spring-beans - ${spring-base-version} - - - org.springframework - spring-core - ${spring-base-version} - - - org.springframework - spring-web - ${spring-base-version} - - - org.springframework - spring-webmvc - ${spring-base-version} - - - javax.servlet - javax.servlet-api - 4.0.1 - provided - - - org.projectlombok - lombok - 1.18.4 - provided - - - - org.springframework - spring-jdbc - ${spring-base-version} - - - mysql - mysql-connector-java - 8.0.13 - - - - junit - junit - 4.12 - test - - - org.springframework - spring-test - ${spring-base-version} - test - - - com.oracle - ojdbc6 - 11.2.0.3.0 - - - - + ${spring-base-version} + + + mysql + mysql-connector-java + 8.0.13 + + + com.oracle + ojdbc6 + 11.2.0.3.0 + + ``` -2、在web.xml 进行如下配置 -```xml - - - - - springMvc - org.springframework.web.servlet.DispatcherServlet - - contextConfigLocation - classpath:springApplication.xml - - 1 - +## 二、 spring 整合 jdbc template - - springMvc - / - - - -``` - -3、在resources文件夹下新建数据库配置文件jdbc.properties +#### 1、在resources文件夹下新建数据库配置文件jdbc.properties ```properties # mysql 数据库配置 @@ -134,7 +48,7 @@ oracle.username=用户名 oracle.password=密码 ``` -4、在resources文件夹下创建springApplication.xml 配置文件 +#### 2、配置Jdbc数据源并定义事务管理器 ```xml @@ -182,34 +96,9 @@ oracle.password=密码 ``` -5、新建查询接口及其实现类,这里我查询的表是mysql和oracle中的字典表 +#### 3、新建查询接口及其实现类,这里我查询的表是mysql和oracle中的字典表 ```java -public interface MysqlDao { - - List get(); -} -``` - -```java -package com.heibaiying.dao; - -import com.heibaiying.bean.Relation; -import com.heibaiying.dao.impl.MysqlDao; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.core.RowMapper; -import org.springframework.stereotype.Repository; - -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.List; - -/** - * @author : heibaiying - * @description : - */ - @Repository public class MysqlDaoImpl implements MysqlDao { @@ -237,42 +126,7 @@ public class MysqlDaoImpl implements MysqlDao { ``` -```mysql -package com.heibaiying.dao.impl; - -import com.heibaiying.bean.Flow; -import java.util.List; - -/** - * @author : heibaiying - * @description : - */ -public interface OracleDao { - - List get(); -} - -``` - ```java -package com.heibaiying.dao; - -import com.heibaiying.bean.Flow; -import com.heibaiying.dao.impl.OracleDao; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.core.RowMapper; -import org.springframework.stereotype.Repository; - -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.List; - -/** - * @author : heibaiying - * @description : - */ - @Repository public class OracleDaoImpl implements OracleDao { @@ -298,29 +152,11 @@ public class OracleDaoImpl implements OracleDao { return flows; } } - ``` -6.新建测试类进行测试 +#### 4.新建测试类进行测试 ```java -package com.heibaiying.dao; - -import com.heibaiying.bean.Relation; -import com.heibaiying.dao.impl.MysqlDao; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringRunner; - -import java.util.List; - -/** - * @author : heibaiying - * @description : - */ - @RunWith(SpringRunner.class) @ContextConfiguration({"classpath:springApplication.xml"}) public class MysqlDaoTest { @@ -342,24 +178,6 @@ public class MysqlDaoTest { ``` ```java -package com.heibaiying.dao; - -import com.heibaiying.bean.Flow; -import com.heibaiying.dao.impl.OracleDao; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringRunner; - -import java.util.List; - -/** - * @author : heibaiying - * @description : - */ - @RunWith(SpringRunner.class) @ContextConfiguration({"classpath:springApplication.xml"}) public class OracleDaoTest { diff --git a/spring/spring-jdbc/src/main/resources/jdbc.properties b/spring/spring-jdbc/src/main/resources/jdbc.properties index 6dadcd3..fb89a05 100644 --- a/spring/spring-jdbc/src/main/resources/jdbc.properties +++ b/spring/spring-jdbc/src/main/resources/jdbc.properties @@ -1,6 +1,6 @@ # mysql ݿ -mysql.driverClassName=com.mysql.jdbc.Driver -mysql.url=jdbc:mysql://localhost:3306/mysql +mysql.driverClassName=com.mysql.cj.jdbc.Driver +mysql.url=jdbc:mysql://localhost:3306/mysql?characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false mysql.username=root mysql.password=root diff --git a/spring/spring-mybatis-annotation/README.md b/spring/spring-mybatis-annotation/README.md index af6d0fc..bac6696 100644 --- a/spring/spring-mybatis-annotation/README.md +++ b/spring/spring-mybatis-annotation/README.md @@ -1,125 +1,48 @@ -# spring 整合 mybatis(注解配置方式) +# spring 整合 mybatis(xml配置方式) -1、创建标准web maven工程,导入依赖 +## 一、说明 + +#### 1.1 项目结构 + +![spring-mybatis](D:\spring-samples-for-all\pictures\spring-mybatis-annotation.png) + +#### 1.2 项目依赖 + +除了spring相关依赖外,还需要导入数据库驱动和对应的mybatis依赖包 ```xml - - - 4.0.0 - - com.heibaiying + + + org.springframework spring-jdbc - 1.0-SNAPSHOT - - 5.1.3.RELEASE - - - - - - org.springframework - spring-context - ${spring-base-version} - - - org.springframework - spring-beans - ${spring-base-version} - - - org.springframework - spring-core - ${spring-base-version} - - - org.springframework - spring-web - ${spring-base-version} - - - org.springframework - spring-webmvc - ${spring-base-version} - - - javax.servlet - javax.servlet-api - 4.0.1 - provided - - - org.projectlombok - lombok - 1.18.4 - provided - - - - org.springframework - spring-jdbc - ${spring-base-version} - - - mysql - mysql-connector-java - 8.0.13 - - - - junit - junit - 4.12 - test - - - org.springframework - spring-test - ${spring-base-version} - test - - - com.oracle - ojdbc6 - 11.2.0.3.0 - - - - org.mybatis - mybatis-spring - 1.3.2 - - - org.mybatis - mybatis - 3.4.6 - - - - + ${spring-base-version} + + + mysql + mysql-connector-java + 8.0.13 + + + com.oracle + ojdbc6 + 11.2.0.3.0 + + + + org.mybatis + mybatis-spring + 1.3.2 + + + org.mybatis + mybatis + 3.4.6 + ``` -2、新建 DispatcherServletInitializer.java继承自AbstractAnnotationConfigDispatcherServletInitializer,等价于我们在web.xml中配置的前端控制器 +## 二、spring 整合 mybatis -```java -public class DispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { - - protected Class[] getRootConfigClasses() { - return new Class[0]; - } - - protected Class[] getServletConfigClasses() { - return new Class[]{ServletConfig.class}; - } - - protected String[] getServletMappings() { - return new String[]{"/"}; - } -} -``` - -3、在resources文件夹下新建数据库配置文件mysql.properties、oracle.properties +#### 2.1 在resources文件夹下新建数据库配置文件jdbc.properties及其映射类 ```properties # mysql 数据库配置 @@ -127,9 +50,7 @@ mysql.driverClassName=com.mysql.jdbc.Driver mysql.url=jdbc:mysql://localhost:3306/mysql mysql.username=root mysql.password=root -``` -```properties # oracle 数据库配置 oracle.driverClassName=oracle.jdbc.driver.OracleDriver oracle.url=jdbc:oracle:thin:@//IP地址:端口号/数据库实例名 @@ -137,21 +58,7 @@ oracle.username=用户名 oracle.password=密码 ``` -4、在新建数据库配置映射类DataSourceConfig.java - ```java -package com.heibaiying.config; - -import lombok.Data; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.PropertySource; - -/** - * @author : heibaiying - * @description : - */ - @Configuration @PropertySource(value = "classpath:mysql.properties") @Data @@ -167,35 +74,18 @@ public class DataSourceConfig { private String password; } - ``` -5、新建ServletConfig.java,进行数据库相关配置 +#### 2.2 配置数据源和mybatis会话工厂、定义事务管理器 ```java -package com.heibaiying.config; - -import org.mybatis.spring.SqlSessionFactoryBean; -import org.mybatis.spring.mapper.MapperScannerConfigurer; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration;; -import org.springframework.core.io.support.PathMatchingResourcePatternResolver; -import org.springframework.jdbc.datasource.DataSourceTransactionManager; -import org.springframework.jdbc.datasource.DriverManagerDataSource; -import org.springframework.transaction.annotation.EnableTransactionManagement; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -import java.io.IOException; - - /** * @author : heibaiying */ @Configuration @EnableTransactionManagement // 开启声明式事务处理 等价于xml中 @ComponentScan(basePackages = {"com.heibaiying.*"}) -public class ServletConfig implements WebMvcConfigurer { +public class DatabaseConfig { /* @Autowired * private DataSourceConfig sourceConfig; @@ -216,7 +106,6 @@ public class ServletConfig implements WebMvcConfigurer { return dataSource; } - /** * 配置mybatis 会话工厂 * @@ -258,7 +147,7 @@ public class ServletConfig implements WebMvcConfigurer { ``` -5、新建mybtais 配置文件 更多settings配置项可以参考[官方文档](http://www.mybatis.org/mybatis-3/zh/configuration.html) +#### 2.3 新建mybtais配置文件,按照需求配置额外参数, 更多settings配置项可以参考[官方文档](http://www.mybatis.org/mybatis-3/zh/configuration.html) ```xml @@ -281,7 +170,7 @@ public class ServletConfig implements WebMvcConfigurer { ``` -5、新建查询接口及其对应的mapper文件 +#### 2.4 新建查询接口及其对应的mapper文件 ```java public interface MysqlDao { @@ -328,30 +217,11 @@ public interface OracleDao { ``` -6.新建测试类进行测试 +#### 2.5 新建测试类进行测试 ```java -package com.heibaiying.dao; - -import com.heibaiying.bean.Relation; -import com.heibaiying.config.DataSourceConfig; -import com.heibaiying.config.DispatcherServletInitializer; -import com.heibaiying.config.ServletConfig; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringRunner; - -import java.util.List; - -/** - * @author : heibaiying - * @description : - */ - @RunWith(SpringRunner.class) -@ContextConfiguration(classes = {DispatcherServletInitializer.class, ServletConfig.class}) +@ContextConfiguration(classes = {DatabaseConfig.class}) public class MysqlDaoTest { @Autowired @@ -370,27 +240,8 @@ public class MysqlDaoTest { ``` ```java -package com.heibaiying.dao; - -import com.heibaiying.bean.Flow; -import com.heibaiying.config.DataSourceConfig; -import com.heibaiying.config.DispatcherServletInitializer; -import com.heibaiying.config.ServletConfig; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringRunner; - -import java.util.List; - -/** - * @author : heibaiying - * @description : - */ - @RunWith(SpringRunner.class) -@ContextConfiguration(classes = {DispatcherServletInitializer.class, ServletConfig.class}) +@ContextConfiguration(classes = {DatabaseConfig.class}) public class OracleDaoTest { @Autowired @@ -406,5 +257,6 @@ public class OracleDaoTest { } } } + ``` diff --git a/spring/spring-mybatis-annotation/src/main/java/com/heibaiying/config/DataSourceConfig.java b/spring/spring-mybatis-annotation/src/main/java/com/heibaiying/config/DataSourceConfig.java index 51dd508..295ae2d 100644 --- a/spring/spring-mybatis-annotation/src/main/java/com/heibaiying/config/DataSourceConfig.java +++ b/spring/spring-mybatis-annotation/src/main/java/com/heibaiying/config/DataSourceConfig.java @@ -7,7 +7,6 @@ import org.springframework.context.annotation.PropertySource; /** * @author : heibaiying - * @description : */ @Configuration @@ -15,10 +14,6 @@ import org.springframework.context.annotation.PropertySource; @Data public class DataSourceConfig { - /** - * 感觉这种注入的方式并不够好 - * 没有spring-boot中使用@ConfigurationProperties(prefix = "config")指定前缀注入的方式优雅 - */ @Value("${mysql.driverClassName}") private String driverClassName; @Value("${mysql.url}") diff --git a/spring/spring-mybatis-annotation/src/main/java/com/heibaiying/config/ServletConfig.java b/spring/spring-mybatis-annotation/src/main/java/com/heibaiying/config/DatabaseConfig.java similarity index 98% rename from spring/spring-mybatis-annotation/src/main/java/com/heibaiying/config/ServletConfig.java rename to spring/spring-mybatis-annotation/src/main/java/com/heibaiying/config/DatabaseConfig.java index 33d9bec..85a5dde 100644 --- a/spring/spring-mybatis-annotation/src/main/java/com/heibaiying/config/ServletConfig.java +++ b/spring/spring-mybatis-annotation/src/main/java/com/heibaiying/config/DatabaseConfig.java @@ -20,7 +20,7 @@ import java.io.IOException; @Configuration @EnableTransactionManagement // 开启声明式事务处理 等价于xml中 @ComponentScan(basePackages = {"com.heibaiying.*"}) -public class ServletConfig implements WebMvcConfigurer { +public class DatabaseConfig { /* @Autowired * private DataSourceConfig sourceConfig; diff --git a/spring/spring-mybatis-annotation/src/main/java/com/heibaiying/config/DispatcherServletInitializer.java b/spring/spring-mybatis-annotation/src/main/java/com/heibaiying/config/DispatcherServletInitializer.java deleted file mode 100644 index 7ed14d2..0000000 --- a/spring/spring-mybatis-annotation/src/main/java/com/heibaiying/config/DispatcherServletInitializer.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.heibaiying.config; - -import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; - -/** - * @author : heibaiying - */ - -public class DispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { - - protected Class[] getRootConfigClasses() { - return new Class[0]; - } - - protected Class[] getServletConfigClasses() { - return new Class[]{ServletConfig.class}; - } - - protected String[] getServletMappings() { - return new String[]{"/"}; - } -} diff --git a/spring/spring-mybatis-annotation/src/main/resources/mysql.properties b/spring/spring-mybatis-annotation/src/main/resources/mysql.properties index e8ab06b..27b2bdc 100644 --- a/spring/spring-mybatis-annotation/src/main/resources/mysql.properties +++ b/spring/spring-mybatis-annotation/src/main/resources/mysql.properties @@ -1,5 +1,5 @@ # mysql ݿ -mysql.driverClassName=com.mysql.jdbc.Driver -mysql.url=jdbc:mysql://localhost:3306/mysql +mysql.driverClassName=com.mysql.cj.jdbc.Driver +mysql.url=jdbc:mysql://localhost:3306/mysql?characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false mysql.username=root mysql.password=root diff --git a/spring/spring-mybatis-annotation/src/test/java/com/heibaiying/dao/MysqlDaoTest.java b/spring/spring-mybatis-annotation/src/test/java/com/heibaiying/dao/MysqlDaoTest.java index 99dc047..30d5d9a 100644 --- a/spring/spring-mybatis-annotation/src/test/java/com/heibaiying/dao/MysqlDaoTest.java +++ b/spring/spring-mybatis-annotation/src/test/java/com/heibaiying/dao/MysqlDaoTest.java @@ -1,9 +1,7 @@ package com.heibaiying.dao; import com.heibaiying.bean.Relation; -import com.heibaiying.config.DataSourceConfig; -import com.heibaiying.config.DispatcherServletInitializer; -import com.heibaiying.config.ServletConfig; +import com.heibaiying.config.DatabaseConfig; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -18,7 +16,7 @@ import java.util.List; */ @RunWith(SpringRunner.class) -@ContextConfiguration(classes = {DispatcherServletInitializer.class, ServletConfig.class}) +@ContextConfiguration(classes = {DatabaseConfig.class}) public class MysqlDaoTest { @Autowired diff --git a/spring/spring-mybatis-annotation/src/test/java/com/heibaiying/dao/OracleDaoTest.java b/spring/spring-mybatis-annotation/src/test/java/com/heibaiying/dao/OracleDaoTest.java index 38a03d6..f5e9350 100644 --- a/spring/spring-mybatis-annotation/src/test/java/com/heibaiying/dao/OracleDaoTest.java +++ b/spring/spring-mybatis-annotation/src/test/java/com/heibaiying/dao/OracleDaoTest.java @@ -1,9 +1,7 @@ package com.heibaiying.dao; import com.heibaiying.bean.Flow; -import com.heibaiying.config.DataSourceConfig; -import com.heibaiying.config.DispatcherServletInitializer; -import com.heibaiying.config.ServletConfig; +import com.heibaiying.config.DatabaseConfig; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -18,7 +16,7 @@ import java.util.List; */ @RunWith(SpringRunner.class) -@ContextConfiguration(classes = {DispatcherServletInitializer.class, ServletConfig.class}) +@ContextConfiguration(classes = {DatabaseConfig.class}) public class OracleDaoTest { @Autowired diff --git a/spring/spring-mybatis/README.md b/spring/spring-mybatis/README.md index 492f2f2..7607c5c 100644 --- a/spring/spring-mybatis/README.md +++ b/spring/spring-mybatis/README.md @@ -1,135 +1,48 @@ # spring 整合 mybatis(xml配置方式) -1、创建标准web maven工程,导入依赖 +## 一、说明 + +#### 1.1 项目结构 + +![spring-mybatis](D:\spring-samples-for-all\pictures\spring-mybatis.png) + +#### 1.2 项目依赖 + +除了spring相关依赖外,还需要导入数据库驱动和对应的mybatis依赖包 ```xml - - - 4.0.0 - - com.heibaiying + + + org.springframework spring-jdbc - 1.0-SNAPSHOT - - 5.1.3.RELEASE - - - - - - org.springframework - spring-context - ${spring-base-version} - - - org.springframework - spring-beans - ${spring-base-version} - - - org.springframework - spring-core - ${spring-base-version} - - - org.springframework - spring-web - ${spring-base-version} - - - org.springframework - spring-webmvc - ${spring-base-version} - - - javax.servlet - javax.servlet-api - 4.0.1 - provided - - - org.projectlombok - lombok - 1.18.4 - provided - - - - org.springframework - spring-jdbc - ${spring-base-version} - - - mysql - mysql-connector-java - 8.0.13 - - - - junit - junit - 4.12 - test - - - org.springframework - spring-test - ${spring-base-version} - test - - - com.oracle - ojdbc6 - 11.2.0.3.0 - - - - org.mybatis - mybatis-spring - 1.3.2 - - - org.mybatis - mybatis - 3.4.6 - - - - + ${spring-base-version} + + + mysql + mysql-connector-java + 8.0.13 + + + com.oracle + ojdbc6 + 11.2.0.3.0 + + + + org.mybatis + mybatis-spring + 1.3.2 + + + org.mybatis + mybatis + 3.4.6 + ``` -2、在web.xml 进行如下配置 +## 二、spring 整合 mybatis -```xml - - - - - - springMvc - org.springframework.web.servlet.DispatcherServlet - - contextConfigLocation - classpath:springApplication.xml - - 1 - - - - springMvc - / - - - -``` - -3、在resources文件夹下新建数据库配置文件jdbc.properties +#### 2.1 在resources文件夹下新建数据库配置文件jdbc.properties ```properties # mysql 数据库配置 @@ -145,7 +58,7 @@ oracle.username=用户名 oracle.password=密码 ``` -4、在resources文件夹下创建springApplication.xml 配置文件 +#### 2.2 配置数据源和mybatis会话工厂、定义事务管理器 ```xml @@ -205,7 +118,7 @@ oracle.password=密码 ``` -5、新建mybtais 配置文件 更多settings配置项可以参考[官方文档](http://www.mybatis.org/mybatis-3/zh/configuration.html) +#### 2.3 新建mybtais配置文件,按照需求配置额外参数, 更多settings配置项可以参考[官方文档](http://www.mybatis.org/mybatis-3/zh/configuration.html) ```xml @@ -228,7 +141,7 @@ oracle.password=密码 ``` -5、新建查询接口及其对应的mapper文件 +#### 2.4 新建查询接口及其对应的mapper文件 ```java public interface MysqlDao { @@ -275,26 +188,9 @@ public interface OracleDao { ``` -6.新建测试类进行测试 +#### 2.5 新建测试类进行测试 ```java -package com.heibaiying.dao; - -import com.heibaiying.bean.Relation; -import com.heibaiying.dao.impl.MysqlDao; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringRunner; - -import java.util.List; - -/** - * @author : heibaiying - * @description : - */ - @RunWith(SpringRunner.class) @ContextConfiguration({"classpath:springApplication.xml"}) public class MysqlDaoTest { @@ -316,24 +212,6 @@ public class MysqlDaoTest { ``` ```java -package com.heibaiying.dao; - -import com.heibaiying.bean.Flow; -import com.heibaiying.dao.impl.OracleDao; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringRunner; - -import java.util.List; - -/** - * @author : heibaiying - * @description : - */ - @RunWith(SpringRunner.class) @ContextConfiguration({"classpath:springApplication.xml"}) public class OracleDaoTest { diff --git a/spring/spring-mybatis/src/main/resources/jdbc.properties b/spring/spring-mybatis/src/main/resources/jdbc.properties index 6dadcd3..fb89a05 100644 --- a/spring/spring-mybatis/src/main/resources/jdbc.properties +++ b/spring/spring-mybatis/src/main/resources/jdbc.properties @@ -1,6 +1,6 @@ # mysql ݿ -mysql.driverClassName=com.mysql.jdbc.Driver -mysql.url=jdbc:mysql://localhost:3306/mysql +mysql.driverClassName=com.mysql.cj.jdbc.Driver +mysql.url=jdbc:mysql://localhost:3306/mysql?characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false mysql.username=root mysql.password=root