From 6ea24c5e634cec129f8d88130fcac1c73d4d94c9 Mon Sep 17 00:00:00 2001 From: luyang Date: Mon, 8 Mar 2021 23:09:03 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lagou/sqlSession/DefaultSqlSession.java | 6 +- .../java/com/lagou/sqlSession/Executor.java | 4 +- .../com/lagou/sqlSession/SimpleExecutor.java | 23 ++- .../java/com/lagou/sqlSession/SqlSession.java | 6 +- .../target/IPersistence-1.0-SNAPSHOT.jar | Bin 2179 -> 16666 bytes .../classes/com/lagou/config/BoundSql.class | Bin 0 -> 1312 bytes .../com/lagou/config/XMLConfigBuilder.class | Bin 0 -> 2786 bytes .../com/lagou/config/XMLMapperBuilder.class | Bin 0 -> 2308 bytes .../classes/com/lagou/io/Resources.class | Bin 570 -> 572 bytes .../com/lagou/pojo/Configuration.class | Bin 0 -> 1194 bytes .../com/lagou/pojo/MappedStatement.class | Bin 0 -> 1129 bytes .../lagou/sqlSession/DefaultSqlSession.class | Bin 0 -> 2147 bytes .../sqlSession/DefaultSqlSessionFactory.class | Bin 0 -> 688 bytes .../com/lagou/sqlSession/Executor.class | Bin 0 -> 685 bytes .../com/lagou/sqlSession/SimpleExecutor.class | Bin 0 -> 5211 bytes .../com/lagou/sqlSession/SqlSession.class | Bin 0 -> 783 bytes .../lagou/sqlSession/SqlSessionFactory.class | Bin 0 -> 199 bytes .../sqlSession/SqlSessionFactoryBulider.class | Bin 0 -> 982 bytes .../com/lagou/utils/GenericTokenParser.class | Bin 0 -> 1795 bytes .../com/lagou/utils/ParameterMapping.class | Bin 0 -> 871 bytes .../utils/ParameterMappingTokenHandler.class | Bin 0 -> 1505 bytes .../com/lagou/utils/TokenHandler.class | Bin 0 -> 184 bytes .../compile/default-compile/createdFiles.lst | 16 ++ Module1/code/IPersistence_test/.gitignore | 28 ++++ .../code/IPersistence_test/.idea/compiler.xml | 4 + .../inspectionProfiles/Project_Default.xml | 42 ------ Module1/code/IPersistence_test/.idea/misc.xml | 5 +- .../IPersistence_test/.idea/workspace.xml | 138 ++++++++++-------- .../IPersistence_test/IPersistence_test.iml | 24 ++- .../src/main/java/com/lagou/pojo/User.java | 24 +++ .../pojo/com/lagou/test/IPersistenceTest.java | 26 ---- 31 files changed, 202 insertions(+), 144 deletions(-) create mode 100644 Module1/code/IPersistence/target/classes/com/lagou/config/BoundSql.class create mode 100644 Module1/code/IPersistence/target/classes/com/lagou/config/XMLConfigBuilder.class create mode 100644 Module1/code/IPersistence/target/classes/com/lagou/config/XMLMapperBuilder.class create mode 100644 Module1/code/IPersistence/target/classes/com/lagou/pojo/Configuration.class create mode 100644 Module1/code/IPersistence/target/classes/com/lagou/pojo/MappedStatement.class create mode 100644 Module1/code/IPersistence/target/classes/com/lagou/sqlSession/DefaultSqlSession.class create mode 100644 Module1/code/IPersistence/target/classes/com/lagou/sqlSession/DefaultSqlSessionFactory.class create mode 100644 Module1/code/IPersistence/target/classes/com/lagou/sqlSession/Executor.class create mode 100644 Module1/code/IPersistence/target/classes/com/lagou/sqlSession/SimpleExecutor.class create mode 100644 Module1/code/IPersistence/target/classes/com/lagou/sqlSession/SqlSession.class create mode 100644 Module1/code/IPersistence/target/classes/com/lagou/sqlSession/SqlSessionFactory.class create mode 100644 Module1/code/IPersistence/target/classes/com/lagou/sqlSession/SqlSessionFactoryBulider.class create mode 100644 Module1/code/IPersistence/target/classes/com/lagou/utils/GenericTokenParser.class create mode 100644 Module1/code/IPersistence/target/classes/com/lagou/utils/ParameterMapping.class create mode 100644 Module1/code/IPersistence/target/classes/com/lagou/utils/ParameterMappingTokenHandler.class create mode 100644 Module1/code/IPersistence/target/classes/com/lagou/utils/TokenHandler.class create mode 100644 Module1/code/IPersistence_test/.gitignore delete mode 100644 Module1/code/IPersistence_test/.idea/inspectionProfiles/Project_Default.xml delete mode 100644 Module1/code/IPersistence_test/src/main/java/com/lagou/pojo/com/lagou/test/IPersistenceTest.java diff --git a/Module1/code/IPersistence/src/main/java/com/lagou/sqlSession/DefaultSqlSession.java b/Module1/code/IPersistence/src/main/java/com/lagou/sqlSession/DefaultSqlSession.java index 1cff858..6a04814 100644 --- a/Module1/code/IPersistence/src/main/java/com/lagou/sqlSession/DefaultSqlSession.java +++ b/Module1/code/IPersistence/src/main/java/com/lagou/sqlSession/DefaultSqlSession.java @@ -2,6 +2,8 @@ package com.lagou.sqlSession; import com.lagou.pojo.Configuration; +import java.beans.IntrospectionException; +import java.lang.reflect.InvocationTargetException; import java.sql.SQLException; import java.util.List; @@ -20,7 +22,7 @@ public class DefaultSqlSession implements SqlSession { * @param params * @return */ - public List selectList(String statementId, Object... params) throws SQLException { + public List selectList(String statementId, Object... params) throws SQLException, IllegalAccessException, IntrospectionException, InstantiationException, NoSuchFieldException, InvocationTargetException, ClassNotFoundException { SimpleExecutor simpleExecutor = new SimpleExecutor(); return simpleExecutor.query(configuration, configuration.getMappedStatementMap().get(statementId), params); } @@ -32,7 +34,7 @@ public class DefaultSqlSession implements SqlSession { * @param params * @return */ - public T selectOne(String statementId, Object... params) throws SQLException { + public T selectOne(String statementId, Object... params) throws SQLException, IllegalAccessException, IntrospectionException, InstantiationException, ClassNotFoundException, InvocationTargetException, NoSuchFieldException { List objects = selectList(statementId, params); if (objects.size()> 1){ throw new RuntimeException("查询结果过多"); diff --git a/Module1/code/IPersistence/src/main/java/com/lagou/sqlSession/Executor.java b/Module1/code/IPersistence/src/main/java/com/lagou/sqlSession/Executor.java index 7ceab1e..a4cd7e9 100644 --- a/Module1/code/IPersistence/src/main/java/com/lagou/sqlSession/Executor.java +++ b/Module1/code/IPersistence/src/main/java/com/lagou/sqlSession/Executor.java @@ -3,9 +3,11 @@ package com.lagou.sqlSession; import com.lagou.pojo.Configuration; import com.lagou.pojo.MappedStatement; +import java.beans.IntrospectionException; +import java.lang.reflect.InvocationTargetException; import java.sql.SQLException; import java.util.List; public interface Executor { - public List query(Configuration configuration, MappedStatement mappedStatement, Object... params) throws SQLException, ClassNotFoundException, NoSuchFieldException, IllegalAccessException; + public List query(Configuration configuration, MappedStatement mappedStatement, Object... params) throws SQLException, ClassNotFoundException, NoSuchFieldException, IllegalAccessException, IntrospectionException, InstantiationException, InvocationTargetException; } diff --git a/Module1/code/IPersistence/src/main/java/com/lagou/sqlSession/SimpleExecutor.java b/Module1/code/IPersistence/src/main/java/com/lagou/sqlSession/SimpleExecutor.java index 1924a25..c5b4fa8 100644 --- a/Module1/code/IPersistence/src/main/java/com/lagou/sqlSession/SimpleExecutor.java +++ b/Module1/code/IPersistence/src/main/java/com/lagou/sqlSession/SimpleExecutor.java @@ -7,13 +7,18 @@ import com.lagou.utils.GenericTokenParser; import com.lagou.utils.ParameterMapping; import com.lagou.utils.ParameterMappingTokenHandler; +import java.beans.IntrospectionException; +import java.beans.PropertyDescriptor; import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.sql.*; +import java.util.ArrayList; import java.util.List; public class SimpleExecutor implements Executor { - public List query(Configuration configuration, MappedStatement mappedStatement, Object... params) throws SQLException, ClassNotFoundException, NoSuchFieldException, IllegalAccessException { + public List query(Configuration configuration, MappedStatement mappedStatement, Object... params) throws SQLException, ClassNotFoundException, NoSuchFieldException, IllegalAccessException, IntrospectionException, InstantiationException, InvocationTargetException { // 1.注册驱动,获取链接 Connection connection = configuration.getDataSource().getConnection(); // 2.获取sql @@ -40,12 +45,24 @@ public class SimpleExecutor implements Executor { // 6.执行SQL ResultSet resultSet = prepareStatement.executeQuery(); // 7. 封装结果集 - Class resultTypeClass = getClassType(mappedStatement.getResultType()); + Object newInstance = resultTypeClass.newInstance(); + ArrayList arrayList = new ArrayList(); while (resultSet.next()){ ResultSetMetaData metaData = resultSet.getMetaData(); + for (int i = 0; i ) arrayList; } private Class getClassType(String paramterType) throws ClassNotFoundException { diff --git a/Module1/code/IPersistence/src/main/java/com/lagou/sqlSession/SqlSession.java b/Module1/code/IPersistence/src/main/java/com/lagou/sqlSession/SqlSession.java index 1718a1d..a2410a7 100644 --- a/Module1/code/IPersistence/src/main/java/com/lagou/sqlSession/SqlSession.java +++ b/Module1/code/IPersistence/src/main/java/com/lagou/sqlSession/SqlSession.java @@ -1,5 +1,7 @@ package com.lagou.sqlSession; +import java.beans.IntrospectionException; +import java.lang.reflect.InvocationTargetException; import java.sql.SQLException; import java.util.List; @@ -13,7 +15,7 @@ public interface SqlSession { * @return */ - public List selectList(String statementId,Object ... params) throws SQLException; + public List selectList(String statementId,Object ... params) throws SQLException, IllegalAccessException, IntrospectionException, InstantiationException, NoSuchFieldException, InvocationTargetException, ClassNotFoundException; /** * 查询单个 @@ -22,5 +24,5 @@ public interface SqlSession { * @param * @return */ - public T selectOne(String statementId,Object ... params) throws SQLException; + public T selectOne(String statementId,Object ... params) throws SQLException, IllegalAccessException, IntrospectionException, InstantiationException, ClassNotFoundException, InvocationTargetException, NoSuchFieldException; } diff --git a/Module1/code/IPersistence/target/IPersistence-1.0-SNAPSHOT.jar b/Module1/code/IPersistence/target/IPersistence-1.0-SNAPSHOT.jar index 44873da2cef7db275d590f642e75483b76e2033a..bc5311c63ceb2ce91abe70ac3792e79bd5bb94b6 100644 GIT binary patch literal 16666 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 delta 1003 zcmbQ$#Mmsz8{o~%!o>grSDMl%@~SXj22v)oRe`)9urQQh0n*9&x%#N;zo;?;6;AeM zRO9CW84y%D!@e+tk%7T#vJt;~eNfaT{`%>01|J{re{h#vuFK_EHRERG=VxzczrFtb zxO#*4oRu02mnFoz%JPb`XJ};@p18j5{V{W%quUGLHyDuCo zqZ-fdW#qrRC9WaJrcAkQSt@(*<;Q*#X5=NyERySi_+4HF%>U+sKE#UlP!L=(d>)pJ_^~0luXYIDcwHrT)?OdIo zV{j!*?upqc@uQYpU&=47XP6eXe242)&zXUGrS|s@-rMxe%+-=Pb%n^*ISsN_jk|VV z5I-C~Q({3Fcd>|dvB&ysu3ueET}E0{B)=JjePu@p-pSP_THx?qVPXQN@0&RC@c~1* zcYEvW55Ndn#W-2d)VRKN!a@JT3KB=({}FAeUKq^3Y@tqEkGI+NC6_ByMXY@q*&=S+ z$G7CpWLGx7_r3c5?@uqPE;7$q^7+&(skH^23rr4`o%&*0Wo;wgpK+E!cJALvN(Vfo z;}<7$B)fJzn`|M7-wt4*1PV(KU`XX1mvfE~P z7xn}kW6x{Zv$Z<(r^(%@gU(i;?^pZ~-}pnX+x1bwALVI>R&1LqbFWxf$5->`(#A7i z&&@mLd%Wdp#e==JfkhLI4#Wn`k7?1!nI*rTe`Ap6$+HTRpWlmIvo|At{;Y4Q^$SvV zJ!AAbchvX;JkdhZ+~oIWhrz+K)!YP>d?&v#w+Hj}EcC&2f`w@`dV1!CCvE|Tw~qY4 zBnwL2If?1{rTUrqz+}$IB*F~J7-;F5iGe`|u9bmdNuw3xWOIHweuM^aPMTb2FU@p< zY4U7)S+Em!1G!(BCd)fW>!7Jb$z^JAqXiiL|JPv#YA{hijd2DBUAQ8U{RJRJ8k1)` a7&5J90W-fji1BeVa5MY`y0w56q!<9yy?VC* diff --git a/Module1/code/IPersistence/target/classes/com/lagou/config/BoundSql.class b/Module1/code/IPersistence/target/classes/com/lagou/config/BoundSql.class new file mode 100644 index 0000000000000000000000000000000000000000..9f5e80258157312d1a0ad8759d75a3604ee7edc9 GIT binary patch literal 1312 zcma)5e{0iF6g@BfWov6^+qJfxTc=LjC3qPQSi^Si!q~3YMO}iQzXQto#$XbWWK z?2&Jh`keakjp`O}f% z9_phBJ*B=g)+a;Vwd6T+CcSsoT%ftaKX&Z5mZ?2;eEW!Gl6JmAyV*X^+8GMes4Xr! ztVL-dbhR3f&N(kwgBr!G=P5_ZmNZgV_3vw+%obOF91p*c0127iw`|Mn3GA(@MXa-3 znegKOaTg}f4IJMc8_zA-)54-l_vL8jaS7Qxa=4twHaY_3U|@rKJaJw9Bud1T)1M(#+6krSh-_ol?9&H-C-snp{%Lux$nLEIrrZ4ZugBl zzx)c|QCx|l1t}TNMNx%R1Y0mDVXvI_b2^G z`%6|fV>*l!D;Q4E^miq+wu3RjEb4dsoT2gkF{8u?M3 zrdEEG5yBHjw!}l(%$hkf?@Fjo+Rmt+v2$(X`T>8FdeNLwD40&laL1UcV;1d_lQ#Di zhg?FC(6}fv33ZdXY`#!jGZp|s2VCz^#;45K#py@0ZOil%p&a$ zupcaOosX&HT3J156&wUg7P)WZEnUf|9or zGR|?!$92#WTx(p&o*kmuDz;*qgf$N$w2A~;iLl&t@@r_{@j=rd2~|vDO2#WHUd3yS zsp~-rr&R36c?k_3sk|bWizwrD6>s288E>h08}F!i7w<_}QH~Mhrs92kpyESZkdP24 z|5tU{>5OAdm`+dDC>B+GBz$~~i=^>*W+Z*o$*Q;{mP)B;I)eQwKJnHC>YuZnjEYZj zQN?HYoJzXxw~FE%v1NRr;!AubVMDog<$F4ht)j@6ReX(ame8JetI5mqH9R~rPQFT5 zT`tTVx$pH`!g|kO#5D3nJ*e^2u<6muAgt*^7ITgQuS3>Qm=?+$2s>YVY zBAk@4DTq}$PZA5*%pkR8e)v~Gv0Rg*)^^A_x-K6d3ibuE`*+#fF{3zOPO@B_yC*q! z^WLIi&WQ)auc(M?xSVk#CD$DGCtUN=cq>!zrieRNW(ggOnE9Y9t%5w}Lx{1IWkILZ@?!SXX+@ZureTOR!G5z)imJ50i=!0!SliD7Kuw?PZP894RDETU9J znUjmp?Og3gH6@^~^*W^1SyY|4j_RKf`q9(e!DlTsfRzYg6_!JT&XwxhU?;ytgzsJ0 zO~3S4)k5uM+`BW2FkRJborc`MZ3c>jf$j0g45C%&49z0OL$x!kg=Vl!LT8OuGlN8{X*3+WdiTaG8tJM@c+kS}mD5-?4b77u z^5oT?yvCE)dh$9?ez^4-LR!r<)^Cq*@L@5Wk4Djy08NLG0yGgV5`V;p5Y?hTV`FD* z7Mo58Ki9FjQ`J;0HjU=1cYl|DUCaO}t__QYgA z#@Lawtl)WCU0{tbv$o%{y5FM>*U*le*n>au7;d2hxA8dsK_~u2x7Up;>`RKDWNp+_ z=rKy&c0?FsJuNyQ({eR!+Ieyd4Ycgy*WGRIcjE~nyGcYsFCzLD^i)WDsVDLLHlD;& z>~B5(#y;v*GmF2-oE~zb8GoRck-|iO2?y~sYKXTF&+t^nA$n}0rLW°CYFXV3Di PhG$9iGs*y0RXF?~@dV=7 literal 0 HcmV?d00001 diff --git a/Module1/code/IPersistence/target/classes/com/lagou/config/XMLMapperBuilder.class b/Module1/code/IPersistence/target/classes/com/lagou/config/XMLMapperBuilder.class new file mode 100644 index 0000000000000000000000000000000000000000..5a1a5cb5fec66b7691e930ee1ab03f9ec2787edf GIT binary patch literal 2308 zcmaJ@+fy556#s25Y%U9waA^aSQcGJdg{@k(0#;itiUwK;Qd;X}Nw#5elMR~z4A zOo!2r85y$?_%SVp*Q0m?b0JJb(SkQacuUNQDCV&c#ZBB2!=j9(5Jp2#L%1x?lQNbg zXcq|Wcv}oBVz@1a)d=q3u8emg=oSjyxEI2^Vty}*_wj)YO~#sp=9HDYZ)A$L<``B^ zLSG_fWmQwlSVc8&ZCL7*_k2P^)1;9zoNE%!4*tLD(29h>l$F*cv?h$4zEI4r>Gra= zW>OMMSSih1(QHHPtHOY@ZWJV(^WavZQ&;B`^IATy+c%1anbvK_5zK3Lfk>wY6C2u= zrW%$ym&+HOq+{z^c0zdf8EN6kJvOymM&+52%g{Jt>xH7}Ebrurpb$yRI*iTT%7smH zS>JXTc2@XICmqevvwDt_eotsFJ8o2U4MNMhSygUNSawEDTiGic>P$t*bDu$$JCBT6 zLMUyeiWOHK9_#6V>?P;x(cLdQLeDWSk_PsCXzkhN&iuf4x=uUcE*8;yrfXK{tO3#ZrDac51pR|g0N}n}EMmrmGG$wdgFo3jzXK;@G z>vS+#$?L02y2e~8&~aZzM!`A^1snK~Jg92rHVP(T%E&6n!IF_zunAfez+|-5@v2cO zC}N8>+)%;|NmB3;wiWD%;ei-F#tQ9cf=7<2a8H(M5KL0+FtCJ{jP5LX z3#W5%$YWkhG8Hw4Z)C0L=qs98WLhs&oqONU&{0on;CMxE5w^Hg>`RzxgD+2WESm+w zpz6nSRk^s+VJRQlx>i_l-znL;%U+XnHyt$)H{uH2gou&>@v4_?BP-#c(tcYA7IbHh zjCUS&7dDh;o-cViM=STY4m6J@N|KwVgx-2t9B!lZz;GJMl3UhvEqa$BiWqv6=t4P$ zHF{K7hjLMGks-&bT#b>}8Fc;l*(oJl^#WF@^59h^-gH+*{D$@O2e6-s$IX?G>j9kS zc!9fF?tPpi!%rX$k35F&H&^E(#});@xW*-Ttuyr~RD!VmaX ztePb}Ma#Gxmt(CJn-G^LD$6jJZIxvtPRJPTqq}IQzm9PwuEawnbaD!p(8VcI!bwii z5>5^O4qplJU362oCmtxFH+GtXu;?wJFRqkv#*f=S|634L_#vp6B@N&=SwRnp=*4ON zT|^({XRt_$?~&vTsmPP!9n$-V1b;&^zN6OnB<@cV_LKw(3Lg+<5hg}4h7c_^s9c3< zzkyoi@bzJkZNikF#ycKnKQ>iHSr mPnaM|fHC~Y_WTNhxJGM*`W4Bml)OesfRgL{-Qe1Xss8}Ohe>t- literal 0 HcmV?d00001 diff --git a/Module1/code/IPersistence/target/classes/com/lagou/io/Resources.class b/Module1/code/IPersistence/target/classes/com/lagou/io/Resources.class index fddac3aadde856e305f09eeb6a6a56146f1f3559..30996a6e2dcb8815aaa6d216e63f45452975300b 100644 GIT binary patch delta 25 gcmdnRvWI0t1D{ZOYDrLPaeir0a;jtT#-4SI0DG?q*8l(j delta 23 ecmdnPvWsOx1CKy@YDrLPaeir0a_Yvub&LRMLl_2!eblxajUG_{Cyk<1-sx(2WoHkzh9Qae&$#QrcRkM*o#2ZZ^@x zAK;HN-kH{2+ORL1Ceu5&cg{KY%;Mh?9aOgvP}qaq#`@r0qg z;F3@MD4g32?a7jV=3lJ!C)av$o*yzaS3C&p#Z+=>uWV1g<^e-ZS6h)3u0;tdD@}#t zaT$e#HBNs$jJGcL9BV2=;W@*}++SHPcl^i-{H3ojHaUhPLNpJBC*+7B-#<8JFvk9Z zuxk_H*>9rN%nsl4nM;}G#GiBbn1@2`lcXU}#F}A0OEmVqkHU#UE`{$AN!79CMY{|; z{e#PlsIJqco&NSpCALMdnVz(7jRbzvxtH1875!?FzHOY%Smy<$64*|g_BHr#+)<|b zN@5g4Ii9Q|q3!FoGe z+H;964S12JKSvKC=!oFJP|GJ>vO@N@2#LM9OCY=0OF-Uj3etY$bvv;iT@uv0 aL{RMaKD8cuWs-YU!j4()QFLFM)BOishXZ5) literal 0 HcmV?d00001 diff --git a/Module1/code/IPersistence/target/classes/com/lagou/pojo/MappedStatement.class b/Module1/code/IPersistence/target/classes/com/lagou/pojo/MappedStatement.class new file mode 100644 index 0000000000000000000000000000000000000000..01897a2a586121822d5a937ef027b823287551ad GIT binary patch literal 1129 zcmaKq+iuf95QhJCY=;=9DWNULmZnfhg1{;g7aY_ZBqXG8P=k8ENmjv;V;g6K#9M&` zLgIo4;GqyRn@DZUhMSq4^EbQu`_Io`0FH1kKo$En_-L^>U~!wpohlBixGUhqBY|db zB0tF}k?A<<>mp9a&jf-(&E|=I|2bCzVJ-_f)v8#SmD$Hcz<(a6u|5{4v^%E)?u%?h zsf}KosyFlLfRg1PAy2cH4P|mFiXd)pZczN)%61LPSoQdn(>E(q$Q*)x zHZO+iWy}k1m7pK;b%v;8Bg6&NLIf->vItQV*!%y^0-I;=@pdp#LyZdZg%T-gLW%eRLSh9=qS25_H=-4FX1l!&+u7`f{b0a1 zpB$fka~z#<@L8BqI<+(6v;T+4U*UM}X6fEG)$!vYo7|J%`JLZ6_nfo8{_)e#08ZoM z3`TJ#jRQE#@k$0soXOxE&Sz0UmE%=una|MQuVrxo7dc)Z!a@dFT$1M+N1fvhjyD;G z4aZ(HJAteFreiZqH4Ud*w)Bn@lzYy)Q(jR2uQ2SdnzrfBGfWr$9y)uKA+_MF3Wfts z(-y6uyCU4SzG9JOtmzoKbyaswd5(-J|GMchsJz|{OB0?)(#n^_njTobwrwFX8BbWk z@SCRRGn_3n*Y%q^iMKmt&38?^Q@N&?7FX5@Tbb>f0^hXC(vfJgp0E3&D{Q~9Dzy#J zP})7+)w`tb;2x9=Bc9pqS)z7J7=iD&49At?C`o8LU^0W+EkpEV?LCeL$6Fk4b2K?F zbF?@X8Pb~Bv2{OisccKt+IdA?l+pZuOT5~yRpv=Tx?jXan*yBsS5#r8BM}VT2@6a$ z8XYY0#Lf%9-FtlLUzI*ijx4&w`-ksr!%A2H0t;S`Yr$S#qn6Z!6(qkT65 z;ofF2)I~U`siJI{y&CTy?!J*&Y=4cWJo6Kp7ph8w(pE)BJ5^R|ywKP~JErNCGYYB- zeG+o0=xvpx--j?x&j~u!$)2F^OmPFOSo#r(dvr?RNqUYDRz6e2k|v&~=rqws<7rIN ziTpxVhEL^05ngiIHMfZjy%q0ZcnjI(vD^lRAIv2;F_M6kmJG`<7P`z(fD=^60tqZC67$;< p^V<^hkwi`70AdIdkUm{qyk!;1oq2No=IBgo1`m9SLk{*w(P4VV5Co39sXHBcF$k z@EGPF{m|hZ!=^Yj%Qy-{kHAj^0rHr zd_!2=ZE@d`cv4iu2Pa@KXMBT4w`m6fMKiDL4v*ZhIjz*W6$<~EGG)ZT_TmP^LAmm` zNlYS{-V~8<*>y)ID$esi>G3CSK*yeeWuzDm;}cpGPfAu8j{nD=Y=$8xm!k{ty5>#0 zXItUC1>>zuwTW`2g%aI#5)2xBicCzeK%qIMq0t~zC#=w4uMWYgNAFNxN1QZ`8G0We zjY|9!DKdl#V>YtL5hC5lm66*j@)OT9(lP28pGe$Q-=GYkz7SR*U1c8WE!~VUZ{o(V IHe#*+0v{2nLjV8( literal 0 HcmV?d00001 diff --git a/Module1/code/IPersistence/target/classes/com/lagou/sqlSession/Executor.class b/Module1/code/IPersistence/target/classes/com/lagou/sqlSession/Executor.class new file mode 100644 index 0000000000000000000000000000000000000000..03a2b5577dc93229eb62bd8a146db80c65344553 GIT binary patch literal 685 zcmcJN%}N6?7)5WYHdd|H{~u6vrw9&iol=m}f>0|m-MNY}9jC-(oFt`g1YgUA58y+I z>4YYlCGQ`vZvalQL$OS;LNN2_MD|3$4?A2x1d_$t1*snBps7_qiCxBQ zqE+~N_mZWlxQi^a;z1}I-gE|R$ozQ~2UoWP!EJc-RdP0wK_@XbB$#WBxJbuBL$OM+ zMzKz@L9t1(MX^m#iIP|`>oP&`TyLHI)i(Y=X}#A98{@cS{cZ@sdS3E$5M6hET0yWsL7S2p)77@Eow_R^dlRIqBggOC ziI7F0;JA=d#7v%Z?n4zE2f5=`FlB-ZWixG3|4u%2fhlT~u}s+{{{RK#coHQOed!h6 zHq<=ldMt~D{h`YQ1SS9F05bi8DNOs-j9=A2QTAgN70h8C3#j^P35%Xz%4fAtUDVZ} literal 0 HcmV?d00001 diff --git a/Module1/code/IPersistence/target/classes/com/lagou/sqlSession/SimpleExecutor.class b/Module1/code/IPersistence/target/classes/com/lagou/sqlSession/SimpleExecutor.class new file mode 100644 index 0000000000000000000000000000000000000000..6e22fbf83ebd7bf0e95e4645c42094d273f1a811 GIT binary patch literal 5211 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 literal 0 HcmV?d00001 diff --git a/Module1/code/IPersistence/target/classes/com/lagou/utils/ParameterMapping.class b/Module1/code/IPersistence/target/classes/com/lagou/utils/ParameterMapping.class new file mode 100644 index 0000000000000000000000000000000000000000..d8bf2a172091eddee120ed4147f59ca86f61dc21 GIT binary patch literal 871 zcmah{O>fgc5Pj<;c4FMt4K;;Opy>xmgTUep^gyIu2p>{Wr5-oVDs1K0m9yr8`k#sf zsRR-~fFFgJwVkwbkhsk3%+9=dZ+3tG`SALT}`BFww9Wr>`L@1HG<>%-5XnQPF ze@hRO(S173mYlV@~S>wSZ9NrxQH%#uz9@;^=KmPpQxN(q1vp?2$x8ab2~Fw?gg0{>SdDN4U+8z$-9}9 Gdw&7tfvoNT literal 0 HcmV?d00001 diff --git a/Module1/code/IPersistence/target/classes/com/lagou/utils/ParameterMappingTokenHandler.class b/Module1/code/IPersistence/target/classes/com/lagou/utils/ParameterMappingTokenHandler.class new file mode 100644 index 0000000000000000000000000000000000000000..e25dd16e540479d60868c1cc57adb6a33c03e2b4 GIT binary patch literal 1505 zcma)+eNWR+6vm(1Z7q8N#u!6oDxl(Ca23U&8JRI8#+Xe>MrQE8yR8|;(k@+R!ne{y zvnYulzz=0Sw=Jv`lJQ4xZ%^<2-SeF1w15Bo{sUkOuM$Y2sGyX9gkl^CloK>;Ch-K7 z8K?@LCNP671bSFp{nFyJ;n(HzZg^1(ni`$L9wd4UzwV@B48biFL_f77M zY>i<%^m@0^wN6xn_pOn;XQ=Lnn6)|~`eG+%2wQWP-8&teJGc{GexuU`GSRX|c2|3=i|$wp%MBV{5niRR zfDFUpq=(%w%qV(TbqM2aQdgQQ7cZOTI?X%t!ORUY5 zejr*Zj}iL?S;D7`@{OVrCbU_~X3nMMyd6G`_Tmm!h$jh;d~TDt5h5hdFmp)Qcyluh z%pgv3M0%^<(hFeH2gV6`5BFZsqD_^B2AtxqMon=;|6a;q`~Uy| literal 0 HcmV?d00001 diff --git a/Module1/code/IPersistence/target/classes/com/lagou/utils/TokenHandler.class b/Module1/code/IPersistence/target/classes/com/lagou/utils/TokenHandler.class new file mode 100644 index 0000000000000000000000000000000000000000..bbaed793147fc8f37848515391b50ed8e39bfa1d GIT binary patch literal 184 zcmX^0Z`VEs1_nb0PId-%b_Nbc2JVc+yp){Oko@e_JVpjJ4WF#UvPAuy#JqI<;F6-u zymV_#Od&=FuHgLAqU2P!%$!t420^fH53oT+dLRQB8Dx_4bAiUB=a=f2mSpA>>m#dS oWDr1Dkuh5!Hn literal 0 HcmV?d00001 diff --git a/Module1/code/IPersistence/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/Module1/code/IPersistence/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst index 2374af1..9ddf5c0 100644 --- a/Module1/code/IPersistence/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +++ b/Module1/code/IPersistence/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -1 +1,17 @@ +com\lagou\utils\TokenHandler.class +com\lagou\sqlSession\Executor.class +com\lagou\config\XMLConfigBuilder.class com\lagou\io\Resources.class +com\lagou\sqlSession\SqlSessionFactory.class +com\lagou\config\BoundSql.class +com\lagou\sqlSession\SimpleExecutor.class +com\lagou\sqlSession\SqlSessionFactoryBulider.class +com\lagou\utils\GenericTokenParser.class +com\lagou\config\XMLMapperBuilder.class +com\lagou\pojo\MappedStatement.class +com\lagou\sqlSession\SqlSession.class +com\lagou\pojo\Configuration.class +com\lagou\utils\ParameterMapping.class +com\lagou\sqlSession\DefaultSqlSessionFactory.class +com\lagou\sqlSession\DefaultSqlSession.class +com\lagou\utils\ParameterMappingTokenHandler.class diff --git a/Module1/code/IPersistence_test/.gitignore b/Module1/code/IPersistence_test/.gitignore new file mode 100644 index 0000000..a9f9bb2 --- /dev/null +++ b/Module1/code/IPersistence_test/.gitignore @@ -0,0 +1,28 @@ +/target/ +!.mvn/wrapper/maven-wrapper.jar + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/build/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +.gitignore +src/main/java/com/lagou/test/ +src/test/ diff --git a/Module1/code/IPersistence_test/.idea/compiler.xml b/Module1/code/IPersistence_test/.idea/compiler.xml index ac48456..7a13c43 100644 --- a/Module1/code/IPersistence_test/.idea/compiler.xml +++ b/Module1/code/IPersistence_test/.idea/compiler.xml @@ -9,5 +9,9 @@ + + + + \ No newline at end of file diff --git a/Module1/code/IPersistence_test/.idea/inspectionProfiles/Project_Default.xml b/Module1/code/IPersistence_test/.idea/inspectionProfiles/Project_Default.xml deleted file mode 100644 index d74e278..0000000 --- a/Module1/code/IPersistence_test/.idea/inspectionProfiles/Project_Default.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - - \ No newline at end of file diff --git a/Module1/code/IPersistence_test/.idea/misc.xml b/Module1/code/IPersistence_test/.idea/misc.xml index f71dfb9..3c6f639 100644 --- a/Module1/code/IPersistence_test/.idea/misc.xml +++ b/Module1/code/IPersistence_test/.idea/misc.xml @@ -1,6 +1,5 @@ - - - - + \ No newline at end of file diff --git a/Module1/code/IPersistence_test/.idea/workspace.xml b/Module1/code/IPersistence_test/.idea/workspace.xml index cbd4f3e..90515e2 100644 --- a/Module1/code/IPersistence_test/.idea/workspace.xml +++ b/Module1/code/IPersistence_test/.idea/workspace.xml @@ -1,19 +1,25 @@ - + + + + + + + + + + + + - - + + - + + + + + - - + + - + - - - - - + + + + + + + + + + + + + + + - - 1615100906021 + + 1615212268686 + + - - - - - - - - - - - - - - - - - - - - - - - - - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + \ No newline at end of file diff --git a/Module1/code/IPersistence_test/IPersistence_test.iml b/Module1/code/IPersistence_test/IPersistence_test.iml index 78b2cc5..c889830 100644 --- a/Module1/code/IPersistence_test/IPersistence_test.iml +++ b/Module1/code/IPersistence_test/IPersistence_test.iml @@ -1,2 +1,24 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Module1/code/IPersistence_test/src/main/java/com/lagou/pojo/User.java b/Module1/code/IPersistence_test/src/main/java/com/lagou/pojo/User.java index 068fefb..039d3d3 100644 --- a/Module1/code/IPersistence_test/src/main/java/com/lagou/pojo/User.java +++ b/Module1/code/IPersistence_test/src/main/java/com/lagou/pojo/User.java @@ -3,4 +3,28 @@ package com.lagou.pojo; public class User { private Integer id; private String name; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public String toString() { + return "User{" + + "id=" + id + + ", name='" + name + '\'' + + '}'; + } } diff --git a/Module1/code/IPersistence_test/src/main/java/com/lagou/pojo/com/lagou/test/IPersistenceTest.java b/Module1/code/IPersistence_test/src/main/java/com/lagou/pojo/com/lagou/test/IPersistenceTest.java deleted file mode 100644 index 609f852..0000000 --- a/Module1/code/IPersistence_test/src/main/java/com/lagou/pojo/com/lagou/test/IPersistenceTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.lagou.pojo.com.lagou.test; - - -import com.lagou.io.Resources; -import com.lagou.pojo.User; -import com.lagou.sqlSession.SqlSession; -import com.lagou.sqlSession.SqlSessionFactory; -import com.lagou.sqlSession.SqlSessionFactoryBulider; -import org.dom4j.DocumentException; - -import java.beans.PropertyVetoException; -import java.io.InputStream; -import java.util.List; - -public class IPersistenceTest { - - public void test() throws PropertyVetoException, DocumentException { - // 1. 获取配置信息 - InputStream resourceSteam = Resources.getResourceAsSteam("sqlMapConfig.xml"); - SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBulider().build(resourceSteam); - SqlSession sqlSession = sqlSessionFactory.openSqlSession(); - User user = new User(); - Object selectOne = sqlSession.selectOne("user.selectList", user); - - } -} -- Gitee From ecbedd13b1052b4bbc18788bfb85e42583f0b0b6 Mon Sep 17 00:00:00 2001 From: luyang Date: Mon, 8 Mar 2021 23:28:33 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/lagou/io/Resources.java | 1 + .../target/IPersistence-1.0-SNAPSHOT.jar | Bin 16666 -> 16729 bytes .../classes/com/lagou/io/Resources.class | Bin 572 -> 714 bytes .../compile/default-compile/inputFiles.lst | 18 +++++++++- Module1/code/IPersistence_test/.gitignore | 2 -- .../IPersistence_test/.idea/workspace.xml | 34 +++++++++--------- .../java/com/lagou/test/IPersistenceTest.java | 31 ++++++++++++++++ 7 files changed, 66 insertions(+), 20 deletions(-) create mode 100644 Module1/code/IPersistence_test/src/main/java/com/lagou/test/IPersistenceTest.java diff --git a/Module1/code/IPersistence/src/main/java/com/lagou/io/Resources.java b/Module1/code/IPersistence/src/main/java/com/lagou/io/Resources.java index 7af3fba..369e4bd 100644 --- a/Module1/code/IPersistence/src/main/java/com/lagou/io/Resources.java +++ b/Module1/code/IPersistence/src/main/java/com/lagou/io/Resources.java @@ -11,6 +11,7 @@ public class Resources { * @return */ public static InputStream getResourceAsSteam(String path){ + System.out.println(path); return Resources.class.getClassLoader().getResourceAsStream(path); } } diff --git a/Module1/code/IPersistence/target/IPersistence-1.0-SNAPSHOT.jar b/Module1/code/IPersistence/target/IPersistence-1.0-SNAPSHOT.jar index bc5311c63ceb2ce91abe70ac3792e79bd5bb94b6..a205d9e1d194b32d529959fb3ef633d030a5d653 100644 GIT binary patch delta 1147 zcmbQ$#CWrbkte{LnT3l11e$hD<$gSkAM8Xh*ImEWAy-GJ?MSR`@lUk%8gVWFvl+`k>ohhaCiLZy#IN zyK(K+tiAWQu1xq48Ms7&!|`a>``f#&c+8rTqWmNLl{2gS9|n7`IZL*><}w-2G%il_ zOZ)!$^{fy z`_%Opl{vGSFM22xwB_%zf_&Hd2S*C!uUy$HY&7NVvisX&E`Cxz{c&x!N?UgIAOD|h@Z#%| z_cMjFPx2mncYG<^v58M3j5qZ0_W3eL-$!O)#6Y*i>!)HvM-g z2Mpp3-`a=n73tOO^_eioK3(wi!nYYEu8-7N#oqU<@tf#6Z=(F_eT{onUUF`l$#Uj^ zLiQIfgHD;BI-fMYoK*KTPIx7{GE4mBqH9atVpA07vGN91oIK`_lHD#`+iP*uroj3D~1)I2aqGYUsK~$ktFj|tkXazPxz*>g!#bjM; zaDq*+mSNHpo?K^bqyS2v9NaHk&N4GFBy%t@=ztSHgjmw(C_4F}s`z9dNx{iKtc5@p z@Yu*OMMy$LhHKoN<_OJ#&7@37(lTP6SPVq*p{ zEARuYQ$?|gMGdG}eeyqRuz?x2GED2$fg*~N>onLWud@{bYiFHOA@&2P{TfiaF^cvE z4X9!fkX`a1Z$%t1F8Kje$jr{bpn;% zJ06aeRufM*Gxq;o6W7os^ShqY`EudnPT2x|uUz|0@-9M4H)>DPJ87d>|LXM;eb)H~ z5xLJh?Tdq2=G~pXQNAiRn{VPDvpLHq1uUA>X!NvbPV9gGgA2YF-e$+pQ((bMcc`M$Y1yQ=eKCT6r2{I|A13B>yp{ei=96_j_|DAmiTnd zhG)97*6rJNFd({eQcmEUMGpVfe{&_=d?8}KVw0xvsio(nZ)D%Qw`9e$1zd9%8LB6A z`z?59cBb`*k~#C2ti-mYbhf9dM-TpaykKz;S8ChbIiY{qVDZKQjJM5S1YE!oVI?dG zrhP?4SwInzBDswbM9WCe1JiqCf;d5Z0kxGN{^Z^2=Rw>a4R^4%t6DZ-ZNmE8V7`Lk zIS@VhgYj_?wbKNg2A-Lif;7pRUSXO%$3kE-qlG#!)lAm1SOw-jvCs$8%9h$-I?hrT zOwYD72GjQ}^+1O4S$Tt~XscilwZSSFE#U}Q+kzzgtz{TjPR_9gC%gI9GEDDxAB914E_BKkUHf@Yu^RT{QrTm`skd=K-n70g5a&o@Amjd7V8EG^lx)|NqaMeA8YI z%x8DtW14L;xzJR4@&pT+$$miYB@kC*a+`w|quAt)4pB@G&42QMpXS z-Jx?m?gn8e9DDAdttkHkEA%K9^#k!W7e;v{?>l1a27cSVc|KR8Nk%q_PYQ*6S*j_M zBV9?)w%$>%37wZ}B%pyMcWWVFnH8CGtWpppHeV!RP<$iRib$6-kpx8;FG8k>gG}j& TQP;%xn^vSqNeEdfk*@s!j|e?K delta 204 zcmYj}OAdlS5JcaMz{rS*Amd-wx-;#nGz!5* z`_)mqb0}FLTdP(y>b%cD9E1#sTUPv``vsfon%=I)yGg2r`8C9U4VDp!TomJuO24St B5rO~! diff --git a/Module1/code/IPersistence/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/Module1/code/IPersistence/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst index 1d58457..d271295 100644 --- a/Module1/code/IPersistence/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ b/Module1/code/IPersistence/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -1 +1,17 @@ -D:\StudyWorkspaces\IPersistence\src\main\java\com\lagou\io\Resources.java +D:\StudyWorkspaces\Module1\code\IPersistence\src\main\java\com\lagou\pojo\MappedStatement.java +D:\StudyWorkspaces\Module1\code\IPersistence\src\main\java\com\lagou\sqlSession\SimpleExecutor.java +D:\StudyWorkspaces\Module1\code\IPersistence\src\main\java\com\lagou\utils\ParameterMappingTokenHandler.java +D:\StudyWorkspaces\Module1\code\IPersistence\src\main\java\com\lagou\utils\TokenHandler.java +D:\StudyWorkspaces\Module1\code\IPersistence\src\main\java\com\lagou\sqlSession\SqlSession.java +D:\StudyWorkspaces\Module1\code\IPersistence\src\main\java\com\lagou\utils\GenericTokenParser.java +D:\StudyWorkspaces\Module1\code\IPersistence\src\main\java\com\lagou\utils\ParameterMapping.java +D:\StudyWorkspaces\Module1\code\IPersistence\src\main\java\com\lagou\pojo\Configuration.java +D:\StudyWorkspaces\Module1\code\IPersistence\src\main\java\com\lagou\config\XMLMapperBuilder.java +D:\StudyWorkspaces\Module1\code\IPersistence\src\main\java\com\lagou\sqlSession\SqlSessionFactory.java +D:\StudyWorkspaces\Module1\code\IPersistence\src\main\java\com\lagou\io\Resources.java +D:\StudyWorkspaces\Module1\code\IPersistence\src\main\java\com\lagou\config\XMLConfigBuilder.java +D:\StudyWorkspaces\Module1\code\IPersistence\src\main\java\com\lagou\sqlSession\DefaultSqlSessionFactory.java +D:\StudyWorkspaces\Module1\code\IPersistence\src\main\java\com\lagou\sqlSession\DefaultSqlSession.java +D:\StudyWorkspaces\Module1\code\IPersistence\src\main\java\com\lagou\sqlSession\SqlSessionFactoryBulider.java +D:\StudyWorkspaces\Module1\code\IPersistence\src\main\java\com\lagou\sqlSession\Executor.java +D:\StudyWorkspaces\Module1\code\IPersistence\src\main\java\com\lagou\config\BoundSql.java diff --git a/Module1/code/IPersistence_test/.gitignore b/Module1/code/IPersistence_test/.gitignore index a9f9bb2..314079b 100644 --- a/Module1/code/IPersistence_test/.gitignore +++ b/Module1/code/IPersistence_test/.gitignore @@ -24,5 +24,3 @@ /nbdist/ /.nb-gradle/ .gitignore -src/main/java/com/lagou/test/ -src/test/ diff --git a/Module1/code/IPersistence_test/.idea/workspace.xml b/Module1/code/IPersistence_test/.idea/workspace.xml index 90515e2..e4a2d1e 100644 --- a/Module1/code/IPersistence_test/.idea/workspace.xml +++ b/Module1/code/IPersistence_test/.idea/workspace.xml @@ -2,16 +2,11 @@ - - - - - + - - - + + @@ -115,22 +111,22 @@ - + - - + + - - + + - - + + - + @@ -139,5 +135,9 @@ + + + + \ No newline at end of file diff --git a/Module1/code/IPersistence_test/src/main/java/com/lagou/test/IPersistenceTest.java b/Module1/code/IPersistence_test/src/main/java/com/lagou/test/IPersistenceTest.java new file mode 100644 index 0000000..033645c --- /dev/null +++ b/Module1/code/IPersistence_test/src/main/java/com/lagou/test/IPersistenceTest.java @@ -0,0 +1,31 @@ +package com.lagou.test; + + + +import com.lagou.io.Resources; +import com.lagou.pojo.User; +import com.lagou.sqlSession.SqlSession; +import com.lagou.sqlSession.SqlSessionFactory; +import com.lagou.sqlSession.SqlSessionFactoryBulider; +import org.dom4j.DocumentException; +import org.junit.Test; + +import java.beans.IntrospectionException; +import java.beans.PropertyVetoException; +import java.io.InputStream; +import java.lang.reflect.InvocationTargetException; +import java.sql.SQLException; + +public class IPersistenceTest { + @Test + public void test() throws PropertyVetoException, DocumentException, SQLException, IllegalAccessException, IntrospectionException, InstantiationException, NoSuchFieldException, InvocationTargetException, ClassNotFoundException { + // 1. 获取配置信息 + InputStream resourceSteam = Resources.getResourceAsSteam("sqlMapConfig.xml"); + System.out.println(resourceSteam); + SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBulider().build(resourceSteam); + SqlSession sqlSession = sqlSessionFactory.openSqlSession(); + User user = new User(); + User result = sqlSession.selectOne("user.selectList", user); + System.out.println(result); + } +} -- Gitee From dc3e8e14c37dc33db6f329e342afeb798a3f3688 Mon Sep 17 00:00:00 2001 From: luyang Date: Sun, 15 Aug 2021 17:09:35 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E9=98=B6=E6=AE=B5=E4=B8=80=E5=AE=8C?= =?UTF-8?q?=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Module1/code/IPersistence/pom.xml | 13 +- .../lagou/sqlSession/DefaultSqlSession.java | 44 - .../java/com/lagou/sqlSession/Executor.java | 13 - .../com/lagou/sqlSession/SimpleExecutor.java | 91 - .../java/com/lagou/sqlSession/SqlSession.java | 28 - .../com/{lagou => yang}/config/BoundSql.java | 23 +- .../config/XmlConfigBuilder.java} | 45 +- .../config/XmlMapperBuilder.java} | 38 +- .../com/{lagou => yang}/io/Resources.java | 15 +- .../{lagou => yang}/pojo/Configuration.java | 9 +- .../{lagou => yang}/pojo/MappedStatement.java | 48 +- .../yang/sqlSession/DefaultSqlSession.java | 140 ++ .../sqlSession/DefaultSqlSessionFactory.java | 10 +- .../java/com/yang/sqlSession/Executor.java | 53 + .../com/yang/sqlSession/SimpleExecutor.java | 156 ++ .../java/com/yang/sqlSession/SqlSession.java | 63 + .../sqlSession/SqlSessionFactory.java | 4 +- .../sqlSession/SqlSessionFactoryBuilder.java} | 22 +- .../utils/GenericTokenParser.java | 2 +- .../utils/ParameterMapping.java | 9 +- .../utils/ParameterMappingTokenHandler.java | 4 +- .../{lagou => yang}/utils/TokenHandler.java | 2 +- .../target/IPersistence-1.0-SNAPSHOT.jar | Bin 16729 -> 16924 bytes .../classes/com/lagou/config/BoundSql.class | Bin 1312 -> 0 bytes .../com/lagou/config/XMLConfigBuilder.class | Bin 2786 -> 0 bytes .../com/lagou/config/XMLMapperBuilder.class | Bin 2308 -> 0 bytes .../classes/com/lagou/io/Resources.class | Bin 714 -> 0 bytes .../com/lagou/pojo/Configuration.class | Bin 1194 -> 0 bytes .../com/lagou/pojo/MappedStatement.class | Bin 1129 -> 0 bytes .../lagou/sqlSession/DefaultSqlSession.class | Bin 2147 -> 0 bytes .../sqlSession/DefaultSqlSessionFactory.class | Bin 688 -> 0 bytes .../com/lagou/sqlSession/Executor.class | Bin 685 -> 0 bytes .../com/lagou/sqlSession/SimpleExecutor.class | Bin 5211 -> 0 bytes .../com/lagou/sqlSession/SqlSession.class | Bin 783 -> 0 bytes .../lagou/sqlSession/SqlSessionFactory.class | Bin 199 -> 0 bytes .../sqlSession/SqlSessionFactoryBulider.class | Bin 982 -> 0 bytes .../com/lagou/utils/GenericTokenParser.class | Bin 1795 -> 0 bytes .../com/lagou/utils/ParameterMapping.class | Bin 871 -> 0 bytes .../utils/ParameterMappingTokenHandler.class | Bin 1505 -> 0 bytes .../com/lagou/utils/TokenHandler.class | Bin 184 -> 0 bytes .../classes/com/yang/config/BoundSql.class | Bin 0 -> 1681 bytes .../com/yang/config/XmlConfigBuilder.class | Bin 0 -> 2912 bytes .../com/yang/config/XmlMapperBuilder.class | Bin 0 -> 2561 bytes .../classes/com/yang/io/Resources.class | Bin 0 -> 570 bytes .../classes/com/yang/pojo/Configuration.class | Bin 0 -> 1189 bytes .../com/yang/pojo/MappedStatement.class | Bin 0 -> 1740 bytes .../yang/sqlSession/DefaultSqlSession$1.class | Bin 0 -> 2824 bytes .../yang/sqlSession/DefaultSqlSession.class | Bin 0 -> 3855 bytes .../sqlSession/DefaultSqlSessionFactory.class | Bin 0 -> 678 bytes .../com/yang/sqlSession/Executor.class | Bin 0 -> 985 bytes .../com/yang/sqlSession/SimpleExecutor.class | Bin 0 -> 6560 bytes .../com/yang/sqlSession/SqlSession.class | Bin 0 -> 1123 bytes .../yang/sqlSession/SqlSessionFactory.class | Bin 0 -> 194 bytes .../sqlSession/SqlSessionFactoryBuilder.class | Bin 0 -> 973 bytes .../com/yang/utils/GenericTokenParser.class | Bin 0 -> 1873 bytes .../com/yang/utils/ParameterMapping.class | Bin 0 -> 585 bytes .../utils/ParameterMappingTokenHandler.class | Bin 0 -> 1496 bytes .../classes/com/yang/utils/TokenHandler.class | Bin 0 -> 183 bytes .../target/maven-archiver/pom.properties | 4 +- .../compile/default-compile/createdFiles.lst | 18 +- .../compile/default-compile/inputFiles.lst | 34 +- Module1/code/IPersistence_test/.gitignore | 26 - .../code/IPersistence_test/.idea/compiler.xml | 5 +- Module1/code/IPersistence_test/.idea/misc.xml | 5 +- .../IPersistence_test/.idea/workspace.xml | 333 ++- .../IPersistence_test/IPersistence_test.iml | 24 - Module1/code/IPersistence_test/pom.xml | 16 +- .../java/com/lagou/test/IPersistenceTest.java | 31 - .../src/main/java/com/yang/dao/IUserDao.java | 31 + .../src/main/java/com/yang/pojo/User.java | 54 + .../java/com/yang/test/IPersistenceTest.java | 92 + .../src/main/resources/UserMapper.xml | 26 +- .../src/main/resources/jdbc.properties | 4 + .../src/main/resources/sqlMapConfig.xml | 11 - .../src/main/resources/sqlMapperConfig.xml | 12 + .../target/classes/UserMapper.xml | 27 + .../classes/com/yang/dao/IUserDao.class | Bin 0 -> 422 bytes .../target/classes/com/yang/pojo/User.class | Bin 0 -> 1586 bytes .../com/yang/test/IPersistenceTest.class | Bin 0 -> 2987 bytes .../target/classes/jdbc.properties | 4 + .../target/classes/sqlMapperConfig.xml | 12 + Module1/code/design_pattern/pom.xml | 12 + .../java/com/yang/constructor/Computer.java | 73 + .../com/yang/constructor/ComputerBuilder.java | 44 + .../com/yang/constructor/ConstructorTest.java | 16 + .../main/java/com/yang/dynamicproxy/Bob.java | 7 + .../yang/dynamicproxy/JDKDynamicProxy.java | 39 + .../com/yang/dynamicproxy/JDKDynamicTest.java | 17 + .../java/com/yang/dynamicproxy/Person.java | 5 + .../java/com/yang/simpleFactory/Computer.java | 10 + .../yang/simpleFactory/ComputerFactory.java | 17 + .../com/yang/simpleFactory/HpComputer.java | 7 + .../yang/simpleFactory/LenovoComputer.java | 7 + .../yang/simpleFactory/SimpleFactoryTest.java | 8 + .../com/yang/constructor/Computer.class | Bin 0 -> 1601 bytes .../yang/constructor/ComputerBuilder.class | Bin 0 -> 1108 bytes .../yang/constructor/ConstructorTest.class | Bin 0 -> 1099 bytes .../com/yang/simpleFactory/Computer.class | Bin 0 -> 311 bytes .../yang/simpleFactory/ComputerFactory.class | Bin 0 -> 780 bytes .../com/yang/simpleFactory/HpComputer.class | Bin 0 -> 548 bytes .../yang/simpleFactory/LenovoComputer.class | Bin 0 -> 560 bytes .../simpleFactory/SimpleFactoryTest.class | Bin 0 -> 705 bytes Module1/code/mybatis-3-master/.DS_Store | Bin 0 -> 6148 bytes Module1/code/mybatis-3-master/.gitattributes | 2 + .../.mvn/wrapper/MavenWrapperDownloader.java | 110 + .../.mvn/wrapper/maven-wrapper.properties | 2 + Module1/code/mybatis-3-master/.travis.yml | 29 + Module1/code/mybatis-3-master/CONTRIBUTING.md | 62 + Module1/code/mybatis-3-master/ICLA | 133 + .../code/mybatis-3-master/ISSUE_TEMPLATE.md | 44 + Module1/code/mybatis-3-master/LICENSE | 202 ++ Module1/code/mybatis-3-master/NOTICE | 68 + Module1/code/mybatis-3-master/README.md | 77 + Module1/code/mybatis-3-master/license.txt | 13 + Module1/code/mybatis-3-master/mvnw | 286 +++ Module1/code/mybatis-3-master/mvnw.cmd | 161 ++ Module1/code/mybatis-3-master/pom.xml | 415 ++++ Module1/code/mybatis-3-master/src/.DS_Store | Bin 0 -> 6148 bytes .../src/main/java/log4j.properties | 6 + .../org/apache/ibatis/annotations/Arg.java | 54 + .../annotations/AutomapConstructor.java | 34 + .../ibatis/annotations/CacheNamespace.java | 72 + .../ibatis/annotations/CacheNamespaceRef.java | 52 + .../org/apache/ibatis/annotations/Case.java | 37 + .../ibatis/annotations/ConstructorArgs.java | 35 + .../org/apache/ibatis/annotations/Delete.java | 35 + .../ibatis/annotations/DeleteProvider.java | 40 + .../org/apache/ibatis/annotations/Flush.java | 32 + .../org/apache/ibatis/annotations/Insert.java | 35 + .../ibatis/annotations/InsertProvider.java | 40 + .../org/apache/ibatis/annotations/Lang.java | 39 + .../org/apache/ibatis/annotations/Many.java | 45 + .../org/apache/ibatis/annotations/MapKey.java | 35 + .../org/apache/ibatis/annotations/Mapper.java | 41 + .../org/apache/ibatis/annotations/One.java | 45 + .../apache/ibatis/annotations/Options.java | 96 + .../org/apache/ibatis/annotations/Param.java | 39 + .../apache/ibatis/annotations/Property.java | 51 + .../org/apache/ibatis/annotations/Result.java | 75 + .../apache/ibatis/annotations/ResultMap.java | 35 + .../apache/ibatis/annotations/ResultType.java | 41 + .../apache/ibatis/annotations/Results.java | 40 + .../org/apache/ibatis/annotations/Select.java | 35 + .../apache/ibatis/annotations/SelectKey.java | 63 + .../ibatis/annotations/SelectProvider.java | 40 + .../ibatis/annotations/TypeDiscriminator.java | 44 + .../org/apache/ibatis/annotations/Update.java | 35 + .../ibatis/annotations/UpdateProvider.java | 40 + .../ibatis/annotations/package-info.java | 20 + .../ibatis/binding/BindingException.java | 45 + .../apache/ibatis/binding/MapperMethod.java | 508 ++++ .../apache/ibatis/binding/MapperProxy.java | 108 + .../ibatis/binding/MapperProxyFactory.java | 67 + .../apache/ibatis/binding/MapperRegistry.java | 128 + .../apache/ibatis/binding/package-info.java | 19 + .../apache/ibatis/builder/BaseBuilder.java | 173 ++ .../ibatis/builder/BuilderException.java | 46 + .../ibatis/builder/CacheRefResolver.java | 42 + .../builder/IncompleteElementException.java | 43 + .../ibatis/builder/InitializingObject.java | 39 + .../builder/MapperBuilderAssistant.java | 584 +++++ .../ibatis/builder/ParameterExpression.java | 144 ++ .../ibatis/builder/ResultMapResolver.java | 71 + .../ibatis/builder/SqlSourceBuilder.java | 169 ++ .../ibatis/builder/StaticSqlSource.java | 58 + .../annotation/MapperAnnotationBuilder.java | 888 +++++++ .../builder/annotation/MethodResolver.java | 46 + .../builder/annotation/ProviderContext.java | 68 + .../builder/annotation/ProviderSqlSource.java | 206 ++ .../builder/annotation/package-info.java | 19 + .../apache/ibatis/builder/package-info.java | 19 + .../ibatis/builder/xml/XMLConfigBuilder.java | 551 +++++ .../builder/xml/XMLIncludeTransformer.java | 175 ++ .../ibatis/builder/xml/XMLMapperBuilder.java | 513 ++++ .../builder/xml/XMLMapperEntityResolver.java | 98 + .../builder/xml/XMLStatementBuilder.java | 250 ++ .../ibatis/builder/xml/mybatis-3-config.dtd | 118 + .../ibatis/builder/xml/mybatis-3-mapper.dtd | 292 +++ .../ibatis/builder/xml/package-info.java | 19 + .../java/org/apache/ibatis/cache/Cache.java | 114 + .../apache/ibatis/cache/CacheException.java | 43 + .../org/apache/ibatis/cache/CacheKey.java | 166 ++ .../org/apache/ibatis/cache/NullCacheKey.java | 41 + .../cache/TransactionalCacheManager.java | 96 + .../cache/decorators/BlockingCache.java | 161 ++ .../ibatis/cache/decorators/FifoCache.java | 105 + .../ibatis/cache/decorators/LoggingCache.java | 116 + .../ibatis/cache/decorators/LruCache.java | 124 + .../cache/decorators/ScheduledCache.java | 122 + .../cache/decorators/SerializedCache.java | 126 + .../ibatis/cache/decorators/SoftCache.java | 157 ++ .../cache/decorators/SynchronizedCache.java | 83 + .../cache/decorators/TransactionalCache.java | 183 ++ .../ibatis/cache/decorators/WeakCache.java | 156 ++ .../ibatis/cache/decorators/package-info.java | 19 + .../ibatis/cache/impl/PerpetualCache.java | 104 + .../ibatis/cache/impl/package-info.java | 19 + .../org/apache/ibatis/cache/package-info.java | 19 + .../java/org/apache/ibatis/cursor/Cursor.java | 53 + .../ibatis/cursor/defaults/DefaultCursor.java | 282 +++ .../ibatis/cursor/defaults/package-info.java | 19 + .../apache/ibatis/cursor/package-info.java | 19 + .../datasource/DataSourceException.java | 43 + .../ibatis/datasource/DataSourceFactory.java | 42 + .../jndi/JndiDataSourceFactory.java | 88 + .../ibatis/datasource/jndi/package-info.java | 19 + .../ibatis/datasource/package-info.java | 19 + .../ibatis/datasource/pooled/PoolState.java | 151 ++ .../datasource/pooled/PooledConnection.java | 298 +++ .../datasource/pooled/PooledDataSource.java | 688 ++++++ .../pooled/PooledDataSourceFactory.java | 31 + .../datasource/pooled/package-info.java | 19 + .../unpooled/UnpooledDataSource.java | 338 +++ .../unpooled/UnpooledDataSourceFactory.java | 94 + .../datasource/unpooled/package-info.java | 19 + .../ibatis/exceptions/ExceptionFactory.java | 42 + .../ibatis/exceptions/IbatisException.java | 42 + .../exceptions/PersistenceException.java | 44 + .../exceptions/TooManyResultsException.java | 43 + .../ibatis/exceptions/package-info.java | 19 + .../apache/ibatis/executor/BaseExecutor.java | 467 ++++ .../apache/ibatis/executor/BatchExecutor.java | 218 ++ .../executor/BatchExecutorException.java | 88 + .../apache/ibatis/executor/BatchResult.java | 92 + .../ibatis/executor/CachingExecutor.java | 219 ++ .../apache/ibatis/executor/ErrorContext.java | 153 ++ .../ibatis/executor/ExecutionPlaceholder.java | 30 + .../org/apache/ibatis/executor/Executor.java | 78 + .../ibatis/executor/ExecutorException.java | 43 + .../ibatis/executor/ResultExtractor.java | 84 + .../apache/ibatis/executor/ReuseExecutor.java | 141 ++ .../ibatis/executor/SimpleExecutor.java | 112 + .../executor/keygen/Jdbc3KeyGenerator.java | 234 ++ .../ibatis/executor/keygen/KeyGenerator.java | 36 + .../executor/keygen/NoKeyGenerator.java | 47 + .../executor/keygen/SelectKeyGenerator.java | 143 ++ .../ibatis/executor/keygen/package-info.java | 19 + .../AbstractEnhancedDeserializationProxy.java | 106 + .../loader/AbstractSerialStateHolder.java | 162 ++ .../executor/loader/CglibProxyFactory.java | 24 + .../loader/JavassistProxyFactory.java | 24 + .../ibatis/executor/loader/ProxyFactory.java | 37 + .../ibatis/executor/loader/ResultLoader.java | 149 ++ .../executor/loader/ResultLoaderMap.java | 359 +++ .../loader/WriteReplaceInterface.java | 27 + .../loader/cglib/CglibProxyFactory.java | 197 ++ .../loader/cglib/CglibSerialStateHolder.java | 49 + .../executor/loader/cglib/package-info.java | 19 + .../javassist/JavassistProxyFactory.java | 216 ++ .../javassist/JavassistSerialStateHolder.java | 49 + .../loader/javassist/package-info.java | 19 + .../ibatis/executor/loader/package-info.java | 19 + .../apache/ibatis/executor/package-info.java | 19 + .../executor/parameter/ParameterHandler.java | 43 + .../executor/parameter/package-info.java | 19 + .../result/DefaultMapResultHandler.java | 71 + .../executor/result/DefaultResultContext.java | 78 + .../executor/result/DefaultResultHandler.java | 56 + .../executor/result/ResultMapException.java | 40 + .../ibatis/executor/result/package-info.java | 19 + .../resultset/DefaultResultSetHandler.java | 1422 +++++++++++ .../executor/resultset/ResultSetHandler.java | 53 + .../executor/resultset/ResultSetWrapper.java | 237 ++ .../executor/resultset/package-info.java | 19 + .../statement/BaseStatementHandler.java | 173 ++ .../statement/CallableStatementHandler.java | 115 + .../statement/PreparedStatementHandler.java | 105 + .../statement/RoutingStatementHandler.java | 101 + .../statement/SimpleStatementHandler.java | 116 + .../executor/statement/StatementHandler.java | 95 + .../executor/statement/StatementUtil.java | 64 + .../executor/statement/package-info.java | 19 + .../apache/ibatis/io/ClassLoaderWrapper.java | 214 ++ .../java/org/apache/ibatis/io/DefaultVFS.java | 357 +++ .../apache/ibatis/io/ExternalResources.java | 69 + .../java/org/apache/ibatis/io/JBoss6VFS.java | 178 ++ .../org/apache/ibatis/io/ResolverUtil.java | 290 +++ .../java/org/apache/ibatis/io/Resources.java | 278 +++ .../main/java/org/apache/ibatis/io/VFS.java | 210 ++ .../org/apache/ibatis/io/package-info.java | 19 + .../org/apache/ibatis/jdbc/AbstractSQL.java | 435 ++++ .../java/org/apache/ibatis/jdbc/Null.java | 87 + .../ibatis/jdbc/RuntimeSqlException.java | 41 + .../main/java/org/apache/ibatis/jdbc/SQL.java | 28 + .../org/apache/ibatis/jdbc/ScriptRunner.java | 319 +++ .../org/apache/ibatis/jdbc/SelectBuilder.java | 112 + .../org/apache/ibatis/jdbc/SqlBuilder.java | 131 + .../org/apache/ibatis/jdbc/SqlRunner.java | 259 ++ .../org/apache/ibatis/jdbc/package-info.java | 19 + .../org/apache/ibatis/lang/UsesJava7.java | 33 + .../org/apache/ibatis/lang/UsesJava8.java | 33 + .../java/org/apache/ibatis/logging/Log.java | 39 + .../apache/ibatis/logging/LogException.java | 45 + .../org/apache/ibatis/logging/LogFactory.java | 122 + .../commons/JakartaCommonsLoggingImpl.java | 67 + .../ibatis/logging/commons/package-info.java | 21 + .../ibatis/logging/jdbc/BaseJdbcLogger.java | 174 ++ .../ibatis/logging/jdbc/ConnectionLogger.java | 98 + .../logging/jdbc/PreparedStatementLogger.java | 108 + .../ibatis/logging/jdbc/ResultSetLogger.java | 152 ++ .../ibatis/logging/jdbc/StatementLogger.java | 91 + .../ibatis/logging/jdbc/package-info.java | 21 + .../logging/jdk14/Jdk14LoggingImpl.java | 69 + .../ibatis/logging/jdk14/package-info.java | 21 + .../ibatis/logging/log4j/Log4jImpl.java | 70 + .../ibatis/logging/log4j/package-info.java | 21 + .../log4j2/Log4j2AbstractLoggerImpl.java | 78 + .../ibatis/logging/log4j2/Log4j2Impl.java | 75 + .../logging/log4j2/Log4j2LoggerImpl.java | 72 + .../ibatis/logging/log4j2/package-info.java | 21 + .../logging/nologging/NoLoggingImpl.java | 64 + .../logging/nologging/package-info.java | 21 + .../apache/ibatis/logging/package-info.java | 19 + .../ibatis/logging/slf4j/Slf4jImpl.java | 88 + .../slf4j/Slf4jLocationAwareLoggerImpl.java | 74 + .../ibatis/logging/slf4j/Slf4jLoggerImpl.java | 67 + .../ibatis/logging/slf4j/package-info.java | 21 + .../ibatis/logging/stdout/StdOutImpl.java | 64 + .../ibatis/logging/stdout/package-info.java | 19 + .../org/apache/ibatis/mapping/BoundSql.java | 94 + .../apache/ibatis/mapping/CacheBuilder.java | 301 +++ .../ibatis/mapping/DatabaseIdProvider.java | 49 + .../mapping/DefaultDatabaseIdProvider.java | 23 + .../apache/ibatis/mapping/Discriminator.java | 83 + .../apache/ibatis/mapping/Environment.java | 111 + .../org/apache/ibatis/mapping/FetchType.java | 23 + .../ibatis/mapping/MappedStatement.java | 401 +++ .../apache/ibatis/mapping/ParameterMap.java | 84 + .../ibatis/mapping/ParameterMapping.java | 256 ++ .../apache/ibatis/mapping/ParameterMode.java | 38 + .../org/apache/ibatis/mapping/ResultFlag.java | 34 + .../org/apache/ibatis/mapping/ResultMap.java | 344 +++ .../apache/ibatis/mapping/ResultMapping.java | 367 +++ .../apache/ibatis/mapping/ResultSetType.java | 51 + .../apache/ibatis/mapping/SqlCommandType.java | 50 + .../org/apache/ibatis/mapping/SqlSource.java | 36 + .../apache/ibatis/mapping/StatementType.java | 38 + .../mapping/VendorDatabaseIdProvider.java | 95 + .../apache/ibatis/mapping/package-info.java | 19 + .../java/org/apache/ibatis/package-info.java | 19 + .../ibatis/parsing/GenericTokenParser.java | 123 + .../ibatis/parsing/ParsingException.java | 45 + .../apache/ibatis/parsing/PropertyParser.java | 121 + .../apache/ibatis/parsing/TokenHandler.java | 33 + .../java/org/apache/ibatis/parsing/XNode.java | 409 +++ .../apache/ibatis/parsing/XPathParser.java | 324 +++ .../apache/ibatis/parsing/package-info.java | 19 + .../org/apache/ibatis/plugin/Interceptor.java | 51 + .../ibatis/plugin/InterceptorChain.java | 55 + .../org/apache/ibatis/plugin/Intercepts.java | 35 + .../org/apache/ibatis/plugin/Invocation.java | 68 + .../java/org/apache/ibatis/plugin/Plugin.java | 136 + .../apache/ibatis/plugin/PluginException.java | 42 + .../org/apache/ibatis/plugin/Signature.java | 48 + .../apache/ibatis/plugin/package-info.java | 19 + .../apache/ibatis/reflection/ArrayUtil.java | 161 ++ .../reflection/DefaultReflectorFactory.java | 63 + .../ibatis/reflection/ExceptionUtil.java | 51 + .../org/apache/ibatis/reflection/Jdk.java | 81 + .../apache/ibatis/reflection/MetaClass.java | 279 +++ .../apache/ibatis/reflection/MetaObject.java | 198 ++ .../ibatis/reflection/OptionalUtil.java | 34 + .../ibatis/reflection/ParamNameResolver.java | 159 ++ .../ibatis/reflection/ParamNameUtil.java | 65 + .../reflection/ReflectionException.java | 45 + .../apache/ibatis/reflection/Reflector.java | 619 +++++ .../ibatis/reflection/ReflectorFactory.java | 43 + .../ibatis/reflection/SystemMetaObject.java | 61 + .../reflection/TypeParameterResolver.java | 388 +++ .../factory/DefaultObjectFactory.java | 115 + .../reflection/factory/ObjectFactory.java | 71 + .../reflection/factory/package-info.java | 19 + .../reflection/invoker/GetFieldInvoker.java | 49 + .../ibatis/reflection/invoker/Invoker.java | 43 + .../reflection/invoker/MethodInvoker.java | 60 + .../reflection/invoker/SetFieldInvoker.java | 50 + .../reflection/invoker/package-info.java | 19 + .../ibatis/reflection/package-info.java | 19 + .../reflection/property/PropertyCopier.java | 59 + .../reflection/property/PropertyNamer.java | 89 + .../property/PropertyTokenizer.java | 98 + .../reflection/property/package-info.java | 19 + .../reflection/wrapper/BaseWrapper.java | 134 + .../reflection/wrapper/BeanWrapper.java | 239 ++ .../reflection/wrapper/CollectionWrapper.java | 103 + .../wrapper/DefaultObjectWrapperFactory.java | 38 + .../ibatis/reflection/wrapper/MapWrapper.java | 160 ++ .../reflection/wrapper/ObjectWrapper.java | 104 + .../wrapper/ObjectWrapperFactory.java | 44 + .../reflection/wrapper/package-info.java | 19 + .../ibatis/scripting/LanguageDriver.java | 71 + .../scripting/LanguageDriverRegistry.java | 86 + .../ibatis/scripting/ScriptingException.java | 45 + .../defaults/DefaultParameterHandler.java | 112 + .../scripting/defaults/RawLanguageDriver.java | 65 + .../scripting/defaults/RawSqlSource.java | 71 + .../scripting/defaults/package-info.java | 19 + .../apache/ibatis/scripting/package-info.java | 19 + .../scripting/xmltags/ChooseSqlNode.java | 60 + .../scripting/xmltags/DynamicContext.java | 168 ++ .../scripting/xmltags/DynamicSqlSource.java | 63 + .../xmltags/ExpressionEvaluator.java | 92 + .../scripting/xmltags/ForEachSqlNode.java | 263 ++ .../ibatis/scripting/xmltags/IfSqlNode.java | 54 + .../scripting/xmltags/MixedSqlNode.java | 45 + .../ibatis/scripting/xmltags/OgnlCache.java | 78 + .../scripting/xmltags/OgnlClassResolver.java | 39 + .../scripting/xmltags/OgnlMemberAccess.java | 80 + .../ibatis/scripting/xmltags/SetSqlNode.java | 36 + .../ibatis/scripting/xmltags/SqlNode.java | 33 + .../scripting/xmltags/StaticTextSqlNode.java | 41 + .../ibatis/scripting/xmltags/TextSqlNode.java | 133 + .../ibatis/scripting/xmltags/TrimSqlNode.java | 205 ++ .../scripting/xmltags/VarDeclSqlNode.java | 48 + .../scripting/xmltags/WhereSqlNode.java | 36 + .../scripting/xmltags/XMLLanguageDriver.java | 76 + .../scripting/xmltags/XMLScriptBuilder.java | 386 +++ .../scripting/xmltags/package-info.java | 19 + .../ibatis/session/AutoMappingBehavior.java | 48 + .../AutoMappingUnknownColumnBehavior.java | 91 + .../apache/ibatis/session/Configuration.java | 1056 ++++++++ .../apache/ibatis/session/ExecutorType.java | 38 + .../ibatis/session/LocalCacheScope.java | 34 + .../apache/ibatis/session/ResultContext.java | 45 + .../apache/ibatis/session/ResultHandler.java | 32 + .../org/apache/ibatis/session/RowBounds.java | 60 + .../org/apache/ibatis/session/SqlSession.java | 286 +++ .../ibatis/session/SqlSessionException.java | 43 + .../ibatis/session/SqlSessionFactory.java | 47 + .../session/SqlSessionFactoryBuilder.java | 122 + .../ibatis/session/SqlSessionManager.java | 384 +++ .../session/TransactionIsolationLevel.java | 39 + .../session/defaults/DefaultSqlSession.java | 386 +++ .../defaults/DefaultSqlSessionFactory.java | 161 ++ .../ibatis/session/defaults/package-info.java | 19 + .../apache/ibatis/session/package-info.java | 19 + .../ibatis/transaction/Transaction.java | 77 + .../transaction/TransactionException.java | 43 + .../transaction/TransactionFactory.java | 66 + .../transaction/jdbc/JdbcTransaction.java | 185 ++ .../jdbc/JdbcTransactionFactory.java | 53 + .../ibatis/transaction/jdbc/package-info.java | 19 + .../managed/ManagedTransaction.java | 120 + .../managed/ManagedTransactionFactory.java | 68 + .../transaction/managed/package-info.java | 19 + .../ibatis/transaction/package-info.java | 19 + .../java/org/apache/ibatis/type/Alias.java | 35 + .../apache/ibatis/type/ArrayTypeHandler.java | 52 + .../apache/ibatis/type/BaseTypeHandler.java | 117 + .../ibatis/type/BigDecimalTypeHandler.java | 52 + .../ibatis/type/BigIntegerTypeHandler.java | 52 + .../type/BlobByteObjectArrayTypeHandler.java | 61 + .../type/BlobInputStreamTypeHandler.java | 76 + .../apache/ibatis/type/BlobTypeHandler.java | 65 + .../ibatis/type/BooleanTypeHandler.java | 54 + .../ibatis/type/ByteArrayTypeHandler.java | 51 + .../apache/ibatis/type/ByteArrayUtils.java | 47 + .../type/ByteObjectArrayTypeHandler.java | 59 + .../apache/ibatis/type/ByteTypeHandler.java | 54 + .../ibatis/type/CharacterTypeHandler.java | 62 + .../ibatis/type/ClobReaderTypeHandler.java | 76 + .../apache/ibatis/type/ClobTypeHandler.java | 58 + .../ibatis/type/DateOnlyTypeHandler.java | 74 + .../apache/ibatis/type/DateTypeHandler.java | 72 + .../apache/ibatis/type/DoubleTypeHandler.java | 55 + .../ibatis/type/EnumOrdinalTypeHandler.java | 107 + .../apache/ibatis/type/EnumTypeHandler.java | 76 + .../apache/ibatis/type/FloatTypeHandler.java | 54 + .../ibatis/type/InstantTypeHandler.java | 56 + .../ibatis/type/IntegerTypeHandler.java | 63 + .../ibatis/type/JapaneseDateTypeHandler.java | 61 + .../java/org/apache/ibatis/type/JdbcType.java | 98 + .../ibatis/type/LocalDateTimeTypeHandler.java | 57 + .../ibatis/type/LocalDateTypeHandler.java | 57 + .../ibatis/type/LocalTimeTypeHandler.java | 57 + .../apache/ibatis/type/LongTypeHandler.java | 54 + .../apache/ibatis/type/MappedJdbcTypes.java | 40 + .../org/apache/ibatis/type/MappedTypes.java | 35 + .../apache/ibatis/type/MonthTypeHandler.java | 54 + .../apache/ibatis/type/NClobTypeHandler.java | 58 + .../ibatis/type/NStringTypeHandler.java | 52 + .../apache/ibatis/type/ObjectTypeHandler.java | 54 + .../type/OffsetDateTimeTypeHandler.java | 58 + .../ibatis/type/OffsetTimeTypeHandler.java | 57 + .../apache/ibatis/type/ShortTypeHandler.java | 54 + .../ibatis/type/SimpleTypeRegistry.java | 67 + .../ibatis/type/SqlDateTypeHandler.java | 48 + .../ibatis/type/SqlTimeTypeHandler.java | 49 + .../ibatis/type/SqlTimestampTypeHandler.java | 48 + .../apache/ibatis/type/SqlxmlTypeHandler.java | 67 + .../apache/ibatis/type/StringTypeHandler.java | 52 + .../ibatis/type/TimeOnlyTypeHandler.java | 61 + .../apache/ibatis/type/TypeAliasRegistry.java | 219 ++ .../org/apache/ibatis/type/TypeException.java | 45 + .../org/apache/ibatis/type/TypeHandler.java | 79 + .../ibatis/type/TypeHandlerRegistry.java | 551 +++++ .../org/apache/ibatis/type/TypeReference.java | 77 + .../ibatis/type/UnknownTypeHandler.java | 164 ++ .../ibatis/type/YearMonthTypeHandler.java | 59 + .../apache/ibatis/type/YearTypeHandler.java | 53 + .../ibatis/type/ZonedDateTimeTypeHandler.java | 58 + .../org/apache/ibatis/type/package-info.java | 19 + .../src/site/es/resources/css/site.css | 30 + .../src/site/es/xdoc/configuration.xml | 1816 ++++++++++++++ .../src/site/es/xdoc/dynamic-sql.xml | 222 ++ .../src/site/es/xdoc/getting-started.xml | 404 +++ .../src/site/es/xdoc/index.xml | 56 + .../src/site/es/xdoc/java-api.xml | 590 +++++ .../src/site/es/xdoc/logging.xml | 163 ++ .../src/site/es/xdoc/sqlmap-xml.xml | 1780 +++++++++++++ .../src/site/es/xdoc/statement-builders.xml | 459 ++++ .../src/site/fr/resources/css/site.css | 30 + .../src/site/fr/xdoc/getting-started.xml | 371 +++ .../src/site/ja/resources/css/site.css | 30 + .../src/site/ja/xdoc/configuration.xml | 1927 +++++++++++++++ .../src/site/ja/xdoc/dynamic-sql.xml | 224 ++ .../src/site/ja/xdoc/getting-started.xml | 306 +++ .../src/site/ja/xdoc/index.xml | 53 + .../src/site/ja/xdoc/java-api.xml | 600 +++++ .../src/site/ja/xdoc/logging.xml | 166 ++ .../src/site/ja/xdoc/sqlmap-xml.xml | 2020 +++++++++++++++ .../src/site/ja/xdoc/statement-builders.xml | 481 ++++ .../src/site/ko/resources/css/site.css | 30 + .../src/site/ko/xdoc/configuration.xml | 1770 +++++++++++++ .../src/site/ko/xdoc/dynamic-sql.xml | 251 ++ .../src/site/ko/xdoc/getting-started.xml | 264 ++ .../src/site/ko/xdoc/index.xml | 65 + .../src/site/ko/xdoc/java-api.xml | 741 ++++++ .../src/site/ko/xdoc/logging.xml | 188 ++ .../src/site/ko/xdoc/sqlmap-xml.xml | 1714 +++++++++++++ .../src/site/ko/xdoc/statement-builders.xml | 518 ++++ .../code/mybatis-3-master/src/site/pdf.xml | 48 + .../src/site/resources/css/site.css | 30 + .../src/site/resources/images/en.png | Bin 0 -> 1767 bytes .../src/site/resources/images/es.png | Bin 0 -> 873 bytes .../src/site/resources/images/fr.png | Bin 0 -> 637 bytes .../src/site/resources/images/ja.png | Bin 0 -> 705 bytes .../src/site/resources/images/ko.png | Bin 0 -> 1361 bytes .../src/site/resources/images/zh.png | Bin 0 -> 793 bytes .../code/mybatis-3-master/src/site/site.xml | 56 + .../mybatis-3-master/src/site/site_es.xml | 58 + .../mybatis-3-master/src/site/site_fr.xml | 60 + .../mybatis-3-master/src/site/site_ja.xml | 59 + .../mybatis-3-master/src/site/site_ko.xml | 56 + .../mybatis-3-master/src/site/site_zh.xml | 56 + .../src/site/xdoc/configuration.xml | 2153 ++++++++++++++++ .../src/site/xdoc/dynamic-sql.xml | 220 ++ .../src/site/xdoc/getting-started.xml | 395 +++ .../mybatis-3-master/src/site/xdoc/index.xml | 79 + .../src/site/xdoc/java-api.xml | 655 +++++ .../src/site/xdoc/logging.xml | 231 ++ .../src/site/xdoc/sqlmap-xml.xml | 2200 +++++++++++++++++ .../src/site/xdoc/statement-builders.xml | 563 +++++ .../src/site/zh/resources/css/site.css | 30 + .../src/site/zh/xdoc/configuration.xml | 1841 ++++++++++++++ .../src/site/zh/xdoc/dynamic-sql.xml | 221 ++ .../src/site/zh/xdoc/getting-started.xml | 324 +++ .../src/site/zh/xdoc/index.xml | 62 + .../src/site/zh/xdoc/java-api.xml | 585 +++++ .../src/site/zh/xdoc/logging.xml | 165 ++ .../src/site/zh/xdoc/sqlmap-xml.xml | 2080 ++++++++++++++++ .../src/site/zh/xdoc/statement-builders.xml | 524 ++++ .../code/mybatis-3-master/src/test/.DS_Store | Bin 0 -> 6148 bytes .../mybatis-3-master/src/test/java/.DS_Store | Bin 0 -> 6148 bytes .../src/test/java/MybatisTest.java | 123 + .../java/com/lagou/mapper/IOrderMapper.java | 14 + .../java/com/lagou/mapper/IUserMapper.java | 14 + .../src/test/java/com/lagou/pojo/Order.java | 53 + .../src/test}/java/com/lagou/pojo/User.java | 30 +- .../test/java/com/lagou/test/MybatisTest.java | 61 + .../src/test/java/log4j.properties | 6 + .../src/test/java/org/.DS_Store | Bin 0 -> 6148 bytes .../src/test/java/org/apache/.DS_Store | Bin 0 -> 6148 bytes .../src/test/java/org/apache/ibatis/.DS_Store | Bin 0 -> 6148 bytes .../java/org/apache/ibatis/BaseDataTest.java | 96 + .../autoconstructor/AnnotatedSubject.java | 45 + .../AutoConstructorMapper.java | 64 + .../autoconstructor/AutoConstructorMapper.xml | 100 + .../autoconstructor/AutoConstructorTest.java | 189 ++ .../ibatis/autoconstructor/BadSubject.java | 38 + .../ibatis/autoconstructor/CreateDB.sql | 58 + .../autoconstructor/ExtensiveSubject.java | 68 + .../autoconstructor/PrimitiveSubject.java | 40 + .../ibatis/autoconstructor/UserMapper.java | 10 + .../ibatis/autoconstructor/mybatis-config.xml | 52 + .../apache/ibatis/binding/BindingTest.java | 695 ++++++ .../ibatis/binding/BoundAuthorMapper.java | 100 + .../ibatis/binding/BoundAuthorMapper.xml | 101 + .../ibatis/binding/BoundBlogMapper.java | 220 ++ .../apache/ibatis/binding/BoundBlogMapper.xml | 139 ++ .../apache/ibatis/binding/BoundBlogSql.java | 31 + .../org/apache/ibatis/binding/FlushTest.java | 87 + .../ibatis/binding/MapperMethodParamTest.java | 84 + .../ibatis/binding/MapperWithOneAndMany.java | 41 + .../binding/MissingNamespaceMapper.java | 22 + .../ibatis/binding/MissingNamespaceMapper.xml | 29 + .../ibatis/binding/WrongMapperTest.java | 29 + .../ibatis/binding/WrongNamespaceMapper.java | 22 + .../ibatis/binding/WrongNamespaceMapper.xml | 29 + .../ibatis/binding/WrongNamespacesTest.java | 36 + .../ibatis/binding/paramtest-schema.sql | 21 + .../apache/ibatis/builder/AuthorMapper.xml | 147 ++ .../org/apache/ibatis/builder/BlogMapper.xml | 156 ++ .../ibatis/builder/CachedAuthorMapper.java | 26 + .../ibatis/builder/CachedAuthorMapper.xml | 56 + .../ibatis/builder/CustomLongTypeHandler.java | 50 + .../builder/CustomObjectWrapperFactory.java | 36 + .../builder/CustomReflectorFactory.java | 22 + .../builder/CustomStringTypeHandler.java | 48 + .../CustomizedSettingsMapperConfig.xml | 111 + .../ibatis/builder/ExampleObjectFactory.java | 45 + .../apache/ibatis/builder/ExamplePlugin.java | 47 + .../apache/ibatis/builder/MapperConfig.xml | 82 + .../ibatis/builder/MinimalMapperConfig.xml | 28 + .../ibatis/builder/NestedBlogMapper.xml | 86 + .../builder/ParameterExpressionTest.java | 147 ++ .../org/apache/ibatis/builder/PostMapper.xml | 148 ++ .../apache/ibatis/builder/ProblemMapper.xml | 28 + .../builder/PropertiesUrlMapperConfig.xml | 29 + .../ibatis/builder/XmlConfigBuilderTest.java | 304 +++ .../ibatis/builder/XmlMapperBuilderTest.java | 199 ++ .../org/apache/ibatis/builder/jdbc.properties | 20 + .../ibatis/builder/mapper/CustomMapper.java | 19 + .../typehandler/CustomIntegerTypeHandler.java | 50 + .../xml/dynamic/DynamicSqlSourceTest.java | 403 +++ .../xml/dynamic/ExpressionEvaluatorTest.java | 89 + .../apache/ibatis/cache/BaseCacheTest.java | 55 + .../org/apache/ibatis/cache/CacheKeyTest.java | 115 + .../apache/ibatis/cache/FifoCacheTest.java | 60 + .../org/apache/ibatis/cache/LruCacheTest.java | 60 + .../ibatis/cache/PerpetualCacheTest.java | 71 + .../ibatis/cache/ScheduledCacheTest.java | 68 + .../apache/ibatis/cache/SoftCacheTest.java | 77 + .../apache/ibatis/cache/SuperCacheTest.java | 48 + .../apache/ibatis/cache/WeakCacheTest.java | 81 + .../cursor/defaults/DefaultCursorTest.java | 189 ++ .../databases/blog/StoredProcedures.java | 57 + .../databases/blog/blog-derby-dataload.sql | 58 + .../databases/blog/blog-derby-schema.sql | 98 + .../databases/blog/blog-derby.properties | 20 + .../jpetstore/jpetstore-hsqldb-dataload.sql | 118 + .../jpetstore/jpetstore-hsqldb-schema.sql | 184 ++ .../jpetstore/jpetstore-hsqldb.properties | 21 + .../jndi/JndiDataSourceFactoryTest.java | 103 + .../unpooled/UnpooledDataSourceTest.java | 69 + .../org/apache/ibatis/domain/blog/Author.java | 128 + .../org/apache/ibatis/domain/blog/Blog.java | 74 + .../apache/ibatis/domain/blog/BlogLite.java | 40 + .../apache/ibatis/domain/blog/Comment.java | 61 + .../domain/blog/ComplexImmutableAuthor.java | 74 + .../domain/blog/ComplexImmutableAuthorId.java | 82 + .../apache/ibatis/domain/blog/DraftPost.java | 19 + .../ibatis/domain/blog/ImmutableAuthor.java | 95 + .../org/apache/ibatis/domain/blog/Post.java | 109 + .../apache/ibatis/domain/blog/PostLite.java | 73 + .../apache/ibatis/domain/blog/PostLiteId.java | 59 + .../apache/ibatis/domain/blog/Section.java | 22 + .../org/apache/ibatis/domain/blog/Tag.java | 43 + .../domain/blog/mappers/AuthorMapper.java | 57 + .../AuthorMapperWithMultipleHandlers.java | 25 + .../mappers/AuthorMapperWithRowBounds.java | 25 + .../domain/blog/mappers/BlogMapper.java | 31 + .../blog/mappers/CopyOfAuthorMapper.java | 42 + .../domain/blog/mappers/NestedBlogMapper.java | 19 + .../ibatis/domain/jpetstore/Account.java | 188 ++ .../apache/ibatis/domain/jpetstore/Cart.java | 92 + .../ibatis/domain/jpetstore/CartItem.java | 74 + .../ibatis/domain/jpetstore/Category.java | 58 + .../apache/ibatis/domain/jpetstore/Item.java | 148 ++ .../ibatis/domain/jpetstore/LineItem.java | 108 + .../apache/ibatis/domain/jpetstore/Order.java | 325 +++ .../ibatis/domain/jpetstore/Product.java | 67 + .../ibatis/domain/jpetstore/Sequence.java | 51 + .../ibatis/domain/misc/CustomBeanWrapper.java | 25 + .../domain/misc/CustomBeanWrapperFactory.java | 37 + .../apache/ibatis/domain/misc/Employee.java | 94 + .../apache/ibatis/domain/misc/RichType.java | 92 + .../domain/misc/generics/GenericAbstract.java | 21 + .../domain/misc/generics/GenericConcrete.java | 38 + .../misc/generics/GenericInterface.java | 20 + .../domain/misc/generics/GenericSubclass.java | 25 + .../exceptions/GeneralExceptionsTest.java | 94 + .../ibatis/executor/BaseExecutorTest.java | 468 ++++ .../ibatis/executor/BatchExecutorTest.java | 31 + .../executor/CachingBatchExecutorTest.java | 32 + .../executor/CachingReuseExecutorTest.java | 32 + .../executor/CachingSimpleExecutorTest.java | 32 + .../ibatis/executor/ErrorContextTest.java | 58 + .../ibatis/executor/ExecutorTestHelper.java | 673 +++++ .../ibatis/executor/ResultExtractorTest.java | 100 + .../ibatis/executor/ReuseExecutorTest.java | 37 + .../executor/loader/CglibProxyTest.java | 73 + .../executor/loader/JavassistProxyTest.java | 73 + .../loader/SerializableProxyTest.java | 219 ++ .../DefaultResultSetHandlerTest.java | 147 ++ .../DefaultResultSetHandlerTest2.java | 217 ++ .../statement/BaseStatementHandlerTest.java | 144 ++ .../ibatis/io/ClassLoaderWrapperTest.java | 84 + .../ibatis/io/ExternalResourcesTest.java | 101 + .../org/apache/ibatis/io/ResourcesTest.java | 175 ++ .../java/org/apache/ibatis/io/VFSTest.java | 71 + .../java/org/apache/ibatis/jdbc/NullTest.java | 32 + .../ibatis/jdbc/PooledDataSourceTest.java | 147 ++ .../java/org/apache/ibatis/jdbc/SQLTest.java | 306 +++ .../ibatis/jdbc/ScriptChangingDelimiter.sql | 26 + ...criptChangingDelimiterMissingDelimiter.sql | 25 + .../jdbc/ScriptCommentAfterEOLTerminator.sql | 17 + .../jdbc/ScriptMissingEOLTerminator.sql | 28 + .../apache/ibatis/jdbc/ScriptRunnerTest.java | 287 +++ .../apache/ibatis/jdbc/SelectBuilderTest.java | 116 + .../apache/ibatis/jdbc/SqlBuilderTest.java | 116 + .../org/apache/ibatis/jdbc/SqlRunnerTest.java | 111 + .../apache/ibatis/logging/LogFactoryTest.java | 109 + .../logging/jdbc/BaseJdbcLoggerTest.java | 58 + .../logging/jdbc/ConnectionLoggerTest.java | 70 + .../jdbc/PreparedStatementLoggerTest.java | 87 + .../logging/jdbc/ResultSetLoggerTest.java | 71 + .../logging/jdbc/StatementLoggerTest.java | 75 + .../apache/ibatis/logging/mybatis-config.xml | 29 + .../apache/ibatis/mapping/BoundSqlTest.java | 65 + .../ibatis/mapping/CacheBuilderTest.java | 93 + .../ibatis/mapping/ResultMappingTest.java | 46 + .../parsing/GenericTokenParserTest.java | 111 + .../ibatis/parsing/PropertyParserTest.java | 83 + .../ibatis/parsing/XPathParserTest.java | 47 + .../org/apache/ibatis/plugin/PluginTest.java | 63 + .../ibatis/reflection/ArrayUtilTest.java | 110 + .../ibatis/reflection/ExceptionUtilTest.java | 36 + .../ibatis/reflection/MetaClassTest.java | 161 ++ .../ibatis/reflection/MetaObjectTest.java | 312 +++ .../ibatis/reflection/ReflectorTest.java | 213 ++ .../reflection/TypeParameterResolverTest.java | 427 ++++ .../factory/DefaultObjectFactoryTest.java | 99 + .../ibatis/reflection/factory/TestClass.java | 31 + .../reflection/typeparam/Calculator.java | 35 + .../reflection/typeparam/Level0Mapper.java | 62 + .../reflection/typeparam/Level1Mapper.java | 19 + .../reflection/typeparam/Level2Mapper.java | 22 + .../scripting/LanguageDriverRegistryTest.java | 121 + .../defaults/DefaultParameterHandlerTest.java | 88 + .../AutoMappingUnknownColumnBehaviorTest.java | 138 ++ .../ibatis/session/SqlSessionManagerTest.java | 99 + .../apache/ibatis/session/SqlSessionTest.java | 811 ++++++ .../ancestor_ref/AncestorRefTest.java | 79 + .../ibatis/submitted/ancestor_ref/Author.java | 56 + .../ibatis/submitted/ancestor_ref/Blog.java | 56 + .../submitted/ancestor_ref/CreateDB.sql | 56 + .../ibatis/submitted/ancestor_ref/Mapper.java | 24 + .../ibatis/submitted/ancestor_ref/Mapper.xml | 91 + .../submitted/ancestor_ref/Reputation.java | 40 + .../ibatis/submitted/ancestor_ref/User.java | 57 + .../submitted/ancestor_ref/mybatis-config.xml | 42 + .../ArrayResultTypeTest.java | 83 + .../submitted/array_result_type/CreateDB.sql | 25 + .../submitted/array_result_type/Mapper.java | 32 + .../submitted/array_result_type/Mapper.xml | 29 + .../submitted/array_result_type/User.java | 38 + .../array_result_type/mybatis-config.xml | 42 + .../submitted/association_nested/Folder.java | 32 + .../association_nested/FolderFlatTree.java | 33 + .../association_nested/FolderMapper.java | 29 + .../association_nested/FolderMapper.xml | 50 + .../association_nested/FolderMapperTest.java | 69 + .../association_nested/mybatis-config.xml | 35 + .../associationtest/AssociationTest.java | 83 + .../submitted/associationtest/Brakes.java | 30 + .../ibatis/submitted/associationtest/Car.java | 49 + .../submitted/associationtest/CreateDB.sql | 30 + .../submitted/associationtest/Engine.java | 34 + .../submitted/associationtest/Mapper.java | 26 + .../submitted/associationtest/Mapper.xml | 51 + .../associationtest/mybatis-config.xml | 42 + .../associationtype/AssociationTypeTest.java | 59 + .../submitted/associationtype/CreateDB.sql | 24 + .../submitted/associationtype/Mapper.xml | 42 + .../associationtype/mybatis-config.xml | 42 + .../autodiscover/AutodiscoverTest.java | 59 + .../submitted/autodiscover/MapperConfig.xml | 50 + .../autodiscover/aliases/DummyTypeAlias.java | 23 + .../handlers/DummyTypeHandler.java | 50 + .../autodiscover/mappers/DummyMapper.java | 20 + .../ibatis/submitted/automapping/Article.java | 20 + .../automapping/AutomappingTest.java | 173 ++ .../ibatis/submitted/automapping/Book.java | 30 + .../ibatis/submitted/automapping/Breeder.java | 38 + .../ibatis/submitted/automapping/CreateDB.sql | 55 + .../ibatis/submitted/automapping/Mapper.java | 33 + .../ibatis/submitted/automapping/Mapper.xml | 91 + .../ibatis/submitted/automapping/Pet.java | 47 + .../ibatis/submitted/automapping/User.java | 59 + .../submitted/automapping/mybatis-config.xml | 44 + .../submitted/awful_table/AwfulTable.java | 118 + .../awful_table/AwfulTableMapper.java | 31 + .../awful_table/AwfulTableMapper.xml | 208 ++ .../submitted/awful_table/AwfulTableTest.java | 81 + .../ibatis/submitted/awful_table/CreateDB.sql | 35 + .../submitted/awful_table/MapperConfig.xml | 50 + .../ibatis/submitted/basetest/BaseTest.java | 65 + .../ibatis/submitted/basetest/CreateDB.sql | 24 + .../ibatis/submitted/basetest/Mapper.java | 23 + .../ibatis/submitted/basetest/Mapper.xml | 33 + .../ibatis/submitted/basetest/User.java | 38 + .../submitted/basetest/mybatis-config.xml | 42 + .../submitted/batch_keys/BatchKeysTest.java | 169 ++ .../ibatis/submitted/batch_keys/Config.xml | 40 + .../ibatis/submitted/batch_keys/CreateDB.sql | 28 + .../ibatis/submitted/batch_keys/Mapper.java | 23 + .../ibatis/submitted/batch_keys/Mapper.xml | 44 + .../ibatis/submitted/batch_keys/User.java | 45 + .../submitted/batch_test/BatchTest.java | 72 + .../ibatis/submitted/batch_test/CreateDB.sql | 35 + .../ibatis/submitted/batch_test/Dept.java | 39 + .../ibatis/submitted/batch_test/Mapper.java | 25 + .../ibatis/submitted/batch_test/Mapper.xml | 40 + .../ibatis/submitted/batch_test/User.java | 49 + .../submitted/batch_test/mybatis-config.xml | 46 + .../ibatis/submitted/blobtest/BlobMapper.java | 24 + .../ibatis/submitted/blobtest/BlobMapper.xml | 46 + .../ibatis/submitted/blobtest/BlobRecord.java | 46 + .../ibatis/submitted/blobtest/BlobTest.java | 115 + .../ibatis/submitted/blobtest/CreateDB.sql | 26 + .../submitted/blobtest/MapperConfig.xml | 49 + .../blocking_cache/BlockingCacheTest.java | 85 + .../submitted/blocking_cache/CreateDB.sql | 26 + .../submitted/blocking_cache/Person.java | 67 + .../blocking_cache/PersonMapper.java | 28 + .../blocking_cache/mybatis-config.xml | 47 + .../bringrags/SimpleChildObject.java | 35 + .../bringrags/SimpleChildObjectMapper.java | 20 + .../bringrags/SimpleChildObjectMapper.xml | 45 + .../submitted/bringrags/SimpleObject.java | 39 + .../submitted/bringrags/SimpleObjectTest.java | 69 + .../submitted/bringrags/mybatis-config.xml | 42 + .../ibatis/submitted/cache/CacheTest.java | 327 +++ .../ibatis/submitted/cache/CreateDB.sql | 26 + .../ibatis/submitted/cache/CustomCache.java | 173 ++ .../submitted/cache/CustomCacheMapper.java | 39 + .../cache/ImportantPersonMapper.java | 32 + .../apache/ibatis/submitted/cache/Person.java | 67 + .../ibatis/submitted/cache/PersonMapper.java | 50 + .../submitted/cache/SpecialPersonMapper.java | 32 + .../ibatis/submitted/cache/mybatis-config.xml | 50 + .../submitted/cacheorder/CacheOrderTest.java | 54 + .../ibatis/submitted/cacheorder/CreateDB.sql | 24 + .../ibatis/submitted/cacheorder/Mapper.xml | 31 + .../ibatis/submitted/cacheorder/Mapper2.xml | 27 + .../ibatis/submitted/cacheorder/User.java | 41 + .../submitted/cacheorder/mybatis-config.xml | 43 + .../CallSettersOnNullsTest.java | 101 + .../call_setters_on_nulls/CreateDB.sql | 36 + .../DoNotCallSettersOnNullsTest.java | 73 + .../call_setters_on_nulls/Mapper.java | 29 + .../call_setters_on_nulls/Mapper.xml | 54 + .../submitted/call_setters_on_nulls/User.java | 40 + .../mybatis-config-2.xml | 42 + .../call_setters_on_nulls/mybatis-config.xml | 46 + .../ChildBean.java | 56 + .../MyBatisTest.java | 48 + .../ParentBean.java | 45 + .../call_setters_on_nulls_again/mapper.xml | 36 + .../mybatis-config.xml | 46 + .../ibatis/submitted/camelcase/Camel.java | 43 + .../camelcase/CamelCaseMappingTest.java | 64 + .../ibatis/submitted/camelcase/CreateDB.sql | 30 + .../apache/ibatis/submitted/camelcase/Map.xml | 33 + .../submitted/camelcase/MapperConfig.xml | 46 + .../cglib_lazy_error/CglibNPELazyTest.java | 108 + .../cglib_lazy_error/CglibNPETest.java | 136 + .../submitted/cglib_lazy_error/CreateDB.sql | 29 + .../submitted/cglib_lazy_error/Person.java | 87 + .../submitted/cglib_lazy_error/Person.xml | 61 + .../cglib_lazy_error/PersonMapper.java | 26 + .../cglib_lazy_error/ibatisConfig.xml | 42 + .../cglib_lazy_error/ibatisConfigLazy.xml | 46 + .../CollectionParametersTest.java | 86 + .../collectionparameters/CreateDB.sql | 26 + .../collectionparameters/Mapper.java | 27 + .../submitted/collectionparameters/Mapper.xml | 50 + .../submitted/collectionparameters/User.java | 38 + .../collectionparameters/mybatis-config.xml | 42 + .../ColumnForwardingTest.java | 70 + .../submitted/column_forwarding/CreateDB.sql | 33 + .../submitted/column_forwarding/Group.java | 38 + .../submitted/column_forwarding/Mapper.java | 22 + .../submitted/column_forwarding/Mapper.xml | 46 + .../submitted/column_forwarding/User.java | 56 + .../column_forwarding/mybatis-config.xml | 42 + .../submitted/column_prefix/Address.java | 104 + .../column_prefix/AddressWithCaution.java | 32 + .../ibatis/submitted/column_prefix/Brand.java | 50 + .../ColumnPrefixAutoMappingTest.java | 54 + .../ColumnPrefixNestedQueryTest.java | 40 + .../column_prefix/ColumnPrefixTest.java | 130 + .../ibatis/submitted/column_prefix/Config.xml | 42 + .../column_prefix/ConfigAutoMapping.xml | 48 + .../column_prefix/ConfigNestedQuery.xml | 47 + .../submitted/column_prefix/CreateDB.sql | 119 + .../ibatis/submitted/column_prefix/Mapper.xml | 185 ++ .../column_prefix/MapperAutoMapping.xml | 180 ++ .../column_prefix/MapperNestedQuery.xml | 158 ++ .../submitted/column_prefix/Person.java | 80 + .../ibatis/submitted/column_prefix/Pet.java | 48 + .../ibatis/submitted/column_prefix/Phone.java | 48 + .../submitted/column_prefix/Product.java | 38 + .../ibatis/submitted/column_prefix/Room.java | 38 + .../ibatis/submitted/column_prefix/Zip.java | 48 + .../complex_column/ComplexColumnTest.java | 135 + .../submitted/complex_column/CreateDB.sql | 33 + .../submitted/complex_column/Person.java | 47 + .../submitted/complex_column/Person.xml | 68 + .../complex_column/PersonMapper.java | 61 + .../submitted/complex_column/ibatisConfig.xml | 42 + .../complex_property/ComponentTest.java | 66 + .../complex_property/Configuration.xml | 50 + .../complex_property/EncryptedString.java | 44 + .../submitted/complex_property/User.java | 70 + .../submitted/complex_property/User.xml | 76 + .../ibatis/submitted/complex_property/db.sql | 23 + .../complex_type/ComplexTypeTest.java | 66 + .../submitted/complex_type/CreateDB.sql | 23 + .../ibatis/submitted/complex_type/Item.java | 23 + .../ibatis/submitted/complex_type/Mapper.xml | 32 + .../submitted/complex_type/Property.java | 21 + .../submitted/complex_type/mybatis-config.xml | 42 + .../constructor_columnprefix/Article.java | 51 + .../constructor_columnprefix/Author.java | 38 + .../ConstructorColumnPrefixTest.java | 80 + .../constructor_columnprefix/CreateDB.sql | 37 + .../constructor_columnprefix/EntityKey.java | 53 + .../constructor_columnprefix/Mapper.java | 44 + .../constructor_columnprefix/Mapper.xml | 59 + .../mybatis-config.xml | 44 + .../apache/ibatis/submitted/count/Count.xml | 28 + .../ibatis/submitted/count/CountMapper.java | 20 + .../ibatis/submitted/count/CountTest.java | 52 + .../ibatis/submitted/count/CreateDB.sql | 28 + .../ibatis/submitted/count/MapperConfig.xml | 42 + .../ibatis/submitted/criterion/CreateDB.sql | 28 + .../ibatis/submitted/criterion/Criterion.java | 37 + .../ibatis/submitted/criterion/Criterion.xml | 31 + .../submitted/criterion/CriterionTest.java | 61 + .../submitted/criterion/MapperConfig.xml | 46 + .../ibatis/submitted/criterion/Parameter.java | 28 + .../submitted/cursor_nested/CreateDB.sql | 40 + .../cursor_nested/CursorNestedTest.java | 108 + .../submitted/cursor_nested/Mapper.java | 24 + .../ibatis/submitted/cursor_nested/Mapper.xml | 40 + .../ibatis/submitted/cursor_nested/User.java | 68 + .../cursor_nested/mybatis-config.xml | 42 + .../cursor_simple/AnnotationMapper.java | 26 + .../submitted/cursor_simple/CreateDB.sql | 28 + .../cursor_simple/CursorSimpleTest.java | 390 +++ .../submitted/cursor_simple/Mapper.java | 24 + .../ibatis/submitted/cursor_simple/Mapper.xml | 34 + .../cursor_simple/PostgresCursorTest.java | 0 .../ibatis/submitted/cursor_simple/User.java | 46 + .../cursor_simple/mybatis-config.xml | 42 + .../custom_collection_handling/Contact.java | 48 + .../custom_collection_handling/CreateDB.sql | 42 + .../CustomCollection.java | 127 + .../CustomCollectionHandlingTest.java | 84 + .../CustomObjectFactory.java | 114 + .../CustomObjectWrapper.java | 106 + .../CustomObjectWrapperFactory.java | 33 + .../MapperConfig.xml | 45 + .../custom_collection_handling/Person.java | 48 + .../PersonMapper.xml | 68 + .../submitted/default_method/CreateDB.sql | 24 + .../default_method/DefaultMethodTest.java | 74 + .../submitted/default_method/Mapper.java | 39 + .../default_method/PackageMapper.java | 27 + .../ibatis/submitted/default_method/User.java | 38 + .../default_method/mybatis-config.xml | 44 + .../deferload_common_property/Child.java | 47 + .../ChildMapper.java | 22 + .../deferload_common_property/ChildMapper.xml | 36 + .../CommonPropertyDeferLoadError.java | 117 + .../deferload_common_property/CreateDB.sql | 33 + .../deferload_common_property/Father.java | 37 + .../FatherMapper.java | 20 + .../FatherMapper.xml | 36 + .../ibatisConfig.xml | 49 + .../lazyLoadIbatisConfig.xml | 49 + .../DisallowDotsOnNamesTest.java | 34 + .../submitted/disallowdotsonnames/Person.java | 42 + .../submitted/disallowdotsonnames/Person.xml | 37 + .../disallowdotsonnames/PersonMapper.java | 25 + .../disallowdotsonnames/ibatisConfig.xml | 42 + .../submitted/dml_return_types/CreateDB.sql | 24 + .../DmlMapperReturnTypesTest.java | 106 + .../submitted/dml_return_types/Mapper.java | 36 + .../submitted/dml_return_types/Mapper.xml | 61 + .../submitted/dml_return_types/User.java | 46 + .../dml_return_types/mybatis-config.xml | 45 + .../duplicate_resource_loaded/Config.xml | 44 + .../DuplicateResourceTest.java | 50 + .../duplicate_resource_loaded/Mapper.java | 25 + .../duplicate_resource_loaded/Mapper.xml | 33 + .../duplicate_statements/AnnotatedMapper.java | 35 + .../AnnotatedMapperExtended.java | 32 + .../duplicate_statements/CreateDB.sql | 33 + .../DuplicateStatementsTest.java | 92 + .../duplicate_statements/Mapper.java | 26 + .../submitted/duplicate_statements/Mapper.xml | 29 + .../submitted/duplicate_statements/User.java | 38 + .../duplicate_statements/mybatis-config.xml | 42 + .../ibatis/submitted/dynsql/CreateDB.sql | 45 + .../ibatis/submitted/dynsql/CustomUtil.java | 22 + .../apache/ibatis/submitted/dynsql/DynSql.xml | 73 + .../ibatis/submitted/dynsql/DynSqlMapper.java | 22 + .../ibatis/submitted/dynsql/DynSqlMapper.xml | 33 + .../ibatis/submitted/dynsql/DynSqlTest.java | 137 + .../ibatis/submitted/dynsql/MapperConfig.xml | 43 + .../ibatis/submitted/dynsql/NumericRow.java | 93 + .../ibatis/submitted/dynsql/Parameter.java | 57 + .../ibatis/submitted/dynsql2/CreateDB.sql | 30 + .../ibatis/submitted/dynsql2/DynSql.xml | 39 + .../ibatis/submitted/dynsql2/DynSqlTest.java | 84 + .../dynsql2/FirstNameTypeHandler.java | 54 + .../dynsql2/LastNameTypeHandler.java | 53 + .../ibatis/submitted/dynsql2/MapperConfig.xml | 42 + .../apache/ibatis/submitted/dynsql2/Name.java | 37 + .../ibatis/submitted/dynsql2/Parameter.java | 33 + .../empty_namespace/EmptyNamespaceTest.java | 32 + .../submitted/empty_namespace/Person.java | 45 + .../submitted/empty_namespace/Person.xml | 81 + .../empty_namespace/ibatisConfig.xml | 42 + .../ibatis/submitted/empty_row/Child.java | 48 + .../ibatis/submitted/empty_row/CreateDB.sql | 45 + .../ibatis/submitted/empty_row/Mapper.java | 59 + .../ibatis/submitted/empty_row/Mapper.xml | 83 + .../ibatis/submitted/empty_row/Parent.java | 76 + .../ibatis/submitted/empty_row/Pet.java | 48 + .../ReturnInstanceForEmptyRowTest.java | 142 ++ .../submitted/empty_row/mybatis-config.xml | 46 + .../ibatis/submitted/emptycollection/Dao.java | 24 + .../ibatis/submitted/emptycollection/Dao.xml | 56 + .../submitted/emptycollection/DaoTest.java | 94 + .../submitted/emptycollection/TodoItem.java | 44 + .../submitted/emptycollection/TodoLists.java | 47 + .../emptycollection/mybatis-config.xml | 38 + .../ibatis/submitted/encoding/CreateDB.sql | 24 + .../ibatis/submitted/encoding/Encoding.xml | 31 + .../submitted/encoding/EncodingConfig.xml | 42 + .../submitted/encoding/EncodingMapper.java | 21 + .../submitted/encoding/EncodingTest.java | 69 + .../enum_interface_type_handler/Color.java | 35 + .../enum_interface_type_handler/CreateDB.sql | 24 + .../EnumInterfaceTypeHandlerTest.java | 68 + .../enum_interface_type_handler/HasValue.java | 21 + .../HasValueEnumTypeHandler.java | 97 + .../enum_interface_type_handler/Mapper.java | 27 + .../enum_interface_type_handler/User.java | 38 + .../mybatis-config.xml | 43 + .../CreateDB.sql | 25 + .../Employee.java | 23 + .../EnumTypeHandlerUsingAnnotationTest.java | 128 + .../enumtypehandler_on_annotation/Person.java | 69 + .../PersonMapper.java | 56 + .../mybatis-config.xml | 36 + .../enumtypehandler_on_map/CreateDB.sql | 25 + .../EnumTypeHandlerTest.java | 74 + .../enumtypehandler_on_map/Person.java | 46 + .../enumtypehandler_on_map/Person.xml | 51 + .../enumtypehandler_on_map/PersonMapper.java | 32 + .../enumtypehandler_on_map/ibatisConfig.xml | 42 + .../apache/ibatis/submitted/extend/Child.java | 20 + .../ibatis/submitted/extend/CreateDB.sql | 24 + .../apache/ibatis/submitted/extend/Extend.xml | 40 + .../ibatis/submitted/extend/ExtendConfig.xml | 42 + .../ibatis/submitted/extend/ExtendMapper.java | 21 + .../ibatis/submitted/extend/ExtendTest.java | 53 + .../ibatis/submitted/extend/Parent.java | 29 + .../submitted/extendresultmap/CreateDB.sql | 25 + .../extendresultmap/ExtendResultMapTest.java | 52 + .../extendresultmap/TestMapperX.java | 25 + .../submitted/extendresultmap/TestMapperX.xml | 27 + .../extendresultmap/TestMapperY.java | 25 + .../submitted/extendresultmap/TestMapperY.xml | 28 + .../submitted/extendresultmap/TestModel.java | 83 + .../extendresultmap/mybatis-config.xml | 43 + .../extends_with_constructor/CreateDB.sql | 33 + .../NpeExtendsTest.java | 105 + .../extends_with_constructor/Student.java | 46 + .../StudentConstructor.java | 66 + .../StudentConstructorMapper.java | 21 + .../StudentConstructorMapper.xml | 50 + .../StudentMapper.java | 22 + .../StudentMapper.xml | 37 + .../extends_with_constructor/Teacher.java | 48 + .../TeacherMapper.java | 20 + .../TeacherMapper.xml | 34 + .../flush_statement_npe/CreateDB.sql | 30 + .../FlushStatementNpeTest.java | 91 + .../submitted/flush_statement_npe/Person.java | 40 + .../submitted/flush_statement_npe/Person.xml | 43 + .../flush_statement_npe/PersonMapper.java | 21 + .../flush_statement_npe/ibatisConfig.xml | 42 + .../force_flush_on_select/CreateDB.sql | 32 + .../ForceFlushOnSelectTest.java | 131 + .../force_flush_on_select/Person.java | 42 + .../force_flush_on_select/Person.xml | 62 + .../force_flush_on_select/PersonMapper.java | 26 + .../force_flush_on_select/ibatisConfig.xml | 42 + .../ibatis/submitted/foreach/CreateDB.sql | 29 + .../ibatis/submitted/foreach/ForEachTest.java | 141 ++ .../ibatis/submitted/foreach/Mapper.java | 37 + .../ibatis/submitted/foreach/Mapper.xml | 95 + .../apache/ibatis/submitted/foreach/User.java | 58 + .../submitted/foreach/mybatis-config.xml | 42 + .../ibatis/submitted/foreach_map/CreateDB.sql | 53 + .../submitted/foreach_map/ForEachMapTest.java | 104 + .../foreach_map/IntBoolMapEntry.java | 74 + .../submitted/foreach_map/MapParam.java | 31 + .../ibatis/submitted/foreach_map/Mapper.xml | 61 + .../submitted/foreach_map/NestedBean.java | 34 + .../foreach_map/NestedBeanMapEntry.java | 100 + .../foreach_map/StringStringMapEntry.java | 74 + .../submitted/foreach_map/mybatis-config.xml | 42 + .../generictyperesolution/CreateDB.sql | 26 + .../generictyperesolution/Entity.java | 48 + .../GenericTypeResolutionTest.java | 71 + .../generictyperesolution/Mapper.java | 30 + .../submitted/generictyperesolution/User.java | 19 + .../generictyperesolution/mybatis-config.xml | 42 + .../ibatis/submitted/generictypes/Config.xml | 44 + .../submitted/generictypes/CreateDB.sql | 26 + .../generictypes/GenericTypesTest.java | 53 + .../ibatis/submitted/generictypes/Group.java | 45 + .../ibatis/submitted/generictypes/Mapper.java | 25 + .../ibatis/submitted/generictypes/User.java | 45 + .../generictypes/UserTypeHandler.java | 47 + .../global_variables/AnnotationMapper.java | 32 + .../submitted/global_variables/BaseTest.java | 90 + .../submitted/global_variables/CreateDB.sql | 24 + .../global_variables/CustomCache.java | 54 + .../submitted/global_variables/Mapper.java | 22 + .../submitted/global_variables/Mapper.xml | 35 + .../submitted/global_variables/User.java | 38 + .../global_variables/mybatis-config.xml | 50 + .../AnnotationMapperTest.java | 92 + .../ConfigurationTest.java | 76 + .../CustomizationTest.java | 110 + .../SupportClasses.java | 76 + .../XmlMapperTest$XmlMapper.xml | 47 + .../XmlMapperTest.java | 94 + .../mybatis-config-custom-separator.xml | 48 + .../mybatis-config.xml | 48 + .../submitted/hashmaptypehandler/CreateDB.sql | 24 + .../HashMapTypeHandler.java | 53 + .../HashMapTypeHandlerTest.java | 85 + .../submitted/hashmaptypehandler/Mapper.java | 35 + .../submitted/hashmaptypehandler/Mapper.xml | 33 + .../submitted/hashmaptypehandler/User.java | 38 + .../hashmaptypehandler/mybatis-config.xml | 46 + .../submitted/heavy_initial_load/Code.java | 1029 ++++++++ .../HeavyInitialLoadTest.java | 96 + .../submitted/heavy_initial_load/Thing.java | 30 + .../heavy_initial_load/ThingMapper.java | 23 + .../heavy_initial_load/ThingMapper.xml | 1034 ++++++++ .../heavy_initial_load/ibatisConfig.xml | 42 + .../immutable_constructor/CreateDB.sql | 23 + .../immutable_constructor/ImmutablePOJO.java | 39 + .../ImmutablePOJOMapper.java | 25 + .../ImmutablePOJOMapper.xml | 40 + .../ImmutablePOJOTest.java | 69 + .../immutable_constructor/ibatisConfig.xml | 42 + .../submitted/include_property/CreateDB.sql | 27 + .../DuplicatedIncludePropertiesMapper.java | 20 + .../DuplicatedIncludePropertiesMapper.xml | 39 + .../IncludePropertyErrorTest.java | 30 + .../include_property/IncludePropertyTest.java | 130 + .../submitted/include_property/Mapper.xml | 152 ++ .../include_property/mybatis-config.xml | 48 + .../ibatis/submitted/includes/CreateDB.sql | 26 + .../ibatis/submitted/includes/Fragments.xml | 33 + .../submitted/includes/IncludeTest.java | 63 + .../ibatis/submitted/includes/Mapper.xml | 57 + .../submitted/includes/MapperConfig.xml | 47 + .../submitted/inheritance/BaseMapper.java | 22 + .../ibatis/submitted/inheritance/CreateDB.sql | 31 + .../inheritance/InheritanceTest.java | 55 + .../submitted/inheritance/UserProfile.java | 38 + .../inheritance/UserProfileMapper.java | 25 + .../submitted/inheritance/mybatis-config.xml | 47 + .../Author.java | 54 + .../Author.xml | 66 + .../AuthorDAOTest.java | 66 + .../initialized_collection_property/Post.java | 47 + .../create.sql | 23 + .../mybatis-config.xml | 45 + .../inline_association_with_dot/Element.java | 38 + .../ElementMapper.java | 20 + .../ElementMapperUsingInline.java | 20 + .../ElementMapperUsingInline.xml | 35 + .../ElementMapperUsingSubMap.java | 20 + .../ElementMapperUsingSubMap.xml | 37 + .../InlineCollectionWithDotTest.java | 81 + .../inline_association_with_dot/create.sql | 18 + .../ibatis-inline.xml | 42 + .../ibatis-submap.xml | 42 + .../integer_enum/IntegerEnumTest.java | 35 + .../ibatis/submitted/integer_enum/Mapper.xml | 42 + .../submitted/integer_enum/MapperConfig.xml | 29 + .../ibatis/submitted/integer_enum/Record.java | 47 + .../ibatis/submitted/javassist/CreateDB.sql | 31 + .../ibatis/submitted/javassist/Group.java | 38 + .../submitted/javassist/JavassistTest.java | 60 + .../ibatis/submitted/javassist/Mapper.java | 22 + .../ibatis/submitted/javassist/Mapper.xml | 39 + .../ibatis/submitted/javassist/User.java | 49 + .../submitted/javassist/mybatis-config.xml | 48 + .../ibatis/submitted/keycolumn/CreateDB.sql | 30 + .../submitted/keycolumn/InsertMapper.java | 32 + .../submitted/keycolumn/InsertMapper.xml | 28 + .../submitted/keycolumn/InsertTest.java | 0 .../ibatis/submitted/keycolumn/Name.java | 40 + .../ibatis/submitted/keygen/Country.java | 63 + .../submitted/keygen/CountryMapper.java | 107 + .../ibatis/submitted/keygen/CountryMapper.xml | 135 + .../ibatis/submitted/keygen/CreateDB.sql | 31 + .../keygen/Jdbc3KeyGeneratorTest.java | 433 ++++ .../ibatis/submitted/keygen/MapperConfig.xml | 40 + .../ibatis/submitted/keygen/Planet.java | 48 + .../ibatis/submitted/language/CreateDB.sql | 27 + .../submitted/language/LanguageTest.java | 218 ++ .../ibatis/submitted/language/Mapper.java | 42 + .../ibatis/submitted/language/Mapper.xml | 89 + .../submitted/language/MapperConfig.xml | 51 + .../ibatis/submitted/language/Name.java | 49 + .../ibatis/submitted/language/Parameter.java | 37 + .../language/VelocityLanguageDriver.java | 0 .../submitted/language/VelocitySqlSource.java | 0 .../language/VelocitySqlSourceBuilder.java | 140 ++ .../submitted/lazy_deserialize/CreateDB.sql | 29 + .../lazy_deserialize/LazyDeserializeTest.java | 110 + .../lazy_deserialize/LazyObjectBar.java | 37 + .../lazy_deserialize/LazyObjectFoo.java | 46 + .../submitted/lazy_deserialize/Mapper.java | 27 + .../submitted/lazy_deserialize/Mapper.xml | 50 + .../lazy_deserialize/ibatisConfig.xml | 50 + .../submitted/lazy_immutable/CreateDB.sql | 23 + .../lazy_immutable/ImmutablePOJO.java | 39 + .../lazy_immutable/ImmutablePOJOMapper.java | 24 + .../lazy_immutable/ImmutablePOJOMapper.xml | 40 + .../lazy_immutable/ImmutablePOJOTest.java | 62 + .../submitted/lazy_immutable/ibatisConfig.xml | 46 + .../submitted/lazy_properties/CreateDB.sql | 24 + .../lazy_properties/LazyPropertiesTest.java | 181 ++ .../submitted/lazy_properties/Mapper.java | 37 + .../submitted/lazy_properties/Mapper.xml | 46 + .../submitted/lazy_properties/User.java | 79 + .../lazy_properties/mybatis-config.xml | 46 + .../lazyload_common_property/Child.java | 47 + .../lazyload_common_property/ChildMapper.java | 20 + .../lazyload_common_property/ChildMapper.xml | 38 + .../CommonPropertyLazyLoadError.java | 82 + .../lazyload_common_property/CreateDB.sql | 40 + .../lazyload_common_property/Father.java | 40 + .../FatherMapper.java | 20 + .../lazyload_common_property/FatherMapper.xml | 37 + .../lazyload_common_property/GrandFather.java | 33 + .../GrandFatherMapper.java | 20 + .../GrandFatherMapper.xml | 36 + .../lazyload_common_property/ibatisConfig.xml | 51 + .../AbstractLazyTest.java | 89 + .../CglibLazyTest.java | 25 + .../CreateDB.sql | 33 + .../DefaultLazyTest.java | 25 + .../Group.java | 39 + .../JavassistLazyTest.java | 27 + .../Mapper.java | 29 + .../Mapper.xml | 107 + .../Owned.java | 21 + .../UserWithGetObjectWithInterface.java | 54 + .../UserWithGetObjectWithoutInterface.java | 51 + .../UserWithGetXxxWithInterface.java | 54 + .../UserWithGetXxxWithoutInterface.java | 47 + .../UserWithNothingWithInterface.java | 50 + .../UserWithNothingWithoutInterface.java | 47 + .../mybatis-config-cglib.xml | 48 + .../mybatis-config-default.xml | 47 + .../mybatis-config-javassist.xml | 48 + .../ibatis/submitted/manyanno/AnnoPost.java | 59 + .../submitted/manyanno/AnnoPostTag.java | 35 + .../submitted/manyanno/ManyAnnoTest.java | 52 + .../ibatis/submitted/manyanno/PostMapper.java | 41 + .../MapperNameTest.java | 33 + .../map_class_name_conflict/Person.java | 46 + .../map_class_name_conflict/PersonMapper.java | 24 + .../map_class_name_conflict/PersonMapper.xml | 35 + .../map_class_name_conflict/ibatisConfig.xml | 43 + .../submitted/mapper_extend/ChildMapper.java | 20 + .../submitted/mapper_extend/CreateDB.sql | 25 + .../mapper_extend/GrandpaMapper.java | 25 + .../submitted/mapper_extend/Mapper.java | 20 + .../mapper_extend/MapperExtendTest.java | 105 + .../mapper_extend/MapperOverload.java | 29 + .../mapper_extend/MapperOverload.xml | 29 + .../submitted/mapper_extend/ParentMapper.java | 27 + .../submitted/mapper_extend/ParentMapper.xml | 33 + .../ibatis/submitted/mapper_extend/User.java | 38 + .../mapper_extend/mybatis-config.xml | 45 + .../mapper_type_parameter/BaseMapper.java | 91 + .../mapper_type_parameter/Country.java | 53 + .../mapper_type_parameter/CountryMapper.java | 19 + .../mapper_type_parameter/CreateDB.sql | 31 + .../MapperTypeParameterTest.java | 107 + .../mapper_type_parameter/Person.java | 58 + .../PersonListMapper.java | 21 + .../mapper_type_parameter/PersonMapper.java | 19 + .../mapper_type_parameter/mybatis-config.xml | 42 + .../submitted/maptypehandler/CreateDB.sql | 24 + .../maptypehandler/LabelsTypeHandler.java | 54 + .../maptypehandler/MapTypeHandlerTest.java | 73 + .../submitted/maptypehandler/Mapper.java | 33 + .../submitted/maptypehandler/Mapper.xml | 29 + .../ibatis/submitted/maptypehandler/User.java | 38 + .../maptypehandler/mybatis-config.xml | 46 + .../member_access/MemberAccessTest.java | 390 +++ .../member_access/mybatis-config.xml | 36 + .../submitted/missing_id_property/Car.java | 40 + .../missing_id_property/CarMapper.java | 21 + .../missing_id_property/CreateDB.sql | 37 + .../submitted/missing_id_property/Map.xml | 52 + .../missing_id_property/MapperConfig.xml | 50 + .../MissingIdPropertyTest.java | 56 + .../submitted/missing_id_property/Part.java | 28 + .../ibatis/submitted/multidb/CreateDB.sql | 29 + .../multidb/DummyDatabaseIdProvider.java | 38 + .../submitted/multidb/MultiDbConfig.xml | 46 + .../submitted/multidb/MultiDbMapper.java | 25 + .../submitted/multidb/MultiDbMapper.xml | 103 + .../ibatis/submitted/multidb/MultiDbTest.java | 101 + .../submitted/multidb/ProviderConfig.xml | 42 + .../submitted/multidb/ProviderTest.java | 45 + .../apache/ibatis/submitted/multidb/User.java | 43 + .../multiple_discriminator/CreateDB.sql | 31 + .../multiple_discriminator/Director.java | 27 + .../multiple_discriminator/Employee.java | 27 + .../MultipleDiscriminatorTest.java | 68 + .../multiple_discriminator/Person.java | 40 + .../multiple_discriminator/Person.xml | 86 + .../multiple_discriminator/PersonMapper.java | 23 + .../multiple_discriminator/ibatisConfig.xml | 44 + .../multiple_resultsets/CreateDB.sql | 83 + .../submitted/multiple_resultsets/Mapper.java | 26 + .../submitted/multiple_resultsets/Mapper.xml | 40 + .../MultipleResultTest.java | 0 .../multiple_resultsets/OrderDetail.java | 56 + .../multiple_resultsets/OrderHeader.java | 39 + .../submitted/multipleiterates/CreateDB.sql | 27 + .../submitted/multipleiterates/Mapper.java | 24 + .../submitted/multipleiterates/Mapper.xml | 58 + .../MultipleIteratesTest.java | 57 + .../submitted/multipleiterates/User.java | 59 + .../multipleiterates/mybatis-config.xml | 42 + .../CreateDB1.sql | 35 + .../CreateDB2.sql | 32 + .../CreateDB3.sql | 35 + .../Mapper.java | 34 + .../Mapper.xml | 40 + .../MultipleResultSetTest.java | 109 + .../OrderDetail.java | 66 + .../OrderHeader.java | 39 + .../mybatis-config.xml | 47 + .../named_constructor_args/CreateDB.sql | 26 + .../InvalidNamedConstructorArgsTest.java | 115 + .../named_constructor_args/Mapper.java | 34 + .../named_constructor_args/Mapper.xml | 40 + .../NamedConstructorArgsTest.java | 73 + ...NamedConstructorArgsUseActualNameTest.java | 68 + .../UseActualNameMapper.java | 33 + .../UseActualNameMapper.xml | 39 + .../named_constructor_args/User.java | 60 + .../named_constructor_args/mybatis-config.xml | 38 + .../ibatis/submitted/nested/CreateDB.sql | 28 + .../ibatis/submitted/nested/Mapper.java | 25 + .../ibatis/submitted/nested/MapperConfig.xml | 46 + .../apache/ibatis/submitted/nested/Name.java | 44 + .../ibatis/submitted/nested/NestedForEach.xml | 66 + .../submitted/nested/NestedForEachTest.java | 125 + .../ibatis/submitted/nested/Parameter.java | 35 + .../nested_query_cache/AuthorMapper.java | 24 + .../nested_query_cache/AuthorMapper.xml | 41 + .../nested_query_cache/BlogMapper.java | 26 + .../nested_query_cache/BlogMapper.xml | 53 + .../nested_query_cache/MapperConfig.xml | 69 + .../NestedQueryCacheTest.java | 90 + .../nested_query_cache/mapper.properties | 19 + .../nestedresulthandler/CreateDB.sql | 39 + .../submitted/nestedresulthandler/Item.java | 47 + .../submitted/nestedresulthandler/Mapper.java | 24 + .../submitted/nestedresulthandler/Mapper.xml | 64 + .../NestedResultHandlerTest.java | 151 ++ .../submitted/nestedresulthandler/Person.java | 66 + .../nestedresulthandler/PersonItemPair.java | 50 + .../nestedresulthandler/mybatis-config.xml | 45 + .../Account.java | 60 + .../AccountAddress.java | 48 + .../AccountRepository.xml | 50 + .../CreateDB.sql | 37 + .../NestedResultHandlerAssociationTest.java | 93 + .../mybatis-config.xml | 42 + .../Binome.java | 66 + .../ChildBean.java | 42 + .../CreateDB.sql | 45 + ...dResultHandlerMultipleAssociationTest.java | 84 + .../ParentBean.java | 58 + .../mapper.xml | 54 + .../mybatis-config.xml | 42 + .../submitted/no_param_type/CreateDB.sql | 22 + .../ibatis/submitted/no_param_type/Mapper.xml | 33 + .../no_param_type/NoParamTypeTest.java | 112 + .../ibatis/submitted/no_param_type/User.java | 38 + .../no_param_type/mybatis-config.xml | 42 + .../nonexistentvariables/CreateDB.sql | 25 + .../nonexistentvariables/Mapper.java | 20 + .../NonExistentVariablesTest.java | 53 + .../nonexistentvariables/mappers.xml | 27 + .../nonexistentvariables/mybatis-config.xml | 42 + .../submitted/not_null_column/Base.java | 35 + .../submitted/not_null_column/Child.java | 44 + .../submitted/not_null_column/CreateDB.sql | 35 + .../submitted/not_null_column/Father.java | 48 + .../not_null_column/FatherMapper.java | 26 + .../not_null_column/FatherMapper.xml | 151 ++ .../not_null_column/NotNullColumnTest.java | 139 ++ .../not_null_column/ibatisConfig.xml | 48 + .../submitted/null_associations/Bar.java | 61 + .../submitted/null_associations/Foo.java | 61 + .../null_associations/FooMapper.java | 26 + .../submitted/null_associations/FooMapper.xml | 61 + .../null_associations/FooMapperTest.java | 85 + .../null_associations/create-schema-mysql.sql | 23 + .../submitted/null_associations/sqlmap.xml | 49 + .../ibatis/submitted/ognl_enum/CreateDB.sql | 31 + .../submitted/ognl_enum/EnumWithOgnlTest.java | 99 + .../ibatis/submitted/ognl_enum/Person.java | 45 + .../ibatis/submitted/ognl_enum/Person.xml | 81 + .../submitted/ognl_enum/PersonMapper.java | 30 + .../submitted/ognl_enum/ibatisConfig.xml | 42 + .../ibatis/submitted/ognlstatic/CreateDB.sql | 24 + .../ibatis/submitted/ognlstatic/Mapper.java | 23 + .../ibatis/submitted/ognlstatic/Mapper.xml | 42 + .../submitted/ognlstatic/OgnlStaticTest.java | 71 + .../submitted/ognlstatic/StaticClass.java | 21 + .../ibatis/submitted/ognlstatic/User.java | 38 + .../submitted/ognlstatic/mybatis-config.xml | 42 + .../optional_on_mapper_method/CreateDB.sql | 25 + .../optional_on_mapper_method/Mapper.java | 29 + .../optional_on_mapper_method/Mapper.xml | 29 + .../OptionalOnMapperMethodTest.java | 112 + .../optional_on_mapper_method/User.java | 38 + .../mybatis-config.xml | 42 + .../order_prefix_removed/CreateDB.sql | 31 + .../OrderPrefixRemoved.java | 57 + .../order_prefix_removed/Person.java | 42 + .../submitted/order_prefix_removed/Person.xml | 41 + .../order_prefix_removed/PersonMapper.java | 20 + .../order_prefix_removed/ibatisConfig.xml | 42 + .../submitted/overwritingproperties/Bar.java | 39 + .../submitted/overwritingproperties/Foo.java | 69 + .../overwritingproperties/FooMapper.java | 26 + .../overwritingproperties/FooMapper.xml | 64 + .../overwritingproperties/FooMapperTest.java | 91 + .../create-schema-mysql.sql | 23 + .../overwritingproperties/sqlmap.xml | 51 + .../submitted/parametrizedlist/Config.xml | 40 + .../submitted/parametrizedlist/CreateDB.sql | 26 + .../submitted/parametrizedlist/Mapper.java | 39 + .../ParametrizedListTest.java | 82 + .../submitted/parametrizedlist/User.java | 45 + .../ibatis/submitted/parent_childs/Child.java | 50 + .../submitted/parent_childs/CreateDB.sql | 38 + .../submitted/parent_childs/Mapper.java | 24 + .../ibatis/submitted/parent_childs/Mapper.xml | 51 + .../submitted/parent_childs/Parent.java | 52 + .../parent_childs/ParentChildTest.java | 61 + .../parent_childs/mybatis-config.xml | 42 + .../parent_reference_3level/Blog.java | 58 + .../parent_reference_3level/BlogTest.java | 104 + .../parent_reference_3level/Comment.java | 53 + .../parent_reference_3level/CreateDB.sql | 47 + .../parent_reference_3level/Mapper.java | 23 + .../parent_reference_3level/Mapper.xml | 80 + .../parent_reference_3level/Post.java | 67 + .../mybatis-config.xml | 44 + .../ibatis/submitted/permissions/CreateDB.sql | 28 + .../submitted/permissions/Permission.java | 36 + .../permissions/PermissionsMapper.java | 25 + .../permissions/PermissionsMapper.xml | 81 + .../permissions/PermissionsTest.java | 99 + .../submitted/permissions/Principal.java | 39 + .../submitted/permissions/Resource.java | 37 + .../submitted/permissions/mybatis-config.xml | 46 + .../submitted/postgres_genkeys/CreateDB.sql | 34 + .../submitted/postgres_genkeys/Mapper.java | 31 + .../PostgresGeneratedKeysTest.java | 0 .../submitted/postgres_genkeys/Section.java | 38 + .../submitted/postgres_genkeys/User.java | 38 + .../submitted/primitive_array/CreateDB.sql | 30 + .../submitted/primitive_array/Mapper.java | 22 + .../submitted/primitive_array/Mapper.xml | 42 + .../primitive_array/PrimitiveArrayTest.java | 56 + .../submitted/primitive_array/User.java | 47 + .../primitive_array/mybatis-config.xml | 42 + .../primitive_result_type/IbatisConfig.java | 55 + .../PrimitiveResultTypeTest.java | 54 + .../primitive_result_type/Product.java | 38 + .../primitive_result_type/ProductDAO.java | 61 + .../primitive_result_type/ProductMapper.java | 30 + .../primitive_result_type/ProductMapper.xml | 40 + .../primitive_result_type/create.sql | 21 + .../primitive_result_type/ibatis.xml | 44 + .../submitted/primitives/Assetright.java | 50 + .../ibatis/submitted/primitives/CreateDB.sql | 36 + .../ibatis/submitted/primitives/Mapper.java | 24 + .../ibatis/submitted/primitives/Mapper.xml | 37 + .../submitted/primitives/PrimitivesTest.java | 56 + .../submitted/primitives/mybatis-config.xml | 42 + .../propertiesinmapperfiles/CreateDB.sql | 24 + .../propertiesinmapperfiles/Mapper.java | 22 + .../propertiesinmapperfiles/Mapper.xml | 29 + .../PropertiesInMappersTest.java | 60 + .../propertiesinmapperfiles/User.java | 38 + .../mybatis-config.xml | 42 + .../submitted/quotedcolumnnames/CreateDB.sql | 30 + .../submitted/quotedcolumnnames/Map.xml | 44 + .../quotedcolumnnames/MapperConfig.xml | 46 + .../QuotedColumnNamesTest.java | 78 + .../submitted/raw_sql_source/CreateDB.sql | 24 + .../submitted/raw_sql_source/Mapper.xml | 39 + .../raw_sql_source/RawSqlSourceTest.java | 73 + .../ibatis/submitted/raw_sql_source/User.java | 38 + .../raw_sql_source/mybatis-config.xml | 42 + .../ibatis/submitted/refcursor/CreateDB.sql | 102 + .../ibatis/submitted/refcursor/Order.java | 42 + .../submitted/refcursor/OrderDetail.java | 47 + .../submitted/refcursor/OrdersMapper.java | 28 + .../submitted/refcursor/OrdersMapper.xml | 57 + .../submitted/refcursor/RefCursorTest.java | 0 .../refid_resolution/ExternalMapper1.xml | 39 + .../refid_resolution/ExternalMapper2.xml | 27 + .../refid_resolution/ExternalMapperConfig.xml | 30 + .../ExternalRefidResolutionTest.java | 38 + .../submitted/refid_resolution/Mapper.xml | 38 + .../refid_resolution/MapperConfig.xml | 29 + .../refid_resolution/RefidResolutionTest.java | 35 + .../submitted/result_handler/CreateDB.sql | 26 + .../submitted/result_handler/Mapper.java | 29 + .../result_handler/ResulthandlerTest.java | 64 + .../ibatis/submitted/result_handler/User.java | 38 + .../result_handler/UserResultHandler.java | 41 + .../result_handler/mybatis-config.xml | 38 + .../result_handler_type/CreateDB.sql | 21 + .../DefaultResultHandlerTypeTest.java | 79 + .../result_handler_type/MapperConfig.xml | 44 + .../result_handler_type/ObjectFactory.java | 42 + .../submitted/result_handler_type/Person.java | 43 + .../result_handler_type/PersonMapper.java | 30 + .../result_handler_type/PersonMapper.xml | 29 + .../submitted/result_set_type/CreateDB.sql | 54 + .../submitted/result_set_type/Mapper.java | 42 + .../submitted/result_set_type/Mapper.xml | 88 + .../result_set_type/ResultSetTypeTest.java | 87 + .../submitted/result_set_type/User.java | 38 + .../result_set_type/mybatis-config.xml | 42 + .../Address.java | 32 + .../CreateDB.sql | 42 + .../resultmapwithassociationstest/Mapper.java | 22 + .../resultmapwithassociationstest/Mapper.xml | 38 + .../resultmapwithassociationstest/Person.java | 39 + .../ResultMapWithAssociationsTest.java | 55 + .../mybatis-config.xml | 42 + .../submitted/results_id/AnotherMapper.java | 32 + .../submitted/results_id/AnotherMapper.xml | 27 + .../ibatis/submitted/results_id/CreateDB.sql | 25 + .../results_id/IdConflictMapper.java | 27 + .../submitted/results_id/IdConflictMapper.xml | 28 + .../submitted/results_id/IdConflictTest.java | 34 + .../ibatis/submitted/results_id/Mapper.java | 49 + .../submitted/results_id/ResultsIdTest.java | 89 + .../ibatis/submitted/results_id/User.java | 48 + .../submitted/results_id/mybatis-config.xml | 43 + .../ibatis/submitted/rounding/CreateDB.sql | 40 + .../ibatis/submitted/rounding/Mapper.java | 25 + .../ibatis/submitted/rounding/Mapper.xml | 55 + .../rounding/RoundingHandlersTest.java | 75 + .../ibatis/submitted/rounding/User.java | 60 + .../submitted/rounding/mybatis-config.xml | 46 + .../submitted/selectkey/AnnotatedMapper.java | 75 + .../submitted/selectkey/AnnotatedMapper.xml | 56 + .../ibatis/submitted/selectkey/CreateDB.sql | 38 + .../submitted/selectkey/MapperConfig.xml | 42 + .../ibatis/submitted/selectkey/Name.java | 40 + .../submitted/selectkey/SelectKeyTest.java | 342 +++ .../submitted/selectkey/SqlProvider.java | 23 + .../ibatis/submitted/selectkey/Table1.xml | 27 + .../ibatis/submitted/selectkey/Table2.xml | 49 + .../serializecircular/Attribute.java | 33 + .../serializecircular/AttributeMapper.java | 21 + .../serializecircular/AttributeMapper.xml | 37 + .../submitted/serializecircular/CreateDB.sql | 34 + .../serializecircular/Department.java | 52 + .../serializecircular/DepartmentMapper.java | 20 + .../serializecircular/DepartmentMapper.xml | 40 + .../MapperConfigWithAggressiveLazyLoading.xml | 49 + ...pperConfigWithoutAggressiveLazyLoading.xml | 49 + .../submitted/serializecircular/Person.java | 44 + .../serializecircular/PersonMapper.java | 23 + .../serializecircular/PersonMapper.xml | 47 + .../SerializeCircularTest.java | 118 + .../serializecircular/UtilityTester.java | 62 + .../submitted/simplelistparameter/Car.java | 39 + .../simplelistparameter/CarMapper.java | 32 + .../simplelistparameter/CreateDB.sql | 26 + .../submitted/simplelistparameter/Rv.java | 19 + .../SimpleListParameterTest.java | 79 + .../simplelistparameter/Vehicle.java | 34 + .../simplelistparameter/mybatis-config.xml | 46 + .../apache/ibatis/submitted/sptests/Book.java | 47 + .../ibatis/submitted/sptests/CreateDB.sql | 189 ++ .../ibatis/submitted/sptests/Genre.java | 29 + .../apache/ibatis/submitted/sptests/Item.java | 37 + .../ibatis/submitted/sptests/MapperConfig.xml | 49 + .../apache/ibatis/submitted/sptests/Name.java | 57 + .../ibatis/submitted/sptests/Parameter.java | 46 + .../ibatis/submitted/sptests/SPMapper.java | 107 + .../ibatis/submitted/sptests/SPMapper.xml | 148 ++ .../ibatis/submitted/sptests/SPTest.java | 758 ++++++ .../submitted/sqlprovider/BaseMapper.java | 69 + .../ibatis/submitted/sqlprovider/CreateDB.sql | 29 + .../ibatis/submitted/sqlprovider/Mapper.java | 65 + .../submitted/sqlprovider/OurSqlBuilder.java | 216 ++ .../sqlprovider/SqlProviderTest.java | 541 ++++ .../ibatis/submitted/sqlprovider/User.java | 38 + .../submitted/sqlprovider/mybatis-config.xml | 47 + .../ibatis/submitted/stringlist/CreateDB.sql | 29 + .../ibatis/submitted/stringlist/Mapper.java | 24 + .../ibatis/submitted/stringlist/Mapper.xml | 39 + .../submitted/stringlist/StringListTest.java | 57 + .../ibatis/submitted/stringlist/User.java | 58 + .../submitted/stringlist/mybatis-config.xml | 42 + .../substitution_in_annots/CreateDB.sql | 30 + .../SubstitutionInAnnotsMapper.java | 34 + .../SubstitutionInAnnotsMapper.xml | 28 + .../SubstitutionInAnnotsTest.java | 80 + .../ibatis/submitted/typehandler/CreateDB.sql | 36 + .../ibatis/submitted/typehandler/Mapper.java | 59 + .../ibatis/submitted/typehandler/Mapper.xml | 35 + .../ibatis/submitted/typehandler/Product.java | 124 + .../StringTrimmingTypeHandler.java | 62 + .../typehandler/TypeHandlerTest.java | 154 ++ .../ibatis/submitted/typehandler/User.java | 56 + .../submitted/typehandler/mybatis-config.xml | 45 + .../typehandlerinjection/CreateDB.sql | 25 + .../typehandlerinjection/Mapper.java | 24 + .../submitted/typehandlerinjection/Mapper.xml | 36 + .../TypeHandlerInjectionTest.java | 60 + .../submitted/typehandlerinjection/User.java | 47 + .../UserStateTypeHandler.java | 73 + .../typehandlerinjection/mybatis-config.xml | 38 + .../submitted/unknownobject/CreateDB.sql | 25 + .../submitted/unknownobject/Mapper.java | 22 + .../ibatis/submitted/unknownobject/Mapper.xml | 35 + .../unknownobject/UnknownObject.java | 20 + .../unknownobject/UnknownObjectTest.java | 43 + .../ibatis/submitted/unknownobject/User.java | 47 + .../unknownobject/mybatis-config.xml | 42 + .../use_actual_param_name/CreateDB.sql | 25 + .../use_actual_param_name/Mapper.java | 34 + .../use_actual_param_name/Mapper.xml | 41 + .../UseActualParamNameTest.java | 85 + .../submitted/use_actual_param_name/User.java | 38 + .../use_actual_param_name/mybatis-config.xml | 42 + .../ibatis/submitted/uuid_test/CreateDB.sql | 24 + .../ibatis/submitted/uuid_test/Mapper.java | 25 + .../ibatis/submitted/uuid_test/Mapper.xml | 33 + .../ibatis/submitted/uuid_test/UUIDTest.java | 67 + .../submitted/uuid_test/UUIDTypeHandler.java | 55 + .../ibatis/submitted/uuid_test/User.java | 40 + .../submitted/uuid_test/mybatis-config.xml | 47 + .../ibatis/submitted/valueinmap/CreateDB.sql | 24 + .../ibatis/submitted/valueinmap/Mapper.xml | 33 + .../submitted/valueinmap/ValueInMapTest.java | 72 + .../submitted/valueinmap/mybatis-config.xml | 42 + .../submitted/xml_external_ref/CreateDB.sql | 28 + .../submitted/xml_external_ref/Dog.java | 20 + .../xml_external_ref/InvalidMapper.java | 22 + .../xml_external_ref/InvalidMapper.xml | 30 + .../InvalidWithInsertMapper.java | 23 + .../InvalidWithInsertMapper.xml | 38 + .../xml_external_ref/MapperConfig.xml | 43 + .../MultipleCrossIncludeMapperConfig.xml | 43 + .../MultipleCrossIncludePersonMapper.java | 22 + .../MultipleCrossIncludePersonMapper.xml | 62 + .../MultipleCrossIncludePetMapper.java | 20 + .../MultipleCrossIncludePetMapper.xml | 48 + .../MultipleCrossIncludeTest.java | 113 + .../MultipleIncludeMapperConfig.xml | 42 + .../MultipleIncludePersonMapper.java | 22 + .../MultipleIncludePersonMapper.xml | 42 + .../xml_external_ref/MultipleIncludeTest.java | 87 + .../MultipleReverseIncludeMapperConfig.xml | 42 + .../MultipleReverseIncludePersonMapper.java | 22 + .../MultipleReverseIncludePersonMapper.xml | 42 + .../MultipleReverseIncludeTest.java | 86 + .../NonFullyQualifiedNamespaceConfig.xml | 43 + ...NonFullyQualifiedNamespacePersonMapper.xml | 56 + .../NonFullyQualifiedNamespacePetMapper.xml | 46 + .../NonFullyQualifiedNamespaceTest.java | 70 + .../ParameterMapReferenceMapperConfig.xml | 43 + .../ParameterMapReferencePersonMapper.java | 20 + .../ParameterMapReferencePersonMapper.xml | 33 + .../ParameterMapReferencePetMapper.java | 19 + .../ParameterMapReferencePetMapper.xml | 25 + .../ParameterMapReferenceTest.java | 89 + .../submitted/xml_external_ref/Person.java | 53 + .../xml_external_ref/PersonMapper.java | 22 + .../xml_external_ref/PersonMapper.xml | 58 + .../submitted/xml_external_ref/Pet.java | 62 + .../submitted/xml_external_ref/PetMapper.java | 20 + .../submitted/xml_external_ref/PetMapper.xml | 44 + .../ResultMapExtendsMapperConfig.xml | 43 + .../ResultMapExtendsPersonMapper.xml | 34 + .../ResultMapExtendsPetMapper.xml | 27 + .../ResultMapExtendsTest.java | 87 + .../ResultMapReferenceMapperConfig.xml | 43 + .../ResultMapReferencePersonMapper.java | 20 + .../ResultMapReferencePersonMapper.xml | 29 + .../ResultMapReferencePetMapper.java | 19 + .../ResultMapReferencePetMapper.xml | 27 + .../ResultMapReferenceTest.java | 87 + .../ReverseIncludeMapperConfig.xml | 42 + .../ReverseIncludePersonMapper.java | 22 + .../ReverseIncludePersonMapper.xml | 37 + .../xml_external_ref/ReverseIncludeTest.java | 86 + .../xml_external_ref/SameIdMapperConfig.xml | 43 + .../xml_external_ref/SameIdPersonMapper.java | 22 + .../xml_external_ref/SameIdPersonMapper.xml | 58 + .../xml_external_ref/SameIdPetMapper.java | 20 + .../xml_external_ref/SameIdPetMapper.xml | 44 + .../xml_external_ref/SameIdTest.java | 96 + .../xml_external_ref/ShortNameTest.java | 54 + .../xml_external_ref/XmlExternalRefTest.java | 138 ++ .../xml_references/EnumWithOgnlTest.java | 56 + .../submitted/xml_references/Person.java | 45 + .../xml_references/PersonMapper.java | 30 + .../submitted/xml_references/PersonMapper.xml | 40 + .../xml_references/PersonMapper2.java | 30 + .../xml_references/PersonMapper2.xml | 35 + .../submitted/xml_references/ibatisConfig.xml | 42 + .../ibatis/test/EmbeddedPostgresqlTests.java | 20 + .../org/apache/ibatis/test/SlowTests.java | 20 + .../ManagedTransactionFactoryTest.java | 65 + .../ibatis/type/ArrayTypeHandlerTest.java | 90 + .../ibatis/type/BaseTypeHandlerTest.java | 52 + .../type/BigDecimalTypeHandlerTest.java | 79 + .../type/BigIntegerTypeHandlerTest.java | 88 + .../BlobByteObjectArrayTypeHandlerTest.java | 104 + .../type/BlobInputStreamTypeHandlerTest.java | 175 ++ .../type/BlobInputStreamTypeHandlerTest.sql | 22 + .../ibatis/type/BlobTypeHandlerTest.java | 92 + .../ibatis/type/BooleanTypeHandlerTest.java | 89 + .../ibatis/type/ByteArrayTypeHandlerTest.java | 75 + .../type/ByteObjectArrayTypeHandlerTest.java | 87 + .../ibatis/type/ByteTypeHandlerTest.java | 90 + .../ibatis/type/CharacterTypeHandlerTest.java | 91 + .../type/ClobReaderTypeHandlerTest.java | 175 ++ .../ibatis/type/ClobReaderTypeHandlerTest.sql | 22 + .../ibatis/type/ClobTypeHandlerTest.java | 92 + .../ibatis/type/DateOnlyTypeHandlerTest.java | 89 + .../ibatis/type/DateTypeHandlerTest.java | 90 + .../ibatis/type/DoubleTypeHandlerTest.java | 90 + .../type/EnumOrdinalTypeHandlerTest.java | 94 + .../ibatis/type/EnumTypeHandlerTest.java | 95 + .../ibatis/type/FloatTypeHandlerTest.java | 90 + ...ricTypeSupportedInHierarchiesTestCase.java | 48 + .../ibatis/type/InstantTypeHandlerTest.java | 86 + .../ibatis/type/IntegerTypeHandlerTest.java | 90 + .../type/JapaneseDateTypeHandlerTest.java | 88 + .../org/apache/ibatis/type/JdbcTypeTest.java | 48 + .../type/Jsr310TypeHandlerRegistryTest.java | 72 + .../type/LocalDateTimeTypeHandlerTest.java | 86 + .../ibatis/type/LocalDateTypeHandlerTest.java | 86 + .../ibatis/type/LocalTimeTypeHandlerTest.java | 87 + .../ibatis/type/LongTypeHandlerTest.java | 90 + .../ibatis/type/MonthTypeHandlerTest.java | 111 + .../ibatis/type/NClobTypeHandlerTest.java | 92 + .../ibatis/type/NStringTypeHandlerTest.java | 75 + .../ibatis/type/ObjectTypeHandlerTest.java | 81 + .../type/OffsetDateTimeTypeHandlerTest.java | 86 + .../type/OffsetTimeTypeHandlerTest.java | 87 + .../ibatis/type/ShortTypeHandlerTest.java | 90 + .../ibatis/type/SimpleTypeRegistryTest.java | 43 + .../ibatis/type/SqlDateTypeHandlerTest.java | 78 + .../ibatis/type/SqlTimeTypeHandlerTest.java | 78 + .../type/SqlTimetampTypeHandlerTest.java | 79 + .../ibatis/type/SqlxmlTypeHandlerTest.java | 0 .../ibatis/type/SqlxmlTypeHandlerTest.sql | 28 + .../ibatis/type/StringTypeHandlerTest.java | 75 + .../ibatis/type/TimeOnlyTypeHandlerTest.java | 89 + .../ibatis/type/TypeAliasRegistryTest.java | 69 + .../ibatis/type/TypeHandlerRegistryTest.java | 217 ++ .../ibatis/type/UnknownTypeHandlerTest.java | 152 ++ .../ibatis/type/YearMonthTypeHandlerTest.java | 85 + .../ibatis/type/YearTypeHandlerTest.java | 95 + .../type/ZonedDateTimeTypeHandlerTest.java | 87 + .../org/apache/ibatis/type/jdbc.properties | 20 + .../src/test/java/resources/nodelet_test.xml | 30 + .../com/lagou/mapper/IOrderMapper.xml | 39 + .../com/lagou/mapper/IUserMapper.xml | 36 + .../src/test/resources/jdbc.properties | 4 + .../src/test/resources/log4j.properties | 6 + .../src/test/resources/sqlMapConfig.xml | 48 + .../mybatis-3-master/travis/after_success.sh | 60 + .../code/mybatis-3-master/travis/install.sh | 18 + .../code/mybatis-3-master/travis/settings.xml | 33 + Module1/code/mybatis_multitable/pom.xml | 64 + .../java/com/yang/mapper/IOrderMapper.java | 33 + .../java/com/yang/mapper/IRoleMapper.java | 12 + .../java/com/yang/mapper/IUserMapper.java | 88 + .../main/java/com/yang/plugin/MyPlugin.java | 41 + .../src/main/java/com/yang/pojo/Order.java | 54 + .../src/main/java/com/yang/pojo/Role.java | 46 + .../src/main/java/com/yang/pojo/User.java | 67 + .../main/java/com/yang/test/CacheTest.java | 71 + .../main/java/com/yang/test/MybatisTest.java | 156 ++ .../com/yang/mapper/IOrderMapper.xml | 20 + .../resources/com/yang/mapper/IUserMapper.xml | 38 + .../src/main/resources/jdbc.properties | 4 + .../src/main/resources/log4j.properties | 15 + .../src/main/resources/redis.properties | 5 + .../src/main/resources/sqlMapConfig.xml | 46 + .../com/yang/mapper/IOrderMapper.class | Bin 0 -> 972 bytes .../classes/com/yang/mapper/IOrderMapper.xml | 20 + .../classes/com/yang/mapper/IRoleMapper.class | Bin 0 -> 453 bytes .../classes/com/yang/mapper/IUserMapper.class | Bin 0 -> 1718 bytes .../classes/com/yang/mapper/IUserMapper.xml | 38 + .../classes/com/yang/plugin/MyPlugin.class | Bin 0 -> 1812 bytes .../target/classes/com/yang/pojo/Order.class | Bin 0 -> 1696 bytes .../target/classes/com/yang/pojo/Role.class | Bin 0 -> 1357 bytes .../target/classes/com/yang/pojo/User.class | Bin 0 -> 2352 bytes .../classes/com/yang/test/CacheTest.class | Bin 0 -> 2411 bytes .../classes/com/yang/test/MybatisTest.class | Bin 0 -> 4529 bytes .../target/classes/jdbc.properties | 4 + .../target/classes/log4j.properties | 15 + .../target/classes/redis.properties | 5 + .../target/classes/sqlMapConfig.xml | 46 + Module1/code/mybatis_quickStarter/pom.xml | 47 + .../main/java/com/yang/mapper/UserMapper.java | 11 + .../java/com/yang/mapper/UserMapperImpl.java | 26 + .../src/main/java/com/yang/pojo/User.java | 56 + .../main/java/com/yang/test/MybatisTest.java | 86 + .../src/main/resources/UserMapper.xml | 22 + .../src/main/resources/jdbc.properties | 4 + .../src/main/resources/sqlMapConfig.xml | 27 + .../target/classes/UserMapper.xml | 22 + .../classes/com/yang/mapper/UserMapper.class | Bin 0 -> 271 bytes .../com/yang/mapper/UserMapperImpl.class | Bin 0 -> 1278 bytes .../target/classes/com/yang/pojo/User.class | Bin 0 -> 1642 bytes .../classes/com/yang/test/MybatisTest.class | Bin 0 -> 3237 bytes .../target/classes/jdbc.properties | 4 + .../target/classes/sqlMapConfig.xml | 27 + .../Mybatis.pdf" | Bin 0 -> 7135986 bytes ...05\345\261\202\346\241\206\346\236\266.md" | 174 ++ ...05\345\261\202\346\241\206\346\236\266.md" | 66 - 1868 files changed, 150731 insertions(+), 561 deletions(-) delete mode 100644 Module1/code/IPersistence/src/main/java/com/lagou/sqlSession/DefaultSqlSession.java delete mode 100644 Module1/code/IPersistence/src/main/java/com/lagou/sqlSession/Executor.java delete mode 100644 Module1/code/IPersistence/src/main/java/com/lagou/sqlSession/SimpleExecutor.java delete mode 100644 Module1/code/IPersistence/src/main/java/com/lagou/sqlSession/SqlSession.java rename Module1/code/IPersistence/src/main/java/com/{lagou => yang}/config/BoundSql.java (69%) rename Module1/code/IPersistence/src/main/java/com/{lagou/config/XMLConfigBuilder.java => yang/config/XmlConfigBuilder.java} (57%) rename Module1/code/IPersistence/src/main/java/com/{lagou/config/XMLMapperBuilder.java => yang/config/XmlMapperBuilder.java} (39%) rename Module1/code/IPersistence/src/main/java/com/{lagou => yang}/io/Resources.java (50%) rename Module1/code/IPersistence/src/main/java/com/{lagou => yang}/pojo/Configuration.java (68%) rename Module1/code/IPersistence/src/main/java/com/{lagou => yang}/pojo/MappedStatement.java (40%) create mode 100644 Module1/code/IPersistence/src/main/java/com/yang/sqlSession/DefaultSqlSession.java rename Module1/code/IPersistence/src/main/java/com/{lagou => yang}/sqlSession/DefaultSqlSessionFactory.java (61%) create mode 100644 Module1/code/IPersistence/src/main/java/com/yang/sqlSession/Executor.java create mode 100644 Module1/code/IPersistence/src/main/java/com/yang/sqlSession/SimpleExecutor.java create mode 100644 Module1/code/IPersistence/src/main/java/com/yang/sqlSession/SqlSession.java rename Module1/code/IPersistence/src/main/java/com/{lagou => yang}/sqlSession/SqlSessionFactory.java (36%) rename Module1/code/IPersistence/src/main/java/com/{lagou/sqlSession/SqlSessionFactoryBulider.java => yang/sqlSession/SqlSessionFactoryBuilder.java} (32%) rename Module1/code/IPersistence/src/main/java/com/{lagou => yang}/utils/GenericTokenParser.java (99%) rename Module1/code/IPersistence/src/main/java/com/{lagou => yang}/utils/ParameterMapping.java (62%) rename Module1/code/IPersistence/src/main/java/com/{lagou => yang}/utils/ParameterMappingTokenHandler.java (96%) rename Module1/code/IPersistence/src/main/java/com/{lagou => yang}/utils/TokenHandler.java (96%) delete mode 100644 Module1/code/IPersistence/target/classes/com/lagou/config/BoundSql.class delete mode 100644 Module1/code/IPersistence/target/classes/com/lagou/config/XMLConfigBuilder.class delete mode 100644 Module1/code/IPersistence/target/classes/com/lagou/config/XMLMapperBuilder.class delete mode 100644 Module1/code/IPersistence/target/classes/com/lagou/io/Resources.class delete mode 100644 Module1/code/IPersistence/target/classes/com/lagou/pojo/Configuration.class delete mode 100644 Module1/code/IPersistence/target/classes/com/lagou/pojo/MappedStatement.class delete mode 100644 Module1/code/IPersistence/target/classes/com/lagou/sqlSession/DefaultSqlSession.class delete mode 100644 Module1/code/IPersistence/target/classes/com/lagou/sqlSession/DefaultSqlSessionFactory.class delete mode 100644 Module1/code/IPersistence/target/classes/com/lagou/sqlSession/Executor.class delete mode 100644 Module1/code/IPersistence/target/classes/com/lagou/sqlSession/SimpleExecutor.class delete mode 100644 Module1/code/IPersistence/target/classes/com/lagou/sqlSession/SqlSession.class delete mode 100644 Module1/code/IPersistence/target/classes/com/lagou/sqlSession/SqlSessionFactory.class delete mode 100644 Module1/code/IPersistence/target/classes/com/lagou/sqlSession/SqlSessionFactoryBulider.class delete mode 100644 Module1/code/IPersistence/target/classes/com/lagou/utils/GenericTokenParser.class delete mode 100644 Module1/code/IPersistence/target/classes/com/lagou/utils/ParameterMapping.class delete mode 100644 Module1/code/IPersistence/target/classes/com/lagou/utils/ParameterMappingTokenHandler.class delete mode 100644 Module1/code/IPersistence/target/classes/com/lagou/utils/TokenHandler.class create mode 100644 Module1/code/IPersistence/target/classes/com/yang/config/BoundSql.class create mode 100644 Module1/code/IPersistence/target/classes/com/yang/config/XmlConfigBuilder.class create mode 100644 Module1/code/IPersistence/target/classes/com/yang/config/XmlMapperBuilder.class create mode 100644 Module1/code/IPersistence/target/classes/com/yang/io/Resources.class create mode 100644 Module1/code/IPersistence/target/classes/com/yang/pojo/Configuration.class create mode 100644 Module1/code/IPersistence/target/classes/com/yang/pojo/MappedStatement.class create mode 100644 Module1/code/IPersistence/target/classes/com/yang/sqlSession/DefaultSqlSession$1.class create mode 100644 Module1/code/IPersistence/target/classes/com/yang/sqlSession/DefaultSqlSession.class create mode 100644 Module1/code/IPersistence/target/classes/com/yang/sqlSession/DefaultSqlSessionFactory.class create mode 100644 Module1/code/IPersistence/target/classes/com/yang/sqlSession/Executor.class create mode 100644 Module1/code/IPersistence/target/classes/com/yang/sqlSession/SimpleExecutor.class create mode 100644 Module1/code/IPersistence/target/classes/com/yang/sqlSession/SqlSession.class create mode 100644 Module1/code/IPersistence/target/classes/com/yang/sqlSession/SqlSessionFactory.class create mode 100644 Module1/code/IPersistence/target/classes/com/yang/sqlSession/SqlSessionFactoryBuilder.class create mode 100644 Module1/code/IPersistence/target/classes/com/yang/utils/GenericTokenParser.class create mode 100644 Module1/code/IPersistence/target/classes/com/yang/utils/ParameterMapping.class create mode 100644 Module1/code/IPersistence/target/classes/com/yang/utils/ParameterMappingTokenHandler.class create mode 100644 Module1/code/IPersistence/target/classes/com/yang/utils/TokenHandler.class delete mode 100644 Module1/code/IPersistence_test/.gitignore delete mode 100644 Module1/code/IPersistence_test/IPersistence_test.iml delete mode 100644 Module1/code/IPersistence_test/src/main/java/com/lagou/test/IPersistenceTest.java create mode 100644 Module1/code/IPersistence_test/src/main/java/com/yang/dao/IUserDao.java create mode 100644 Module1/code/IPersistence_test/src/main/java/com/yang/pojo/User.java create mode 100644 Module1/code/IPersistence_test/src/main/java/com/yang/test/IPersistenceTest.java create mode 100644 Module1/code/IPersistence_test/src/main/resources/jdbc.properties delete mode 100644 Module1/code/IPersistence_test/src/main/resources/sqlMapConfig.xml create mode 100644 Module1/code/IPersistence_test/src/main/resources/sqlMapperConfig.xml create mode 100644 Module1/code/IPersistence_test/target/classes/UserMapper.xml create mode 100644 Module1/code/IPersistence_test/target/classes/com/yang/dao/IUserDao.class create mode 100644 Module1/code/IPersistence_test/target/classes/com/yang/pojo/User.class create mode 100644 Module1/code/IPersistence_test/target/classes/com/yang/test/IPersistenceTest.class create mode 100644 Module1/code/IPersistence_test/target/classes/jdbc.properties create mode 100644 Module1/code/IPersistence_test/target/classes/sqlMapperConfig.xml create mode 100644 Module1/code/design_pattern/pom.xml create mode 100644 Module1/code/design_pattern/src/main/java/com/yang/constructor/Computer.java create mode 100644 Module1/code/design_pattern/src/main/java/com/yang/constructor/ComputerBuilder.java create mode 100644 Module1/code/design_pattern/src/main/java/com/yang/constructor/ConstructorTest.java create mode 100644 Module1/code/design_pattern/src/main/java/com/yang/dynamicproxy/Bob.java create mode 100644 Module1/code/design_pattern/src/main/java/com/yang/dynamicproxy/JDKDynamicProxy.java create mode 100644 Module1/code/design_pattern/src/main/java/com/yang/dynamicproxy/JDKDynamicTest.java create mode 100644 Module1/code/design_pattern/src/main/java/com/yang/dynamicproxy/Person.java create mode 100644 Module1/code/design_pattern/src/main/java/com/yang/simpleFactory/Computer.java create mode 100644 Module1/code/design_pattern/src/main/java/com/yang/simpleFactory/ComputerFactory.java create mode 100644 Module1/code/design_pattern/src/main/java/com/yang/simpleFactory/HpComputer.java create mode 100644 Module1/code/design_pattern/src/main/java/com/yang/simpleFactory/LenovoComputer.java create mode 100644 Module1/code/design_pattern/src/main/java/com/yang/simpleFactory/SimpleFactoryTest.java create mode 100644 Module1/code/design_pattern/target/classes/com/yang/constructor/Computer.class create mode 100644 Module1/code/design_pattern/target/classes/com/yang/constructor/ComputerBuilder.class create mode 100644 Module1/code/design_pattern/target/classes/com/yang/constructor/ConstructorTest.class create mode 100644 Module1/code/design_pattern/target/classes/com/yang/simpleFactory/Computer.class create mode 100644 Module1/code/design_pattern/target/classes/com/yang/simpleFactory/ComputerFactory.class create mode 100644 Module1/code/design_pattern/target/classes/com/yang/simpleFactory/HpComputer.class create mode 100644 Module1/code/design_pattern/target/classes/com/yang/simpleFactory/LenovoComputer.class create mode 100644 Module1/code/design_pattern/target/classes/com/yang/simpleFactory/SimpleFactoryTest.class create mode 100644 Module1/code/mybatis-3-master/.DS_Store create mode 100644 Module1/code/mybatis-3-master/.gitattributes create mode 100644 Module1/code/mybatis-3-master/.mvn/wrapper/MavenWrapperDownloader.java create mode 100644 Module1/code/mybatis-3-master/.mvn/wrapper/maven-wrapper.properties create mode 100644 Module1/code/mybatis-3-master/.travis.yml create mode 100644 Module1/code/mybatis-3-master/CONTRIBUTING.md create mode 100644 Module1/code/mybatis-3-master/ICLA create mode 100644 Module1/code/mybatis-3-master/ISSUE_TEMPLATE.md create mode 100644 Module1/code/mybatis-3-master/LICENSE create mode 100644 Module1/code/mybatis-3-master/NOTICE create mode 100644 Module1/code/mybatis-3-master/README.md create mode 100644 Module1/code/mybatis-3-master/license.txt create mode 100644 Module1/code/mybatis-3-master/mvnw create mode 100644 Module1/code/mybatis-3-master/mvnw.cmd create mode 100644 Module1/code/mybatis-3-master/pom.xml create mode 100644 Module1/code/mybatis-3-master/src/.DS_Store create mode 100644 Module1/code/mybatis-3-master/src/main/java/log4j.properties create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Arg.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/AutomapConstructor.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/CacheNamespace.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/CacheNamespaceRef.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Case.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/ConstructorArgs.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Delete.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/DeleteProvider.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Flush.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Insert.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/InsertProvider.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Lang.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Many.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/MapKey.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/One.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Options.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Param.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Property.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Result.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/ResultMap.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/ResultType.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Results.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Select.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/SelectKey.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/SelectProvider.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/TypeDiscriminator.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Update.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/UpdateProvider.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/binding/BindingException.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/binding/MapperMethod.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/binding/MapperProxy.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/binding/MapperProxyFactory.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/binding/MapperRegistry.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/binding/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/BaseBuilder.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/BuilderException.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/CacheRefResolver.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/IncompleteElementException.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/InitializingObject.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/MapperBuilderAssistant.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/ParameterExpression.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/ResultMapResolver.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/SqlSourceBuilder.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/StaticSqlSource.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/annotation/MapperAnnotationBuilder.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/annotation/MethodResolver.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/annotation/ProviderContext.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/annotation/ProviderSqlSource.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/annotation/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/xml/XMLConfigBuilder.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/xml/XMLIncludeTransformer.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/xml/XMLMapperBuilder.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/xml/XMLMapperEntityResolver.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/xml/XMLStatementBuilder.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/xml/mybatis-3-config.dtd create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/xml/mybatis-3-mapper.dtd create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/xml/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/cache/Cache.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/cache/CacheException.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/cache/CacheKey.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/cache/NullCacheKey.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/cache/TransactionalCacheManager.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/cache/decorators/BlockingCache.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/cache/decorators/FifoCache.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/cache/decorators/LoggingCache.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/cache/decorators/LruCache.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/cache/decorators/ScheduledCache.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/cache/decorators/SerializedCache.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/cache/decorators/SoftCache.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/cache/decorators/SynchronizedCache.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/cache/decorators/TransactionalCache.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/cache/decorators/WeakCache.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/cache/decorators/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/cache/impl/PerpetualCache.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/cache/impl/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/cache/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/cursor/Cursor.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/cursor/defaults/DefaultCursor.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/cursor/defaults/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/cursor/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/datasource/DataSourceException.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/datasource/DataSourceFactory.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/datasource/jndi/JndiDataSourceFactory.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/datasource/jndi/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/datasource/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/datasource/pooled/PoolState.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/datasource/pooled/PooledConnection.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/datasource/pooled/PooledDataSource.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/datasource/pooled/PooledDataSourceFactory.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/datasource/pooled/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/datasource/unpooled/UnpooledDataSource.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/datasource/unpooled/UnpooledDataSourceFactory.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/datasource/unpooled/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/exceptions/ExceptionFactory.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/exceptions/IbatisException.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/exceptions/PersistenceException.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/exceptions/TooManyResultsException.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/exceptions/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/BaseExecutor.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/BatchExecutor.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/BatchExecutorException.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/BatchResult.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/CachingExecutor.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/ErrorContext.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/ExecutionPlaceholder.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/Executor.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/ExecutorException.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/ResultExtractor.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/ReuseExecutor.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/SimpleExecutor.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/keygen/Jdbc3KeyGenerator.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/keygen/KeyGenerator.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/keygen/NoKeyGenerator.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/keygen/SelectKeyGenerator.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/keygen/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/loader/AbstractEnhancedDeserializationProxy.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/loader/AbstractSerialStateHolder.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/loader/CglibProxyFactory.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/loader/JavassistProxyFactory.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/loader/ProxyFactory.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/loader/ResultLoader.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/loader/ResultLoaderMap.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/loader/WriteReplaceInterface.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/loader/cglib/CglibProxyFactory.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/loader/cglib/CglibSerialStateHolder.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/loader/cglib/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/loader/javassist/JavassistProxyFactory.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/loader/javassist/JavassistSerialStateHolder.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/loader/javassist/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/loader/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/parameter/ParameterHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/parameter/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/result/DefaultMapResultHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/result/DefaultResultContext.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/result/DefaultResultHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/result/ResultMapException.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/result/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/resultset/DefaultResultSetHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/resultset/ResultSetHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/resultset/ResultSetWrapper.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/resultset/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/statement/BaseStatementHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/statement/CallableStatementHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/statement/PreparedStatementHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/statement/RoutingStatementHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/statement/SimpleStatementHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/statement/StatementHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/statement/StatementUtil.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/executor/statement/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/io/ClassLoaderWrapper.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/io/DefaultVFS.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/io/ExternalResources.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/io/JBoss6VFS.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/io/ResolverUtil.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/io/Resources.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/io/VFS.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/io/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/jdbc/AbstractSQL.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/jdbc/Null.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/jdbc/RuntimeSqlException.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/jdbc/SQL.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/jdbc/ScriptRunner.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/jdbc/SelectBuilder.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/jdbc/SqlBuilder.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/jdbc/SqlRunner.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/jdbc/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/lang/UsesJava7.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/lang/UsesJava8.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/logging/Log.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/logging/LogException.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/logging/LogFactory.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/logging/commons/JakartaCommonsLoggingImpl.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/logging/commons/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/logging/jdbc/BaseJdbcLogger.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/logging/jdbc/ConnectionLogger.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/logging/jdbc/PreparedStatementLogger.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/logging/jdbc/ResultSetLogger.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/logging/jdbc/StatementLogger.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/logging/jdbc/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/logging/jdk14/Jdk14LoggingImpl.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/logging/jdk14/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/logging/log4j/Log4jImpl.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/logging/log4j/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/logging/log4j2/Log4j2AbstractLoggerImpl.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/logging/log4j2/Log4j2Impl.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/logging/log4j2/Log4j2LoggerImpl.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/logging/log4j2/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/logging/nologging/NoLoggingImpl.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/logging/nologging/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/logging/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/logging/slf4j/Slf4jImpl.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/logging/slf4j/Slf4jLocationAwareLoggerImpl.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/logging/slf4j/Slf4jLoggerImpl.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/logging/slf4j/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/logging/stdout/StdOutImpl.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/logging/stdout/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/BoundSql.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/CacheBuilder.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/DatabaseIdProvider.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/DefaultDatabaseIdProvider.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/Discriminator.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/Environment.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/FetchType.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/MappedStatement.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/ParameterMap.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/ParameterMapping.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/ParameterMode.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/ResultFlag.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/ResultMap.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/ResultMapping.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/ResultSetType.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/SqlCommandType.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/SqlSource.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/StatementType.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/VendorDatabaseIdProvider.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/parsing/GenericTokenParser.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/parsing/ParsingException.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/parsing/PropertyParser.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/parsing/TokenHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/parsing/XNode.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/parsing/XPathParser.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/parsing/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/plugin/Interceptor.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/plugin/InterceptorChain.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/plugin/Intercepts.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/plugin/Invocation.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/plugin/Plugin.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/plugin/PluginException.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/plugin/Signature.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/plugin/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/ArrayUtil.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/DefaultReflectorFactory.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/ExceptionUtil.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/Jdk.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/MetaClass.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/MetaObject.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/OptionalUtil.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/ParamNameResolver.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/ParamNameUtil.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/ReflectionException.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/Reflector.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/ReflectorFactory.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/SystemMetaObject.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/TypeParameterResolver.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/factory/DefaultObjectFactory.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/factory/ObjectFactory.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/factory/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/invoker/GetFieldInvoker.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/invoker/Invoker.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/invoker/MethodInvoker.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/invoker/SetFieldInvoker.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/invoker/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/property/PropertyCopier.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/property/PropertyNamer.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/property/PropertyTokenizer.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/property/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/wrapper/BaseWrapper.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/wrapper/BeanWrapper.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/wrapper/CollectionWrapper.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/wrapper/DefaultObjectWrapperFactory.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/wrapper/MapWrapper.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/wrapper/ObjectWrapper.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/wrapper/ObjectWrapperFactory.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/wrapper/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/scripting/LanguageDriver.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/scripting/LanguageDriverRegistry.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/scripting/ScriptingException.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/scripting/defaults/DefaultParameterHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/scripting/defaults/RawLanguageDriver.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/scripting/defaults/RawSqlSource.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/scripting/defaults/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/scripting/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/scripting/xmltags/ChooseSqlNode.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/scripting/xmltags/DynamicContext.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/scripting/xmltags/DynamicSqlSource.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/scripting/xmltags/ExpressionEvaluator.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/scripting/xmltags/ForEachSqlNode.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/scripting/xmltags/IfSqlNode.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/scripting/xmltags/MixedSqlNode.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/scripting/xmltags/OgnlCache.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/scripting/xmltags/OgnlClassResolver.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/scripting/xmltags/OgnlMemberAccess.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/scripting/xmltags/SetSqlNode.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/scripting/xmltags/SqlNode.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/scripting/xmltags/StaticTextSqlNode.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/scripting/xmltags/TextSqlNode.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/scripting/xmltags/TrimSqlNode.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/scripting/xmltags/VarDeclSqlNode.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/scripting/xmltags/WhereSqlNode.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/scripting/xmltags/XMLLanguageDriver.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/scripting/xmltags/XMLScriptBuilder.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/scripting/xmltags/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/session/AutoMappingBehavior.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/session/AutoMappingUnknownColumnBehavior.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/session/Configuration.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/session/ExecutorType.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/session/LocalCacheScope.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/session/ResultContext.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/session/ResultHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/session/RowBounds.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/session/SqlSession.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/session/SqlSessionException.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/session/SqlSessionFactory.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/session/SqlSessionFactoryBuilder.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/session/SqlSessionManager.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/session/TransactionIsolationLevel.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/session/defaults/DefaultSqlSession.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/session/defaults/DefaultSqlSessionFactory.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/session/defaults/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/session/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/transaction/Transaction.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/transaction/TransactionException.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/transaction/TransactionFactory.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/transaction/jdbc/JdbcTransaction.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/transaction/jdbc/JdbcTransactionFactory.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/transaction/jdbc/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/transaction/managed/ManagedTransaction.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/transaction/managed/ManagedTransactionFactory.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/transaction/managed/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/transaction/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/Alias.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/ArrayTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/BaseTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/BigDecimalTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/BigIntegerTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/BlobByteObjectArrayTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/BlobInputStreamTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/BlobTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/BooleanTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/ByteArrayTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/ByteArrayUtils.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/ByteObjectArrayTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/ByteTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/CharacterTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/ClobReaderTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/ClobTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/DateOnlyTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/DateTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/DoubleTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/EnumOrdinalTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/EnumTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/FloatTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/InstantTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/IntegerTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/JapaneseDateTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/JdbcType.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/LocalDateTimeTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/LocalDateTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/LocalTimeTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/LongTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/MappedJdbcTypes.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/MappedTypes.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/MonthTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/NClobTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/NStringTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/ObjectTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/OffsetDateTimeTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/OffsetTimeTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/ShortTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/SimpleTypeRegistry.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/SqlDateTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/SqlTimeTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/SqlTimestampTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/SqlxmlTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/StringTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/TimeOnlyTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/TypeAliasRegistry.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/TypeException.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/TypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/TypeHandlerRegistry.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/TypeReference.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/UnknownTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/YearMonthTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/YearTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/ZonedDateTimeTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/type/package-info.java create mode 100644 Module1/code/mybatis-3-master/src/site/es/resources/css/site.css create mode 100644 Module1/code/mybatis-3-master/src/site/es/xdoc/configuration.xml create mode 100644 Module1/code/mybatis-3-master/src/site/es/xdoc/dynamic-sql.xml create mode 100644 Module1/code/mybatis-3-master/src/site/es/xdoc/getting-started.xml create mode 100644 Module1/code/mybatis-3-master/src/site/es/xdoc/index.xml create mode 100644 Module1/code/mybatis-3-master/src/site/es/xdoc/java-api.xml create mode 100644 Module1/code/mybatis-3-master/src/site/es/xdoc/logging.xml create mode 100644 Module1/code/mybatis-3-master/src/site/es/xdoc/sqlmap-xml.xml create mode 100644 Module1/code/mybatis-3-master/src/site/es/xdoc/statement-builders.xml create mode 100644 Module1/code/mybatis-3-master/src/site/fr/resources/css/site.css create mode 100644 Module1/code/mybatis-3-master/src/site/fr/xdoc/getting-started.xml create mode 100644 Module1/code/mybatis-3-master/src/site/ja/resources/css/site.css create mode 100644 Module1/code/mybatis-3-master/src/site/ja/xdoc/configuration.xml create mode 100644 Module1/code/mybatis-3-master/src/site/ja/xdoc/dynamic-sql.xml create mode 100644 Module1/code/mybatis-3-master/src/site/ja/xdoc/getting-started.xml create mode 100644 Module1/code/mybatis-3-master/src/site/ja/xdoc/index.xml create mode 100644 Module1/code/mybatis-3-master/src/site/ja/xdoc/java-api.xml create mode 100644 Module1/code/mybatis-3-master/src/site/ja/xdoc/logging.xml create mode 100644 Module1/code/mybatis-3-master/src/site/ja/xdoc/sqlmap-xml.xml create mode 100644 Module1/code/mybatis-3-master/src/site/ja/xdoc/statement-builders.xml create mode 100644 Module1/code/mybatis-3-master/src/site/ko/resources/css/site.css create mode 100644 Module1/code/mybatis-3-master/src/site/ko/xdoc/configuration.xml create mode 100644 Module1/code/mybatis-3-master/src/site/ko/xdoc/dynamic-sql.xml create mode 100644 Module1/code/mybatis-3-master/src/site/ko/xdoc/getting-started.xml create mode 100644 Module1/code/mybatis-3-master/src/site/ko/xdoc/index.xml create mode 100644 Module1/code/mybatis-3-master/src/site/ko/xdoc/java-api.xml create mode 100644 Module1/code/mybatis-3-master/src/site/ko/xdoc/logging.xml create mode 100644 Module1/code/mybatis-3-master/src/site/ko/xdoc/sqlmap-xml.xml create mode 100644 Module1/code/mybatis-3-master/src/site/ko/xdoc/statement-builders.xml create mode 100644 Module1/code/mybatis-3-master/src/site/pdf.xml create mode 100644 Module1/code/mybatis-3-master/src/site/resources/css/site.css create mode 100644 Module1/code/mybatis-3-master/src/site/resources/images/en.png create mode 100644 Module1/code/mybatis-3-master/src/site/resources/images/es.png create mode 100644 Module1/code/mybatis-3-master/src/site/resources/images/fr.png create mode 100644 Module1/code/mybatis-3-master/src/site/resources/images/ja.png create mode 100644 Module1/code/mybatis-3-master/src/site/resources/images/ko.png create mode 100644 Module1/code/mybatis-3-master/src/site/resources/images/zh.png create mode 100644 Module1/code/mybatis-3-master/src/site/site.xml create mode 100644 Module1/code/mybatis-3-master/src/site/site_es.xml create mode 100644 Module1/code/mybatis-3-master/src/site/site_fr.xml create mode 100644 Module1/code/mybatis-3-master/src/site/site_ja.xml create mode 100644 Module1/code/mybatis-3-master/src/site/site_ko.xml create mode 100644 Module1/code/mybatis-3-master/src/site/site_zh.xml create mode 100644 Module1/code/mybatis-3-master/src/site/xdoc/configuration.xml create mode 100644 Module1/code/mybatis-3-master/src/site/xdoc/dynamic-sql.xml create mode 100644 Module1/code/mybatis-3-master/src/site/xdoc/getting-started.xml create mode 100644 Module1/code/mybatis-3-master/src/site/xdoc/index.xml create mode 100644 Module1/code/mybatis-3-master/src/site/xdoc/java-api.xml create mode 100644 Module1/code/mybatis-3-master/src/site/xdoc/logging.xml create mode 100644 Module1/code/mybatis-3-master/src/site/xdoc/sqlmap-xml.xml create mode 100644 Module1/code/mybatis-3-master/src/site/xdoc/statement-builders.xml create mode 100644 Module1/code/mybatis-3-master/src/site/zh/resources/css/site.css create mode 100644 Module1/code/mybatis-3-master/src/site/zh/xdoc/configuration.xml create mode 100644 Module1/code/mybatis-3-master/src/site/zh/xdoc/dynamic-sql.xml create mode 100644 Module1/code/mybatis-3-master/src/site/zh/xdoc/getting-started.xml create mode 100644 Module1/code/mybatis-3-master/src/site/zh/xdoc/index.xml create mode 100644 Module1/code/mybatis-3-master/src/site/zh/xdoc/java-api.xml create mode 100644 Module1/code/mybatis-3-master/src/site/zh/xdoc/logging.xml create mode 100644 Module1/code/mybatis-3-master/src/site/zh/xdoc/sqlmap-xml.xml create mode 100644 Module1/code/mybatis-3-master/src/site/zh/xdoc/statement-builders.xml create mode 100644 Module1/code/mybatis-3-master/src/test/.DS_Store create mode 100644 Module1/code/mybatis-3-master/src/test/java/.DS_Store create mode 100644 Module1/code/mybatis-3-master/src/test/java/MybatisTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/com/lagou/mapper/IOrderMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/com/lagou/mapper/IUserMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/com/lagou/pojo/Order.java rename Module1/code/{IPersistence_test/src/main => mybatis-3-master/src/test}/java/com/lagou/pojo/User.java (35%) create mode 100644 Module1/code/mybatis-3-master/src/test/java/com/lagou/test/MybatisTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/log4j.properties create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/.DS_Store create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/.DS_Store create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/.DS_Store create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/BaseDataTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/autoconstructor/AnnotatedSubject.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/autoconstructor/AutoConstructorMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/autoconstructor/AutoConstructorMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/autoconstructor/AutoConstructorTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/autoconstructor/BadSubject.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/autoconstructor/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/autoconstructor/ExtensiveSubject.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/autoconstructor/PrimitiveSubject.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/autoconstructor/UserMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/autoconstructor/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/binding/BindingTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/binding/BoundAuthorMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/binding/BoundAuthorMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/binding/BoundBlogMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/binding/BoundBlogMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/binding/BoundBlogSql.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/binding/FlushTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/binding/MapperMethodParamTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/binding/MapperWithOneAndMany.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/binding/MissingNamespaceMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/binding/MissingNamespaceMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/binding/WrongMapperTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/binding/WrongNamespaceMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/binding/WrongNamespaceMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/binding/WrongNamespacesTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/binding/paramtest-schema.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/builder/AuthorMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/builder/BlogMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/builder/CachedAuthorMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/builder/CachedAuthorMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/builder/CustomLongTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/builder/CustomObjectWrapperFactory.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/builder/CustomReflectorFactory.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/builder/CustomStringTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/builder/CustomizedSettingsMapperConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/builder/ExampleObjectFactory.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/builder/ExamplePlugin.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/builder/MapperConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/builder/MinimalMapperConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/builder/NestedBlogMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/builder/ParameterExpressionTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/builder/PostMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/builder/ProblemMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/builder/PropertiesUrlMapperConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/builder/XmlConfigBuilderTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/builder/XmlMapperBuilderTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/builder/jdbc.properties create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/builder/mapper/CustomMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/builder/typehandler/CustomIntegerTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/builder/xml/dynamic/DynamicSqlSourceTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/builder/xml/dynamic/ExpressionEvaluatorTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/cache/BaseCacheTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/cache/CacheKeyTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/cache/FifoCacheTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/cache/LruCacheTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/cache/PerpetualCacheTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/cache/ScheduledCacheTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/cache/SoftCacheTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/cache/SuperCacheTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/cache/WeakCacheTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/cursor/defaults/DefaultCursorTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/databases/blog/StoredProcedures.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/databases/blog/blog-derby-dataload.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/databases/blog/blog-derby-schema.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/databases/blog/blog-derby.properties create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/databases/jpetstore/jpetstore-hsqldb-dataload.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/databases/jpetstore/jpetstore-hsqldb-schema.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/databases/jpetstore/jpetstore-hsqldb.properties create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/datasource/jndi/JndiDataSourceFactoryTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/datasource/unpooled/UnpooledDataSourceTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/domain/blog/Author.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/domain/blog/Blog.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/domain/blog/BlogLite.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/domain/blog/Comment.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/domain/blog/ComplexImmutableAuthor.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/domain/blog/ComplexImmutableAuthorId.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/domain/blog/DraftPost.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/domain/blog/ImmutableAuthor.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/domain/blog/Post.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/domain/blog/PostLite.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/domain/blog/PostLiteId.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/domain/blog/Section.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/domain/blog/Tag.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/domain/blog/mappers/AuthorMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/domain/blog/mappers/AuthorMapperWithMultipleHandlers.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/domain/blog/mappers/AuthorMapperWithRowBounds.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/domain/blog/mappers/BlogMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/domain/blog/mappers/CopyOfAuthorMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/domain/blog/mappers/NestedBlogMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/domain/jpetstore/Account.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/domain/jpetstore/Cart.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/domain/jpetstore/CartItem.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/domain/jpetstore/Category.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/domain/jpetstore/Item.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/domain/jpetstore/LineItem.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/domain/jpetstore/Order.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/domain/jpetstore/Product.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/domain/jpetstore/Sequence.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/domain/misc/CustomBeanWrapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/domain/misc/CustomBeanWrapperFactory.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/domain/misc/Employee.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/domain/misc/RichType.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/domain/misc/generics/GenericAbstract.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/domain/misc/generics/GenericConcrete.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/domain/misc/generics/GenericInterface.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/domain/misc/generics/GenericSubclass.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/exceptions/GeneralExceptionsTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/executor/BaseExecutorTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/executor/BatchExecutorTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/executor/CachingBatchExecutorTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/executor/CachingReuseExecutorTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/executor/CachingSimpleExecutorTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/executor/ErrorContextTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/executor/ExecutorTestHelper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/executor/ResultExtractorTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/executor/ReuseExecutorTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/executor/loader/CglibProxyTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/executor/loader/JavassistProxyTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/executor/loader/SerializableProxyTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/executor/resultset/DefaultResultSetHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/executor/resultset/DefaultResultSetHandlerTest2.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/executor/statement/BaseStatementHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/io/ClassLoaderWrapperTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/io/ExternalResourcesTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/io/ResourcesTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/io/VFSTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/jdbc/NullTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/jdbc/PooledDataSourceTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/jdbc/SQLTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/jdbc/ScriptChangingDelimiter.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/jdbc/ScriptChangingDelimiterMissingDelimiter.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/jdbc/ScriptCommentAfterEOLTerminator.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/jdbc/ScriptMissingEOLTerminator.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/jdbc/ScriptRunnerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/jdbc/SelectBuilderTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/jdbc/SqlBuilderTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/jdbc/SqlRunnerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/logging/LogFactoryTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/logging/jdbc/BaseJdbcLoggerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/logging/jdbc/ConnectionLoggerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/logging/jdbc/PreparedStatementLoggerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/logging/jdbc/ResultSetLoggerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/logging/jdbc/StatementLoggerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/logging/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/mapping/BoundSqlTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/mapping/CacheBuilderTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/mapping/ResultMappingTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/parsing/GenericTokenParserTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/parsing/PropertyParserTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/parsing/XPathParserTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/plugin/PluginTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/reflection/ArrayUtilTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/reflection/ExceptionUtilTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/reflection/MetaClassTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/reflection/MetaObjectTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/reflection/ReflectorTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/reflection/TypeParameterResolverTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/reflection/factory/DefaultObjectFactoryTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/reflection/factory/TestClass.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/reflection/typeparam/Calculator.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/reflection/typeparam/Level0Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/reflection/typeparam/Level1Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/reflection/typeparam/Level2Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/scripting/LanguageDriverRegistryTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/scripting/defaults/DefaultParameterHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/session/AutoMappingUnknownColumnBehaviorTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/session/SqlSessionManagerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/session/SqlSessionTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ancestor_ref/AncestorRefTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ancestor_ref/Author.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ancestor_ref/Blog.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ancestor_ref/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ancestor_ref/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ancestor_ref/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ancestor_ref/Reputation.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ancestor_ref/User.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ancestor_ref/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/array_result_type/ArrayResultTypeTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/array_result_type/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/array_result_type/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/array_result_type/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/array_result_type/User.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/array_result_type/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/association_nested/Folder.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/association_nested/FolderFlatTree.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/association_nested/FolderMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/association_nested/FolderMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/association_nested/FolderMapperTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/association_nested/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/associationtest/AssociationTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/associationtest/Brakes.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/associationtest/Car.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/associationtest/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/associationtest/Engine.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/associationtest/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/associationtest/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/associationtest/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/associationtype/AssociationTypeTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/associationtype/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/associationtype/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/associationtype/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/autodiscover/AutodiscoverTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/autodiscover/MapperConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/autodiscover/aliases/DummyTypeAlias.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/autodiscover/handlers/DummyTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/autodiscover/mappers/DummyMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/automapping/Article.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/automapping/AutomappingTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/automapping/Book.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/automapping/Breeder.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/automapping/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/automapping/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/automapping/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/automapping/Pet.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/automapping/User.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/automapping/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/awful_table/AwfulTable.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/awful_table/AwfulTableMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/awful_table/AwfulTableMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/awful_table/AwfulTableTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/awful_table/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/awful_table/MapperConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/basetest/BaseTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/basetest/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/basetest/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/basetest/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/basetest/User.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/basetest/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/batch_keys/BatchKeysTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/batch_keys/Config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/batch_keys/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/batch_keys/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/batch_keys/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/batch_keys/User.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/batch_test/BatchTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/batch_test/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/batch_test/Dept.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/batch_test/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/batch_test/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/batch_test/User.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/batch_test/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/blobtest/BlobMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/blobtest/BlobMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/blobtest/BlobRecord.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/blobtest/BlobTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/blobtest/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/blobtest/MapperConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/blocking_cache/BlockingCacheTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/blocking_cache/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/blocking_cache/Person.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/blocking_cache/PersonMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/blocking_cache/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/bringrags/SimpleChildObject.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/bringrags/SimpleChildObjectMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/bringrags/SimpleChildObjectMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/bringrags/SimpleObject.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/bringrags/SimpleObjectTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/bringrags/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/cache/CacheTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/cache/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/cache/CustomCache.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/cache/CustomCacheMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/cache/ImportantPersonMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/cache/Person.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/cache/PersonMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/cache/SpecialPersonMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/cache/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/cacheorder/CacheOrderTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/cacheorder/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/cacheorder/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/cacheorder/Mapper2.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/cacheorder/User.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/cacheorder/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/call_setters_on_nulls/CallSettersOnNullsTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/call_setters_on_nulls/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/call_setters_on_nulls/DoNotCallSettersOnNullsTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/call_setters_on_nulls/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/call_setters_on_nulls/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/call_setters_on_nulls/User.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/call_setters_on_nulls/mybatis-config-2.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/call_setters_on_nulls/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/call_setters_on_nulls_again/ChildBean.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/call_setters_on_nulls_again/MyBatisTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/call_setters_on_nulls_again/ParentBean.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/call_setters_on_nulls_again/mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/call_setters_on_nulls_again/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/camelcase/Camel.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/camelcase/CamelCaseMappingTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/camelcase/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/camelcase/Map.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/camelcase/MapperConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/cglib_lazy_error/CglibNPELazyTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/cglib_lazy_error/CglibNPETest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/cglib_lazy_error/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/cglib_lazy_error/Person.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/cglib_lazy_error/Person.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/cglib_lazy_error/PersonMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/cglib_lazy_error/ibatisConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/cglib_lazy_error/ibatisConfigLazy.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/collectionparameters/CollectionParametersTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/collectionparameters/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/collectionparameters/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/collectionparameters/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/collectionparameters/User.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/collectionparameters/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/column_forwarding/ColumnForwardingTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/column_forwarding/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/column_forwarding/Group.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/column_forwarding/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/column_forwarding/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/column_forwarding/User.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/column_forwarding/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/column_prefix/Address.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/column_prefix/AddressWithCaution.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/column_prefix/Brand.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/column_prefix/ColumnPrefixAutoMappingTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/column_prefix/ColumnPrefixNestedQueryTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/column_prefix/ColumnPrefixTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/column_prefix/Config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/column_prefix/ConfigAutoMapping.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/column_prefix/ConfigNestedQuery.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/column_prefix/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/column_prefix/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/column_prefix/MapperAutoMapping.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/column_prefix/MapperNestedQuery.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/column_prefix/Person.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/column_prefix/Pet.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/column_prefix/Phone.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/column_prefix/Product.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/column_prefix/Room.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/column_prefix/Zip.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/complex_column/ComplexColumnTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/complex_column/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/complex_column/Person.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/complex_column/Person.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/complex_column/PersonMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/complex_column/ibatisConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/complex_property/ComponentTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/complex_property/Configuration.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/complex_property/EncryptedString.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/complex_property/User.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/complex_property/User.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/complex_property/db.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/complex_type/ComplexTypeTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/complex_type/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/complex_type/Item.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/complex_type/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/complex_type/Property.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/complex_type/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/constructor_columnprefix/Article.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/constructor_columnprefix/Author.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/constructor_columnprefix/ConstructorColumnPrefixTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/constructor_columnprefix/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/constructor_columnprefix/EntityKey.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/constructor_columnprefix/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/constructor_columnprefix/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/constructor_columnprefix/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/count/Count.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/count/CountMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/count/CountTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/count/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/count/MapperConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/criterion/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/criterion/Criterion.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/criterion/Criterion.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/criterion/CriterionTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/criterion/MapperConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/criterion/Parameter.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/cursor_nested/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/cursor_nested/CursorNestedTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/cursor_nested/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/cursor_nested/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/cursor_nested/User.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/cursor_nested/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/cursor_simple/AnnotationMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/cursor_simple/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/cursor_simple/CursorSimpleTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/cursor_simple/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/cursor_simple/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/cursor_simple/PostgresCursorTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/cursor_simple/User.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/cursor_simple/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/custom_collection_handling/Contact.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/custom_collection_handling/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/custom_collection_handling/CustomCollection.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/custom_collection_handling/CustomCollectionHandlingTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/custom_collection_handling/CustomObjectFactory.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/custom_collection_handling/CustomObjectWrapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/custom_collection_handling/CustomObjectWrapperFactory.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/custom_collection_handling/MapperConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/custom_collection_handling/Person.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/custom_collection_handling/PersonMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/default_method/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/default_method/DefaultMethodTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/default_method/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/default_method/PackageMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/default_method/User.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/default_method/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/deferload_common_property/Child.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/deferload_common_property/ChildMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/deferload_common_property/ChildMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/deferload_common_property/CommonPropertyDeferLoadError.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/deferload_common_property/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/deferload_common_property/Father.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/deferload_common_property/FatherMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/deferload_common_property/FatherMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/deferload_common_property/ibatisConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/deferload_common_property/lazyLoadIbatisConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/disallowdotsonnames/DisallowDotsOnNamesTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/disallowdotsonnames/Person.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/disallowdotsonnames/Person.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/disallowdotsonnames/PersonMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/disallowdotsonnames/ibatisConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/dml_return_types/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/dml_return_types/DmlMapperReturnTypesTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/dml_return_types/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/dml_return_types/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/dml_return_types/User.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/dml_return_types/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/duplicate_resource_loaded/Config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/duplicate_resource_loaded/DuplicateResourceTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/duplicate_resource_loaded/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/duplicate_resource_loaded/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/duplicate_statements/AnnotatedMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/duplicate_statements/AnnotatedMapperExtended.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/duplicate_statements/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/duplicate_statements/DuplicateStatementsTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/duplicate_statements/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/duplicate_statements/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/duplicate_statements/User.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/duplicate_statements/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/dynsql/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/dynsql/CustomUtil.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/dynsql/DynSql.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/dynsql/DynSqlMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/dynsql/DynSqlMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/dynsql/DynSqlTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/dynsql/MapperConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/dynsql/NumericRow.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/dynsql/Parameter.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/dynsql2/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/dynsql2/DynSql.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/dynsql2/DynSqlTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/dynsql2/FirstNameTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/dynsql2/LastNameTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/dynsql2/MapperConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/dynsql2/Name.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/dynsql2/Parameter.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/empty_namespace/EmptyNamespaceTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/empty_namespace/Person.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/empty_namespace/Person.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/empty_namespace/ibatisConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/empty_row/Child.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/empty_row/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/empty_row/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/empty_row/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/empty_row/Parent.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/empty_row/Pet.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/empty_row/ReturnInstanceForEmptyRowTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/empty_row/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/emptycollection/Dao.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/emptycollection/Dao.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/emptycollection/DaoTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/emptycollection/TodoItem.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/emptycollection/TodoLists.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/emptycollection/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/encoding/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/encoding/Encoding.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/encoding/EncodingConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/encoding/EncodingMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/encoding/EncodingTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/enum_interface_type_handler/Color.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/enum_interface_type_handler/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/enum_interface_type_handler/EnumInterfaceTypeHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/enum_interface_type_handler/HasValue.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/enum_interface_type_handler/HasValueEnumTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/enum_interface_type_handler/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/enum_interface_type_handler/User.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/enum_interface_type_handler/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/enumtypehandler_on_annotation/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/enumtypehandler_on_annotation/Employee.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/enumtypehandler_on_annotation/EnumTypeHandlerUsingAnnotationTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/enumtypehandler_on_annotation/Person.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/enumtypehandler_on_annotation/PersonMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/enumtypehandler_on_annotation/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/enumtypehandler_on_map/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/enumtypehandler_on_map/EnumTypeHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/enumtypehandler_on_map/Person.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/enumtypehandler_on_map/Person.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/enumtypehandler_on_map/PersonMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/enumtypehandler_on_map/ibatisConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/extend/Child.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/extend/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/extend/Extend.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/extend/ExtendConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/extend/ExtendMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/extend/ExtendTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/extend/Parent.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/extendresultmap/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/extendresultmap/ExtendResultMapTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/extendresultmap/TestMapperX.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/extendresultmap/TestMapperX.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/extendresultmap/TestMapperY.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/extendresultmap/TestMapperY.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/extendresultmap/TestModel.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/extendresultmap/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/extends_with_constructor/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/extends_with_constructor/NpeExtendsTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/extends_with_constructor/Student.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/extends_with_constructor/StudentConstructor.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/extends_with_constructor/StudentConstructorMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/extends_with_constructor/StudentConstructorMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/extends_with_constructor/StudentMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/extends_with_constructor/StudentMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/extends_with_constructor/Teacher.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/extends_with_constructor/TeacherMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/extends_with_constructor/TeacherMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/flush_statement_npe/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/flush_statement_npe/FlushStatementNpeTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/flush_statement_npe/Person.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/flush_statement_npe/Person.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/flush_statement_npe/PersonMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/flush_statement_npe/ibatisConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/force_flush_on_select/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/force_flush_on_select/ForceFlushOnSelectTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/force_flush_on_select/Person.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/force_flush_on_select/Person.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/force_flush_on_select/PersonMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/force_flush_on_select/ibatisConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/foreach/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/foreach/ForEachTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/foreach/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/foreach/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/foreach/User.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/foreach/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/foreach_map/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/foreach_map/ForEachMapTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/foreach_map/IntBoolMapEntry.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/foreach_map/MapParam.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/foreach_map/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/foreach_map/NestedBean.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/foreach_map/NestedBeanMapEntry.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/foreach_map/StringStringMapEntry.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/foreach_map/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/generictyperesolution/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/generictyperesolution/Entity.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/generictyperesolution/GenericTypeResolutionTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/generictyperesolution/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/generictyperesolution/User.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/generictyperesolution/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/generictypes/Config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/generictypes/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/generictypes/GenericTypesTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/generictypes/Group.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/generictypes/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/generictypes/User.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/generictypes/UserTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/global_variables/AnnotationMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/global_variables/BaseTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/global_variables/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/global_variables/CustomCache.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/global_variables/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/global_variables/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/global_variables/User.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/global_variables/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/global_variables_defaults/AnnotationMapperTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/global_variables_defaults/ConfigurationTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/global_variables_defaults/CustomizationTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/global_variables_defaults/SupportClasses.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/global_variables_defaults/XmlMapperTest$XmlMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/global_variables_defaults/XmlMapperTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/global_variables_defaults/mybatis-config-custom-separator.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/global_variables_defaults/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/hashmaptypehandler/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/hashmaptypehandler/HashMapTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/hashmaptypehandler/HashMapTypeHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/hashmaptypehandler/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/hashmaptypehandler/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/hashmaptypehandler/User.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/hashmaptypehandler/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/heavy_initial_load/Code.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/heavy_initial_load/HeavyInitialLoadTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/heavy_initial_load/Thing.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/heavy_initial_load/ThingMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/heavy_initial_load/ThingMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/heavy_initial_load/ibatisConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/immutable_constructor/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/immutable_constructor/ImmutablePOJO.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/immutable_constructor/ImmutablePOJOMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/immutable_constructor/ImmutablePOJOMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/immutable_constructor/ImmutablePOJOTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/immutable_constructor/ibatisConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/include_property/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/include_property/DuplicatedIncludePropertiesMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/include_property/DuplicatedIncludePropertiesMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/include_property/IncludePropertyErrorTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/include_property/IncludePropertyTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/include_property/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/include_property/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/includes/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/includes/Fragments.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/includes/IncludeTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/includes/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/includes/MapperConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/inheritance/BaseMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/inheritance/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/inheritance/InheritanceTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/inheritance/UserProfile.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/inheritance/UserProfileMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/inheritance/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/initialized_collection_property/Author.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/initialized_collection_property/Author.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/initialized_collection_property/AuthorDAOTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/initialized_collection_property/Post.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/initialized_collection_property/create.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/initialized_collection_property/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/inline_association_with_dot/Element.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/inline_association_with_dot/ElementMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/inline_association_with_dot/ElementMapperUsingInline.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/inline_association_with_dot/ElementMapperUsingInline.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/inline_association_with_dot/ElementMapperUsingSubMap.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/inline_association_with_dot/ElementMapperUsingSubMap.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/inline_association_with_dot/InlineCollectionWithDotTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/inline_association_with_dot/create.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/inline_association_with_dot/ibatis-inline.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/inline_association_with_dot/ibatis-submap.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/integer_enum/IntegerEnumTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/integer_enum/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/integer_enum/MapperConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/integer_enum/Record.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/javassist/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/javassist/Group.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/javassist/JavassistTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/javassist/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/javassist/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/javassist/User.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/javassist/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/keycolumn/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/keycolumn/InsertMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/keycolumn/InsertMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/keycolumn/InsertTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/keycolumn/Name.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/keygen/Country.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/keygen/CountryMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/keygen/CountryMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/keygen/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/keygen/Jdbc3KeyGeneratorTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/keygen/MapperConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/keygen/Planet.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/language/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/language/LanguageTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/language/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/language/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/language/MapperConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/language/Name.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/language/Parameter.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/language/VelocityLanguageDriver.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/language/VelocitySqlSource.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/language/VelocitySqlSourceBuilder.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_deserialize/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_deserialize/LazyDeserializeTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_deserialize/LazyObjectBar.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_deserialize/LazyObjectFoo.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_deserialize/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_deserialize/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_deserialize/ibatisConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_immutable/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_immutable/ImmutablePOJO.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_immutable/ImmutablePOJOMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_immutable/ImmutablePOJOMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_immutable/ImmutablePOJOTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_immutable/ibatisConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_properties/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_properties/LazyPropertiesTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_properties/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_properties/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_properties/User.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_properties/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_common_property/Child.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_common_property/ChildMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_common_property/ChildMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_common_property/CommonPropertyLazyLoadError.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_common_property/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_common_property/Father.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_common_property/FatherMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_common_property/FatherMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_common_property/GrandFather.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_common_property/GrandFatherMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_common_property/GrandFatherMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_common_property/ibatisConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/AbstractLazyTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/CglibLazyTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/DefaultLazyTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/Group.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/JavassistLazyTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/Owned.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/UserWithGetObjectWithInterface.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/UserWithGetObjectWithoutInterface.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/UserWithGetXxxWithInterface.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/UserWithGetXxxWithoutInterface.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/UserWithNothingWithInterface.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/UserWithNothingWithoutInterface.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/mybatis-config-cglib.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/mybatis-config-default.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/mybatis-config-javassist.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/manyanno/AnnoPost.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/manyanno/AnnoPostTag.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/manyanno/ManyAnnoTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/manyanno/PostMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/map_class_name_conflict/MapperNameTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/map_class_name_conflict/Person.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/map_class_name_conflict/PersonMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/map_class_name_conflict/PersonMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/map_class_name_conflict/ibatisConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_extend/ChildMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_extend/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_extend/GrandpaMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_extend/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_extend/MapperExtendTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_extend/MapperOverload.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_extend/MapperOverload.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_extend/ParentMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_extend/ParentMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_extend/User.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_extend/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_type_parameter/BaseMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_type_parameter/Country.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_type_parameter/CountryMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_type_parameter/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_type_parameter/MapperTypeParameterTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_type_parameter/Person.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_type_parameter/PersonListMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_type_parameter/PersonMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_type_parameter/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/maptypehandler/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/maptypehandler/LabelsTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/maptypehandler/MapTypeHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/maptypehandler/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/maptypehandler/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/maptypehandler/User.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/maptypehandler/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/member_access/MemberAccessTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/member_access/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/missing_id_property/Car.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/missing_id_property/CarMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/missing_id_property/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/missing_id_property/Map.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/missing_id_property/MapperConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/missing_id_property/MissingIdPropertyTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/missing_id_property/Part.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multidb/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multidb/DummyDatabaseIdProvider.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multidb/MultiDbConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multidb/MultiDbMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multidb/MultiDbMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multidb/MultiDbTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multidb/ProviderConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multidb/ProviderTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multidb/User.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_discriminator/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_discriminator/Director.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_discriminator/Employee.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_discriminator/MultipleDiscriminatorTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_discriminator/Person.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_discriminator/Person.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_discriminator/PersonMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_discriminator/ibatisConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_resultsets/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_resultsets/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_resultsets/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_resultsets/MultipleResultTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_resultsets/OrderDetail.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_resultsets/OrderHeader.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleiterates/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleiterates/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleiterates/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleiterates/MultipleIteratesTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleiterates/User.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleiterates/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleresultsetswithassociation/CreateDB1.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleresultsetswithassociation/CreateDB2.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleresultsetswithassociation/CreateDB3.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleresultsetswithassociation/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleresultsetswithassociation/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleresultsetswithassociation/MultipleResultSetTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleresultsetswithassociation/OrderDetail.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleresultsetswithassociation/OrderHeader.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleresultsetswithassociation/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/named_constructor_args/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/named_constructor_args/InvalidNamedConstructorArgsTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/named_constructor_args/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/named_constructor_args/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/named_constructor_args/NamedConstructorArgsTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/named_constructor_args/NamedConstructorArgsUseActualNameTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/named_constructor_args/UseActualNameMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/named_constructor_args/UseActualNameMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/named_constructor_args/User.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/named_constructor_args/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested/MapperConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested/Name.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested/NestedForEach.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested/NestedForEachTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested/Parameter.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested_query_cache/AuthorMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested_query_cache/AuthorMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested_query_cache/BlogMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested_query_cache/BlogMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested_query_cache/MapperConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested_query_cache/NestedQueryCacheTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested_query_cache/mapper.properties create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler/Item.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler/NestedResultHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler/Person.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler/PersonItemPair.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_association/Account.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_association/AccountAddress.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_association/AccountRepository.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_association/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_association/NestedResultHandlerAssociationTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_association/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_multiple_association/Binome.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_multiple_association/ChildBean.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_multiple_association/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_multiple_association/NestedResultHandlerMultipleAssociationTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_multiple_association/ParentBean.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_multiple_association/mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_multiple_association/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/no_param_type/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/no_param_type/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/no_param_type/NoParamTypeTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/no_param_type/User.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/no_param_type/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nonexistentvariables/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nonexistentvariables/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nonexistentvariables/NonExistentVariablesTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nonexistentvariables/mappers.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nonexistentvariables/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/not_null_column/Base.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/not_null_column/Child.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/not_null_column/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/not_null_column/Father.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/not_null_column/FatherMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/not_null_column/FatherMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/not_null_column/NotNullColumnTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/not_null_column/ibatisConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/null_associations/Bar.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/null_associations/Foo.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/null_associations/FooMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/null_associations/FooMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/null_associations/FooMapperTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/null_associations/create-schema-mysql.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/null_associations/sqlmap.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognl_enum/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognl_enum/EnumWithOgnlTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognl_enum/Person.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognl_enum/Person.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognl_enum/PersonMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognl_enum/ibatisConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognlstatic/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognlstatic/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognlstatic/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognlstatic/OgnlStaticTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognlstatic/StaticClass.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognlstatic/User.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognlstatic/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/optional_on_mapper_method/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/optional_on_mapper_method/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/optional_on_mapper_method/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/optional_on_mapper_method/OptionalOnMapperMethodTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/optional_on_mapper_method/User.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/optional_on_mapper_method/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/order_prefix_removed/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/order_prefix_removed/OrderPrefixRemoved.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/order_prefix_removed/Person.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/order_prefix_removed/Person.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/order_prefix_removed/PersonMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/order_prefix_removed/ibatisConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/overwritingproperties/Bar.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/overwritingproperties/Foo.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/overwritingproperties/FooMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/overwritingproperties/FooMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/overwritingproperties/FooMapperTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/overwritingproperties/create-schema-mysql.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/overwritingproperties/sqlmap.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parametrizedlist/Config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parametrizedlist/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parametrizedlist/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parametrizedlist/ParametrizedListTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parametrizedlist/User.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_childs/Child.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_childs/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_childs/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_childs/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_childs/Parent.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_childs/ParentChildTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_childs/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_reference_3level/Blog.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_reference_3level/BlogTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_reference_3level/Comment.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_reference_3level/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_reference_3level/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_reference_3level/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_reference_3level/Post.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_reference_3level/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/permissions/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/permissions/Permission.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/permissions/PermissionsMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/permissions/PermissionsMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/permissions/PermissionsTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/permissions/Principal.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/permissions/Resource.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/permissions/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/postgres_genkeys/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/postgres_genkeys/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/postgres_genkeys/PostgresGeneratedKeysTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/postgres_genkeys/Section.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/postgres_genkeys/User.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_array/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_array/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_array/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_array/PrimitiveArrayTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_array/User.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_array/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_result_type/IbatisConfig.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_result_type/PrimitiveResultTypeTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_result_type/Product.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_result_type/ProductDAO.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_result_type/ProductMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_result_type/ProductMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_result_type/create.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_result_type/ibatis.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitives/Assetright.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitives/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitives/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitives/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitives/PrimitivesTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitives/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/propertiesinmapperfiles/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/propertiesinmapperfiles/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/propertiesinmapperfiles/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/propertiesinmapperfiles/PropertiesInMappersTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/propertiesinmapperfiles/User.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/propertiesinmapperfiles/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/quotedcolumnnames/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/quotedcolumnnames/Map.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/quotedcolumnnames/MapperConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/quotedcolumnnames/QuotedColumnNamesTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/raw_sql_source/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/raw_sql_source/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/raw_sql_source/RawSqlSourceTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/raw_sql_source/User.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/raw_sql_source/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/refcursor/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/refcursor/Order.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/refcursor/OrderDetail.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/refcursor/OrdersMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/refcursor/OrdersMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/refcursor/RefCursorTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/refid_resolution/ExternalMapper1.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/refid_resolution/ExternalMapper2.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/refid_resolution/ExternalMapperConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/refid_resolution/ExternalRefidResolutionTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/refid_resolution/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/refid_resolution/MapperConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/refid_resolution/RefidResolutionTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler/ResulthandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler/User.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler/UserResultHandler.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler_type/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler_type/DefaultResultHandlerTypeTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler_type/MapperConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler_type/ObjectFactory.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler_type/Person.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler_type/PersonMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler_type/PersonMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_set_type/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_set_type/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_set_type/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_set_type/ResultSetTypeTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_set_type/User.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_set_type/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/resultmapwithassociationstest/Address.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/resultmapwithassociationstest/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/resultmapwithassociationstest/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/resultmapwithassociationstest/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/resultmapwithassociationstest/Person.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/resultmapwithassociationstest/ResultMapWithAssociationsTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/resultmapwithassociationstest/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/results_id/AnotherMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/results_id/AnotherMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/results_id/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/results_id/IdConflictMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/results_id/IdConflictMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/results_id/IdConflictTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/results_id/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/results_id/ResultsIdTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/results_id/User.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/results_id/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/rounding/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/rounding/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/rounding/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/rounding/RoundingHandlersTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/rounding/User.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/rounding/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/selectkey/AnnotatedMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/selectkey/AnnotatedMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/selectkey/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/selectkey/MapperConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/selectkey/Name.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/selectkey/SelectKeyTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/selectkey/SqlProvider.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/selectkey/Table1.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/selectkey/Table2.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/Attribute.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/AttributeMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/AttributeMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/Department.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/DepartmentMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/DepartmentMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/MapperConfigWithAggressiveLazyLoading.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/MapperConfigWithoutAggressiveLazyLoading.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/Person.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/PersonMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/PersonMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/SerializeCircularTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/UtilityTester.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/simplelistparameter/Car.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/simplelistparameter/CarMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/simplelistparameter/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/simplelistparameter/Rv.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/simplelistparameter/SimpleListParameterTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/simplelistparameter/Vehicle.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/simplelistparameter/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sptests/Book.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sptests/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sptests/Genre.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sptests/Item.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sptests/MapperConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sptests/Name.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sptests/Parameter.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sptests/SPMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sptests/SPMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sptests/SPTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sqlprovider/BaseMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sqlprovider/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sqlprovider/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sqlprovider/OurSqlBuilder.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sqlprovider/SqlProviderTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sqlprovider/User.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sqlprovider/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/stringlist/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/stringlist/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/stringlist/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/stringlist/StringListTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/stringlist/User.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/stringlist/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/substitution_in_annots/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/substitution_in_annots/SubstitutionInAnnotsMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/substitution_in_annots/SubstitutionInAnnotsMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/substitution_in_annots/SubstitutionInAnnotsTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandler/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandler/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandler/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandler/Product.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandler/StringTrimmingTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandler/TypeHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandler/User.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandler/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandlerinjection/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandlerinjection/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandlerinjection/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandlerinjection/TypeHandlerInjectionTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandlerinjection/User.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandlerinjection/UserStateTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandlerinjection/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/unknownobject/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/unknownobject/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/unknownobject/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/unknownobject/UnknownObject.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/unknownobject/UnknownObjectTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/unknownobject/User.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/unknownobject/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/use_actual_param_name/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/use_actual_param_name/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/use_actual_param_name/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/use_actual_param_name/UseActualParamNameTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/use_actual_param_name/User.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/use_actual_param_name/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/uuid_test/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/uuid_test/Mapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/uuid_test/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/uuid_test/UUIDTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/uuid_test/UUIDTypeHandler.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/uuid_test/User.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/uuid_test/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/valueinmap/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/valueinmap/Mapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/valueinmap/ValueInMapTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/valueinmap/mybatis-config.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/CreateDB.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/Dog.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/InvalidMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/InvalidMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/InvalidWithInsertMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/InvalidWithInsertMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MapperConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleCrossIncludeMapperConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleCrossIncludePersonMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleCrossIncludePersonMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleCrossIncludePetMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleCrossIncludePetMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleCrossIncludeTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleIncludeMapperConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleIncludePersonMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleIncludePersonMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleIncludeTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleReverseIncludeMapperConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleReverseIncludePersonMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleReverseIncludePersonMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleReverseIncludeTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/NonFullyQualifiedNamespaceConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/NonFullyQualifiedNamespacePersonMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/NonFullyQualifiedNamespacePetMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/NonFullyQualifiedNamespaceTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ParameterMapReferenceMapperConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ParameterMapReferencePersonMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ParameterMapReferencePersonMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ParameterMapReferencePetMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ParameterMapReferencePetMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ParameterMapReferenceTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/Person.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/PersonMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/PersonMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/Pet.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/PetMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/PetMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ResultMapExtendsMapperConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ResultMapExtendsPersonMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ResultMapExtendsPetMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ResultMapExtendsTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ResultMapReferenceMapperConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ResultMapReferencePersonMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ResultMapReferencePersonMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ResultMapReferencePetMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ResultMapReferencePetMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ResultMapReferenceTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ReverseIncludeMapperConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ReverseIncludePersonMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ReverseIncludePersonMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ReverseIncludeTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/SameIdMapperConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/SameIdPersonMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/SameIdPersonMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/SameIdPetMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/SameIdPetMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/SameIdTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ShortNameTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/XmlExternalRefTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_references/EnumWithOgnlTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_references/Person.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_references/PersonMapper.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_references/PersonMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_references/PersonMapper2.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_references/PersonMapper2.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_references/ibatisConfig.xml create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/test/EmbeddedPostgresqlTests.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/test/SlowTests.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/transaction/managed/ManagedTransactionFactoryTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/ArrayTypeHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/BaseTypeHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/BigDecimalTypeHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/BigIntegerTypeHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/BlobByteObjectArrayTypeHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/BlobInputStreamTypeHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/BlobInputStreamTypeHandlerTest.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/BlobTypeHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/BooleanTypeHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/ByteArrayTypeHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/ByteObjectArrayTypeHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/ByteTypeHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/CharacterTypeHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/ClobReaderTypeHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/ClobReaderTypeHandlerTest.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/ClobTypeHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/DateOnlyTypeHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/DateTypeHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/DoubleTypeHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/EnumOrdinalTypeHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/EnumTypeHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/FloatTypeHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/GenericTypeSupportedInHierarchiesTestCase.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/InstantTypeHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/IntegerTypeHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/JapaneseDateTypeHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/JdbcTypeTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/Jsr310TypeHandlerRegistryTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/LocalDateTimeTypeHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/LocalDateTypeHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/LocalTimeTypeHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/LongTypeHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/MonthTypeHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/NClobTypeHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/NStringTypeHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/ObjectTypeHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/OffsetDateTimeTypeHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/OffsetTimeTypeHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/ShortTypeHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/SimpleTypeRegistryTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/SqlDateTypeHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/SqlTimeTypeHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/SqlTimetampTypeHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/SqlxmlTypeHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/SqlxmlTypeHandlerTest.sql create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/StringTypeHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/TimeOnlyTypeHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/TypeAliasRegistryTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/TypeHandlerRegistryTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/UnknownTypeHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/YearMonthTypeHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/YearTypeHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/ZonedDateTimeTypeHandlerTest.java create mode 100644 Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/jdbc.properties create mode 100644 Module1/code/mybatis-3-master/src/test/java/resources/nodelet_test.xml create mode 100644 Module1/code/mybatis-3-master/src/test/resources/com/lagou/mapper/IOrderMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/resources/com/lagou/mapper/IUserMapper.xml create mode 100644 Module1/code/mybatis-3-master/src/test/resources/jdbc.properties create mode 100644 Module1/code/mybatis-3-master/src/test/resources/log4j.properties create mode 100644 Module1/code/mybatis-3-master/src/test/resources/sqlMapConfig.xml create mode 100644 Module1/code/mybatis-3-master/travis/after_success.sh create mode 100644 Module1/code/mybatis-3-master/travis/install.sh create mode 100644 Module1/code/mybatis-3-master/travis/settings.xml create mode 100644 Module1/code/mybatis_multitable/pom.xml create mode 100644 Module1/code/mybatis_multitable/src/main/java/com/yang/mapper/IOrderMapper.java create mode 100644 Module1/code/mybatis_multitable/src/main/java/com/yang/mapper/IRoleMapper.java create mode 100644 Module1/code/mybatis_multitable/src/main/java/com/yang/mapper/IUserMapper.java create mode 100644 Module1/code/mybatis_multitable/src/main/java/com/yang/plugin/MyPlugin.java create mode 100644 Module1/code/mybatis_multitable/src/main/java/com/yang/pojo/Order.java create mode 100644 Module1/code/mybatis_multitable/src/main/java/com/yang/pojo/Role.java create mode 100644 Module1/code/mybatis_multitable/src/main/java/com/yang/pojo/User.java create mode 100644 Module1/code/mybatis_multitable/src/main/java/com/yang/test/CacheTest.java create mode 100644 Module1/code/mybatis_multitable/src/main/java/com/yang/test/MybatisTest.java create mode 100644 Module1/code/mybatis_multitable/src/main/resources/com/yang/mapper/IOrderMapper.xml create mode 100644 Module1/code/mybatis_multitable/src/main/resources/com/yang/mapper/IUserMapper.xml create mode 100644 Module1/code/mybatis_multitable/src/main/resources/jdbc.properties create mode 100644 Module1/code/mybatis_multitable/src/main/resources/log4j.properties create mode 100644 Module1/code/mybatis_multitable/src/main/resources/redis.properties create mode 100644 Module1/code/mybatis_multitable/src/main/resources/sqlMapConfig.xml create mode 100644 Module1/code/mybatis_multitable/target/classes/com/yang/mapper/IOrderMapper.class create mode 100644 Module1/code/mybatis_multitable/target/classes/com/yang/mapper/IOrderMapper.xml create mode 100644 Module1/code/mybatis_multitable/target/classes/com/yang/mapper/IRoleMapper.class create mode 100644 Module1/code/mybatis_multitable/target/classes/com/yang/mapper/IUserMapper.class create mode 100644 Module1/code/mybatis_multitable/target/classes/com/yang/mapper/IUserMapper.xml create mode 100644 Module1/code/mybatis_multitable/target/classes/com/yang/plugin/MyPlugin.class create mode 100644 Module1/code/mybatis_multitable/target/classes/com/yang/pojo/Order.class create mode 100644 Module1/code/mybatis_multitable/target/classes/com/yang/pojo/Role.class create mode 100644 Module1/code/mybatis_multitable/target/classes/com/yang/pojo/User.class create mode 100644 Module1/code/mybatis_multitable/target/classes/com/yang/test/CacheTest.class create mode 100644 Module1/code/mybatis_multitable/target/classes/com/yang/test/MybatisTest.class create mode 100644 Module1/code/mybatis_multitable/target/classes/jdbc.properties create mode 100644 Module1/code/mybatis_multitable/target/classes/log4j.properties create mode 100644 Module1/code/mybatis_multitable/target/classes/redis.properties create mode 100644 Module1/code/mybatis_multitable/target/classes/sqlMapConfig.xml create mode 100644 Module1/code/mybatis_quickStarter/pom.xml create mode 100644 Module1/code/mybatis_quickStarter/src/main/java/com/yang/mapper/UserMapper.java create mode 100644 Module1/code/mybatis_quickStarter/src/main/java/com/yang/mapper/UserMapperImpl.java create mode 100644 Module1/code/mybatis_quickStarter/src/main/java/com/yang/pojo/User.java create mode 100644 Module1/code/mybatis_quickStarter/src/main/java/com/yang/test/MybatisTest.java create mode 100644 Module1/code/mybatis_quickStarter/src/main/resources/UserMapper.xml create mode 100644 Module1/code/mybatis_quickStarter/src/main/resources/jdbc.properties create mode 100644 Module1/code/mybatis_quickStarter/src/main/resources/sqlMapConfig.xml create mode 100644 Module1/code/mybatis_quickStarter/target/classes/UserMapper.xml create mode 100644 Module1/code/mybatis_quickStarter/target/classes/com/yang/mapper/UserMapper.class create mode 100644 Module1/code/mybatis_quickStarter/target/classes/com/yang/mapper/UserMapperImpl.class create mode 100644 Module1/code/mybatis_quickStarter/target/classes/com/yang/pojo/User.class create mode 100644 Module1/code/mybatis_quickStarter/target/classes/com/yang/test/MybatisTest.class create mode 100644 Module1/code/mybatis_quickStarter/target/classes/jdbc.properties create mode 100644 Module1/code/mybatis_quickStarter/target/classes/sqlMapConfig.xml create mode 100644 "Module1/document/01\350\207\252\345\256\232\344\271\211\346\214\201\344\271\205\345\261\202\346\241\206\346\236\266/Mybatis.pdf" create mode 100644 "Module1/document/01\350\207\252\345\256\232\344\271\211\346\214\201\344\271\205\345\261\202\346\241\206\346\236\266/\350\207\252\345\256\232\344\271\211\346\214\201\344\271\205\345\261\202\346\241\206\346\236\266.md" delete mode 100644 "Module1/document/\350\207\252\345\256\232\344\271\211\346\214\201\344\271\205\345\261\202\346\241\206\346\236\266.md" diff --git a/Module1/code/IPersistence/pom.xml b/Module1/code/IPersistence/pom.xml index 3f279f6..ecc9df5 100644 --- a/Module1/code/IPersistence/pom.xml +++ b/Module1/code/IPersistence/pom.xml @@ -4,14 +4,22 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.lagou + com.yang IPersistence 1.0-SNAPSHOT + + UTF-8 + UTF-8 + 1.8 + 1.8 + 1.8 + + mysql mysql-connector-java - 5.1.38 + 8.0.11 c3p0 @@ -28,7 +36,6 @@ junit 4.10 - dom4j dom4j diff --git a/Module1/code/IPersistence/src/main/java/com/lagou/sqlSession/DefaultSqlSession.java b/Module1/code/IPersistence/src/main/java/com/lagou/sqlSession/DefaultSqlSession.java deleted file mode 100644 index 6a04814..0000000 --- a/Module1/code/IPersistence/src/main/java/com/lagou/sqlSession/DefaultSqlSession.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.lagou.sqlSession; - -import com.lagou.pojo.Configuration; - -import java.beans.IntrospectionException; -import java.lang.reflect.InvocationTargetException; -import java.sql.SQLException; -import java.util.List; - -public class DefaultSqlSession implements SqlSession { - - private Configuration configuration; - - public DefaultSqlSession(Configuration configuration) { - this.configuration = configuration; - } - - /** - * 查询多个 - * - * @param statementId - * @param params - * @return - */ - public List selectList(String statementId, Object... params) throws SQLException, IllegalAccessException, IntrospectionException, InstantiationException, NoSuchFieldException, InvocationTargetException, ClassNotFoundException { - SimpleExecutor simpleExecutor = new SimpleExecutor(); - return simpleExecutor.query(configuration, configuration.getMappedStatementMap().get(statementId), params); - } - - /** - * 查询单个 - * - * @param statementId - * @param params - * @return - */ - public T selectOne(String statementId, Object... params) throws SQLException, IllegalAccessException, IntrospectionException, InstantiationException, ClassNotFoundException, InvocationTargetException, NoSuchFieldException { - List objects = selectList(statementId, params); - if (objects.size()> 1){ - throw new RuntimeException("查询结果过多"); - } - return objects.get(0); - } -} diff --git a/Module1/code/IPersistence/src/main/java/com/lagou/sqlSession/Executor.java b/Module1/code/IPersistence/src/main/java/com/lagou/sqlSession/Executor.java deleted file mode 100644 index a4cd7e9..0000000 --- a/Module1/code/IPersistence/src/main/java/com/lagou/sqlSession/Executor.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.lagou.sqlSession; - -import com.lagou.pojo.Configuration; -import com.lagou.pojo.MappedStatement; - -import java.beans.IntrospectionException; -import java.lang.reflect.InvocationTargetException; -import java.sql.SQLException; -import java.util.List; - -public interface Executor { - public List query(Configuration configuration, MappedStatement mappedStatement, Object... params) throws SQLException, ClassNotFoundException, NoSuchFieldException, IllegalAccessException, IntrospectionException, InstantiationException, InvocationTargetException; -} diff --git a/Module1/code/IPersistence/src/main/java/com/lagou/sqlSession/SimpleExecutor.java b/Module1/code/IPersistence/src/main/java/com/lagou/sqlSession/SimpleExecutor.java deleted file mode 100644 index c5b4fa8..0000000 --- a/Module1/code/IPersistence/src/main/java/com/lagou/sqlSession/SimpleExecutor.java +++ /dev/null @@ -1,91 +0,0 @@ -package com.lagou.sqlSession; - -import com.lagou.config.BoundSql; -import com.lagou.pojo.Configuration; -import com.lagou.pojo.MappedStatement; -import com.lagou.utils.GenericTokenParser; -import com.lagou.utils.ParameterMapping; -import com.lagou.utils.ParameterMappingTokenHandler; - -import java.beans.IntrospectionException; -import java.beans.PropertyDescriptor; -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.sql.*; -import java.util.ArrayList; -import java.util.List; - -public class SimpleExecutor implements Executor { - - public List query(Configuration configuration, MappedStatement mappedStatement, Object... params) throws SQLException, ClassNotFoundException, NoSuchFieldException, IllegalAccessException, IntrospectionException, InstantiationException, InvocationTargetException { - // 1.注册驱动,获取链接 - Connection connection = configuration.getDataSource().getConnection(); - // 2.获取sql - String sql = mappedStatement.getSql(); - // 3.sql 转换 - BoundSql boundSql = getBoundSql(sql); - - // 4.获取预处理对象 - PreparedStatement prepareStatement = connection.prepareStatement(boundSql.getSqlText()); - // 5.设置参数 - // 获取参数全路径,使用反射设置参数 - String paramterType = mappedStatement.getParamterType(); - Class paramterTypeClass = getClassType(paramterType); - List parameterMappingList = boundSql.getParameterMappingList(); - for (int i = 0; i < parameterMappingList.size(); i++) { - ParameterMapping parameterMapping = parameterMappingList.get(i); - String content = parameterMapping.getContent(); - // 反射 - Field declaredField = paramterTypeClass.getDeclaredField(content); - declaredField.setAccessible(true); - Object o = declaredField.get(params[0]); - prepareStatement.setObject(i+1,o); - } - // 6.执行SQL - ResultSet resultSet = prepareStatement.executeQuery(); - // 7. 封装结果集 - Class resultTypeClass = getClassType(mappedStatement.getResultType()); - Object newInstance = resultTypeClass.newInstance(); - ArrayList arrayList = new ArrayList(); - while (resultSet.next()){ - ResultSetMetaData metaData = resultSet.getMetaData(); - for (int i = 0; i ) arrayList; - } - - private Class getClassType(String paramterType) throws ClassNotFoundException { - if(paramterType!=null){ - return Class.forName(paramterType); - } - return null; - } - - /** - * 完成对#{} 的转化 将#{} 使用? 替换 解析#{} 内容进行存储 - * @param sql - * @return - */ - private BoundSql getBoundSql(String sql) { - // 标记处理类: 配置标记解析器来完成对占位符的解析处理工作 - ParameterMappingTokenHandler parameterMappingTokenHandler = new ParameterMappingTokenHandler(); - // - GenericTokenParser genericTokenParser = new GenericTokenParser("#{", "}", parameterMappingTokenHandler); - // 解析后的SQL - String parse = genericTokenParser.parse(sql); - // #{}里面解析出的SQL参数名称 - List parameterMappings = parameterMappingTokenHandler.getParameterMappings(); - return new BoundSql(parse,parameterMappings); - } -} diff --git a/Module1/code/IPersistence/src/main/java/com/lagou/sqlSession/SqlSession.java b/Module1/code/IPersistence/src/main/java/com/lagou/sqlSession/SqlSession.java deleted file mode 100644 index a2410a7..0000000 --- a/Module1/code/IPersistence/src/main/java/com/lagou/sqlSession/SqlSession.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.lagou.sqlSession; - -import java.beans.IntrospectionException; -import java.lang.reflect.InvocationTargetException; -import java.sql.SQLException; -import java.util.List; - -public interface SqlSession { - - /** - * 查询多个 - * @param statementId - * @param params - * @param - * @return - */ - - public List selectList(String statementId,Object ... params) throws SQLException, IllegalAccessException, IntrospectionException, InstantiationException, NoSuchFieldException, InvocationTargetException, ClassNotFoundException; - - /** - * 查询单个 - * @param statementId - * @param params - * @param - * @return - */ - public T selectOne(String statementId,Object ... params) throws SQLException, IllegalAccessException, IntrospectionException, InstantiationException, ClassNotFoundException, InvocationTargetException, NoSuchFieldException; -} diff --git a/Module1/code/IPersistence/src/main/java/com/lagou/config/BoundSql.java b/Module1/code/IPersistence/src/main/java/com/yang/config/BoundSql.java similarity index 69% rename from Module1/code/IPersistence/src/main/java/com/lagou/config/BoundSql.java rename to Module1/code/IPersistence/src/main/java/com/yang/config/BoundSql.java index 51acb1a..1aed839 100644 --- a/Module1/code/IPersistence/src/main/java/com/lagou/config/BoundSql.java +++ b/Module1/code/IPersistence/src/main/java/com/yang/config/BoundSql.java @@ -1,15 +1,23 @@ -package com.lagou.config; +package com.yang.config; -import com.lagou.utils.ParameterMapping; +import com.yang.utils.ParameterMapping; import java.util.ArrayList; import java.util.List; +/** + * 存放后的SQL语句 + */ public class BoundSql { private String sqlText; - private List parameterMappingList = new ArrayList(); + private List parameterMappingList = new ArrayList<>(); + + public BoundSql(String sqlText, List parameterMappingList) { + this.sqlText = sqlText; + this.parameterMappingList = parameterMappingList; + } public String getSqlText() { return sqlText; @@ -27,8 +35,11 @@ public class BoundSql { this.parameterMappingList = parameterMappingList; } - public BoundSql(String sqlText, List parameterMappingList) { - this.sqlText = sqlText; - this.parameterMappingList = parameterMappingList; + @Override + public String toString() { + return "BoundSql{" + + "sqlText='" + sqlText + '\'' + + ", parameterMappingList=" + parameterMappingList + + '}'; } } diff --git a/Module1/code/IPersistence/src/main/java/com/lagou/config/XMLConfigBuilder.java b/Module1/code/IPersistence/src/main/java/com/yang/config/XmlConfigBuilder.java similarity index 57% rename from Module1/code/IPersistence/src/main/java/com/lagou/config/XMLConfigBuilder.java rename to Module1/code/IPersistence/src/main/java/com/yang/config/XmlConfigBuilder.java index 0c57bb3..805bfd2 100644 --- a/Module1/code/IPersistence/src/main/java/com/lagou/config/XMLConfigBuilder.java +++ b/Module1/code/IPersistence/src/main/java/com/yang/config/XmlConfigBuilder.java @@ -1,8 +1,8 @@ -package com.lagou.config; +package com.yang.config; -import com.lagou.io.Resources; -import com.lagou.pojo.Configuration; import com.mchange.v2.c3p0.ComboPooledDataSource; +import com.yang.io.Resources; +import com.yang.pojo.Configuration; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; @@ -13,50 +13,51 @@ import java.io.InputStream; import java.util.List; import java.util.Properties; -/** - * 使用dom4j 解析xml - */ -public class XMLConfigBuilder { +public class XmlConfigBuilder { + /** + * 将Configuration 封装为成员变量,这样在初始化xmlConfigBuilder 时初始化Configuration + */ private Configuration configuration; - public XMLConfigBuilder() { - this.configuration = new Configuration(); + public XmlConfigBuilder() { + this.configuration = new Configuration(); } /** - * 该方法 使用 dom4j将配置 xml 解析并封装为cofiguration - * @param in + * 该方法解析配置文件,封装在Configuration中 + * @param inputStream * @return */ - public Configuration parseConfig(InputStream in) throws DocumentException, PropertyVetoException { - Document document = new SAXReader().read(in); - // 标签 + public Configuration parseConfig(InputStream inputStream) throws DocumentException, PropertyVetoException { + // 解析 + Document document = new SAXReader().read(inputStream); + // 既 Element rootElement = document.getRootElement(); - // 标签读取 - List selectNodes = rootElement.selectNodes("//property"); + // 获取sqlMapperConfig.xml 中所有的节点 + List list = rootElement.selectNodes("//property"); Properties properties = new Properties(); - for (Element element : selectNodes) { + for (Element element : list) { String name = element.attributeValue("name"); String value = element.attributeValue("value"); properties.setProperty(name,value); } - ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource(); + ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource(); comboPooledDataSource.setDriverClass(properties.getProperty("driverClass")); comboPooledDataSource.setJdbcUrl(properties.getProperty("jdbcUrl")); comboPooledDataSource.setUser(properties.getProperty("username")); comboPooledDataSource.setPassword(properties.getProperty("password")); configuration.setDataSource(comboPooledDataSource); - - // 解析 mapper.xml -> 获取mapper.xml 路径 --》字节输入流 --->dom4j 进行解析 + //2.解析mapper.xml + // 2.1. 获取 地址 List mapperList = rootElement.selectNodes("//mapper"); for (Element element : mapperList) { String mapperPath = element.attributeValue("resource"); InputStream resourceAsSteam = Resources.getResourceAsSteam(mapperPath); - XMLMapperBuilder xmlMapperBuilder = new XMLMapperBuilder(configuration); + XmlMapperBuilder xmlMapperBuilder = new XmlMapperBuilder(configuration); xmlMapperBuilder.parse(resourceAsSteam); } + return configuration; - return null; } } diff --git a/Module1/code/IPersistence/src/main/java/com/lagou/config/XMLMapperBuilder.java b/Module1/code/IPersistence/src/main/java/com/yang/config/XmlMapperBuilder.java similarity index 39% rename from Module1/code/IPersistence/src/main/java/com/lagou/config/XMLMapperBuilder.java rename to Module1/code/IPersistence/src/main/java/com/yang/config/XmlMapperBuilder.java index 604dcd6..c94930c 100644 --- a/Module1/code/IPersistence/src/main/java/com/lagou/config/XMLMapperBuilder.java +++ b/Module1/code/IPersistence/src/main/java/com/yang/config/XmlMapperBuilder.java @@ -1,7 +1,7 @@ -package com.lagou.config; +package com.yang.config; -import com.lagou.pojo.Configuration; -import com.lagou.pojo.MappedStatement; +import com.yang.pojo.Configuration; +import com.yang.pojo.MappedStatement; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; @@ -10,36 +10,36 @@ import org.dom4j.io.SAXReader; import java.io.InputStream; import java.util.List; -public class XMLMapperBuilder { +public class XmlMapperBuilder { private Configuration configuration; - public XMLMapperBuilder(Configuration configuration) { + public XmlMapperBuilder(Configuration configuration) { this.configuration = configuration; } /** - * 解析 mapper.xml - * @param in + * 解析sql.xml + * @param inputStream */ - public void parse(InputStream in) throws DocumentException { - Document document = new SAXReader().read(in); + public void parse(InputStream inputStream) throws DocumentException { + Document document = new SAXReader().read(inputStream); + // Element rootElement = document.getRootElement(); - String namespace = rootElement.attributeValue("namespace"); - List selectNodes = rootElement.selectNodes("//select"); - for (Element element : selectNodes) { + List allSqlXmlList = rootElement.selectNodes("//select|//insert|//update|//delete"); + for (Element element : allSqlXmlList) { String id = element.attributeValue("id"); String resultType = element.attributeValue("resultType"); - String paramterType = element.attributeValue("paramterType"); - String sqlText = element.getTextTrim(); + String parameterType = element.attributeValue("parameterType"); + String sql = element.getTextTrim(); + String sqlType = element.getName().toLowerCase(); MappedStatement mappedStatement = new MappedStatement(); mappedStatement.setId(id); mappedStatement.setResultType(resultType); - mappedStatement.setParamterType(paramterType); - mappedStatement.setSql(sqlText); - configuration.getMappedStatementMap().put(namespace+"."+id,mappedStatement); + mappedStatement.setParameterType(parameterType); + mappedStatement.setSql(sql); + mappedStatement.setSqlType(sqlType); + configuration.getMappedStatementMap().put(rootElement.attributeValue("namespace")+"."+id,mappedStatement); } - - } } diff --git a/Module1/code/IPersistence/src/main/java/com/lagou/io/Resources.java b/Module1/code/IPersistence/src/main/java/com/yang/io/Resources.java similarity index 50% rename from Module1/code/IPersistence/src/main/java/com/lagou/io/Resources.java rename to Module1/code/IPersistence/src/main/java/com/yang/io/Resources.java index 369e4bd..64a86d2 100644 --- a/Module1/code/IPersistence/src/main/java/com/lagou/io/Resources.java +++ b/Module1/code/IPersistence/src/main/java/com/yang/io/Resources.java @@ -1,18 +1,15 @@ -package com.lagou.io; - +package com.yang.io; import java.io.InputStream; +/** + * 加载配置文件 + */ public class Resources { - /** - * 根据配置文件路径将配置文件加载成字节输入流,存储在内存中 - * @param path - * @return - */ + // 根据配置文件路径,将配置文件加载成字节输入流,存储在内存中 public static InputStream getResourceAsSteam(String path){ - System.out.println(path); return Resources.class.getClassLoader().getResourceAsStream(path); + } } - diff --git a/Module1/code/IPersistence/src/main/java/com/lagou/pojo/Configuration.java b/Module1/code/IPersistence/src/main/java/com/yang/pojo/Configuration.java similarity index 68% rename from Module1/code/IPersistence/src/main/java/com/lagou/pojo/Configuration.java rename to Module1/code/IPersistence/src/main/java/com/yang/pojo/Configuration.java index 4e627e3..00d12a2 100644 --- a/Module1/code/IPersistence/src/main/java/com/lagou/pojo/Configuration.java +++ b/Module1/code/IPersistence/src/main/java/com/yang/pojo/Configuration.java @@ -1,21 +1,20 @@ -package com.lagou.pojo; +package com.yang.pojo; import javax.sql.DataSource; import java.util.HashMap; import java.util.Map; /** - * 存储数据源对象 + * 存放配置信息 */ public class Configuration { private DataSource dataSource; /** - * key :statementId 及 namespace + id - * value: 封装好的mappedStatement 对象 及 *mapper.xml 解析出来的内容 + * key: 及statementId value 封装好的mapper配置信息 */ - private Map mappedStatementMap = new HashMap(); + Map mappedStatementMap = new HashMap(); public DataSource getDataSource() { return dataSource; diff --git a/Module1/code/IPersistence/src/main/java/com/lagou/pojo/MappedStatement.java b/Module1/code/IPersistence/src/main/java/com/yang/pojo/MappedStatement.java similarity index 40% rename from Module1/code/IPersistence/src/main/java/com/lagou/pojo/MappedStatement.java rename to Module1/code/IPersistence/src/main/java/com/yang/pojo/MappedStatement.java index 1c1aded..6a172ba 100644 --- a/Module1/code/IPersistence/src/main/java/com/lagou/pojo/MappedStatement.java +++ b/Module1/code/IPersistence/src/main/java/com/yang/pojo/MappedStatement.java @@ -1,30 +1,21 @@ -package com.lagou.pojo; +package com.yang.pojo; /** - * 对mapper.xml 解析的内容实例化 + * 映射配置类 存放mapper.xml 解析的内容 */ public class MappedStatement { - /** - * id 标识 - */ private String id; - /** - * 返回值类型 - */ private String resultType; - /** - * 参数值类型 - */ - private String paramterType; + private String parameterType; - /** - * sql语句 - */ private String sql; + + private String sqlType; + public String getId() { return id; } @@ -41,12 +32,12 @@ public class MappedStatement { this.resultType = resultType; } - public String getParamterType() { - return paramterType; + public String getParameterType() { + return parameterType; } - public void setParamterType(String paramterType) { - this.paramterType = paramterType; + public void setParameterType(String parameterType) { + this.parameterType = parameterType; } public String getSql() { @@ -56,4 +47,23 @@ public class MappedStatement { public void setSql(String sql) { this.sql = sql; } + + public String getSqlType() { + return sqlType; + } + + public void setSqlType(String sqlType) { + this.sqlType = sqlType; + } + + @Override + public String toString() { + return "MappedStatement{" + + "id='" + id + '\'' + + ", resultType='" + resultType + '\'' + + ", parameterType='" + parameterType + '\'' + + ", sql='" + sql + '\'' + + ", sqlType='" + sqlType + '\'' + + '}'; + } } diff --git a/Module1/code/IPersistence/src/main/java/com/yang/sqlSession/DefaultSqlSession.java b/Module1/code/IPersistence/src/main/java/com/yang/sqlSession/DefaultSqlSession.java new file mode 100644 index 0000000..c7d5ce8 --- /dev/null +++ b/Module1/code/IPersistence/src/main/java/com/yang/sqlSession/DefaultSqlSession.java @@ -0,0 +1,140 @@ +package com.yang.sqlSession; + +import com.yang.pojo.Configuration; +import com.yang.pojo.MappedStatement; + +import java.beans.IntrospectionException; +import java.lang.reflect.*; +import java.sql.SQLException; +import java.util.List; + +public class DefaultSqlSession implements SqlSession { + + private Configuration configuration; + + private SimpleExecutor simpleExecutor = new SimpleExecutor(); + + public DefaultSqlSession(Configuration configuration) { + this.configuration = configuration; + } + + /** + * 查询所有 + * + * @param statementId + * @param params + * @return + */ + @Override + public List selectList(String statementId, Object... params) throws IllegalAccessException, IntrospectionException, InstantiationException, NoSuchFieldException, SQLException, InvocationTargetException, ClassNotFoundException { + // 完成simpleExecutor中 query 的调用 + List objects = simpleExecutor.query(configuration, configuration.getMappedStatementMap().get(statementId), params); + return (List) objects; + } + + /** + * 查询单个 + * + * @param statementId + * @param params + * @return + */ + @Override + public T selectOne(String statementId, Object... params) throws IllegalAccessException, ClassNotFoundException, IntrospectionException, InstantiationException, SQLException, InvocationTargetException, NoSuchFieldException { + List objects = selectList(statementId, params); + if (objects.size()== 1) { + return objects.get(0); + } else { + throw new RuntimeException("返回结果有误"); + } + } + + /** + * 新增 + * + * @param statementId + * @param params + * @return + * @throws Exception + */ + @Override + public Integer insert(String statementId, Object... params) throws SQLException, IllegalAccessException, NoSuchFieldException, ClassNotFoundException { + return simpleExecutor.insert(configuration, configuration.getMappedStatementMap().get(statementId), params); + } + + /** + * 更新方法 + * + * @param statementId + * @param params + * @return + * @throws Exception + */ + @Override + public Integer update(String statementId, Object... params) throws ClassNotFoundException, SQLException, NoSuchFieldException, IllegalAccessException { + return simpleExecutor.update(configuration, configuration.getMappedStatementMap().get(statementId), params); + } + + /** + * 删除方法 + * + * @param statementId + * @param params + * @return + * @throws Exception + */ + @Override + public Boolean delete(String statementId, Object... params) throws ClassNotFoundException, SQLException, NoSuchFieldException, IllegalAccessException { + return simpleExecutor.delete(configuration, configuration.getMappedStatementMap().get(statementId), params); + } + + /** + * 为Dao接口生成代理实现类 + * + * @param mapperClass + * @return + */ + @Override + public T getMapper(Class mapperClass) { + // 使用jdk动态代理 为dao接口生成实现类 + Object proxyInstance = Proxy.newProxyInstance(DefaultSqlSession.class.getClassLoader(), new Class[]{mapperClass}, new InvocationHandler() { + /** + * + * @param proxy 当前代理对象的应用 + * @param method 当前被调用方法的引用 + * @param args 传递的参数 + * @return + * @throws Throwable + */ + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + // 底层执行JDBC // 根据不同情况 + // 准备参数 statementId sql 语句的唯一标识 namespaces.id = 接口全限定名.方法名 + String methodName = method.getName(); + String className = method.getDeclaringClass().getName(); + String statementId = className+"."+methodName; + MappedStatement mappedStatement = configuration.getMappedStatementMap().get(statementId); + String sqlType = mappedStatement.getSqlType(); + switch (sqlType) { + case "select": + Type genericReturnType = method.getGenericReturnType(); + // 判断是否进行了 泛型类型参数化 + if (genericReturnType instanceof ParameterizedType) { + return selectList(statementId, args); + } + return selectOne(statementId, args); + case "insert": + return insert(statementId, args); + case "update": + return update(statementId, args); + case "delete": + return delete(statementId, args); + default: + return null; + + } + } + }); + return (T) proxyInstance; + } +} diff --git a/Module1/code/IPersistence/src/main/java/com/lagou/sqlSession/DefaultSqlSessionFactory.java b/Module1/code/IPersistence/src/main/java/com/yang/sqlSession/DefaultSqlSessionFactory.java similarity index 61% rename from Module1/code/IPersistence/src/main/java/com/lagou/sqlSession/DefaultSqlSessionFactory.java rename to Module1/code/IPersistence/src/main/java/com/yang/sqlSession/DefaultSqlSessionFactory.java index 61b0992..2022d5e 100644 --- a/Module1/code/IPersistence/src/main/java/com/lagou/sqlSession/DefaultSqlSessionFactory.java +++ b/Module1/code/IPersistence/src/main/java/com/yang/sqlSession/DefaultSqlSessionFactory.java @@ -1,16 +1,16 @@ -package com.lagou.sqlSession; +package com.yang.sqlSession; -import com.lagou.pojo.Configuration; +import com.yang.pojo.Configuration; public class DefaultSqlSessionFactory implements SqlSessionFactory { private Configuration configuration; - public DefaultSqlSessionFactory(Configuration configuration) { - this.configuration = configuration; + this.configuration = configuration; } - public SqlSession openSqlSession() { + @Override + public SqlSession openSession() { return new DefaultSqlSession(configuration); } } diff --git a/Module1/code/IPersistence/src/main/java/com/yang/sqlSession/Executor.java b/Module1/code/IPersistence/src/main/java/com/yang/sqlSession/Executor.java new file mode 100644 index 0000000..3eac9eb --- /dev/null +++ b/Module1/code/IPersistence/src/main/java/com/yang/sqlSession/Executor.java @@ -0,0 +1,53 @@ +package com.yang.sqlSession; + +import com.yang.pojo.Configuration; +import com.yang.pojo.MappedStatement; + +import java.beans.IntrospectionException; +import java.lang.reflect.InvocationTargetException; +import java.sql.SQLException; +import java.util.List; + +/** + * 开辟原则 + */ +public interface Executor { + /** + * 具体查询方法 + * @param configuration 数据库配置信息 + * @param mappedStatement sql 文件解析结果 + * @param params + * @param + * @return + */ + public List query(Configuration configuration, MappedStatement mappedStatement,Object ... params) throws SQLException, ClassNotFoundException, NoSuchFieldException, IllegalAccessException, IntrospectionException, InstantiationException, InvocationTargetException; + + + /** + * 插入方法 + * @param configuration + * @param mappedStatement + * @param params + * @return + * @throws Exception + */ + Integer insert(Configuration configuration,MappedStatement mappedStatement,Object... params) throws SQLException, IllegalAccessException, NoSuchFieldException, ClassNotFoundException; + + /** + * 更新方法 + * @param configuration + * @param mappedStatement + * @param params + * @return + */ + Integer update(Configuration configuration,MappedStatement mappedStatement,Object... params) throws SQLException, ClassNotFoundException, IllegalAccessException, NoSuchFieldException; + + /** + * 删除方法 + * @param configuration + * @param mappedStatement + * @param params + * @return + */ + Boolean delete(Configuration configuration,MappedStatement mappedStatement,Object... params) throws ClassNotFoundException, SQLException, IllegalAccessException, NoSuchFieldException; +} diff --git a/Module1/code/IPersistence/src/main/java/com/yang/sqlSession/SimpleExecutor.java b/Module1/code/IPersistence/src/main/java/com/yang/sqlSession/SimpleExecutor.java new file mode 100644 index 0000000..2a2a1f1 --- /dev/null +++ b/Module1/code/IPersistence/src/main/java/com/yang/sqlSession/SimpleExecutor.java @@ -0,0 +1,156 @@ +package com.yang.sqlSession; + +import com.yang.config.BoundSql; +import com.yang.pojo.Configuration; +import com.yang.pojo.MappedStatement; +import com.yang.utils.GenericTokenParser; +import com.yang.utils.ParameterMapping; +import com.yang.utils.ParameterMappingTokenHandler; +import java.beans.IntrospectionException; +import java.beans.PropertyDescriptor; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.sql.*; +import java.util.ArrayList; +import java.util.List; +public class SimpleExecutor implements Executor { + /** + * 具体查询方法 + * + * @param configuration 数据库配置信息 + * @param mappedStatement sql 文件解析结果 + * @param params + * @return + */ + @Override + public List query(Configuration configuration, MappedStatement mappedStatement, Object... params) throws SQLException, ClassNotFoundException, NoSuchFieldException, IllegalAccessException, IntrospectionException, InstantiationException, InvocationTargetException { + // 参数 预处理 + PreparedStatement preparedStatement = preparedStatementHandler(configuration, mappedStatement, params); + // 执行sql + ResultSet resultSet = preparedStatement.executeQuery(); + // 封装结果集 + // 返回对象 + Class resultTypeClass = getClassType(mappedStatement.getResultType()); + ArrayList resultList = new ArrayList<>(); + while (resultSet.next()){ + Object resultObject = resultTypeClass.newInstance(); + ResultSetMetaData metaData = resultSet.getMetaData(); + for (int i = 1; i <= metaData.getColumnCount() ; i++) { + String columnName = metaData.getColumnName(i); + Object value = resultSet.getObject(columnName); + // 使用反射 内省 完成封装 + PropertyDescriptor propertyDescriptor = new PropertyDescriptor(columnName, resultTypeClass); + Method writeMethod = propertyDescriptor.getWriteMethod(); + writeMethod.invoke(resultObject,value); + } + resultList.add(resultObject); + } + + return (List) resultList; + } + + /** + * 插入方法 + * + * @param configuration + * @param mappedStatement + * @param params + * @return + * @throws Exception + */ + @Override + public Integer insert(Configuration configuration, MappedStatement mappedStatement, Object... params) throws SQLException, IllegalAccessException, NoSuchFieldException, ClassNotFoundException { + return update(configuration,mappedStatement,params); + } + + /** + * 更新方法 + * + * @param configuration + * @param mappedStatement + * @param params + * @return + */ + @Override + public Integer update(Configuration configuration, MappedStatement mappedStatement, Object... params) throws ClassNotFoundException, SQLException, IllegalAccessException, NoSuchFieldException { + PreparedStatement preparedStatement = preparedStatementHandler(configuration, mappedStatement, params); + return preparedStatement.executeUpdate(); + } + + /** + * 删除方法 + * + * @param configuration + * @param mappedStatement + * @param params + * @return + */ + @Override + public Boolean delete(Configuration configuration, MappedStatement mappedStatement, Object... params) throws ClassNotFoundException, SQLException, IllegalAccessException, NoSuchFieldException { + PreparedStatement preparedStatement = preparedStatementHandler(configuration, mappedStatement, params); + return preparedStatement.execute(); + } + + /** + * 获取查询参数及返回值类型 + * @param parameterType + * @return + */ + private Class getClassType(String parameterType) throws ClassNotFoundException { + if (parameterType != null){ + return Class.forName(parameterType); + } + return null; + } + + /** + * 预处理 + * @param configuration + * @param mappedStatement + * @param params + * @return + * @throws SQLException + */ + private PreparedStatement preparedStatementHandler(Configuration configuration, MappedStatement mappedStatement, Object... params) throws SQLException, ClassNotFoundException, NoSuchFieldException, IllegalAccessException { + // 1. 注册驱动,获取连接 + Connection connection = configuration.getDataSource().getConnection(); + // 2. 获取SQL + String sql = mappedStatement.getSql(); + BoundSql boundSql = getBoundSql(sql); + // 3.获取预处理对象:preparedStatement + PreparedStatement preparedStatement = connection.prepareStatement(boundSql.getSqlText()); + // 4. 获取SQL参数类型 + String parameterType = mappedStatement.getParameterType(); + // 5. 处理参数 + Class parameterTypeClass = getClassType(parameterType); + List parameterMappingList = boundSql.getParameterMappingList(); + for (int i = 0; i < parameterMappingList.size(); i++) { + ParameterMapping parameterMapping = parameterMappingList.get(i); + String content = parameterMapping.getContent(); + //反射 + Field declaredField = parameterTypeClass.getDeclaredField(content); + //暴力访问 + declaredField.setAccessible(true); + Object o = declaredField.get(params[0]); + preparedStatement.setObject(i+1,o); + } + return preparedStatement; + } + + /** + * 完成对#{}的解析工作 + * @param sql + * @return + */ + private BoundSql getBoundSql(String sql) { + // 标记处理类 配合标记解析器完成占位符处理工作 + ParameterMappingTokenHandler parameterMappingTokenHandler = new ParameterMappingTokenHandler(); + GenericTokenParser genericTokenParser = new GenericTokenParser("#{", "}", parameterMappingTokenHandler); + String parseSql = genericTokenParser.parse(sql); + List parameterMappingList = parameterMappingTokenHandler.getParameterMappings(); + BoundSql boundSql = new BoundSql(parseSql,parameterMappingList); + boundSql.setSqlText(parseSql); + return boundSql; + } +} diff --git a/Module1/code/IPersistence/src/main/java/com/yang/sqlSession/SqlSession.java b/Module1/code/IPersistence/src/main/java/com/yang/sqlSession/SqlSession.java new file mode 100644 index 0000000..730ce0b --- /dev/null +++ b/Module1/code/IPersistence/src/main/java/com/yang/sqlSession/SqlSession.java @@ -0,0 +1,63 @@ +package com.yang.sqlSession; + +import java.beans.IntrospectionException; +import java.lang.reflect.InvocationTargetException; +import java.sql.SQLException; +import java.util.List; + +public interface SqlSession { + + /** + * 查询所有 + * @param statementId + * @param params + * @param + * @return + */ + public List selectList(String statementId,Object ... params) throws IllegalAccessException, IntrospectionException, InstantiationException, NoSuchFieldException, SQLException, InvocationTargetException, ClassNotFoundException; + + /** + * 查询单个 + * @param statementId + * @param params + * @param + * @return + */ + public T selectOne(String statementId,Object ... params) throws IllegalAccessException, ClassNotFoundException, IntrospectionException, InstantiationException, SQLException, InvocationTargetException, NoSuchFieldException; + + /** + * 新增 + * @param statementId + * @param params + * @return + * @throws Exception + */ + Integer insert(String statementId,Object... params) throws SQLException, IllegalAccessException, NoSuchFieldException, ClassNotFoundException; + + /** + * 更新方法 + * @param statementId + * @param params + * @return + * @throws Exception + */ + Integer update(String statementId,Object... params) throws ClassNotFoundException, SQLException, NoSuchFieldException, IllegalAccessException; + + /** + * 删除方法 + * @param statementId + * @param params + * @return + * @throws Exception + */ + Boolean delete (String statementId,Object... params) throws ClassNotFoundException, SQLException, NoSuchFieldException, IllegalAccessException; + + /** + * 为Dao接口生成代理实现类 getMapper 实现 + * @param mapperClass + * @param + * @return + */ + T getMapper(Class mapperClass); + +} diff --git a/Module1/code/IPersistence/src/main/java/com/lagou/sqlSession/SqlSessionFactory.java b/Module1/code/IPersistence/src/main/java/com/yang/sqlSession/SqlSessionFactory.java similarity index 36% rename from Module1/code/IPersistence/src/main/java/com/lagou/sqlSession/SqlSessionFactory.java rename to Module1/code/IPersistence/src/main/java/com/yang/sqlSession/SqlSessionFactory.java index b85dc43..b4a6c99 100644 --- a/Module1/code/IPersistence/src/main/java/com/lagou/sqlSession/SqlSessionFactory.java +++ b/Module1/code/IPersistence/src/main/java/com/yang/sqlSession/SqlSessionFactory.java @@ -1,6 +1,6 @@ -package com.lagou.sqlSession; +package com.yang.sqlSession; public interface SqlSessionFactory { - public SqlSession openSqlSession(); + public SqlSession openSession(); } diff --git a/Module1/code/IPersistence/src/main/java/com/lagou/sqlSession/SqlSessionFactoryBulider.java b/Module1/code/IPersistence/src/main/java/com/yang/sqlSession/SqlSessionFactoryBuilder.java similarity index 32% rename from Module1/code/IPersistence/src/main/java/com/lagou/sqlSession/SqlSessionFactoryBulider.java rename to Module1/code/IPersistence/src/main/java/com/yang/sqlSession/SqlSessionFactoryBuilder.java index 31fc36b..0a843a1 100644 --- a/Module1/code/IPersistence/src/main/java/com/lagou/sqlSession/SqlSessionFactoryBulider.java +++ b/Module1/code/IPersistence/src/main/java/com/yang/sqlSession/SqlSessionFactoryBuilder.java @@ -1,24 +1,24 @@ -package com.lagou.sqlSession; +package com.yang.sqlSession; -import com.lagou.config.XMLConfigBuilder; -import com.lagou.pojo.Configuration; +import com.yang.config.XmlConfigBuilder; +import com.yang.pojo.Configuration; import org.dom4j.DocumentException; import java.beans.PropertyVetoException; import java.io.InputStream; /** - * sqlSesson 工厂类 + * */ -public class SqlSessionFactoryBulider { +public class SqlSessionFactoryBuilder { - public SqlSessionFactory build (InputStream in) throws DocumentException, PropertyVetoException { - // 第一 使用dom4j 解析配置文件 并将解析出来的内容封装到Configuration中 - XMLConfigBuilder xmlConfigBuilder = new XMLConfigBuilder(); + public SqlSessionFactory build(InputStream in) throws PropertyVetoException, DocumentException { + // 1.使用dom4j解析配置文件,将文件存储在Configuration中 + XmlConfigBuilder xmlConfigBuilder = new XmlConfigBuilder(); Configuration configuration = xmlConfigBuilder.parseConfig(in); - // 第二 创建sqlSessionFactory对象 工厂类 生产sqlSession: 会话对象 - + // 2.创建SqlSessionFactory对象 return new DefaultSqlSessionFactory(configuration); + } + - } } diff --git a/Module1/code/IPersistence/src/main/java/com/lagou/utils/GenericTokenParser.java b/Module1/code/IPersistence/src/main/java/com/yang/utils/GenericTokenParser.java similarity index 99% rename from Module1/code/IPersistence/src/main/java/com/lagou/utils/GenericTokenParser.java rename to Module1/code/IPersistence/src/main/java/com/yang/utils/GenericTokenParser.java index d92cd5e..1cd4976 100644 --- a/Module1/code/IPersistence/src/main/java/com/lagou/utils/GenericTokenParser.java +++ b/Module1/code/IPersistence/src/main/java/com/yang/utils/GenericTokenParser.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.lagou.utils; +package com.yang.utils; /** * @author Clinton Begin diff --git a/Module1/code/IPersistence/src/main/java/com/lagou/utils/ParameterMapping.java b/Module1/code/IPersistence/src/main/java/com/yang/utils/ParameterMapping.java similarity index 62% rename from Module1/code/IPersistence/src/main/java/com/lagou/utils/ParameterMapping.java rename to Module1/code/IPersistence/src/main/java/com/yang/utils/ParameterMapping.java index 9754ce7..1170d4b 100644 --- a/Module1/code/IPersistence/src/main/java/com/lagou/utils/ParameterMapping.java +++ b/Module1/code/IPersistence/src/main/java/com/yang/utils/ParameterMapping.java @@ -1,4 +1,4 @@ -package com.lagou.utils; +package com.yang.utils; public class ParameterMapping { @@ -15,11 +15,4 @@ public class ParameterMapping { public void setContent(String content) { this.content = content; } - - @Override - public String toString() { - return "ParameterMapping{" + - "content='" + content + '\'' + - '}'; - } } diff --git a/Module1/code/IPersistence/src/main/java/com/lagou/utils/ParameterMappingTokenHandler.java b/Module1/code/IPersistence/src/main/java/com/yang/utils/ParameterMappingTokenHandler.java similarity index 96% rename from Module1/code/IPersistence/src/main/java/com/lagou/utils/ParameterMappingTokenHandler.java rename to Module1/code/IPersistence/src/main/java/com/yang/utils/ParameterMappingTokenHandler.java index 623c4e7..0b03a76 100644 --- a/Module1/code/IPersistence/src/main/java/com/lagou/utils/ParameterMappingTokenHandler.java +++ b/Module1/code/IPersistence/src/main/java/com/yang/utils/ParameterMappingTokenHandler.java @@ -1,9 +1,11 @@ -package com.lagou.utils; +package com.yang.utils; import java.util.ArrayList; import java.util.List; + + public class ParameterMappingTokenHandler implements TokenHandler { private List parameterMappings = new ArrayList(); diff --git a/Module1/code/IPersistence/src/main/java/com/lagou/utils/TokenHandler.java b/Module1/code/IPersistence/src/main/java/com/yang/utils/TokenHandler.java similarity index 96% rename from Module1/code/IPersistence/src/main/java/com/lagou/utils/TokenHandler.java rename to Module1/code/IPersistence/src/main/java/com/yang/utils/TokenHandler.java index 566d90b..ec6d22a 100644 --- a/Module1/code/IPersistence/src/main/java/com/lagou/utils/TokenHandler.java +++ b/Module1/code/IPersistence/src/main/java/com/yang/utils/TokenHandler.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.lagou.utils; +package com.yang.utils; /** * @author Clinton Begin diff --git a/Module1/code/IPersistence/target/IPersistence-1.0-SNAPSHOT.jar b/Module1/code/IPersistence/target/IPersistence-1.0-SNAPSHOT.jar index a205d9e1d194b32d529959fb3ef633d030a5d653..46db9c8e104c6c35d8fda5c995eb57a34a1b5ba7 100644 GIT binary patch literal 16924 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 C!&VRg diff --git a/Module1/code/IPersistence/target/classes/com/lagou/config/BoundSql.class b/Module1/code/IPersistence/target/classes/com/lagou/config/BoundSql.class deleted file mode 100644 index 9f5e80258157312d1a0ad8759d75a3604ee7edc9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1312 zcma)5e{0iF6g@BfWov6^+qJfxTc=LjC3qPQSi^Si!q~3YMO}iQzXQto#$XbWWK z?2&Jh`keakjp`O}f% z9_phBJ*B=g)+a;Vwd6T+CcSsoT%ftaKX&Z5mZ?2;eEW!Gl6JmAyV*X^+8GMes4Xr! ztVL-dbhR3f&N(kwgBr!G=P5_ZmNZgV_3vw+%obOF91p*c0127iw`|Mn3GA(@MXa-3 znegKOaTg}f4IJMc8_zA-)54-l_vL8jaS7Qxa=4twHaY_3U|@rKJaJw9Bud1T)1M(#+6krSh-_ol?9&H-C-snp{%Lux$nLEIrrZ4ZugBl zzx)c|QCx|l1t}TNMNx%R1Y0mDVXvI_b2^G z`%6|fV>*l!D;Q4E^miq+wu3RjEb4dsoT2gkF{8u?M3 zrdEEG5yBHjw!}l(%$hkf?@Fjo+Rmt+v2$(X`T>8FdeNLwD40&laL1UcV;1d_lQ#Di zhg?FC(6}fv33ZdXY`#!jGZp|s2VCz^#;45K#py@0ZOil%p&a$ zupcaOosX&HT3J156&wUg7P)WZEnUf|9or zGR|?!$92#WTx(p&o*kmuDz;*qgf$N$w2A~;iLl&t@@r_{@j=rd2~|vDO2#WHUd3yS zsp~-rr&R36c?k_3sk|bWizwrD6>s288E>h08}F!i7w<_}QH~Mhrs92kpyESZkdP24 z|5tU{>5OAdm`+dDC>B+GBz$~~i=^>*W+Z*o$*Q;{mP)B;I)eQwKJnHC>YuZnjEYZj zQN?HYoJzXxw~FE%v1NRr;!AubVMDog<$F4ht)j@6ReX(ame8JetI5mqH9R~rPQFT5 zT`tTVx$pH`!g|kO#5D3nJ*e^2u<6muAgt*^7ITgQuS3>Qm=?+$2s>YVY zBAk@4DTq}$PZA5*%pkR8e)v~Gv0Rg*)^^A_x-K6d3ibuE`*+#fF{3zOPO@B_yC*q! z^WLIi&WQ)auc(M?xSVk#CD$DGCtUN=cq>!zrieRNW(ggOnE9Y9t%5w}Lx{1IWkILZ@?!SXX+@ZureTOR!G5z)imJ50i=!0!SliD7Kuw?PZP894RDETU9J znUjmp?Og3gH6@^~^*W^1SyY|4j_RKf`q9(e!DlTsfRzYg6_!JT&XwxhU?;ytgzsJ0 zO~3S4)k5uM+`BW2FkRJborc`MZ3c>jf$j0g45C%&49z0OL$x!kg=Vl!LT8OuGlN8{X*3+WdiTaG8tJM@c+kS}mD5-?4b77u z^5oT?yvCE)dh$9?ez^4-LR!r<)^Cq*@L@5Wk4Djy08NLG0yGgV5`V;p5Y?hTV`FD* z7Mo58Ki9FjQ`J;0HjU=1cYl|DUCaO}t__QYgA z#@Lawtl)WCU0{tbv$o%{y5FM>*U*le*n>au7;d2hxA8dsK_~u2x7Up;>`RKDWNp+_ z=rKy&c0?FsJuNyQ({eR!+Ieyd4Ycgy*WGRIcjE~nyGcYsFCzLD^i)WDsVDLLHlD;& z>~B5(#y;v*GmF2-oE~zb8GoRck-|iO2?y~sYKXTF&+t^nA$n}0rLW°CYFXV3Di PhG$9iGs*y0RXF?~@dV=7 diff --git a/Module1/code/IPersistence/target/classes/com/lagou/config/XMLMapperBuilder.class b/Module1/code/IPersistence/target/classes/com/lagou/config/XMLMapperBuilder.class deleted file mode 100644 index 5a1a5cb5fec66b7691e930ee1ab03f9ec2787edf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2308 zcmaJ@+fy556#s25Y%U9waA^aSQcGJdg{@k(0#;itiUwK;Qd;X}Nw#5elMR~z4A zOo!2r85y$?_%SVp*Q0m?b0JJb(SkQacuUNQDCV&c#ZBB2!=j9(5Jp2#L%1x?lQNbg zXcq|Wcv}oBVz@1a)d=q3u8emg=oSjyxEI2^Vty}*_wj)YO~#sp=9HDYZ)A$L<``B^ zLSG_fWmQwlSVc8&ZCL7*_k2P^)1;9zoNE%!4*tLD(29h>l$F*cv?h$4zEI4r>Gra= zW>OMMSSih1(QHHPtHOY@ZWJV(^WavZQ&;B`^IATy+c%1anbvK_5zK3Lfk>wY6C2u= zrW%$ym&+HOq+{z^c0zdf8EN6kJvOymM&+52%g{Jt>xH7}Ebrurpb$yRI*iTT%7smH zS>JXTc2@XICmqevvwDt_eotsFJ8o2U4MNMhSygUNSawEDTiGic>P$t*bDu$$JCBT6 zLMUyeiWOHK9_#6V>?P;x(cLdQLeDWSk_PsCXzkhN&iuf4x=uUcE*8;yrfXK{tO3#ZrDac51pR|g0N}n}EMmrmGG$wdgFo3jzXK;@G z>vS+#$?L02y2e~8&~aZzM!`A^1snK~Jg92rHVP(T%E&6n!IF_zunAfez+|-5@v2cO zC}N8>+)%;|NmB3;wiWD%;ei-F#tQ9cf=7<2a8H(M5KL0+FtCJ{jP5LX z3#W5%$YWkhG8Hw4Z)C0L=qs98WLhs&oqONU&{0on;CMxE5w^Hg>`RzxgD+2WESm+w zpz6nSRk^s+VJRQlx>i_l-znL;%U+XnHyt$)H{uH2gou&>@v4_?BP-#c(tcYA7IbHh zjCUS&7dDh;o-cViM=STY4m6J@N|KwVgx-2t9B!lZz;GJMl3UhvEqa$BiWqv6=t4P$ zHF{K7hjLMGks-&bT#b>}8Fc;l*(oJl^#WF@^59h^-gH+*{D$@O2e6-s$IX?G>j9kS zc!9fF?tPpi!%rX$k35F&H&^E(#});@xW*-Ttuyr~RD!VmaX ztePb}Ma#Gxmt(CJn-G^LD$6jJZIxvtPRJPTqq}IQzm9PwuEawnbaD!p(8VcI!bwii z5>5^O4qplJU362oCmtxFH+GtXu;?wJFRqkv#*f=S|634L_#vp6B@N&=SwRnp=*4ON zT|^({XRt_$?~&vTsmPP!9n$-V1b;&^zN6OnB<@cV_LKw(3Lg+<5hg}4h7c_^s9c3< zzkyoi@bzJkZNikF#ycKnKQ>iHSr mPnaM|fHC~Y_WTNhxJGM*`W4Bml)OesfRgL{-Qe1Xss8}Ohe>t- diff --git a/Module1/code/IPersistence/target/classes/com/lagou/io/Resources.class b/Module1/code/IPersistence/target/classes/com/lagou/io/Resources.class deleted file mode 100644 index 7c3e182a9ae134ccf5b6635b064eb6ebd417403d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 714 zcmZuv*-FDe6g|_%j*YRab>G*vg287+5kU}wiWT3db*PavDal0euhfSMKKKEClz1mv z>z0SPbI-l!E@$%k_WS~18=EFLDp`zU!o(z|IHpa^VAjMO<~bG^GP|ztsy&8uwRXv1 z90pgCA@8`pJc&C^8D5B{M@Y#DTEe>&p{xB*&`{TI#4zc!f{yKpb`aZcV4uq z9JzYHT)$1UrBf{oBg?U9VF}9|D;8F<#xVZ>q#WxOHc;iLS*WAHP#E+(ZQjV1`T;fW zA|+{)bP!XZ@-_Pz?J}6XoYbI|zQGKn1@kB}eqKJ-LH3g<}1_qM5^9Hx@7dIP!E}V3Z|e7nPfpkPP9R>B8n&x&QMM=$KC;& Cbf)A0 diff --git a/Module1/code/IPersistence/target/classes/com/lagou/pojo/Configuration.class b/Module1/code/IPersistence/target/classes/com/lagou/pojo/Configuration.class deleted file mode 100644 index a04dcabede30c978a5f067c211f236f3c2591a39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1194 zcmbVLU60a06g>l_2!eblxajUG_{Cyk<1-sx(2WoHkzh9Qae&$#QrcRkM*o#2ZZ^@x zAK;HN-kH{2+ORL1Ceu5&cg{KY%;Mh?9aOgvP}qaq#`@r0qg z;F3@MD4g32?a7jV=3lJ!C)av$o*yzaS3C&p#Z+=>uWV1g<^e-ZS6h)3u0;tdD@}#t zaT$e#HBNs$jJGcL9BV2=;W@*}++SHPcl^i-{H3ojHaUhPLNpJBC*+7B-#<8JFvk9Z zuxk_H*>9rN%nsl4nM;}G#GiBbn1@2`lcXU}#F}A0OEmVqkHU#UE`{$AN!79CMY{|; z{e#PlsIJqco&NSpCALMdnVz(7jRbzvxtH1875!?FzHOY%Smy<$64*|g_BHr#+)<|b zN@5g4Ii9Q|q3!FoGe z+H;964S12JKSvKC=!oFJP|GJ>vO@N@2#LM9OCY=0OF-Uj3etY$bvv;iT@uv0 aL{RMaKD8cuWs-YU!j4()QFLFM)BOishXZ5) diff --git a/Module1/code/IPersistence/target/classes/com/lagou/pojo/MappedStatement.class b/Module1/code/IPersistence/target/classes/com/lagou/pojo/MappedStatement.class deleted file mode 100644 index 01897a2a586121822d5a937ef027b823287551ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1129 zcmaKq+iuf95QhJCY=;=9DWNULmZnfhg1{;g7aY_ZBqXG8P=k8ENmjv;V;g6K#9M&` zLgIo4;GqyRn@DZUhMSq4^EbQu`_Io`0FH1kKo$En_-L^>U~!wpohlBixGUhqBY|db zB0tF}k?A<<>mp9a&jf-(&E|=I|2bCzVJ-_f)v8#SmD$Hcz<(a6u|5{4v^%E)?u%?h zsf}KosyFlLfRg1PAy2cH4P|mFiXd)pZczN)%61LPSoQdn(>E(q$Q*)x zHZO+iWy}k1m7pK;b%v;8Bg6&NLIf->vItQV*!%y^0-I;=@pdp#LyZdZg%T-gLW%eRLSh9=qS25_H=-4FX1l!&+u7`f{b0a1 zpB$fka~z#<@L8BqI<+(6v;T+4U*UM}X6fEG)$!vYo7|J%`JLZ6_nfo8{_)e#08ZoM z3`TJ#jRQE#@k$0soXOxE&Sz0UmE%=una|MQuVrxo7dc)Z!a@dFT$1M+N1fvhjyD;G z4aZ(HJAteFreiZqH4Ud*w)Bn@lzYy)Q(jR2uQ2SdnzrfBGfWr$9y)uKA+_MF3Wfts z(-y6uyCU4SzG9JOtmzoKbyaswd5(-J|GMchsJz|{OB0?)(#n^_njTobwrwFX8BbWk z@SCRRGn_3n*Y%q^iMKmt&38?^Q@N&?7FX5@Tbb>f0^hXC(vfJgp0E3&D{Q~9Dzy#J zP})7+)w`tb;2x9=Bc9pqS)z7J7=iD&49At?C`o8LU^0W+EkpEV?LCeL$6Fk4b2K?F zbF?@X8Pb~Bv2{OisccKt+IdA?l+pZuOT5~yRpv=Tx?jXan*yBsS5#r8BM}VT2@6a$ z8XYY0#Lf%9-FtlLUzI*ijx4&w`-ksr!%A2H0t;S`Yr$S#qn6Z!6(qkT65 z;ofF2)I~U`siJI{y&CTy?!J*&Y=4cWJo6Kp7ph8w(pE)BJ5^R|ywKP~JErNCGYYB- zeG+o0=xvpx--j?x&j~u!$)2F^OmPFOSo#r(dvr?RNqUYDRz6e2k|v&~=rqws<7rIN ziTpxVhEL^05ngiIHMfZjy%q0ZcnjI(vD^lRAIv2;F_M6kmJG`<7P`z(fD=^60tqZC67$;< p^V<^hkwi`70AdIdkUm{qyk!;1oq2No=IBgo1`m9SLk{*w(P4VV5Co39sXHBcF$k z@EGPF{m|hZ!=^Yj%Qy-{kHAj^0rHr zd_!2=ZE@d`cv4iu2Pa@KXMBT4w`m6fMKiDL4v*ZhIjz*W6$<~EGG)ZT_TmP^LAmm` zNlYS{-V~8<*>y)ID$esi>G3CSK*yeeWuzDm;}cpGPfAu8j{nD=Y=$8xm!k{ty5>#0 zXItUC1>>zuwTW`2g%aI#5)2xBicCzeK%qIMq0t~zC#=w4uMWYgNAFNxN1QZ`8G0We zjY|9!DKdl#V>YtL5hC5lm66*j@)OT9(lP28pGe$Q-=GYkz7SR*U1c8WE!~VUZ{o(V IHe#*+0v{2nLjV8( diff --git a/Module1/code/IPersistence/target/classes/com/lagou/sqlSession/Executor.class b/Module1/code/IPersistence/target/classes/com/lagou/sqlSession/Executor.class deleted file mode 100644 index 03a2b5577dc93229eb62bd8a146db80c65344553..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 685 zcmcJN%}N6?7)5WYHdd|H{~u6vrw9&iol=m}f>0|m-MNY}9jC-(oFt`g1YgUA58y+I z>4YYlCGQ`vZvalQL$OS;LNN2_MD|3$4?A2x1d_$t1*snBps7_qiCxBQ zqE+~N_mZWlxQi^a;z1}I-gE|R$ozQ~2UoWP!EJc-RdP0wK_@XbB$#WBxJbuBL$OM+ zMzKz@L9t1(MX^m#iIP|`>oP&`TyLHI)i(Y=X}#A98{@cS{cZ@sdS3E$5M6hET0yWsL7S2p)77@Eow_R^dlRIqBggOC ziI7F0;JA=d#7v%Z?n4zE2f5=`FlB-ZWixG3|4u%2fhlT~u}s+{{{RK#coHQOed!h6 zHq<=ldMt~D{h`YQ1SS9F05bi8DNOs-j9=A2QTAgN70h8C3#j^P35%Xz%4fAtUDVZ} diff --git a/Module1/code/IPersistence/target/classes/com/lagou/sqlSession/SimpleExecutor.class b/Module1/code/IPersistence/target/classes/com/lagou/sqlSession/SimpleExecutor.class deleted file mode 100644 index 6e22fbf83ebd7bf0e95e4645c42094d273f1a811..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5211 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 diff --git a/Module1/code/IPersistence/target/classes/com/lagou/utils/ParameterMapping.class b/Module1/code/IPersistence/target/classes/com/lagou/utils/ParameterMapping.class deleted file mode 100644 index d8bf2a172091eddee120ed4147f59ca86f61dc21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 871 zcmah{O>fgc5Pj<;c4FMt4K;;Opy>xmgTUep^gyIu2p>{Wr5-oVDs1K0m9yr8`k#sf zsRR-~fFFgJwVkwbkhsk3%+9=dZ+3tG`SALT}`BFww9Wr>`L@1HG<>%-5XnQPF ze@hRO(S173mYlV@~S>wSZ9NrxQH%#uz9@;^=KmPpQxN(q1vp?2$x8ab2~Fw?gg0{>SdDN4U+8z$-9}9 Gdw&7tfvoNT diff --git a/Module1/code/IPersistence/target/classes/com/lagou/utils/ParameterMappingTokenHandler.class b/Module1/code/IPersistence/target/classes/com/lagou/utils/ParameterMappingTokenHandler.class deleted file mode 100644 index e25dd16e540479d60868c1cc57adb6a33c03e2b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1505 zcma)+eNWR+6vm(1Z7q8N#u!6oDxl(Ca23U&8JRI8#+Xe>MrQE8yR8|;(k@+R!ne{y zvnYulzz=0Sw=Jv`lJQ4xZ%^<2-SeF1w15Bo{sUkOuM$Y2sGyX9gkl^CloK>;Ch-K7 z8K?@LCNP671bSFp{nFyJ;n(HzZg^1(ni`$L9wd4UzwV@B48biFL_f77M zY>i<%^m@0^wN6xn_pOn;XQ=Lnn6)|~`eG+%2wQWP-8&teJGc{GexuU`GSRX|c2|3=i|$wp%MBV{5niRR zfDFUpq=(%w%qV(TbqM2aQdgQQ7cZOTI?X%t!ORUY5 zejr*Zj}iL?S;D7`@{OVrCbU_~X3nMMyd6G`_Tmm!h$jh;d~TDt5h5hdFmp)Qcyluh z%pgv3M0%^<(hFeH2gV6`5BFZsqD_^B2AtxqMon=;|6a;q`~Uy| diff --git a/Module1/code/IPersistence/target/classes/com/lagou/utils/TokenHandler.class b/Module1/code/IPersistence/target/classes/com/lagou/utils/TokenHandler.class deleted file mode 100644 index bbaed793147fc8f37848515391b50ed8e39bfa1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 184 zcmX^0Z`VEs1_nb0PId-%b_Nbc2JVc+yp){Oko@e_JVpjJ4WF#UvPAuy#JqI<;F6-u zymV_#Od&=FuHgLAqU2P!%$!t420^fH53oT+dLRQB8Dx_4bAiUB=a=f2mSpA>>m#dS oWDr1Dkuh5!Hn diff --git a/Module1/code/IPersistence/target/classes/com/yang/config/BoundSql.class b/Module1/code/IPersistence/target/classes/com/yang/config/BoundSql.class new file mode 100644 index 0000000000000000000000000000000000000000..4acb44fc1e20066a277926b20d06849c82b93060 GIT binary patch literal 1681 zcma)6X-^YT6g|_OT5Ks$7Ew?@N@*FD#ih^$NQ@t0a z@K~%*gjkDUU91~IY=-ePjAs(UjnmqJ`q`3@EFLSL6uGA8Rk>uDnqJLI7^^F$a-v$Q z`C6&hsViy?+9n*^rlr+np`qnaNvrCL)ihNJYo6n+V%a#6&qQS5(vbH(QS${x2yJP) zW)&nXru(UQBIcJ5B?R`23en<4O;_JEPmWacKsl;WlPnr#rFN*8n)r8>0qdjIkTBil zQa1DtT2+xgZ1DcvMV!8%%1EuuL^A4@Oy=SrJKkInc1Y!PUJ zfxLxu+LLTY?QPITpYkS*2}3S}VMbkIT@*oU)2qD+jBt!thBJ4}zhpGcviedJ-5hQ= zXjKeo3@JR9FlrC0jl5%;%9%(!h9pK~NMMAly~DiQ)M^#gCFxeSr&j|5mbaCGv9jj$t7Jph~7vlX<^@@btpmz2RflHS&Ig{S& zpONnIm2eJZ{(5`d=kpNf+u`HKLfJc34ZQ01ew>d3?*S%wK1t0N`1t|TnF~mnOZeVj zz<-WFX5}2gOqRPJJoRIWGKC=J2m(ZivlnBGJ4HE7?VJ+@cQC_0#vE?EilSm2qLNWe>Eb^sA4n?+K2h$T13KGzPRo=Q4|=1FMb z8bVIbx-|>gHEVYsyt~G24ku$51zPkw91oQJy7LA$^yT?dy<)if%4M*{`bG-du#W_Yd`-2 zpbg)K(Trgk2g4}Ca0qwfkc`K|2x3?~9*^KKo>1^)1l7=G#KVYSID!O{5g0fk9wRbF z6|@NnQ^95-F(%_^7@i#GD!%TNP_e~Ko9I1H58u0XAZ7WEw&zSM zX*hHg$>>hj@VOG&ntR6daa}WQZC5&za|d0=&{Lf)1xqE-2GV-U1LG-MA}VT{=@B{z zj_X#Am$G3QDI@JlsOhnt5iMz_+QzgUK9h3cl%B~LPQUJsGEm3J+Bqj-Y|9S1L?EHA zBrplp6Dh0L)6BVsae5>|VOP9;W}LPHzhpd~hD z*0VWE2n%0+%7ka(YhEWzW@fu#RS^gwx}_+<+4OIvwaP(PPaI{Qye{$@_jwsFa6DwZ z$k~zc66bs++2$27)2<(fbV~!h6m!)U3DozO-ALBIJeJmMI>~ky?XT(v- zWerD6iHc9WbB6NAZ6~SXQ=C@u89t|wruh{mIXeI{zEJTczLL-|m%73<&+BTD;;&Vl z#W$se=Z!v_w=k@G;$ucaOs2=0Km6P=g=EbRgoLU>w*CH#78tu+gL}?)SneBD=ema= zJ(akjr?XnVWRpXNYZr+GxPOwIi<|AG8||}`t40iWpm<#Cnp;XVJ&Tt$EC$}k<;rPo z%sVOGUo8uUht?HyF1&i$y)kUc$fJ6;&zN9JxxWu`U!=W5?X0}#!q2+EtGnEm@tkW6 z`Ma{|=17Xcc>%bynUm07Le0lltd)m6A3}sFD;TQE8g6%?uQ}5tEQ{|_n1Z|gMrY7G z>|>kfVdWc~i$z!~T5>Vp*o2lnW@&|sPGL|iM*p+OE*!{z1X!D>DCxp)LQ5%Be!%m4 zm^p4}zU4Pe_zrrXLJ3RrW*69K8Nv$wU^Mf`L*gf&yNXm9X)ZQC*YdO-<)nb>)(enY zXHYhL0p&j;@PjA0j?XGe080?SQY=CY8c(XPgY~$FCkY#{k#=dXOs8}uS<(!GG*z*B z3Ucq7X($r<)<#3q2$!KFFoOs$)sA2+FpWwH9Tl;PX;ewvG#do9NW!nE?vP`0bn!Hz zR8dIQ_+%&+j483u6l(XMyMA#7bu?8kEX0D*B~w^Bg_uX*=F!VM`gV_A?$LL6^qsBe z5r|bxpQG~9EHZ_r zbJu?ptnZna07L>0GkL&DCan=QXu@)qq=`k@!GiR&B!^fIg9RC70*_JSS*G{|Q+tZZ zJbRy$;B zE~DNi-dsj4wLAHjc!m5exSz-_5s{D!iPGiEDyXfLlX(9(9>9YvaSi^$Hp-PVia*&r zU5v2_zoVO;f<%83JMj=Ih_@FH^H#<##$HcNUw${`{kz?~dxUrE5xC9}WEnj&dS&#< o*dwD~#-lO@fU9V~hP^TdJ>I}oBHBx>3R>KUA!6IlQyC8Y2S$kjApigX literal 0 HcmV?d00001 diff --git a/Module1/code/IPersistence/target/classes/com/yang/config/XmlMapperBuilder.class b/Module1/code/IPersistence/target/classes/com/yang/config/XmlMapperBuilder.class new file mode 100644 index 0000000000000000000000000000000000000000..37ad3afffde74899bdc0b18656ba88a82449ddc9 GIT binary patch literal 2561 zcmaJ@S$7mg6#i;vGCfNtz+{183p-f|&8A|AD1^o6FhCLmL{U34ozS6Ydg$q4bwv?T zR9q1seDFnIJ?d~qjvgO;@_3H?27iVR;#b|XC4eUyVCOEe!9oWWFkJ6_iNs{_`25AajYkXSp7; zOHRf(V9L06&JX2g86FiIaZbg0Y@mk?z8KT7J;z54ogr6o9v5gx#YJ2aSgUD8a-4Br z(KIt(G#n|E3R%X8LY7Caq2d+1O0QJBhS%wuiZ}44ipzLQU{S+L^>r%V#uXLs;Hrvu zaaF-J74P9H>tSv=%nP=P_i z&3?ibv94;QxvYEVWiZhrX8i?S#J&Gz)KO09#k6srtnnF>Y*~44(NWX)O!&k~e|48l zWUAyE6S`GmLT`AuC(X|B0etB=p~oFFComVj-k20BrI{0RqUxU#!L?KNIl~#&W#elp z8tw@B?tG8~?0&60A8l%L3%Ncrx6_5W#eTsO^##A*Evu*8{q3LT=;6E);F1MZ5NXC~rg$$6l@ua2?$?rn*Z&g&-+MZJ9NYNS1{NWN1fpn1KUZD8Ha1~^ zE8g=^S;^Q8jc3FZfAdBw&+gtq@WgF|`palJw5fuyKzbmdR1gVZFq8~c5EU3~Nw!oF z6S#$Mq!btU4eDSx8BVlT&_+##;sRfcP+aJX(PX%SMZ6!ALPDU7_QCiabkJhwpqf;Z zN*P_8B4sS*6fI*3r&t+DPVq99_Wg)J8O!cqIj^i3NUZdL%jiz5;vlbgm$5pjRo>^z zO>*=#QT`;Kf00MY>O~?Q#1(A8RwzWch;5W2#IdoRQj}=Z{Asn7d^?!LBb4GqK8i>2 z81D`dc_$u6m{@n~vAK&u>|$h8{7#K07@c!yg8d2(C^)F#X$2#|KlqLeNG=4P<$sED0Ehkqzju<@ literal 0 HcmV?d00001 diff --git a/Module1/code/IPersistence/target/classes/com/yang/io/Resources.class b/Module1/code/IPersistence/target/classes/com/yang/io/Resources.class new file mode 100644 index 0000000000000000000000000000000000000000..c2df80d4643c1dde6cf72812dd38e1fb08b85810 GIT binary patch literal 570 zcmZuuO;5r=5Pb`ULahZsMEs05;9xJ@FeZk?#H7(g4ELpMpr*8>T}=E}dcnklKfoVl zoGmmEbPuyLZ{C}a-S3~zF902!8_1!mW8Xjx2L|dm)X`wbUwMHiuNkt<)__6lg(JaG za=bv?&!s_>=hjp6S!tX2 zQc+Fhp)=I}9ZbiOiDR7TI5lwwi=n(O|1f+OuB0beLp`6zw5CPNB(4+kk%$-?&DGe+ zCL1XlytXAzHPx*bQG4P78TuV{GN3PkPPRaiO*f-E*Zu%|PtrxQ`2;M$Am3aPutOeD n#4apCl(>@=1B^;$foyvL?Tye3ancIrMg;>Ulqtiom#`|omx6%r literal 0 HcmV?d00001 diff --git a/Module1/code/IPersistence/target/classes/com/yang/pojo/Configuration.class b/Module1/code/IPersistence/target/classes/com/yang/pojo/Configuration.class new file mode 100644 index 0000000000000000000000000000000000000000..80faa4840a162d5fc339eee654af4abd79d20448 GIT binary patch literal 1189 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 AKmY&$ literal 0 HcmV?d00001 diff --git a/Module1/code/IPersistence/target/classes/com/yang/sqlSession/DefaultSqlSessionFactory.class b/Module1/code/IPersistence/target/classes/com/yang/sqlSession/DefaultSqlSessionFactory.class new file mode 100644 index 0000000000000000000000000000000000000000..8bd476d97cf5ed84ddb5417ba39086124d7712ab GIT binary patch literal 678 zcma)4OHaZ;7@RGYN+}Of@kyd4CV+-sj2Dd;3@4%o42j337Az@U?8AhArHO__6Muj| z%J?lb;6aRseayErv$K!SueT2XCn)JiVm*Z=6g6z*Q zTuBnWB_iLl8;%T9TI5~p^G9w#$F6~8q!D#;`hJ Gt$hPeprtAR literal 0 HcmV?d00001 diff --git a/Module1/code/IPersistence/target/classes/com/yang/sqlSession/Executor.class b/Module1/code/IPersistence/target/classes/com/yang/sqlSession/Executor.class new file mode 100644 index 0000000000000000000000000000000000000000..439771d3c6f0709812185ef4c034de23506a0979 GIT binary patch literal 985 zcmcJO&rTFU5XQg8WgAuzRPZk%+%P82#gjuwle^pae{rmRkF97fGO5(A^6M^N+n*5D`+8=9ok=!U-B$b=E zt}Q>tlPse4mLGNcKON W^UEf}{)c$f;TzrNhQMa4xb+9+tSGwx literal 0 HcmV?d00001 diff --git a/Module1/code/IPersistence/target/classes/com/yang/sqlSession/SimpleExecutor.class b/Module1/code/IPersistence/target/classes/com/yang/sqlSession/SimpleExecutor.class new file mode 100644 index 0000000000000000000000000000000000000000..c69f0bd9da6f4283225d3542b09ae909102c5d74 GIT binary patch literal 6560 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 Ul;9}OGiUF5x*@1bV$`iq11S*aS^xk5 literal 0 HcmV?d00001 diff --git a/Module1/code/IPersistence/target/classes/com/yang/sqlSession/SqlSession.class b/Module1/code/IPersistence/target/classes/com/yang/sqlSession/SqlSession.class new file mode 100644 index 0000000000000000000000000000000000000000..5bd76cce94be479e2c737d1864c4d8f490a87240 GIT binary patch literal 1123 zcmbtT%Wl*#6g@5_Az`59QQizKr4khq5fT!j8I5>oMyfQlqREbxn=xrBV~5zOV99T> z-~;$5#EqwIQdpptMI`6=_?&aEuYdmf{sX{stogX-<32-ZgcO;b6vi^Vcs$wX2RxEo z3@VvQ;Omh%7}^@x^em( zo63q@RE^okTqGDL<=6Wl+F-MnrvKP<(-3xbm zKxGf(bys|t=(@_pxR8{1A^9v5VGIq%(`K|7`kDR|eQgHJ9B)M}i(#=H!P%WKEVt06 zlp^Qyb(WFp@z61>ILa=SY9eZ3rA$c|7+Dw@m>F0=ECyB}$;7}002{|Px&QzG literal 0 HcmV?d00001 diff --git a/Module1/code/IPersistence/target/classes/com/yang/sqlSession/SqlSessionFactoryBuilder.class b/Module1/code/IPersistence/target/classes/com/yang/sqlSession/SqlSessionFactoryBuilder.class new file mode 100644 index 0000000000000000000000000000000000000000..d4987c10716fbb1399cd0c45bc2bd44af5314aef GIT binary patch literal 973 zcma)4+invv5IxRqOPcgX%dG^`a!X37U-DMe2U;p2g@TkSqL0qT4UTr#!RtlMU%?BJ zsKf{GQHb#-N-Np`ei)Bu<{XdD_~)_*zmCF;SodO zrHYi@W60L(ZHC;w?n;Kmri$cI5_Y6H7M*}1D^2Z-pe>AY=SeVUKdP8vr|IjE4@K1D z@u#3A<5=m4x2Eo)@U1q(SBVO`((E$iJI-a;t2O)Lv*1eeH_;%mEo-C*ckBPhM?@JF zF|1un!mxA}2KzcXRlUj044W6sewyJQ{-`0+@;H?kVd)(Vl?%{7_cb4LPSR9ge0}E2 zfvb%@JofN}LM@#bUmhwaU1gRMJMQr%+(40`I+bunVr zlV2JaU;&GCqThpMB5~jzvdGbX`y82*5wdT$pMOK{=p6Zz7b6tDP%1-k5Hw46nL1b@ se>J7u8bc?vL_)cnL_bH@tYVFj3)JT=if3_$&;^Rz#XYK6PkHbE2BjnAdm*6cCZI9F*X_x6;W6H z16_2NO+_mr7Tr*(5T#XFwo=z!SC#q$x^L5@=ZzsCj3U8(@7?$Ax#zxf=lQocKOO++ zz~fT*aKnppXqTo#nwzEQ#H|wCmSdMR-5PpI;l&MUdZp=;?tVGDBhB41+{1u|K@CF! z-rTyGoyk2lvjV=vs_~f-%NW_^*tBh>v&%gKrO8Y#Zyuh|R*Y;aV_E_i6Up3K?3p~e zVW%_sm~&#Ru+1<}Z#tW{`vrzV#i(a^-iH>R6;KCrDN~>_k3w6}sm4)iSVI$q<-zIPhLto&(z5pR#r0g566&~s5gi|(T8Cen8l2ZKtYZ{o0?-l1 zxQ>sIAjE0O4>{?$j|piebv(dB9aEUrF@r}MW_8TrlECFtniZ1~s5*w9TwFDiypR*F zLX+{{LQ-NaogZFXx1TxdCvu%lnVXYK0ySqS6A$zL%k13XiecTeEQ4WcDC}IlvCf{R zLiM5f!Faq_!sBa?o&o&6^PY^EUA9*ohD`6J!ihtV8j8yzO6=TGRn?(lC@NTc>e^0z zIIO7fg*i@K<`?ecx9_5*n4I~fp3X=~IVup;Izam&R~fEVj@6Nu5RsNWD3NP>a7Chf zP``Ih*V5L&Ov5@&S^0*T zC4k7b{DRV!eYl^)KJ>X@VN(8Sr@Dhb0-j${d4%KHfj8h`riyo= z3_KYjskrQFR!?ZU89;TJ5s8A<&ZlM{s>FGi{x;g8`2>P&qeysAh zAcp~bjv;(O@0WZco?{Fz_(Xh%ar}$~e&;LjCnoSWAA;y`A%xjo?V^YEh2dd^U}Y6$%4<}Kw`@>N!!-?2q2W6JWBda;tK6^ADE>t} Qc;O$^m&;VG3{=qeKh*}9bpQYW literal 0 HcmV?d00001 diff --git a/Module1/code/IPersistence/target/classes/com/yang/utils/ParameterMapping.class b/Module1/code/IPersistence/target/classes/com/yang/utils/ParameterMapping.class new file mode 100644 index 0000000000000000000000000000000000000000..69e425cd8361ff6f98c2068ad34a2945ec5570d1 GIT binary patch literal 585 zcmah_O;5r=6r3%km9_FEpf|$}FtHbJ8ZIQ9>PLd%zSIpaDJ>~m6aSSa8WRux0DqM6 zwM8UwFq`bYc{@8Z`@X(EJ^`HLn8UtsHW@tv3i)Tw)sFM_d%Rf<-)xOech{bQFE==R6eY1Qhbnb%ZY!RppL1a2 z$UzYn!^uAp7^;8sxS7nPPctfXx?{9yekRS6!APa3Do|}>kMzS%1Et@%1YCvlhIwV_X^{gid@dhnocI;N6FUuLZH3`kw@P-kjUd)Kh_wz<%N*-JZgOlU literal 0 HcmV?d00001 diff --git a/Module1/code/IPersistence/target/classes/com/yang/utils/ParameterMappingTokenHandler.class b/Module1/code/IPersistence/target/classes/com/yang/utils/ParameterMappingTokenHandler.class new file mode 100644 index 0000000000000000000000000000000000000000..4a4616a3a256025c93dce95fbaac5f56caab09b4 GIT binary patch literal 1496 zcma)+X>Zd&5Qg7%4(Fmtb3rLR!clUxHPEJjQUxI-gir#NQU#T7o5V_85+`yTr2H$8 zKowNt2k@g1v$k8iZl&~tch|E!&(1qD_TPWM{{Yy<%NXJ)$tcGlp%g_7l^6}1acp5b z0!7A?7$SHo zH8IHDk#4HGDT1*w;q_q1b*9>&=NHLPy_P>OH#|?N0YaF z)houE6)iit_Ku9B)V)HKG=I5rv+;TL_WZ|ha=9SJTBE7aRo`l&F$#XM-ePZyIwi1( zG(*Pi-q(h~XQG7@xP^rT?qNknHGw@mXJD@w*5;H)AYU+4<{a~eLIri3=40nX?NTEx z`v8|67TkzMu=I`aUXL2h+fX*CR{HF-pEq(F1^U$EU`Ws-3B5EY>AxT$g%GVNIW%U- zQb&MRK&pHSRz8Dtbc(=F1ixFSvowky2oOb(RykS;CY?tfw`pd$gC&Rco><~+y8Hvd za^)1EUkFS1l$O7dRf0=PQZy-xmbX0|8u{WbmWd~c0y*3!aRWq%pCNKY*l2Up56n`4 zISaUMAH4v^9blA@t5~CvVVx2rS@IQn6LLZ#WEUE?j7uK9AqQw@@jmT8z(WUeK(o*t pE?1n)1w2|;DC4Uht>KH%!cJu#k*}RqVM!6&zGZ_}k7-Xr@juONT~`1A literal 0 HcmV?d00001 diff --git a/Module1/code/IPersistence/target/classes/com/yang/utils/TokenHandler.class b/Module1/code/IPersistence/target/classes/com/yang/utils/TokenHandler.class new file mode 100644 index 0000000000000000000000000000000000000000..ab679dfc60d9b9b7407c8204750434cb4f15470b GIT binary patch literal 183 zcmX^0Z`VEs1_l!bPId-%b_Nbc2JVc+yp){Oko@e_JVpjJ4WF#UvPAuy#JqI<;F6-u zymV_#Od&=FuHgLAqU2P!%$!t420^fH53oT+dLRQB8Kjf*bM-4h#*~(1<`nBAD`8|1 mK-l7+l$DxX!p6wJ$iM`28Uq6(3nK$F0}F`7zzQUp7}x;HRWTm` literal 0 HcmV?d00001 diff --git a/Module1/code/IPersistence/target/maven-archiver/pom.properties b/Module1/code/IPersistence/target/maven-archiver/pom.properties index 71861a1..25fccfb 100644 --- a/Module1/code/IPersistence/target/maven-archiver/pom.properties +++ b/Module1/code/IPersistence/target/maven-archiver/pom.properties @@ -1,5 +1,5 @@ #Generated by Maven -#Sun Mar 07 16:22:39 CST 2021 +#Tue May 18 23:05:58 CST 2021 version=1.0-SNAPSHOT -groupId=com.lagou +groupId=com.yang artifactId=IPersistence diff --git a/Module1/code/IPersistence/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/Module1/code/IPersistence/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst index 9ddf5c0..a5e38f9 100644 --- a/Module1/code/IPersistence/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +++ b/Module1/code/IPersistence/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -1,17 +1 @@ -com\lagou\utils\TokenHandler.class -com\lagou\sqlSession\Executor.class -com\lagou\config\XMLConfigBuilder.class -com\lagou\io\Resources.class -com\lagou\sqlSession\SqlSessionFactory.class -com\lagou\config\BoundSql.class -com\lagou\sqlSession\SimpleExecutor.class -com\lagou\sqlSession\SqlSessionFactoryBulider.class -com\lagou\utils\GenericTokenParser.class -com\lagou\config\XMLMapperBuilder.class -com\lagou\pojo\MappedStatement.class -com\lagou\sqlSession\SqlSession.class -com\lagou\pojo\Configuration.class -com\lagou\utils\ParameterMapping.class -com\lagou\sqlSession\DefaultSqlSessionFactory.class -com\lagou\sqlSession\DefaultSqlSession.class -com\lagou\utils\ParameterMappingTokenHandler.class +com\yang\io\Resources.class diff --git a/Module1/code/IPersistence/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/Module1/code/IPersistence/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst index d271295..c7cc8ad 100644 --- a/Module1/code/IPersistence/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ b/Module1/code/IPersistence/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -1,17 +1,17 @@ -D:\StudyWorkspaces\Module1\code\IPersistence\src\main\java\com\lagou\pojo\MappedStatement.java -D:\StudyWorkspaces\Module1\code\IPersistence\src\main\java\com\lagou\sqlSession\SimpleExecutor.java -D:\StudyWorkspaces\Module1\code\IPersistence\src\main\java\com\lagou\utils\ParameterMappingTokenHandler.java -D:\StudyWorkspaces\Module1\code\IPersistence\src\main\java\com\lagou\utils\TokenHandler.java -D:\StudyWorkspaces\Module1\code\IPersistence\src\main\java\com\lagou\sqlSession\SqlSession.java -D:\StudyWorkspaces\Module1\code\IPersistence\src\main\java\com\lagou\utils\GenericTokenParser.java -D:\StudyWorkspaces\Module1\code\IPersistence\src\main\java\com\lagou\utils\ParameterMapping.java -D:\StudyWorkspaces\Module1\code\IPersistence\src\main\java\com\lagou\pojo\Configuration.java -D:\StudyWorkspaces\Module1\code\IPersistence\src\main\java\com\lagou\config\XMLMapperBuilder.java -D:\StudyWorkspaces\Module1\code\IPersistence\src\main\java\com\lagou\sqlSession\SqlSessionFactory.java -D:\StudyWorkspaces\Module1\code\IPersistence\src\main\java\com\lagou\io\Resources.java -D:\StudyWorkspaces\Module1\code\IPersistence\src\main\java\com\lagou\config\XMLConfigBuilder.java -D:\StudyWorkspaces\Module1\code\IPersistence\src\main\java\com\lagou\sqlSession\DefaultSqlSessionFactory.java -D:\StudyWorkspaces\Module1\code\IPersistence\src\main\java\com\lagou\sqlSession\DefaultSqlSession.java -D:\StudyWorkspaces\Module1\code\IPersistence\src\main\java\com\lagou\sqlSession\SqlSessionFactoryBulider.java -D:\StudyWorkspaces\Module1\code\IPersistence\src\main\java\com\lagou\sqlSession\Executor.java -D:\StudyWorkspaces\Module1\code\IPersistence\src\main\java\com\lagou\config\BoundSql.java +D:\StudyWorkspaces\Module1\code\IPersistence\src\main\java\com\yang\sqlSession\SqlSession.java +D:\StudyWorkspaces\Module1\code\IPersistence\src\main\java\com\yang\sqlSession\SqlSessionFactory.java +D:\StudyWorkspaces\Module1\code\IPersistence\src\main\java\com\yang\sqlSession\DefaultSqlSession.java +D:\StudyWorkspaces\Module1\code\IPersistence\src\main\java\com\yang\config\BoundSql.java +D:\StudyWorkspaces\Module1\code\IPersistence\src\main\java\com\yang\pojo\Configuration.java +D:\StudyWorkspaces\Module1\code\IPersistence\src\main\java\com\yang\io\Resources.java +D:\StudyWorkspaces\Module1\code\IPersistence\src\main\java\com\yang\sqlSession\SimpleExecutor.java +D:\StudyWorkspaces\Module1\code\IPersistence\src\main\java\com\yang\sqlSession\SqlSessionFactoryBuilder.java +D:\StudyWorkspaces\Module1\code\IPersistence\src\main\java\com\yang\sqlSession\DefaultSqlSessionFactory.java +D:\StudyWorkspaces\Module1\code\IPersistence\src\main\java\com\yang\config\XmlMapperBuilder.java +D:\StudyWorkspaces\Module1\code\IPersistence\src\main\java\com\yang\utils\ParameterMapping.java +D:\StudyWorkspaces\Module1\code\IPersistence\src\main\java\com\yang\utils\GenericTokenParser.java +D:\StudyWorkspaces\Module1\code\IPersistence\src\main\java\com\yang\config\XmlConfigBuilder.java +D:\StudyWorkspaces\Module1\code\IPersistence\src\main\java\com\yang\utils\TokenHandler.java +D:\StudyWorkspaces\Module1\code\IPersistence\src\main\java\com\yang\pojo\MappedStatement.java +D:\StudyWorkspaces\Module1\code\IPersistence\src\main\java\com\yang\sqlSession\Executor.java +D:\StudyWorkspaces\Module1\code\IPersistence\src\main\java\com\yang\utils\ParameterMappingTokenHandler.java diff --git a/Module1/code/IPersistence_test/.gitignore b/Module1/code/IPersistence_test/.gitignore deleted file mode 100644 index 314079b..0000000 --- a/Module1/code/IPersistence_test/.gitignore +++ /dev/null @@ -1,26 +0,0 @@ -/target/ -!.mvn/wrapper/maven-wrapper.jar - -### STS ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans -.sts4-cache - -### IntelliJ IDEA ### -.idea -*.iws -*.iml -*.ipr - -### NetBeans ### -/nbproject/private/ -/build/ -/nbbuild/ -/dist/ -/nbdist/ -/.nb-gradle/ -.gitignore diff --git a/Module1/code/IPersistence_test/.idea/compiler.xml b/Module1/code/IPersistence_test/.idea/compiler.xml index 7a13c43..98f46d7 100644 --- a/Module1/code/IPersistence_test/.idea/compiler.xml +++ b/Module1/code/IPersistence_test/.idea/compiler.xml @@ -6,12 +6,9 @@ + - - - - \ No newline at end of file diff --git a/Module1/code/IPersistence_test/.idea/misc.xml b/Module1/code/IPersistence_test/.idea/misc.xml index 3c6f639..f71dfb9 100644 --- a/Module1/code/IPersistence_test/.idea/misc.xml +++ b/Module1/code/IPersistence_test/.idea/misc.xml @@ -1,5 +1,6 @@ + - + + + \ No newline at end of file diff --git a/Module1/code/IPersistence_test/.idea/workspace.xml b/Module1/code/IPersistence_test/.idea/workspace.xml index e4a2d1e..2963ae9 100644 --- a/Module1/code/IPersistence_test/.idea/workspace.xml +++ b/Module1/code/IPersistence_test/.idea/workspace.xml @@ -1,18 +1,124 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + @@ -25,7 +131,7 @@ - + @@ -35,34 +141,100 @@ - - - + - + - + + + + + - - + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + - + + + + + @@ -79,65 +255,106 @@ - - 1615212268686 + + 1620659904257 - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + + - - - + + + + - - - + + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + + - - - + + + - + \ No newline at end of file diff --git a/Module1/code/IPersistence_test/IPersistence_test.iml b/Module1/code/IPersistence_test/IPersistence_test.iml deleted file mode 100644 index c889830..0000000 --- a/Module1/code/IPersistence_test/IPersistence_test.iml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Module1/code/IPersistence_test/pom.xml b/Module1/code/IPersistence_test/pom.xml index dfb52c7..06e83a3 100644 --- a/Module1/code/IPersistence_test/pom.xml +++ b/Module1/code/IPersistence_test/pom.xml @@ -4,18 +4,24 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.lagou + com.yang IPersistence_test - pom 1.0-SNAPSHOT - + + UTF-8 + UTF-8 + 1.8 + 1.8 + 1.8 + + + - com.lagou + com.yang IPersistence 1.0-SNAPSHOT - diff --git a/Module1/code/IPersistence_test/src/main/java/com/lagou/test/IPersistenceTest.java b/Module1/code/IPersistence_test/src/main/java/com/lagou/test/IPersistenceTest.java deleted file mode 100644 index 033645c..0000000 --- a/Module1/code/IPersistence_test/src/main/java/com/lagou/test/IPersistenceTest.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.lagou.test; - - - -import com.lagou.io.Resources; -import com.lagou.pojo.User; -import com.lagou.sqlSession.SqlSession; -import com.lagou.sqlSession.SqlSessionFactory; -import com.lagou.sqlSession.SqlSessionFactoryBulider; -import org.dom4j.DocumentException; -import org.junit.Test; - -import java.beans.IntrospectionException; -import java.beans.PropertyVetoException; -import java.io.InputStream; -import java.lang.reflect.InvocationTargetException; -import java.sql.SQLException; - -public class IPersistenceTest { - @Test - public void test() throws PropertyVetoException, DocumentException, SQLException, IllegalAccessException, IntrospectionException, InstantiationException, NoSuchFieldException, InvocationTargetException, ClassNotFoundException { - // 1. 获取配置信息 - InputStream resourceSteam = Resources.getResourceAsSteam("sqlMapConfig.xml"); - System.out.println(resourceSteam); - SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBulider().build(resourceSteam); - SqlSession sqlSession = sqlSessionFactory.openSqlSession(); - User user = new User(); - User result = sqlSession.selectOne("user.selectList", user); - System.out.println(result); - } -} diff --git a/Module1/code/IPersistence_test/src/main/java/com/yang/dao/IUserDao.java b/Module1/code/IPersistence_test/src/main/java/com/yang/dao/IUserDao.java new file mode 100644 index 0000000..fa832ed --- /dev/null +++ b/Module1/code/IPersistence_test/src/main/java/com/yang/dao/IUserDao.java @@ -0,0 +1,31 @@ +package com.yang.dao; + +import com.yang.pojo.User; + +import java.util.List; + +public interface IUserDao { + + /** + * 查询所有 + * @return + */ + public List findAll(); + + /** + * 按条件查询 + * @param user + * @return + */ + public User findByCondition(User user); + + // 新增 + Integer insert(User user); + + // 修改 + Integer update(User user); + + // 删除 + Boolean delete(User user); + +} diff --git a/Module1/code/IPersistence_test/src/main/java/com/yang/pojo/User.java b/Module1/code/IPersistence_test/src/main/java/com/yang/pojo/User.java new file mode 100644 index 0000000..21b1bad --- /dev/null +++ b/Module1/code/IPersistence_test/src/main/java/com/yang/pojo/User.java @@ -0,0 +1,54 @@ +package com.yang.pojo; + +public class User { + + private Integer id; + + private String username; + + private String password; + + private String birthday; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getBirthday() { + return birthday; + } + + public void setBirthday(String birthday) { + this.birthday = birthday; + } + + @Override + public String toString() { + return "User{" + + "id=" + id + + ", username='" + username + '\'' + + ", password='" + password + '\'' + + ", birthday='" + birthday + '\'' + + '}'; + } +} diff --git a/Module1/code/IPersistence_test/src/main/java/com/yang/test/IPersistenceTest.java b/Module1/code/IPersistence_test/src/main/java/com/yang/test/IPersistenceTest.java new file mode 100644 index 0000000..5e457b4 --- /dev/null +++ b/Module1/code/IPersistence_test/src/main/java/com/yang/test/IPersistenceTest.java @@ -0,0 +1,92 @@ +package com.yang.test; + +import com.yang.dao.IUserDao; +import com.yang.io.Resources; +import com.yang.pojo.User; +import com.yang.sqlSession.SqlSession; +import com.yang.sqlSession.SqlSessionFactory; +import com.yang.sqlSession.SqlSessionFactoryBuilder; +import org.dom4j.DocumentException; +import org.junit.Before; +import org.junit.Test; +import java.beans.PropertyVetoException; +import java.io.InputStream; +import java.util.List; + +/** + * 自定义持久层框架测试类 + */ +public class IPersistenceTest { + + private IUserDao userDao; + + @Before + public void beforeTest() throws PropertyVetoException, DocumentException { + InputStream resourceAsSteam = Resources.getResourceAsSteam("sqlMapperConfig.xml"); + SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsSteam); + SqlSession sqlSession = sqlSessionFactory.openSession(); + userDao = sqlSession.getMapper(IUserDao.class); + } + + /** + * 测试查询所有 + */ + @Test + public void testFindAll() { + List userList = (List) userDao.findAll(); + System.out.println(userList); + } + + /** + * 测试查询一个 + */ + @Test + public void testFindOne() { + User user = new User(); + user.setId(1); + user.setUsername("lucy"); + User resultUser = userDao.findByCondition(user); + System.out.println(resultUser); + } + + /** + * 测试查询一个 + */ + @Test + public void testInsert() { + User user = new User(); + user.setId(4); + user.setUsername("lucy"); + user.setPassword("345"); + user.setBirthday("2021-08-15"); + Integer insert = userDao.insert(user); + System.out.println(insert); + } + + /** + * 测试查询一个 + */ + @Test + public void testUpdate() { + User user = new User(); + user.setId(4); + user.setUsername("lucy 2222"); + Integer update = userDao.update(user); + System.out.println(update); + } + + /** + * 测试delete + */ + @Test + public void testDelete() { + User user = new User(); + user.setId(4); + Boolean delete = userDao.delete(user); + System.out.println(delete); + } + + + + +} diff --git a/Module1/code/IPersistence_test/src/main/resources/UserMapper.xml b/Module1/code/IPersistence_test/src/main/resources/UserMapper.xml index 50cb6ea..cccf065 100644 --- a/Module1/code/IPersistence_test/src/main/resources/UserMapper.xml +++ b/Module1/code/IPersistence_test/src/main/resources/UserMapper.xml @@ -1,9 +1,27 @@ - - - select * from user - select * from user where id = #{id} and username = #{username} + + + + insert into user (id,username,password,birthday) values (#{id},#{username},#{password},#{birthday}); + + + + + update user set username = #{username} where id = #{id} + + + + + delete from user where id = #{id} + + diff --git a/Module1/code/IPersistence_test/src/main/resources/jdbc.properties b/Module1/code/IPersistence_test/src/main/resources/jdbc.properties new file mode 100644 index 0000000..bc7c0bd --- /dev/null +++ b/Module1/code/IPersistence_test/src/main/resources/jdbc.properties @@ -0,0 +1,4 @@ +jdbc.driver = com.mysql.cj.jdbc.Driver +jdbc.url = jdbc:mysql://117.50.15.23:3306/study?useUnicode=true&characterEncoding=utf-8&useSSL=false +jdbc.username = yang +jdbc.password = yang_stuty diff --git a/Module1/code/IPersistence_test/src/main/resources/sqlMapConfig.xml b/Module1/code/IPersistence_test/src/main/resources/sqlMapConfig.xml deleted file mode 100644 index c2e1ff5..0000000 --- a/Module1/code/IPersistence_test/src/main/resources/sqlMapConfig.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - diff --git a/Module1/code/IPersistence_test/src/main/resources/sqlMapperConfig.xml b/Module1/code/IPersistence_test/src/main/resources/sqlMapperConfig.xml new file mode 100644 index 0000000..b8beb02 --- /dev/null +++ b/Module1/code/IPersistence_test/src/main/resources/sqlMapperConfig.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/Module1/code/IPersistence_test/target/classes/UserMapper.xml b/Module1/code/IPersistence_test/target/classes/UserMapper.xml new file mode 100644 index 0000000..cccf065 --- /dev/null +++ b/Module1/code/IPersistence_test/target/classes/UserMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + insert into user (id,username,password,birthday) values (#{id},#{username},#{password},#{birthday}); + + + + + update user set username = #{username} where id = #{id} + + + + + delete from user where id = #{id} + + + diff --git a/Module1/code/IPersistence_test/target/classes/com/yang/dao/IUserDao.class b/Module1/code/IPersistence_test/target/classes/com/yang/dao/IUserDao.class new file mode 100644 index 0000000000000000000000000000000000000000..50aa86062e708544adaa1b3e600043c79fd220fc GIT binary patch literal 422 zcmah_%}N6?7@V)RyS7?e3%F->tyNFR+;SJo0{SzgrgS&B9oD+;p-bHZ?CDknqRXhQZ& za8Z>0No=L7#M;+h+;4OL zt~ixV?OMseJrkv^j)(u<3-7I#j@_e`Z<|uz8q3DD0OJs&4i7%@5M$O5jymP!1O0<=TL1t6 literal 0 HcmV?d00001 diff --git a/Module1/code/IPersistence_test/target/classes/com/yang/pojo/User.class b/Module1/code/IPersistence_test/target/classes/com/yang/pojo/User.class new file mode 100644 index 0000000000000000000000000000000000000000..917874632ef3b0538bb33eb0186080ac66f69196 GIT binary patch literal 1586 zcmZ{j>rN9<5Xb*#+ijP!LMgN;AaawIa#``NP}Gu`kPtCJN&L8NH)ToLZMIttF}{-~ zS`tls03XUYv)jvd-F}%lXU?3N-^`rz=kL$o0CrJMVG28ANJC?BkHs#F`$;@VA%PtQ z4_QBA@mRqV)=w2YQ}CRZdr9mkQ4)~Mn!xn&h5k|38oE{2jx5)x8_u49(ry`!rC%BX znSjHo>zG!Z&zpLy^~rW9fKo9X_q?WG2_*JS%XAL}Vug(}f%u_aqX3h~re(ZoUsep~ zonC2pA?>Q(IMW@I_g!P$JvUndGsji?QoCZDrhQ>+?+Jtw%5}p%qHNj1Mu2AkEVumg zTp{9^Va6!{$MTDs84A-cYn-ACoU*}KU7ud4xBdG0PGCoA%Ke7$*+>K^G71oxKY9PKpHg0x(` zhWO^W&67-c#uyf8t@;kQjYZlC+`$sb;mhA4eGOfnh`hXvmG0#OB9u5)aq|bHLF$xe z%|NCqIDO9d>ZWHju8*l#u@(Um3xnh$LGEHb3M3W=nIn+-5g^=P2FXW)#KRzqksyU= zka!qmg+NwEfbfJFWFrzp4uh;mf)t}cf4pNzMe;p&0&Uc_@Zuo|H-!S1DI3)h$XaVf!CA C=n7c? literal 0 HcmV?d00001 diff --git a/Module1/code/IPersistence_test/target/classes/com/yang/test/IPersistenceTest.class b/Module1/code/IPersistence_test/target/classes/com/yang/test/IPersistenceTest.class new file mode 100644 index 0000000000000000000000000000000000000000..1388e5079bf6d407e6208c67f1b5182603060d20 GIT binary patch literal 2987 zcmai0Ygg1(6x|sf8HQA05G;qq@3pl1bt)OZkv{@44rmv(G+{;otxM`WwJ0{F1^!TuCCA!c|<8 zkx!u+SHx$&9oMlSW3e6Y;zk<|pwNyamfEn4l@xB`JsG!B*d?^z#|L8fVGxP6kgJYn&#IP$z4@Y5&TgvadbXrm+1#>!F)pEX zLN|4HQbN-}W<^5tj8)Pk?9S_^cD-6&)$Ap8)u1Guw~DHY@i2}Mwt!itQ?VV`d)*P#97quy;;A(1FLU(>cy{Be%LNhB>x8T|o z^I4~J*C=R?qg&>jT68UYQ^N7cTXdT()GG?7(ftb`BXR7R(7*Jcs8w7#b7XAD_*6pg zjjHMDWo<=wbjCepnwG128XhI~dUm5q{<70vc(lsagJ&g=7U?!q! zxWXI{0(s8lo@iV3VAJJ8F+}O)Ojlc{=RkM4Qc_*|Xsret&%&%`Xr8nbY~mKCEz8hU zQ&=c?6)>lZ;_9xim=mHL6db}~30+LryjrPf_Kan&>FXyRlnoh%f-+1A!(m}J%xX|I z(^cIlX|@6j6&ZIG*kIjuhi~IeA;VQr#XSXYpkKj#Jdm-e;4?gw@wtL8@Fi0pz6|pr z<0}PUEhQzIwOj+~<8C!ui>Pb9R7 zC;g-RQ!tGu3TE-MgoB|gk)IvC#TxKh$4k({>V{Ti_WC{1Dw%e&i?&7T+|3ouwZi(A z&?gF~WR=fsWM{2nwXB(L>^5SCEqNp8Rx*}e*WB7MY~IX3tVYl zLc(P5rcNOf)#=O9$@)1O((*Dz_9LS=gApR(@W87)&~(IjL(@zYS@0{8IO4(27^>sc zVvl8nM&-5IOh^-hm!J43h$XSG$;ru?*ko0i%4jk!lGtc6c6la9UrbCd6`^FXFS_Hn z{JIzy1HLn=mY|*a>Yi#;wS_fKq=8%juCC!*9L>!!Z#{9dwRs@ywo^gO5mPOThK{S% zN`hLu1q;)gY~+$Irl^F$fhgr+FOkA9y^+v&vPg>WTQ;!>m(#lK-YKd4Szr}5c+)tV zSL@aW6-Uqk{*nU{5@H^3Cv(ri#P1QFvRoyuErU-X{l-lKZ}Qvf3A=EVd&O74F&yVf z!T=vPd5<4)ZKf=fPCP?X{yCa&Jw?mV7Fy?rw;@ZoJ~)z2Zlf)Me~|nWsmMVOTKKS+ zj`ksqKJNC@@Bz=^pl>vA*h*I!4AOBLdohGzLhMBcMsR}ev$WDm$w~gxGV1LmoaQRw z3}Gfbn76qmC`%9ifz&qICFFmHLYS`!JWXD}ySRe86cKdNvk1J$e-+?J@n4fMyhY1z z^G=ZBOU`mv^L&ms63&O7AJT%bn|Y31q-J-1sQDQ>w$M40PH&-0;2GM+o&@FzXgC1m zXJ8-00)tF4%npXx!w?TK$N@SN;QD>T0k|aZ#xX(XhxpI15jfjC^-&l zDBZn}>?_FdYHs_&ra6;{-Ut9A2QCNy5HJ{@;lK9Sebu1VBY-7pYSZ zbSeb8lf4k=zKFfPM&Nw*F4M&og3A%yRWfsp?B!#iG9joqd(#a-&4i%t2J9WFXD{Gt qe<^KUJ1-| + + + + + + + + + + + diff --git a/Module1/code/design_pattern/pom.xml b/Module1/code/design_pattern/pom.xml new file mode 100644 index 0000000..7cb2abc --- /dev/null +++ b/Module1/code/design_pattern/pom.xml @@ -0,0 +1,12 @@ + + + 4.0.0 + + com.yang + design_pattern + 1.0-SNAPSHOT + + + diff --git a/Module1/code/design_pattern/src/main/java/com/yang/constructor/Computer.java b/Module1/code/design_pattern/src/main/java/com/yang/constructor/Computer.java new file mode 100644 index 0000000..8a2dca5 --- /dev/null +++ b/Module1/code/design_pattern/src/main/java/com/yang/constructor/Computer.java @@ -0,0 +1,73 @@ +package com.yang.constructor; + +import java.io.Serializable; + +/** + * 电脑 + */ +public class Computer implements Serializable { + + private static final long serialVersionUID = 1316314459157322662L; + + /** + * 显示器 + */ + private String disPlayer; + + /** + * 主机 + */ + private String mainUnit; + + /** + * 鼠标 + */ + private String mouse; + + /** + * 键盘 + */ + private String keyboard; + + public String getDisPlayer() { + return disPlayer; + } + + public void setDisPlayer(String disPlayer) { + this.disPlayer = disPlayer; + } + + public String getMainUnit() { + return mainUnit; + } + + public void setMainUnit(String mainUnit) { + this.mainUnit = mainUnit; + } + + public String getMouse() { + return mouse; + } + + public void setMouse(String mouse) { + this.mouse = mouse; + } + + public String getKeyboard() { + return keyboard; + } + + public void setKeyboard(String keyboard) { + this.keyboard = keyboard; + } + + @Override + public String toString() { + return "Computer{" + + "disPlayer='" + disPlayer + '\'' + + ", mainUnit='" + mainUnit + '\'' + + ", mouse='" + mouse + '\'' + + ", keyboard='" + keyboard + '\'' + + '}'; + } +} diff --git a/Module1/code/design_pattern/src/main/java/com/yang/constructor/ComputerBuilder.java b/Module1/code/design_pattern/src/main/java/com/yang/constructor/ComputerBuilder.java new file mode 100644 index 0000000..d831115 --- /dev/null +++ b/Module1/code/design_pattern/src/main/java/com/yang/constructor/ComputerBuilder.java @@ -0,0 +1,44 @@ +package com.yang.constructor; + +/** + * 构建电脑 + */ +public class ComputerBuilder { + Computer computer = new Computer(); + + /** + * 安装显示器 + * @param disPlayer + */ + public void installDisPlayer(String disPlayer){ + computer.setDisPlayer(disPlayer); + } + + /** + * 安装主机 + * @param disPlayer + */ + public void installMainUnit(String mainUnit){ + computer.setMainUnit(mainUnit); + } + + /** + * 安装鼠标 + * @param mouse + */ + public void installMouse(String mouse){ + computer.setMouse(mouse); + } + + /** + * 安装键盘 + * @param keyboard + */ + public void installKeyboard(String keyboard){ + computer.setKeyboard(keyboard); + } + + public Computer getComputer() { + return computer; + } +} diff --git a/Module1/code/design_pattern/src/main/java/com/yang/constructor/ConstructorTest.java b/Module1/code/design_pattern/src/main/java/com/yang/constructor/ConstructorTest.java new file mode 100644 index 0000000..838ab9b --- /dev/null +++ b/Module1/code/design_pattern/src/main/java/com/yang/constructor/ConstructorTest.java @@ -0,0 +1,16 @@ +package com.yang.constructor; + +public class ConstructorTest { + + public static void main(String[] args) { + ComputerBuilder computerBuilder = new ComputerBuilder(); + computerBuilder.installDisPlayer("显示器"); + computerBuilder.installMainUnit("主机"); + computerBuilder.installMouse("鼠标"); + computerBuilder.installKeyboard("键盘"); + + Computer computer = computerBuilder.getComputer(); + System.out.println("@@@@@@@@@@@@@@@@@@@@@@"); + System.out.println(computer); + } +} diff --git a/Module1/code/design_pattern/src/main/java/com/yang/dynamicproxy/Bob.java b/Module1/code/design_pattern/src/main/java/com/yang/dynamicproxy/Bob.java new file mode 100644 index 0000000..a7d6210 --- /dev/null +++ b/Module1/code/design_pattern/src/main/java/com/yang/dynamicproxy/Bob.java @@ -0,0 +1,7 @@ +package com.yang.dynamicproxy; + +public class Bob implements Person { + public void doSomething() { + System.out.println("bob: 卧室嫩叠!!!"); + } +} diff --git a/Module1/code/design_pattern/src/main/java/com/yang/dynamicproxy/JDKDynamicProxy.java b/Module1/code/design_pattern/src/main/java/com/yang/dynamicproxy/JDKDynamicProxy.java new file mode 100644 index 0000000..932f656 --- /dev/null +++ b/Module1/code/design_pattern/src/main/java/com/yang/dynamicproxy/JDKDynamicProxy.java @@ -0,0 +1,39 @@ +package com.yang.dynamicproxy; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; + + +/** + * JDK动态代理 + * 需实现 InvocationHandler 接口 + */ + +public class JDKDynamicProxy implements InvocationHandler { + + //被代理的对象 + Person target; + // 代理对象构造函数 + public JDKDynamicProxy(Person target) { + this.target = target; + } + //获取代理对象 + public Person getTarget() { + return (Person) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); + + } + + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + //被代理方法前执行 + System.out.println("沃实嫩蝶"); + //执行被代理的方法 + Person result = (Person) method.invoke(target, args); + //被代理方法后执行 + System.out.println("沃实嫩亲蝶"); + return result; + + } + + +} diff --git a/Module1/code/design_pattern/src/main/java/com/yang/dynamicproxy/JDKDynamicTest.java b/Module1/code/design_pattern/src/main/java/com/yang/dynamicproxy/JDKDynamicTest.java new file mode 100644 index 0000000..fc8c542 --- /dev/null +++ b/Module1/code/design_pattern/src/main/java/com/yang/dynamicproxy/JDKDynamicTest.java @@ -0,0 +1,17 @@ +package com.yang.dynamicproxy; + +public class JDKDynamicTest { + + public static void main(String[] args) { + System.out.println("不使用代理类,调用doSomething方法。"); +//不使用代理类 + Person person = new Bob(); +// 调用 doSomething 方法 + person.doSomething(); + System.out.println("分割线-----------"); + System.out.println("使用代理类,调用doSomething方法。"); +//获取代理类 + Person proxyPerson = new JDKDynamicProxy(new Bob()).getTarget(); +// 调用 doSomething 方法 proxyPerson.doSomething(); + } +} diff --git a/Module1/code/design_pattern/src/main/java/com/yang/dynamicproxy/Person.java b/Module1/code/design_pattern/src/main/java/com/yang/dynamicproxy/Person.java new file mode 100644 index 0000000..b4bb08b --- /dev/null +++ b/Module1/code/design_pattern/src/main/java/com/yang/dynamicproxy/Person.java @@ -0,0 +1,5 @@ +package com.yang.dynamicproxy; + +public interface Person { + void doSomething(); +} diff --git a/Module1/code/design_pattern/src/main/java/com/yang/simpleFactory/Computer.java b/Module1/code/design_pattern/src/main/java/com/yang/simpleFactory/Computer.java new file mode 100644 index 0000000..22347de --- /dev/null +++ b/Module1/code/design_pattern/src/main/java/com/yang/simpleFactory/Computer.java @@ -0,0 +1,10 @@ +package com.yang.simpleFactory; + +/** + * 抽象的父类 + */ +public abstract class Computer { + + public abstract void start(); + +} diff --git a/Module1/code/design_pattern/src/main/java/com/yang/simpleFactory/ComputerFactory.java b/Module1/code/design_pattern/src/main/java/com/yang/simpleFactory/ComputerFactory.java new file mode 100644 index 0000000..ea8fd55 --- /dev/null +++ b/Module1/code/design_pattern/src/main/java/com/yang/simpleFactory/ComputerFactory.java @@ -0,0 +1,17 @@ +package com.yang.simpleFactory; + + +public class ComputerFactory { + + public static Computer createComputer(String type){ + Computer computer = null; + if ("lenovo".equals(type)) { + computer = new LenovoComputer(); + + computer = new HpComputer(); + } else if ("hp".equals(type)) { + computer = new HpComputer(); + } + return computer; + } +} diff --git a/Module1/code/design_pattern/src/main/java/com/yang/simpleFactory/HpComputer.java b/Module1/code/design_pattern/src/main/java/com/yang/simpleFactory/HpComputer.java new file mode 100644 index 0000000..4ea69b6 --- /dev/null +++ b/Module1/code/design_pattern/src/main/java/com/yang/simpleFactory/HpComputer.java @@ -0,0 +1,7 @@ +package com.yang.simpleFactory; + +public class HpComputer extends Computer { + public void start() { + System.out.println("惠普电脑启动"); + } +} diff --git a/Module1/code/design_pattern/src/main/java/com/yang/simpleFactory/LenovoComputer.java b/Module1/code/design_pattern/src/main/java/com/yang/simpleFactory/LenovoComputer.java new file mode 100644 index 0000000..5b65290 --- /dev/null +++ b/Module1/code/design_pattern/src/main/java/com/yang/simpleFactory/LenovoComputer.java @@ -0,0 +1,7 @@ +package com.yang.simpleFactory; + +public class LenovoComputer extends Computer { + public void start() { + System.out.println("联想电脑启动"); + } +} diff --git a/Module1/code/design_pattern/src/main/java/com/yang/simpleFactory/SimpleFactoryTest.java b/Module1/code/design_pattern/src/main/java/com/yang/simpleFactory/SimpleFactoryTest.java new file mode 100644 index 0000000..cb7dc6c --- /dev/null +++ b/Module1/code/design_pattern/src/main/java/com/yang/simpleFactory/SimpleFactoryTest.java @@ -0,0 +1,8 @@ +package com.yang.simpleFactory; + +public class SimpleFactoryTest { + public static void main(String[] args) { + Computer computer = ComputerFactory.createComputer("hp"); + computer.start(); + } +} diff --git a/Module1/code/design_pattern/target/classes/com/yang/constructor/Computer.class b/Module1/code/design_pattern/target/classes/com/yang/constructor/Computer.class new file mode 100644 index 0000000000000000000000000000000000000000..5ae0ce4056cb18a96a02f596ad204a333f79421c GIT binary patch literal 1601 zcmaKrTTc^F5Xb+g*QG2{YY|isP@oqs3o0l=t5Ra3)=R=AF+OeE4KB93WV>sE20xC^ znkXci_-KqD$~d#zi)Z3qkO>e%atB0B;kSg!1Z&jtP8hgr?ZRy6|nt;?$bz{fSZGmXRbebBu z-e`vvQ?+UWv2~rUiUQ$mZdV{uGHVntSk?{gnbW9f*0x%ylP6U+t3;&|8`&*q#D1+e z1;)!&v!NXFt5v47oT_bFO37>-IJRaHgS@BNn_bRyHWx%HH%~9tBAv1K||RePv&!PIaMe}Q`{V-#aDhA|@J5{t_$ zu3$u9*x&OFN3Yj-9O?Ea-gjnH$jG>l2P`(IEprp?;S@47N-`Ok&vexu66efgN?`22 zZKl=fl02{MYgL+f+I8usvgK}-{?40bOg%Wz3>yD@P>*}s-l~WOIhrl?j;?);Nm}4aOdu;~ zfbfJFWHt~a>IYd31eps4iTXhb1X4T$gjb9~=x;=lcjN<&PmtdJj@Zi+#8c8S`tr0d tq>`CqBvSpJBiwPwo+Hw640w)c+mSq?ykng6*R}CaUE7^~U2qpu`3nK85orJb literal 0 HcmV?d00001 diff --git a/Module1/code/design_pattern/target/classes/com/yang/constructor/ComputerBuilder.class b/Module1/code/design_pattern/target/classes/com/yang/constructor/ComputerBuilder.class new file mode 100644 index 0000000000000000000000000000000000000000..ab2c866c3f9078f579b01ae391cee7b3b3df7e86 GIT binary patch literal 1108 zcmaKq+iuf95QhIvoH%hz8vf?;(a z1Mw!E3`O*w4}IEc4MLCmCp?mBtv8M2lZ+X<%d0$3r9To86>CcBf&2ao8Nc)SRCU?@{tuxRHS0B(!3P?F=AO)5J3kE5n3}IlvVWfQN=%0# zk4BX9dG0pGBFTke==A!_r=oGJ<1mdp@lq;*Zsxgq+MRG;v1}(2BrB<0F>L8Z`9eP?8Jvl}n^+dKx zK8-+jl~#u+&(5088JKf{(#JEDf5P}qXC*Yrs)wku44Al1o}I;`g&VXYmC)9#XB4So z>&_1td%sXwgsh-OMHOT%3)B!wp`CTYFx)D{RTptbB7=FHO(5@6V%ZC2~y5V3zMM2Ra;6^-gD9Mn-c+`z%mUJuWT9aLY7oZ0i zJ>b9tk4*HS7%*Ib*P$ccgz^2lAS<;2<5CzogtDp zs`^8>Qq=8rt!R=)$y+7O+|X=;%PnQdd1llY#_}brqSm!)SuI)Bnq#{q$FkMj$$MR| zIT^}c(Tpm?Q0i%ZOM9-VCJ!k%woxr-e00q&Q@+6tW~zxmwp~ZJv#w!o>h?cy+x!Su zJPu_T?pA9vhMc8><=Q3vzQNm${nf-YuUp0-Vho8cUALh#gd01DNALE(zkV;{7UpT> z-##BS-tNn|?Mpwt>^62^$hgy#UVS)vvm+yec^M11D_~K^5|(Ld%N;)f_he+bcNV$s zMg3k2Uj;+-Wd4teTY8DB4D!)TbH%8wnOdC>IG*afr%20nmDc%~&WAxh)>v+h-%m?? zpx29*W^Xd|m31fAS|Gz{YW%-@_@l%^z2@i@x>3s|ta!61!&2AiavZuJU8~UI2K}De z)eOQmcQWbh+PZ0WO;?9eoTC4Ue*sVu#E8a8Qi(I-JrjFiAAR!>(OzE}#A$lVO$VI8 zS(3syhx4T2!7nLUkoepI0#Ei3%%_!*hn}?3>p@5>qK9x=kv#OJJ;Cgn$8}F&{+22tg;&k15j5BH|Y_(gef>T%;J0Y?m-h-*yqz%@>CjB%V{nqfvrZ*6PC9btTau_lOxdoqM+Xd6n`21E1! literal 0 HcmV?d00001 diff --git a/Module1/code/design_pattern/target/classes/com/yang/simpleFactory/ComputerFactory.class b/Module1/code/design_pattern/target/classes/com/yang/simpleFactory/ComputerFactory.class new file mode 100644 index 0000000000000000000000000000000000000000..e03e4c84a733fb542a3039e65e9fd6ed786ca511 GIT binary patch literal 780 zcma)4%TD7!5Ue&PPMj={kg&k=3eN;2EDn3hYA;A=4;Fg>AuYFw86`%JZH$AI10TW{ zaD@wzK;i@VC`6AF3lJdIhi-RGb#?XFk56|G0JgDa!o*A#KTOPG&cM709Ww?NOk@fVnd*KgKq zU+J-s9(TjU*1K*(mhB{S36=klGWUZ{yP`4yV;JY0LlF~QOFUDP&iF?5N^d+7gq7`E?`;cVDfC>68)vwVteUUQQMHE13NM}w;@yUMY2p0NVf bd4R>^m4V6r5R_0(`YcAivjxIbQcphv4zs+$ literal 0 HcmV?d00001 diff --git a/Module1/code/design_pattern/target/classes/com/yang/simpleFactory/HpComputer.class b/Module1/code/design_pattern/target/classes/com/yang/simpleFactory/HpComputer.class new file mode 100644 index 0000000000000000000000000000000000000000..85da1a38cd3f8170a0c743398a1541cf77731a26 GIT binary patch literal 548 zcmah`yG{Z@6g|Uh*%bvrd@CU~VByBf0%Jo$EQm3|&=0u5G5a99vnJG9S!rTpXKAI; zL`^LG0RIE@D~xwR!9wE{bLXCO?zwknUO%2+0IVaYA%;m6X=LJ<(vZcpf*A#~46#jN z3%SJ*E)?qwk+QRIFeIzOHg{xAI8g7Xp>PhZO2Ce4!ZqulUz&1IOtR3k3=eq-$`C?veQgW>DIJ$h4`hFen^YN`hOZVjX!z=@Wt#0?84lU8PK?$S6iv zpTO?=v_^ZZ4~8*D=fprjahx)SiDB_Z-waUi5lV+25g8e1M3E~=V?RvPp-Gb15K^B6 CuYTSD literal 0 HcmV?d00001 diff --git a/Module1/code/design_pattern/target/classes/com/yang/simpleFactory/LenovoComputer.class b/Module1/code/design_pattern/target/classes/com/yang/simpleFactory/LenovoComputer.class new file mode 100644 index 0000000000000000000000000000000000000000..3b4dc836e6d3cc8cb7fbaee620a49a250712ade7 GIT binary patch literal 560 zcma)3J4*vW5dJo=%boF+7~c;p#KgkG$|7PTSREon(ywvRmAl(;*%MNVR#po65q6@Y zf`vc8{}Iiv5a$w&3JPv9v-8b2-^}bjzdb$ySiziy6oyS?kxOI5LLQ?A#te)zq}HS_ z^*TemP^>T{Hq@SA7<8mBwnA@L1Ur1!B_!*pDt9Y9kWu^rCiH=in6$VwYDI@9JPulV!KjIk}NE?{QU=mZ* zy?xw#Ik|mp-nCCJTIW}-vr7Zh8O&goVc}oh8Rq`rea^=)6t%Y9XpwTGu7yX>qC%QC z?{qR!+1r8iby)|3d$dpP7ns4QMI_g!xb-AP+yQynmlKDuYR1oHh9F%0yIS36>Wd4pIsevibLfJG@%C2H!Mh}jbvq-+dB E@6{WF{r~^~ literal 0 HcmV?d00001 diff --git a/Module1/code/design_pattern/target/classes/com/yang/simpleFactory/SimpleFactoryTest.class b/Module1/code/design_pattern/target/classes/com/yang/simpleFactory/SimpleFactoryTest.class new file mode 100644 index 0000000000000000000000000000000000000000..b8ca42fc6fac37ea0f209ccf16202f95fc179d60 GIT binary patch literal 705 zcma)4%T5A85UgHc7Z(IY#rFeE3~J)WgC~s_6TEEn0O8_kSSL6HcF8c9_*q`mc<=-K zC}R&|G*P2-n4YSBRCi}yUZ0);9AL|bi*gq8J{GX(V+qS1Ry?c{++!6hb3#Z}cbbIs zX>uhA#ZblaeAsJA-4LxVGo>(zM7JrlvUp6U&9xd3cEc#?1-Bw@2LsjXcV$gPCegP+ z{VQt7fjMG@o=`ENT)hlC;zk5rn^rek#qFa}2ST^G=FAUnLY9U4LnAez@|)=CIE1zQ zdNS0JtSLJ|`CB*pwt+l6WC_l7-@{rS>)7y6$z#)!)&I^#nED*%qScX+A#DGW{n6lf zON2tCr7-e?CmdFP*v&uYUH?OokQo@E4Jyd+kFdu9*#+=D!6;x$Y%{wLpu3UV=i42T zDdhN_e-B_g$!G!v6q&KfXKWp|xsvmURJeDK^k<0zQtYy-E__zBrONN&n8Gw8m%Sy- La1p{RV+V6@PM)ma literal 0 HcmV?d00001 diff --git a/Module1/code/mybatis-3-master/.DS_Store b/Module1/code/mybatis-3-master/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..cf89e80e938bf63adff1b7e4853544104eef1f2c GIT binary patch literal 6148 zcmeHK%Sr<=6uq%iDT-31g3Ek?*sZIfj2l;l!F@|ds^Hkt*LuJ|5d0B8!-Z?M@ z`M5Gy2E+kzVEY{4cehSwbVnK8(AxWZaurtdQIcfy*??$S?>?Eul(_jQ`=vU*E$<9H zCP&cCX+aO+u5p}}YhLsH@#TVPp63;-wNUSzc{Q5Sga(1yb^7KjUTb;Sikb4w@k;BJ zKYl%< zd;OJ%0pIIyt_S*Ld^U@awDk_)%;sq9Ta+vghy&ul$^qUVG#X>smfh3l%-=_yLqw0!lI> ~/.mavenrc + +install: + # Compile sources with Java 1.8 + - jdk_switcher use oraclejdk8 + - chmod -R 777 ./travis/install.sh + - ./travis/install.sh + # Switch back to the original JDK to run the tests + - jdk_switcher use ${TRAVIS_JDK_VERSION} + +script: ./mvnw test -Dmaven.surefire.excludeGroups= -B + +after_success: + - chmod -R 777 ./travis/after_success.sh + - ./travis/after_success.sh + +env: + global: + - secure: "jWLfOryabB89R5v7nD3V/8ke6+B26UW8E5wjwKj7dDhjfmGUg+KbOShqWrq4\nEAnyE4GltwDLxKErZ5aAPWcT47C3GJYocKtmTcec2sblqMdVVUd3udylrM1d\n66Yb0XZoqri9JJ9pb8ObDp5XRV+ZQ5xP0w1gboNY6SynJg/1FKk=" + - secure: "UV14rAITDqou5jObPInlIS3IYdf45LihGal9/+C4TLyhXLaVktbT/arFAAIF\ndpv9OM+YgeA7ZeRZLJ8vbgipO+rxizPNL1DqK1rp9s5B2F2y9+ir47nTwayL\n0RN7TgdswjzZZKOukWF2CVK1hjk+n8iFkCrorU22trmXlHc0aoE=" diff --git a/Module1/code/mybatis-3-master/CONTRIBUTING.md b/Module1/code/mybatis-3-master/CONTRIBUTING.md new file mode 100644 index 0000000..5ac3d4a --- /dev/null +++ b/Module1/code/mybatis-3-master/CONTRIBUTING.md @@ -0,0 +1,62 @@ +## If you have a question or need any help... + +Please use [the mailing list](http://groups.google.com/group/mybatis-user) instead of creating issues on the tracker. Thank you! + +## Reporting a bug + +- Create a new issue on [the tracker](https://github.com/mybatis/mybatis-3/issues). +- The best way to report a bug is to create a failing test case. Please see the [Contributing code](CONTRIBUTING.md#contributing-code) section. + +## Proposing a new feature + +- It is a good idea to discuss your changes on [the mailing list](http://groups.google.com/group/mybatis-user) to get feedback from the community. +- If you have a patch with unit tests, send a pull request. Please see the [Contributing code](CONTRIBUTING.md#contributing-code) section. + + +## Improving documentation + +- Documentations are placed under [src/site](https://github.com/mybatis/mybatis-3/tree/master/src/site) directory in [the xdoc format](http://maven.apache.org/doxia/references/xdoc-format.html), so it is basically the same as creating a patch to contribute documentation changes. Please see the [Contributing code](CONTRIBUTING.md#contributing-code) section. + +## Contributing code + +### Copyright and License + +- You are the author of your contributions and will always be. +- Everything you can find it this project is licensed under the Apache Software License 2.0 +- Every contribution you do must be licensed under the Apache Software License 2.0. Otherwise we will not be able to accept it. +- Please make sure that all the new files you create hold the following header: + +``` +/* + * Copyright [year] the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +``` + +### How to send your modifications as a pull request + +The best way to submit a patch is to send a pull request. +Here are the steps of a typical workflow. + +1. Fork the repository on GitHub. +2. Clone your fork to your local machine. +3. Create a topic branch with a descriptive name. +4. Make changes with unit tests in the topic branch. +5. Push commits to your fork on GitHub. +6. Send a [pull request](https://help.github.com/articles/using-pull-requests). + +For steps 1 to 3, please read [this GitHub help](https://help.github.com/articles/fork-a-repo) if you are not familiar with these operations. +Step 4 and 5 are basic [git](http://git-scm.com/) operations. Please see the [online documentation](http://git-scm.com/documentation) for its usage. + +For how to write a unit test, please see the [unit test](https://github.com/mybatis/mybatis-3/wiki/Unit-Test) page. diff --git a/Module1/code/mybatis-3-master/ICLA b/Module1/code/mybatis-3-master/ICLA new file mode 100644 index 0000000..767314f --- /dev/null +++ b/Module1/code/mybatis-3-master/ICLA @@ -0,0 +1,133 @@ + MyBatis + Individual Contributor License Agreement ("Agreement") V2.0 + https://mybatis.googlecode.com/svn/trunk/ICLA + +Thank you for your interest in MyBatis (the +"Project"). In order to clarify the intellectual property license +granted with Contributions from any person or entity, the Project +must have a Contributor License Agreement ("CLA") on file that has +been signed by each Contributor, indicating agreement to the license +terms below. This license is for your protection as a Contributor as +well as the protection of the Project and its users; it does not +change your rights to use your own Contributions for any other purpose. +If you have not already done so, please complete and sign, then scan +and email a PDF file of this Agreement to an existing member of the +Project (preferably the person who invited you)for filing. Please +read this document carefully before signing and keep a copy for your +records. + + Full name: ______________________________________________________ + + (optional) Public name: _________________________________________ + + Mailing Address: ________________________________________________ + + ________________________________________________ + + Country: ______________________________________________________ + + Telephone: ______________________________________________________ + + E-Mail: ______________________________________________________ + + +You accept and agree to the following terms and conditions for Your +previous, present and future Contributions submitted to the Project. +In return, the Project shall not use Your Contributions in a way that +is contrary to the public benefit or inconsistent with its nonprofit +status and bylaws in effect at the time of the Contribution. Except +for the license granted herein to the Project and recipients of +software distributed by the Project, You reserve all right, title, +and interest in and to Your Contributions. + +1. Definitions. + + "You" (or "Your") shall mean the copyright owner or legal entity + authorized by the copyright owner that is making this Agreement + with the Project. For legal entities, the entity making a + Contribution and all other entities that control, are controlled + by, or are under common control with that entity are considered to + be a single Contributor. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "Contribution" shall mean any original work of authorship, + including any modifications or additions to an existing work, that + is intentionally submitted by You to the Project for inclusion + in, or documentation of, any of the products owned or managed by + the Project (the "Work"). For the purposes of this definition, + "submitted" means any form of electronic, verbal, or written + communication sent to the Project or its representatives, + including but not limited to communication on electronic mailing + lists, source code control systems, and issue tracking systems that + are managed by, or on behalf of, the Project for the purpose of + discussing and improving the Work, but excluding communication that + is conspicuously marked or otherwise designated in writing by You + as "Not a Contribution." + +2. Grant of Copyright License. Subject to the terms and conditions of + this Agreement, You hereby grant to the Project and to + recipients of software distributed by the Project a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare derivative works of, + publicly display, publicly perform, sublicense, and distribute Your + Contributions and such derivative works. + +3. Grant of Patent License. Subject to the terms and conditions of + this Agreement, You hereby grant to the Project and to + recipients of software distributed by the Project a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have + made, use, offer to sell, sell, import, and otherwise transfer the + Work, where such license applies only to those patent claims + licensable by You that are necessarily infringed by Your + Contribution(s) alone or by combination of Your Contribution(s) + with the Work to which such Contribution(s) was submitted. If any + entity institutes patent litigation against You or any other entity + (including a cross-claim or counterclaim in a lawsuit) alleging + that your Contribution, or the Work to which you have contributed, + constitutes direct or contributory patent infringement, then any + patent licenses granted to that entity under this Agreement for + that Contribution or Work shall terminate as of the date such + litigation is filed. + +4. You represent that you are legally entitled to grant the above + license. If your employer(s) has rights to intellectual property + that you create that includes your Contributions, you represent + that you have received permission to make Contributions on behalf + of that employer, that your employer has waived such rights for + your Contributions to the Project, or that your employer has + executed a separate Corporate CLA with the Project. + +5. You represent that each of Your Contributions is Your original + creation (see section 7 for submissions on behalf of others). You + represent that Your Contribution submissions include complete + details of any third-party license or other restriction (including, + but not limited to, related patents and trademarks) of which you + are personally aware and which are associated with any part of Your + Contributions. + +6. You are not expected to provide support for Your Contributions, + except to the extent You desire to provide support. You may provide + support for free, for a fee, or not at all. Unless required by + applicable law or agreed to in writing, You provide Your + Contributions on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS + OF ANY KIND, either express or implied, including, without + limitation, any warranties or conditions of TITLE, NON- + INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. + +7. Should You wish to submit work that is not Your original creation, + You may submit it to the Project separately from any + Contribution, identifying the complete details of its source and of + any license or other restriction (including, but not limited to, + related patents, trademarks, and license agreements) of which you + are personally aware, and conspicuously marking the work as + "Submitted on behalf of a third-party: [named here]". + +8. You agree to notify the Project of any facts or circumstances of + which you become aware that would make these representations + inaccurate in any respect. + +Please sign: __________________________________ Date: ________________ diff --git a/Module1/code/mybatis-3-master/ISSUE_TEMPLATE.md b/Module1/code/mybatis-3-master/ISSUE_TEMPLATE.md new file mode 100644 index 0000000..e6ab84d --- /dev/null +++ b/Module1/code/mybatis-3-master/ISSUE_TEMPLATE.md @@ -0,0 +1,44 @@ + + + + +## MyBatis version +3.x.x + +## Database vendor and version + +## Test case or example project + +## Steps to reproduce + +## Expected result + +## Actual result + diff --git a/Module1/code/mybatis-3-master/LICENSE b/Module1/code/mybatis-3-master/LICENSE new file mode 100644 index 0000000..57bc88a --- /dev/null +++ b/Module1/code/mybatis-3-master/LICENSE @@ -0,0 +1,202 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + diff --git a/Module1/code/mybatis-3-master/NOTICE b/Module1/code/mybatis-3-master/NOTICE new file mode 100644 index 0000000..929f42e --- /dev/null +++ b/Module1/code/mybatis-3-master/NOTICE @@ -0,0 +1,68 @@ +iBATIS + This product includes software developed by + The Apache Software Foundation (http://www.apache.org/). + + Copyright 2010 The Apache Software Foundation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +OGNL +//-------------------------------------------------------------------------- +// Copyright (c) 2004, Drew Davidson and Luke Blanshard +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// Neither the name of the Drew Davidson nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +// OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED +// AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +// DAMAGE. +//-------------------------------------------------------------------------- + +Refactored SqlBuilder class (SQL, AbstractSQL) + + This product includes software developed by + Adam Gent (https://gist.github.com/3650165) + + Copyright 2010 Adam Gent + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/Module1/code/mybatis-3-master/README.md b/Module1/code/mybatis-3-master/README.md new file mode 100644 index 0000000..4c54d1e --- /dev/null +++ b/Module1/code/mybatis-3-master/README.md @@ -0,0 +1,77 @@ +MyBatis SQL Mapper Framework for Java +===================================== + +[![Build Status](https://travis-ci.org/mybatis/mybatis-3.svg?branch=master)](https://travis-ci.org/mybatis/mybatis-3) +[![Coverage Status](https://coveralls.io/repos/mybatis/mybatis-3/badge.svg?branch=master&service=github)](https://coveralls.io/github/mybatis/mybatis-3?branch=master) +[![Dependency Status](https://www.versioneye.com/user/projects/56199c04a193340f320005d3/badge.svg?style=flat)](https://www.versioneye.com/user/projects/56199c04a193340f320005d3) +[![Maven central](https://maven-badges.herokuapp.com/maven-central/org.mybatis/mybatis/badge.svg)](https://maven-badges.herokuapp.com/maven-central/org.mybatis/mybatis) +[![License](http://img.shields.io/:license-apache-brightgreen.svg)](http://www.apache.org/licenses/LICENSE-2.0.html) +[![Stack Overflow](http://img.shields.io/:stack%20overflow-mybatis-brightgreen.svg)](http://stackoverflow.com/questions/tagged/mybatis) +[![Project Stats](https://www.openhub.net/p/mybatis/widgets/project_thin_badge.gif)](https://www.openhub.net/p/mybatis) + +![mybatis](http://mybatis.github.io/images/mybatis-logo.png) + +The MyBatis SQL mapper framework makes it easier to use a relational database with object-oriented applications. +MyBatis couples objects with stored procedures or SQL statements using a XML descriptor or annotations. +Simplicity is the biggest advantage of the MyBatis data mapper over object relational mapping tools. + +Essentials +---------- + +* [See the docs](http://mybatis.github.io/mybatis-3) +* [Download Latest](https://github.com/mybatis/mybatis-3/releases) +* [Download Snapshot](https://oss.sonatype.org/content/repositories/snapshots/org/mybatis/mybatis/) + +# 个人博客 + +[http://www.iocoder.cn](http://www.iocoder.cn/?github) + +------- + +![](http://www.iocoder.cn/images/common/wechat_mp.jpeg) + +> 🙂🙂🙂关注**微信公众号:【芋艿的后端小屋】**有福利: +> 1. RocketMQ / MyCAT / Sharding-JDBC **所有**源码分析文章列表 +> 2. RocketMQ / MyCAT / Sharding-JDBC **中文注释源码 GitHub 地址** +> 3. 您对于源码的疑问每条留言**都**将得到**认真**回复。**甚至不知道如何读源码也可以请教噢**。 +> 4. **新的**源码解析文章**实时**收到通知。**每周更新一篇左右**。 + +------- + +* 知识星球:![知识星球](http://www.iocoder.cn/images/Architecture/2017_12_29/01.png) + +* 数据持久层框架 **MyBatis** + + * [《精尽 MyBatis 面试题》](http://www.iocoder.cn/MyBatis/good-collection?github&1613) + * [《精尽 MyBatis 源码分析 —— 调试环境搭建》](http://www.iocoder.cn/MyBatis/good-collection?github&1613) + * [《精尽 MyBatis 源码分析 —— 项目结构一览》](http://www.iocoder.cn/MyBatis/good-collection?github&1613) + * [《精尽 MyBatis 源码分析 —— 解析器模块》](http://www.iocoder.cn/MyBatis/good-collection?github&1613) + * [《精尽 MyBatis 源码分析 —— 反射模块》](http://www.iocoder.cn/MyBatis/good-collection?github&1613) + * [《精尽 MyBatis 源码分析 —— 异常模块》](http://www.iocoder.cn/MyBatis/good-collection?github&1613) + * [《精尽 MyBatis 源码分析 —— 数据源模块》](http://www.iocoder.cn/MyBatis/good-collection?github&1613) + * [《精尽 MyBatis 源码分析 —— 事务模块》](http://www.iocoder.cn/MyBatis/good-collection?github&1613) + * [《精尽 MyBatis 源码分析 —— 缓存模块》](http://www.iocoder.cn/MyBatis/good-collection?github&1613) + * [《精尽 MyBatis 源码分析 —— 类型模块》](http://www.iocoder.cn/MyBatis/good-collection?github&1613) + * [《精尽 MyBatis 源码分析 —— IO 模块》](http://www.iocoder.cn/MyBatis/good-collection?github&1613) + * [《精尽 MyBatis 源码分析 —— 日志模块》](http://www.iocoder.cn/MyBatis/good-collection?github&1613) + * [《精尽 MyBatis 源码分析 —— 注解模块》](http://www.iocoder.cn/MyBatis/good-collection?github&1613) + * [《精尽 MyBatis 源码分析 —— Binding 模块》](http://www.iocoder.cn/MyBatis/good-collection?github&1613) + * [《精尽 MyBatis 源码分析 —— MyBatis 初始化(一)之加载 mybatis-config》](http://www.iocoder.cn/MyBatis/good-collection?github&1613) + * [《精尽 MyBatis 源码分析 —— MyBatis 初始化(二)之加载 Mapper 映射配置文件》](http://www.iocoder.cn/MyBatis/good-collection?github&1613) + * [《精尽 MyBatis 源码分析 —— MyBatis 初始化(三)之加载 Statement 配置》](http://www.iocoder.cn/MyBatis/good-collection?github&1613) + * [《精尽 MyBatis 源码分析 —— MyBatis 初始化(四)之加载注解配置》](http://www.iocoder.cn/MyBatis/good-collection?github&1613) + * [《精尽 MyBatis 源码分析 —— SQL 初始化(上)之 SqlNode》](http://www.iocoder.cn/MyBatis/good-collection?github&1613) + * [《精尽 MyBatis 源码分析 —— SQL 初始化(下)之 SqlSource》](http://www.iocoder.cn/MyBatis/good-collection?github&1613) + * [《精尽 MyBatis 源码分析 —— SQL 执行(一)之 Executor》](http://www.iocoder.cn/MyBatis/good-collection?github&1613) + * [《精尽 MyBatis 源码分析 —— SQL 执行(二)之 StatementHandler》](http://www.iocoder.cn/MyBatis/good-collection?github&1613) + * [《精尽 MyBatis 源码分析 —— SQL 执行(三)之 KeyGenerator》](http://www.iocoder.cn/MyBatis/good-collection?github&1613) + * [《精尽 MyBatis 源码分析 —— SQL 执行(四)之 ResultSetHandler》](http://www.iocoder.cn/MyBatis/good-collection?github&1613) + * [《精尽 MyBatis 源码分析 —— SQL 执行(五)之延迟加载》](http://www.iocoder.cn/MyBatis/good-collection?github&1613) + * [《精尽 MyBatis 源码分析 —— 会话 SqlSession》](http://www.iocoder.cn/MyBatis/good-collection?github&1613) + * [《精尽 MyBatis 源码分析 —— 插件体系(一)之原理》](http://www.iocoder.cn/MyBatis/good-collection?github&1613) + * [《精尽 MyBatis 源码分析 —— 插件体系(二)之 PageHelper》](http://www.iocoder.cn/MyBatis/good-collection?github&1613) + * [《精尽 MyBatis 源码解析 —— Spring 集成(一)之调试环境搭建》](http://www.iocoder.cn/MyBatis/good-collection?github&1613) + * [《精尽 MyBatis 源码解析 —— Spring 集成(二)之初始化》](http://www.iocoder.cn/MyBatis/good-collection?github&1613) + * [《精尽 MyBatis 源码解析 —— Spring 集成(三)之 SqlSession》](http://www.iocoder.cn/MyBatis/good-collection?github&1613) + * [《精尽 MyBatis 源码解析 —— Spring 集成(四)之事务》](http://www.iocoder.cn/MyBatis/good-collection?github&1613) + * [《精尽 MyBatis 源码解析 —— Spring 集成(五)之批处理》](http://www.iocoder.cn/MyBatis/good-collection?github&1613) diff --git a/Module1/code/mybatis-3-master/license.txt b/Module1/code/mybatis-3-master/license.txt new file mode 100644 index 0000000..4ce1777 --- /dev/null +++ b/Module1/code/mybatis-3-master/license.txt @@ -0,0 +1,13 @@ + Copyright ${license.git.copyrightYears} the original author or authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/Module1/code/mybatis-3-master/mvnw b/Module1/code/mybatis-3-master/mvnw new file mode 100644 index 0000000..961a825 --- /dev/null +++ b/Module1/code/mybatis-3-master/mvnw @@ -0,0 +1,286 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven2 Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" + # TODO classpath? +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.0/maven-wrapper-0.4.0.jar" + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + wget "$jarUrl" -O "$wrapperJarPath" + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + curl -o "$wrapperJarPath" "$jarUrl" + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/Module1/code/mybatis-3-master/mvnw.cmd b/Module1/code/mybatis-3-master/mvnw.cmd new file mode 100644 index 0000000..830073a --- /dev/null +++ b/Module1/code/mybatis-3-master/mvnw.cmd @@ -0,0 +1,161 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven2 Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.0/maven-wrapper-0.4.0.jar" +FOR /F "tokens=1,2 delims==" %%A IN (%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties) DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + echo Found %WRAPPER_JAR% +) else ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + powershell -Command "(New-Object Net.WebClient).DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')" + echo Finished downloading %WRAPPER_JAR% +) +@REM End of extension + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% diff --git a/Module1/code/mybatis-3-master/pom.xml b/Module1/code/mybatis-3-master/pom.xml new file mode 100644 index 0000000..8e77739 --- /dev/null +++ b/Module1/code/mybatis-3-master/pom.xml @@ -0,0 +1,415 @@ + + + + 4.0.0 + + + org.mybatis + mybatis-parent + 31 + + + + mybatis + 3.5.3 + jar + + mybatis + + The MyBatis SQL mapper framework makes it easier to use a relational database with object-oriented + applications. MyBatis couples objects with stored procedures or SQL statements using a XML descriptor or + annotations. Simplicity is the biggest advantage of the MyBatis data mapper over object relational mapping + tools. + + http://www.mybatis.org/mybatis-3 + + 2009 + + + + Adam Gent + adam.gent@evocatus.com + + + Andrea Selva + selva.andre@gmail.com + + + Antonio Sánchez + juntandolineas@gmail.com + + + Arkadi Shishlov + arkadi.shishlov@gmail.com + + + Axel Doerfler + axel.doerfler@gmail.com + + + Chris Dadej + chris.dadej@gmail.com + + + Denis Vygovskiy + qizant@gmail.com + + + Franta Mejta + mejta@rewor.cz + + + Jurriaan Pruys + jurriaan@pruys.com + + + Keith Wong + wongkwl@gmail.com + + + Lasse Voss + lasse.voss@motor-talk-gmbh.de + + + Luke Stevens + nosuchluke@gmail.com + + + Paul Krause + paulkrause88@alum.mit.edu + + + Peter Leibiger + kuhnroyal@gmail.com + + + Riccardo Cossu + riccardo.cossu@gmail.com + + + Tomáš Neuberg + neuberg@m-atelier.cz + + + + + http://github.com/mybatis/mybatis-3 + scm:git:ssh://github.com/mybatis/mybatis-3.git + scm:git:ssh://git@github.com/mybatis/mybatis-3.git + mybatis-3.5.3 + + + GitHub Issue Management + https://github.com/mybatis/mybatis-3/issues + + + Travis CI + https://travis-ci.org/mybatis/mybatis-3/ + + + + gh-pages + Mybatis GitHub Pages + git:ssh://git@github.com/mybatis/mybatis-3.git?gh-pages# + + + + + 3.4.6 + TestcontainersTests + -parameters + org.mybatis + org.apache.ibatis.*;version=${project.version};-noimport:=true + *;resolution:=optional + * + org.apache.ibatis.* + + + 0.8.4 + + + + + ognl + ognl + 3.2.10 + compile + true + + + org.javassist + javassist + 3.24.1-GA + compile + true + + + org.slf4j + slf4j-api + 1.7.26 + true + + + org.slf4j + slf4j-log4j12 + 1.7.26 + true + + + log4j + log4j + 1.2.17 + true + + + org.apache.logging.log4j + log4j-core + 2.11.2 + true + + + commons-logging + commons-logging + 1.2 + true + + + cglib + cglib + 3.2.10 + true + + + + + org.junit.jupiter + junit-jupiter-engine + 5.5.0 + test + + + org.hsqldb + hsqldb + 2.4.1 + test + + + org.apache.derby + derby + 10.14.2.0 + test + + + org.mockito + mockito-core + 2.25.1 + test + + + org.mockito + mockito-junit-jupiter + 2.25.1 + test + + + org.apache.commons + commons-dbcp2 + 2.6.0 + test + + + javax.transaction + javax.transaction-api + 1.3 + test + + + org.apache.velocity + velocity-engine-core + 2.0 + test + + + + org.postgresql + postgresql + 42.2.5 + test + + + mysql + mysql-connector-java + 8.0.17 + test + + + org.assertj + assertj-core + 3.12.2 + test + + + eu.codearte.catch-exception + catch-exception + 1.4.6 + test + + + org.testcontainers + junit-jupiter + 1.12.1 + test + + + org.testcontainers + postgresql + 1.12.1 + test + + + org.testcontainers + mysql + 1.12.1 + test + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + ${maven.compiler.testCompilerArgument} + + + + org.apache.maven.plugins + maven-surefire-plugin + + ${argLine} -Xmx2048m + + + derby.stream.error.file + ${project.build.directory}/derby.log + + + derby.system.home + ${project.build.directory} + + + + + + org.apache.maven.plugins + maven-pdf-plugin + + + org.apache.maven.plugins + maven-shade-plugin + + + package + + shade + + + false + + + org.mybatis:mybatis + ognl:ognl + org.javassist:javassist + + + + + ognl + org.apache.ibatis.ognl + + + javassist + org.apache.ibatis.javassist + + + + + + + + org.apache.maven.plugins + maven-site-plugin + + en,es,ja,fr,zh_CN,ko + + + + org.jacoco + jacoco-maven-plugin + + + org.apache.ibatis.ognl.* + org.apache.ibatis.javassist.* + + + + + + + + ${project.basedir} + META-INF + + LICENSE + NOTICE + + + + ${project.build.sourceDirectory} + + **/*.java + + + + + + ${project.build.testSourceDirectory} + + **/*.java + + + + + + + + + travis-ci + + + env.TRAVIS + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/.DS_Store b/Module1/code/mybatis-3-master/src/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..13ada831e263ef413d280a87525a4260b272cc24 GIT binary patch literal 6148 zcmeHKyK2Kw43%0BfkMg9q2paU<_|8x{en#00&z)(7zb+a-ZJ;M`U(A-9z7atjMof_ z1k&-<)w#CMU|B@O>#kZ6Es1CW7o@X#Q=cZ4^9kV=)Y2z? zQ9I(l{d^Di>ZUBKuH6y+KEGr=@WQK`YIg5*7(CO*R*4Zpflwe62n9lcJ5~TaTWs-U z7%>zG1ww&~0`h%GaKY@@8|tS6K}P_f{Kl){T4xDhk_0e2_J+v7*r-6GvX2;SbmWuQ zWyjvo=)^vJu-}<|LSel-&QDrSoDCy}0-?ZIfk#^|rT@RfXXgJgDORCCC~#8>a8Yi` zHD1Yk>*VF6*CzND{%@$&as+L~KyAfXNGpCF)Frvbes=5)m5#j9f$<|Cx`c%S*HGXO DI9?_B literal 0 HcmV?d00001 diff --git a/Module1/code/mybatis-3-master/src/main/java/log4j.properties b/Module1/code/mybatis-3-master/src/main/java/log4j.properties new file mode 100644 index 0000000..1f0ee6c --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/log4j.properties @@ -0,0 +1,6 @@ +log4j.rootLogger=info,A1 + +log4j.appender.A1=org.apache.log4j.ConsoleAppender +log4j.appender.A1.layout=org.apache.log4j.PatternLayout +log4j.appender.A1.layout.ConversionPattern=[%t] [%c]-[%p] %m%n +log4j.logger.com.lagou.mapper=TRACE diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Arg.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Arg.java new file mode 100644 index 0000000..4b4601b --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Arg.java @@ -0,0 +1,54 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.annotations; + +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.TypeHandler; +import org.apache.ibatis.type.UnknownTypeHandler; + +/** + * @author Clinton Begin + */ +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({}) +public @interface Arg { + boolean id() default false; + + String column() default ""; + + Class javaType() default void.class; + + JdbcType jdbcType() default JdbcType.UNDEFINED; + + Class typeHandler() default UnknownTypeHandler.class; + + String select() default ""; + + String resultMap() default ""; + + String name() default ""; + + /** + * @since 3.5.0 + */ + String columnPrefix() default ""; +} diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/AutomapConstructor.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/AutomapConstructor.java new file mode 100644 index 0000000..0de84a3 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/AutomapConstructor.java @@ -0,0 +1,34 @@ +/** + * Copyright 2009-2017 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.annotations; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * The marker annotation that indicate a constructor for automatic mapping. + * + * @author Tim Chen + * @since 3.4.3 + */ +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.CONSTRUCTOR}) +public @interface AutomapConstructor { +} diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/CacheNamespace.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/CacheNamespace.java new file mode 100644 index 0000000..c3a57cb --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/CacheNamespace.java @@ -0,0 +1,72 @@ +/** + * Copyright 2009-2016 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.annotations; + +import org.apache.ibatis.cache.decorators.LruCache; +import org.apache.ibatis.cache.impl.PerpetualCache; + +import java.lang.annotation.*; + +/** + * 缓存空间配置的注解 + * + * @author Clinton Begin + * @author Kazuki Shimizu + */ +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) // Mapper 类上 +public @interface CacheNamespace { + + /** + * @return 负责存储的 Cache 实现类 + */ + Class implementation() default PerpetualCache.class; + + /** + * @return 负责过期的 Cache 实现类 + */ + Class eviction() default LruCache.class; + + /** + * @return 清空缓存的频率。0 代表不清空 + */ + long flushInterval() default 0; + + /** + * @return 缓存容器大小 + */ + int size() default 1024; + + /** + * @return 是否序列化。{@link org.apache.ibatis.cache.decorators.SerializedCache} + */ + boolean readWrite() default true; + + /** + * @return 是否阻塞。{@link org.apache.ibatis.cache.decorators.BlockingCache} + */ + boolean blocking() default false; + + /** + * Property values for a implementation object. + * @since 3.4.2 + * + * {@link Property} 数组 + */ + Property[] properties() default {}; + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/CacheNamespaceRef.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/CacheNamespaceRef.java new file mode 100644 index 0000000..10fa750 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/CacheNamespaceRef.java @@ -0,0 +1,52 @@ +/** + * Copyright 2009-2016 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.annotations; + +import org.apache.ibatis.builder.annotation.MapperAnnotationBuilder; + +import java.lang.annotation.*; + +/** + * 指向指定命名空间的注解 + * + * The annotation that reference a cache. + *

+ * If you use this annotation, should be specified either {@link #value()} or {@link #name()} attribute. + *

+ * @author Clinton Begin + * @author Kazuki Shimizu + */ +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) // 类型 +public @interface CacheNamespaceRef { + + /** + * 见 {@link MapperAnnotationBuilder#parseCacheRef()} 方法 + * + * A namespace type to reference a cache (the namespace name become a FQCN of specified type) + */ + Class value() default void.class; + + /** + * 指向的命名空间 + * + * A namespace name to reference a cache + * @since 3.4.2 + */ + String name() default ""; + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Case.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Case.java new file mode 100644 index 0000000..616f944 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Case.java @@ -0,0 +1,37 @@ +/** + * Copyright 2009-2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.annotations; + +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * @author Clinton Begin + */ +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({}) +public @interface Case { + String value(); + + Class type(); + + Result[] results() default {}; + + Arg[] constructArgs() default {}; +} diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/ConstructorArgs.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/ConstructorArgs.java new file mode 100644 index 0000000..d321c2e --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/ConstructorArgs.java @@ -0,0 +1,35 @@ +/** + * Copyright 2009-2016 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.annotations; + +import java.lang.annotation.*; + +/** + * + * + * @author Clinton Begin + */ +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface ConstructorArgs { + + /** + * @return {@link Arg} 数组 + */ + Arg[] value() default {}; + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Delete.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Delete.java new file mode 100644 index 0000000..e80f6d4 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Delete.java @@ -0,0 +1,35 @@ +/** + * Copyright 2009-2016 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.annotations; + +import java.lang.annotation.*; + +/** + * 删除语句注解 + * + * @author Clinton Begin + */ +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) // 方法 +public @interface Delete { + + /** + * @return 删除语句 + */ + String[] value(); + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/DeleteProvider.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/DeleteProvider.java new file mode 100644 index 0000000..908f9bd --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/DeleteProvider.java @@ -0,0 +1,40 @@ +/** + * Copyright 2009-2016 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.annotations; + +import java.lang.annotation.*; + +/** + * 删除语句提供器 + * + * @author Clinton Begin + */ +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface DeleteProvider { + + /** + * @return 提供的类 + */ + Class type(); + + /** + * @return 提供的方法 + */ + String method(); + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Flush.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Flush.java new file mode 100644 index 0000000..94ab596 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Flush.java @@ -0,0 +1,32 @@ +/** + * Copyright 2009-2016 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.annotations; + +import java.lang.annotation.*; + +/** + * Flush 注解 + * + * The maker annotation that invoke a flush statements via Mapper interface. + * + * @since 3.3.0 + * @author Kazuki Shimizu + */ +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) // 方法上 +public @interface Flush { +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Insert.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Insert.java new file mode 100644 index 0000000..161ff63 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Insert.java @@ -0,0 +1,35 @@ +/** + * Copyright 2009-2016 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.annotations; + +import java.lang.annotation.*; + +/** + * 插入语句注解 + * + * @author Clinton Begin + */ +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) // 方法 +public @interface Insert { + + /** + * @return 插入语句 + */ + String[] value(); + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/InsertProvider.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/InsertProvider.java new file mode 100644 index 0000000..5b98996 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/InsertProvider.java @@ -0,0 +1,40 @@ +/** + * Copyright 2009-2016 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.annotations; + +import java.lang.annotation.*; + +/** + * 插入语句提供器 + * + * @author Clinton Begin + */ +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) // 方法 +public @interface InsertProvider { + + /** + * @return 提供的类 + */ + Class type(); + + /** + * @return 提供的方法 + */ + String method(); + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Lang.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Lang.java new file mode 100644 index 0000000..300559b --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Lang.java @@ -0,0 +1,39 @@ +/** + * Copyright 2009-2018 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.annotations; + +import org.apache.ibatis.scripting.LanguageDriver; + +import java.lang.annotation.*; + +/** + * 语言驱动的注解 + * + * 可见 https://www.jianshu.com/p/03642b807688 + * + * @author Clinton Begin + */ +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) // 方法 +public @interface Lang { + + /** + * @return 驱动类 + */ + Class value(); + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Many.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Many.java new file mode 100644 index 0000000..9d91964 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Many.java @@ -0,0 +1,45 @@ +/** + * Copyright 2009-2016 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.annotations; + +import org.apache.ibatis.mapping.FetchType; + +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 复杂类型的集合属性值的注解 + * + * @author Clinton Begin + */ +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({}) +public @interface Many { + + /** + * @return 已映射语句(也就是映射器方法)的全限定名 + */ + String select() default ""; + + /** + * @return 加载类型 + */ + FetchType fetchType() default FetchType.DEFAULT; + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/MapKey.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/MapKey.java new file mode 100644 index 0000000..8f2f527 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/MapKey.java @@ -0,0 +1,35 @@ +/** + * Copyright 2009-2016 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.annotations; + +import java.lang.annotation.*; + +/** + * Map 结果的键的注解 + * + * @author Clinton Begin + */ +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) // 方法上 +public @interface MapKey { + + /** + * @return 键名 + */ + String value(); + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Mapper.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Mapper.java new file mode 100644 index 0000000..6a1d61e --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Mapper.java @@ -0,0 +1,41 @@ +/** + * Copyright 2009-2016 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.annotations; + +import java.lang.annotation.Documented; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import static java.lang.annotation.ElementType.*; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +/** + * Marker interface for MyBatis mappers + * + * 标记这是个 Mapper 的注解 + * + * @author Frank David Martínez + */ +@Documented +@Inherited +@Retention(RUNTIME) +@Target({TYPE, METHOD, FIELD, PARAMETER}) +public @interface Mapper { + + // Interface Mapper + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/One.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/One.java new file mode 100644 index 0000000..50f920a --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/One.java @@ -0,0 +1,45 @@ +/** + * Copyright 2009-2016 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.annotations; + +import org.apache.ibatis.mapping.FetchType; + +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 复杂类型的单独属性值的注解 + * + * @author Clinton Begin + */ +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({}) +public @interface One { + + /** + * @return 已映射语句(也就是映射器方法)的全限定名 + */ + String select() default ""; + + /** + * @return 加载类型 + */ + FetchType fetchType() default FetchType.DEFAULT; + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Options.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Options.java new file mode 100644 index 0000000..6d21245 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Options.java @@ -0,0 +1,96 @@ +/** + * Copyright 2009-2018 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.annotations; + +import org.apache.ibatis.mapping.ResultSetType; +import org.apache.ibatis.mapping.StatementType; + +import java.lang.annotation.*; + +/** + * 操作可选项 + * + * @author Clinton Begin + */ +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface Options { + + /** + * The options for the {@link Options#flushCache()}. + * The default is {@link FlushCachePolicy#DEFAULT} + */ + enum FlushCachePolicy { + /** false for select statement; true for insert/update/delete statement. */ + DEFAULT, + /** Flushes cache regardless of the statement type. */ + TRUE, + /** Does not flush cache regardless of the statement type. */ + FALSE + } + + /** + * @return 是否使用缓存 + */ + boolean useCache() default true; + + /** + * @return 刷新缓存的策略 + */ + FlushCachePolicy flushCache() default FlushCachePolicy.DEFAULT; + + /** + * @return 结果类型 + */ + ResultSetType resultSetType() default ResultSetType.DEFAULT; + + /** + * @return 语句类型 + */ + StatementType statementType() default StatementType.PREPARED; + + /** + * @return 加载数量 + */ + int fetchSize() default -1; + + /** + * @return 超时时间 + */ + int timeout() default -1; + + /** + * @return 是否生成主键 + */ + boolean useGeneratedKeys() default false; + + /** + * @return 主键在 Java 类中的属性 + */ + String keyProperty() default ""; + + /** + * @return 主键在数据库中的字段 + */ + String keyColumn() default ""; + + /** + * @return 结果集 + */ + String resultSets() default ""; + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Param.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Param.java new file mode 100644 index 0000000..ebfeb71 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Param.java @@ -0,0 +1,39 @@ +/** + * Copyright 2009-2016 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.annotations; + +import java.lang.annotation.*; + +/** + * 方法参数名的注解 + * + * 当映射器方法需多个参数,这个注解可以被应用于映射器方法参数来给每个参数一个名字。否则,多参数将会以它们的顺序位置来被命名。比如 #{1},#{2} 等,这是默认的。 + * + * 使用 @Param(“person”) ,SQL中参数应该被命名为 #{person} 。 + * + * @author Clinton Begin + */ +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.PARAMETER) // 参数 +public @interface Param { + + /** + * @return 参数名 + */ + String value(); + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Property.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Property.java new file mode 100644 index 0000000..8613ad5 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Property.java @@ -0,0 +1,51 @@ +/** + * Copyright 2009-2016 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.annotations; + +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * The annotation that inject a property value. + * + * 属性的注解 + * + * @since 3.4.2 + * @author Kazuki Shimizu + * @see CacheNamespace + */ +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({}) +public @interface Property { + + /** + * 属性名 + * + * A target property name + */ + String name(); + + /** + * 属性值 + * + * A property value or placeholder + */ + String value(); + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Result.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Result.java new file mode 100644 index 0000000..2bbed6d --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Result.java @@ -0,0 +1,75 @@ +/** + * Copyright 2009-2016 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.annotations; + +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.TypeHandler; +import org.apache.ibatis.type.UnknownTypeHandler; + +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * @author Clinton Begin + */ +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({}) +public @interface Result { + + /** + * @return 是否是 ID 字段 + */ + boolean id() default false; + + /** + * @return Java 类中的属性 + */ + String property() default ""; + + /** + * @return 数据库的字段 + */ + String column() default ""; + + /** + * @return Java Type + */ + Class javaType() default void.class; + + /** + * @return JDBC Type + */ + JdbcType jdbcType() default JdbcType.UNDEFINED; + + /** + * @return 使用的 TypeHandler 处理器 + */ + Class typeHandler() default UnknownTypeHandler.class; + + /** + * @return {@link One} 注解 + */ + One one() default @One; + + /** + * @return {@link Many} 注解 + */ + Many many() default @Many; + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/ResultMap.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/ResultMap.java new file mode 100644 index 0000000..01387f3 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/ResultMap.java @@ -0,0 +1,35 @@ +/** + * Copyright 2009-2016 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.annotations; + +import java.lang.annotation.*; + +/** + * 使用的结果集的注解 + * + * @author Jeff Butler + */ +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) // 方法 +public @interface ResultMap { + + /** + * @return 结果集 + */ + String[] value(); + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/ResultType.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/ResultType.java new file mode 100644 index 0000000..236e1fe --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/ResultType.java @@ -0,0 +1,41 @@ +/** + * Copyright 2009-2016 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.annotations; + +import java.lang.annotation.*; + +/** + * 结果类型 + * + * This annotation can be used when a @Select method is using a + * ResultHandler. Those methods must have void return type, so + * this annotation can be used to tell MyBatis what kind of object + * it should build for each row. + * + * @since 3.2.0 + * @author Jeff Butler + */ +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface ResultType { + + /** + * @return 类型 + */ + Class value(); + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Results.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Results.java new file mode 100644 index 0000000..8ed3817 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Results.java @@ -0,0 +1,40 @@ +/** + * Copyright 2009-2016 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.annotations; + +import java.lang.annotation.*; + +/** + * 结果的注解 + * + * @author Clinton Begin + */ +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface Results { + + /** + * The name of the result map. + */ + String id() default ""; + + /** + * @return {@link Result} 数组 + */ + Result[] value() default {}; + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Select.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Select.java new file mode 100644 index 0000000..48683a9 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Select.java @@ -0,0 +1,35 @@ +/** + * Copyright 2009-2016 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.annotations; + +import java.lang.annotation.*; + +/** + * 查询语句注解 + * + * @author Clinton Begin + */ +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) // 方法 +public @interface Select { + + /** + * @return 查询语句 + */ + String[] value(); + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/SelectKey.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/SelectKey.java new file mode 100644 index 0000000..891c2eb --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/SelectKey.java @@ -0,0 +1,63 @@ +/** + * Copyright 2009-2016 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.annotations; + +import org.apache.ibatis.mapping.StatementType; + +import java.lang.annotation.*; + +/** + * 通过 SQL 语句获得主键的注解 + * + * @author Clinton Begin + */ +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface SelectKey { + + /** + * @return 语句 + */ + String[] statement(); + + /** + * @return {@link #statement()} 的类型 + */ + StatementType statementType() default StatementType.PREPARED; + + /** + * @return Java 对象的属性 + */ + String keyProperty(); + + /** + * @return 数据库的字段 + */ + String keyColumn() default ""; + + /** + * @return 在插入语句执行前,还是执行后 + */ + boolean before(); + + /** + * @return 返回类型 + */ + Class resultType(); + + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/SelectProvider.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/SelectProvider.java new file mode 100644 index 0000000..c4ed5c8 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/SelectProvider.java @@ -0,0 +1,40 @@ +/** + * Copyright 2009-2016 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.annotations; + +import java.lang.annotation.*; + +/** + * 查询语句提供器 + * + * @author Clinton Begin + */ +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) // 方法 +public @interface SelectProvider { + + /** + * @return 提供的类 + */ + Class type(); + + /** + * @return 提供的方法 + */ + String method(); + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/TypeDiscriminator.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/TypeDiscriminator.java new file mode 100644 index 0000000..8feddd4 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/TypeDiscriminator.java @@ -0,0 +1,44 @@ +/** + * Copyright 2009-2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.annotations; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.TypeHandler; +import org.apache.ibatis.type.UnknownTypeHandler; + +/** + * @author Clinton Begin + */ +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface TypeDiscriminator { + String column(); + + Class javaType() default void.class; + + JdbcType jdbcType() default JdbcType.UNDEFINED; + + Class typeHandler() default UnknownTypeHandler.class; + + Case[] cases(); +} diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Update.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Update.java new file mode 100644 index 0000000..de393d3 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/Update.java @@ -0,0 +1,35 @@ +/** + * Copyright 2009-2016 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.annotations; + +import java.lang.annotation.*; + +/** + * 更新语句注解 + * + * @author Clinton Begin + */ +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface Update { + + /** + * @return 更新语句 + */ + String[] value(); + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/UpdateProvider.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/UpdateProvider.java new file mode 100644 index 0000000..49b677c --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/UpdateProvider.java @@ -0,0 +1,40 @@ +/** + * Copyright 2009-2016 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.annotations; + +import java.lang.annotation.*; + +/** + * 更新语句提供器 + * + * @author Clinton Begin + */ +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface UpdateProvider { + + /** + * @return 提供的类 + */ + Class type(); + + /** + * @return 提供的方法 + */ + String method(); + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/package-info.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/package-info.java new file mode 100644 index 0000000..bbbce10 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/annotations/package-info.java @@ -0,0 +1,20 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Contains all the annotation that are used in mapper interfaces + */ +package org.apache.ibatis.annotations; + diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/binding/BindingException.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/binding/BindingException.java new file mode 100644 index 0000000..d7daa8e --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/binding/BindingException.java @@ -0,0 +1,45 @@ +/** + * Copyright 2009-2015 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.binding; + +import org.apache.ibatis.exceptions.PersistenceException; + +/** + * 绑定异常 + * + * @author Clinton Begin + */ +public class BindingException extends PersistenceException { + + private static final long serialVersionUID = 4300802238789381562L; + + public BindingException() { + super(); + } + + public BindingException(String message) { + super(message); + } + + public BindingException(String message, Throwable cause) { + super(message, cause); + } + + public BindingException(Throwable cause) { + super(cause); + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/binding/MapperMethod.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/binding/MapperMethod.java new file mode 100644 index 0000000..a025b4b --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/binding/MapperMethod.java @@ -0,0 +1,508 @@ +/** + * Copyright 2009-2018 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.binding; + +import org.apache.ibatis.annotations.Flush; +import org.apache.ibatis.annotations.MapKey; +import org.apache.ibatis.cursor.Cursor; +import org.apache.ibatis.mapping.MappedStatement; +import org.apache.ibatis.mapping.SqlCommandType; +import org.apache.ibatis.mapping.StatementType; +import org.apache.ibatis.reflection.MetaObject; +import org.apache.ibatis.reflection.ParamNameResolver; +import org.apache.ibatis.reflection.TypeParameterResolver; +import org.apache.ibatis.session.Configuration; +import org.apache.ibatis.session.ResultHandler; +import org.apache.ibatis.session.RowBounds; +import org.apache.ibatis.session.SqlSession; + +import java.lang.reflect.Array; +import java.lang.reflect.Method; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +/** + * Mapper 方法。在 Mapper 接口中,每个定义的方法,对应一个 MapperMethod 对象 + * + * @author Clinton Begin + * @author Eduardo Macarron + * @author Lasse Voss + * @author Kazuki Shimizu + */ +public class MapperMethod { + + /** + * SqlCommand 对象 + */ + private final SqlCommand command; + /** + * MethodSignature 对象 + */ + private final MethodSignature method; + + public MapperMethod(Class mapperInterface, Method method, Configuration config) { + this.command = new SqlCommand(config, mapperInterface, method); + this.method = new MethodSignature(config, mapperInterface, method); + } + + public Object execute(SqlSession sqlSession, Object[] args) { + Object result; + //判断mapper中的方法类型,最终调用的还是SqlSession中的方法 + switch (command.getType()) { + case INSERT: { + // 转换参数 + Object param = method.convertArgsToSqlCommandParam(args); + // 执行 INSERT 操作 + // 转换 rowCount + result = rowCountResult(sqlSession.insert(command.getName(), param)); + break; + } + case UPDATE: { + // 转换参数 + Object param = method.convertArgsToSqlCommandParam(args); + // 转换 rowCount + result = rowCountResult(sqlSession.update(command.getName(), param)); + break; + } + case DELETE: { + // 转换参数 + Object param = method.convertArgsToSqlCommandParam(args); + // 转换 rowCount + result = rowCountResult(sqlSession.delete(command.getName(), param)); + break; + } + case SELECT: + // 无返回,并且有 ResultHandler 方法参数,则将查询的结果,提交给 ResultHandler 进行处理 + if (method.returnsVoid() && method.hasResultHandler()) { + executeWithResultHandler(sqlSession, args); + result = null; + // 执行查询,返回列表 + } else if (method.returnsMany()) { + result = executeForMany(sqlSession, args); + // 执行查询,返回 Map + } else if (method.returnsMap()) { + result = executeForMap(sqlSession, args); + // 执行查询,返回 Cursor + } else if (method.returnsCursor()) { + result = executeForCursor(sqlSession, args); + // 执行查询,返回单个对象 + } else { + // 转换参数 + Object param = method.convertArgsToSqlCommandParam(args); + // 查询单条 + result = sqlSession.selectOne(command.getName(), param); + if (method.returnsOptional() && + (result == null || !method.getReturnType().equals(result.getClass()))) { + result = Optional.ofNullable(result); + } + } + break; + case FLUSH: + result = sqlSession.flushStatements(); + break; + default: + throw new BindingException("Unknown execution method for: " + command.getName()); + } + // 返回结果为 null ,并且返回类型为基本类型,则抛出 BindingException 异常 + if (result == null && method.getReturnType().isPrimitive() && !method.returnsVoid()) { + throw new BindingException("Mapper method '" + command.getName() + + " attempted to return null from a method with a primitive return type (" + method.getReturnType() + ")."); + } + // 返回结果 + return result; + } + + private Object rowCountResult(int rowCount) { + final Object result; + if (method.returnsVoid()) { // Void 情况,不用返回 + result = null; + } else if (Integer.class.equals(method.getReturnType()) || Integer.TYPE.equals(method.getReturnType())) { // Int + result = rowCount; + } else if (Long.class.equals(method.getReturnType()) || Long.TYPE.equals(method.getReturnType())) { // Long + result = (long) rowCount; + } else if (Boolean.class.equals(method.getReturnType()) || Boolean.TYPE.equals(method.getReturnType())) { // Boolean + result = rowCount > 0; + } else { + throw new BindingException("Mapper method '" + command.getName() + "' has an unsupported return type: " + method.getReturnType()); + } + return result; + } + + private void executeWithResultHandler(SqlSession sqlSession, Object[] args) { + // 获得 MappedStatement 对象 + MappedStatement ms = sqlSession.getConfiguration().getMappedStatement(command.getName()); + if (!StatementType.CALLABLE.equals(ms.getStatementType()) // 校验存储过程的情况。不符合,抛出 BindingException 异常 + && void.class.equals(ms.getResultMaps().get(0).getType())) { + throw new BindingException("method " + command.getName() + + " needs either a @ResultMap annotation, a @ResultType annotation," + + " or a resultType attribute in XML so a ResultHandler can be used as a parameter."); + } + // 转换参数 + Object param = method.convertArgsToSqlCommandParam(args); + // 执行 SELECT 操作 + if (method.hasRowBounds()) { + RowBounds rowBounds = method.extractRowBounds(args); + sqlSession.select(command.getName(), param, rowBounds, method.extractResultHandler(args)); + } else { + sqlSession.select(command.getName(), param, method.extractResultHandler(args)); + } + } + + private Object executeForMany(SqlSession sqlSession, Object[] args) { + List result; + // 转换参数 + Object param = method.convertArgsToSqlCommandParam(args); + // 执行 SELECT 操作 + if (method.hasRowBounds()) { + RowBounds rowBounds = method.extractRowBounds(args); + result = sqlSession.selectList(command.getName(), param, rowBounds); + } else { + result = sqlSession.selectList(command.getName(), param); + } + // issue #510 Collections & arrays support + // 封装 Array 或 Collection 结果 + if (!method.getReturnType().isAssignableFrom(result.getClass())) { + if (method.getReturnType().isArray()) { // 情况一,Array + return convertToArray(result); + } else { + return convertToDeclaredCollection(sqlSession.getConfiguration(), result); // 情况二,Collection + } + } + // 直接返回的结果 + return result; // 情况三,默认 + } + + private Cursor executeForCursor(SqlSession sqlSession, Object[] args) { + Cursor result; + // 转换参数 + Object param = method.convertArgsToSqlCommandParam(args); + // 执行 SELECT 操作 + if (method.hasRowBounds()) { + RowBounds rowBounds = method.extractRowBounds(args); + result = sqlSession.selectCursor(command.getName(), param, rowBounds); + } else { + result = sqlSession.selectCursor(command.getName(), param); + } + return result; + } + + private Object convertToDeclaredCollection(Configuration config, List list) { + Object collection = config.getObjectFactory().create(method.getReturnType()); + MetaObject metaObject = config.newMetaObject(collection); + metaObject.addAll(list); + return collection; + } + + @SuppressWarnings("unchecked") + private Object convertToArray(List list) { + Class arrayComponentType = method.getReturnType().getComponentType(); + Object array = Array.newInstance(arrayComponentType, list.size()); + if (arrayComponentType.isPrimitive()) { + for (int i = 0; i < list.size(); i++) { + Array.set(array, i, list.get(i)); + } + return array; + } else { + return list.toArray((E[]) array); + } + } + + private Map executeForMap(SqlSession sqlSession, Object[] args) { + Map result; + // 转换参数 + Object param = method.convertArgsToSqlCommandParam(args); + // 执行 SELECT 操作 + if (method.hasRowBounds()) { + RowBounds rowBounds = method.extractRowBounds(args); + result = sqlSession.selectMap(command.getName(), param, method.getMapKey(), rowBounds); + } else { + result = sqlSession.selectMap(command.getName(), param, method.getMapKey()); + } + return result; + } + + public static class ParamMap extends HashMap { + + private static final long serialVersionUID = -2212268410512043556L; + + @Override + public V get(Object key) { + if (!super.containsKey(key)) { + throw new BindingException("Parameter '" + key + "' not found. Available parameters are " + keySet()); + } + return super.get(key); + } + + } + + /** + * SQL 命令 + */ + public static class SqlCommand { + + /** + * {@link MappedStatement#getId()} + */ + private final String name; + /** + * SQL 命令类型 + */ + private final SqlCommandType type; + + public SqlCommand(Configuration configuration, Class mapperInterface, Method method) { + final String methodName = method.getName(); + final Class declaringClass = method.getDeclaringClass(); + // 获得 MappedStatement 对象 + MappedStatement ms = resolveMappedStatement(mapperInterface, methodName, declaringClass, + configuration); + // 找不到 MappedStatement + if (ms == null) { + // 如果有 @Flush 注解,则标记为 FLUSH 类型 + if (method.getAnnotation(Flush.class) != null) { + name = null; + type = SqlCommandType.FLUSH; + } else { // 抛出 BindingException 异常,如果找不到 MappedStatement + throw new BindingException("Invalid bound statement (not found): " + + mapperInterface.getName() + "." + methodName); + } + // 找到 MappedStatement + } else { + // 获得 name + name = ms.getId(); + // 获得 type + type = ms.getSqlCommandType(); + if (type == SqlCommandType.UNKNOWN) { // 抛出 BindingException 异常,如果是 UNKNOWN 类型 + throw new BindingException("Unknown execution method for: " + name); + } + } + } + + public String getName() { + return name; + } + + public SqlCommandType getType() { + return type; + } + + private MappedStatement resolveMappedStatement(Class mapperInterface, String methodName, + Class declaringClass, Configuration configuration) { + // 获得编号 + String statementId = mapperInterface.getName() + "." + methodName; + // 如果有,获得 MappedStatement 对象,并返回 + if (configuration.hasStatement(statementId)) { + return configuration.getMappedStatement(statementId); + // 如果没有,并且当前方法就是 declaringClass 声明的,则说明真的找不到 + } else if (mapperInterface.equals(declaringClass)) { + return null; + } + // 遍历父接口,继续获得 MappedStatement 对象 + for (Class superInterface : mapperInterface.getInterfaces()) { + if (declaringClass.isAssignableFrom(superInterface)) { + MappedStatement ms = resolveMappedStatement(superInterface, methodName, + declaringClass, configuration); + if (ms != null) { + return ms; + } + } + } + // 真的找不到,返回 null + return null; + } + + } + + /** + * 方法签名 + */ + public static class MethodSignature { + + /** + * 返回类型是否为集合 + */ + private final boolean returnsMany; + /** + * 返回类型是否为 Map + */ + private final boolean returnsMap; + /** + * 返回类型是否为 void + */ + private final boolean returnsVoid; + /** + * 返回类型是否为 {@link org.apache.ibatis.cursor.Cursor} + */ + private final boolean returnsCursor; + /** + * 返回类型是否为 {@link java.util.Optional} + */ + private final boolean returnsOptional; + /** + * 返回类型 + */ + private final Class returnType; + /** + * 返回方法上的 {@link MapKey#value()} ,前提是返回类型为 Map + */ + private final String mapKey; + /** + * 获得 {@link ResultHandler} 在方法参数中的位置。 + * + * 如果为 null ,说明不存在这个类型 + */ + private final Integer resultHandlerIndex; + /** + * 获得 {@link RowBounds} 在方法参数中的位置。 + * + * 如果为 null ,说明不存在这个类型 + */ + private final Integer rowBoundsIndex; + /** + * ParamNameResolver 对象 + */ + private final ParamNameResolver paramNameResolver; + + public MethodSignature(Configuration configuration, Class mapperInterface, Method method) { + // 初始化 returnType 属性 + Type resolvedReturnType = TypeParameterResolver.resolveReturnType(method, mapperInterface); + if (resolvedReturnType instanceof Class) { // 普通类 + this.returnType = (Class) resolvedReturnType; + } else if (resolvedReturnType instanceof ParameterizedType) { // 泛型 + this.returnType = (Class) ((ParameterizedType) resolvedReturnType).getRawType(); + } else { // 内部类等等 + this.returnType = method.getReturnType(); + } + // 初始化 returnsVoid 属性 + this.returnsVoid = void.class.equals(this.returnType); + // 初始化 returnsMany 属性 + this.returnsMany = configuration.getObjectFactory().isCollection(this.returnType) || this.returnType.isArray(); + // 初始化 returnsCursor 属性 + this.returnsCursor = Cursor.class.equals(this.returnType); + // 初始化 returnsOptional 属性 + this.returnsOptional = Optional.class.equals(this.returnType); + // 初始化 mapKey + this.mapKey = getMapKey(method); + // 初始化 returnsMap + this.returnsMap = this.mapKey != null; + // 初始化 rowBoundsIndex、resultHandlerIndex + this.rowBoundsIndex = getUniqueParamIndex(method, RowBounds.class); + this.resultHandlerIndex = getUniqueParamIndex(method, ResultHandler.class); + // 初始化 paramNameResolver + this.paramNameResolver = new ParamNameResolver(configuration, method); + } + + public Object convertArgsToSqlCommandParam(Object[] args) { + return paramNameResolver.getNamedParams(args); + } + + public boolean hasRowBounds() { + return rowBoundsIndex != null; + } + + public RowBounds extractRowBounds(Object[] args) { + return hasRowBounds() ? (RowBounds) args[rowBoundsIndex] : null; + } + + public boolean hasResultHandler() { + return resultHandlerIndex != null; + } + + public ResultHandler extractResultHandler(Object[] args) { + return hasResultHandler() ? (ResultHandler) args[resultHandlerIndex] : null; + } + + public String getMapKey() { + return mapKey; + } + + public Class getReturnType() { + return returnType; + } + + public boolean returnsMany() { + return returnsMany; + } + + public boolean returnsMap() { + return returnsMap; + } + + public boolean returnsVoid() { + return returnsVoid; + } + + public boolean returnsCursor() { + return returnsCursor; + } + + /** + * return whether return type is {@code java.util.Optional} + * @return return {@code true}, if return type is {@code java.util.Optional} + * @since 3.5.0 + */ + public boolean returnsOptional() { + return returnsOptional; + } + + /** + * 获得指定参数类型在方法参数中的位置 + * + * @param method 指定方法 + * @param paramType 参数类型 + * @return 位置 + */ + private Integer getUniqueParamIndex(Method method, Class paramType) { + Integer index = null; + // 遍历方法参数 + final Class[] argTypes = method.getParameterTypes(); + for (int i = 0; i < argTypes.length; i++) { + if (paramType.isAssignableFrom(argTypes[i])) { // 类型符合 + // 获得第一次的位置 + if (index == null) { + index = i; + // 如果重复类型了,则抛出 BindingException 异常 + } else { + throw new BindingException(method.getName() + " cannot have multiple " + paramType.getSimpleName() + " parameters"); + } + } + } + return index; + } + + /** + * @param method 方法 + * @return 获得注解的 {@link MapKey#value()} + */ + private String getMapKey(Method method) { + String mapKey = null; + // 返回类型为 Map + if (Map.class.isAssignableFrom(method.getReturnType())) { + // 使用 @MapKey 注解 + final MapKey mapKeyAnnotation = method.getAnnotation(MapKey.class); + // 获得 @MapKey 注解的键 + if (mapKeyAnnotation != null) { + mapKey = mapKeyAnnotation.value(); + } + } + return mapKey; + } + } + +} diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/binding/MapperProxy.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/binding/MapperProxy.java new file mode 100644 index 0000000..cc2b95f --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/binding/MapperProxy.java @@ -0,0 +1,108 @@ +/** + * Copyright 2009-2018 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.binding; + +import org.apache.ibatis.reflection.ExceptionUtil; +import org.apache.ibatis.session.SqlSession; + +import java.io.Serializable; +import java.lang.invoke.MethodHandles; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.Map; + +/** + * Mapper Proxy + * + * @author Clinton Begin + * @author Eduardo Macarron + */ +public class MapperProxy implements InvocationHandler, Serializable { + + private static final long serialVersionUID = -6424540398559729838L; + + /** + * SqlSession 对象 + */ + private final SqlSession sqlSession; + /** + * Mapper 接口 + */ + private final Class mapperInterface; + /** + * 方法与 MapperMethod 的映射 + * + * 从 {@link MapperProxyFactory#methodCache} 传递过来 + */ + private final Map methodCache; + + // 构造,传入了SqlSession,说明每个session中的代理对象的不同的! + public MapperProxy(SqlSession sqlSession, Class mapperInterface, Map methodCache) { + this.sqlSession = sqlSession; + this.mapperInterface = mapperInterface; + this.methodCache = methodCache; + } + + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + try { + // 如果是 Object 定义的方法,直接调用 + if (Object.class.equals(method.getDeclaringClass())) { + return method.invoke(this, args); + + } else if (isDefaultMethod(method)) { + return invokeDefaultMethod(proxy, method, args); + } + } catch (Throwable t) { + throw ExceptionUtil.unwrapThrowable(t); + } + // 获得 MapperMethod 对象 + final MapperMethod mapperMethod = cachedMapperMethod(method); + // 重点在这:MapperMethod最终调用了执行的方法 + return mapperMethod.execute(sqlSession, args); + } + + private MapperMethod cachedMapperMethod(Method method) { + return methodCache.computeIfAbsent(method, k -> new MapperMethod(mapperInterface, method, sqlSession.getConfiguration())); + } + + private Object invokeDefaultMethod(Object proxy, Method method, Object[] args) + throws Throwable { + final Constructor constructor = MethodHandles.Lookup.class + .getDeclaredConstructor(Class.class, int.class); + if (!constructor.isAccessible()) { + constructor.setAccessible(true); + } + final Class declaringClass = method.getDeclaringClass(); + return constructor + .newInstance(declaringClass, + MethodHandles.Lookup.PRIVATE | MethodHandles.Lookup.PROTECTED + | MethodHandles.Lookup.PACKAGE | MethodHandles.Lookup.PUBLIC) + .unreflectSpecial(method, declaringClass).bindTo(proxy).invokeWithArguments(args); + } + + /** + * Backport of java.lang.reflect.Method#isDefault() + */ + private boolean isDefaultMethod(Method method) { + return (method.getModifiers() + & (Modifier.ABSTRACT | Modifier.PUBLIC | Modifier.STATIC)) == Modifier.PUBLIC + && method.getDeclaringClass().isInterface(); + } + +} diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/binding/MapperProxyFactory.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/binding/MapperProxyFactory.java new file mode 100644 index 0000000..6781859 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/binding/MapperProxyFactory.java @@ -0,0 +1,67 @@ +/** + * Copyright 2009-2018 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.binding; + +import org.apache.ibatis.session.SqlSession; + +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * Mapper Proxy 工厂类 + * + * @author Lasse Voss + */ +public class MapperProxyFactory { + + /** + * Mapper 接口 + */ + private final Class mapperInterface; + /** + * 方法与 MapperMethod 的映射 + */ + private final Map methodCache = new ConcurrentHashMap<>(); + + public MapperProxyFactory(Class mapperInterface) { + this.mapperInterface = mapperInterface; + } + + public Class getMapperInterface() { + return mapperInterface; + } + + public Map getMethodCache() { + return methodCache; + } + + @SuppressWarnings("unchecked") + protected T newInstance(MapperProxy mapperProxy) { + + return (T) Proxy.newProxyInstance(mapperInterface.getClassLoader(), new Class[]{mapperInterface}, mapperProxy); + } + + //MapperProxyFactory类中的newInstance方法 + public T newInstance(SqlSession sqlSession) { + // 创建了JDK动态代理的invocationHandler接口的实现类mapperProxy + final MapperProxy mapperProxy = new MapperProxy<>(sqlSession, mapperInterface, methodCache); + // 调用了重载方法 + return newInstance(mapperProxy); + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/binding/MapperRegistry.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/binding/MapperRegistry.java new file mode 100644 index 0000000..4462dbc --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/binding/MapperRegistry.java @@ -0,0 +1,128 @@ +/** + * Copyright 2009-2018 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.binding; + +import org.apache.ibatis.builder.annotation.MapperAnnotationBuilder; +import org.apache.ibatis.io.ResolverUtil; +import org.apache.ibatis.session.Configuration; +import org.apache.ibatis.session.SqlSession; + +import java.util.*; + +/** + * Mapper 注册表 + * + * @author Clinton Begin + * @author Eduardo Macarron + * @author Lasse Voss + */ +public class MapperRegistry { + + /** + * MyBatis Configuration 对象 + */ + private final Configuration config; + /** + * MapperProxyFactory 的映射 + * + * KEY:Mapper 接口 + */ + //这个类中维护一个HashMap存放MapperProxyFactory + private final Map, MapperProxyFactory> knownMappers = new HashMap<>(); + + public MapperRegistry(Configuration config) { + this.config = config; + } + + @SuppressWarnings("unchecked") + public T getMapper(Class type, SqlSession sqlSession) { + // 获得 MapperProxyFactory 对象 + final MapperProxyFactory mapperProxyFactory = (MapperProxyFactory) knownMappers.get(type); + // 不存在,则抛出 BindingException 异常 + if (mapperProxyFactory == null) { + throw new BindingException("Type " + type + " is not known to the MapperRegistry."); + } + /// 通过动态代理工厂生成实例。 + try { + return mapperProxyFactory.newInstance(sqlSession); + } catch (Exception e) { + throw new BindingException("Error getting mapper instance. Cause: " + e, e); + } + } + + public boolean hasMapper(Class type) { + return knownMappers.containsKey(type); + } + + public void addMapper(Class type) { + // 判断,必须是接口。 + if (type.isInterface()) { + // 已经添加过,则抛出 BindingException 异常 + if (hasMapper(type)) { + throw new BindingException("Type " + type + " is already known to the MapperRegistry."); + } + boolean loadCompleted = false; + try { + // 添加到 knownMappers 中 + knownMappers.put(type, new MapperProxyFactory<>(type)); + // It's important that the type is added before the parser is run + // otherwise the binding may automatically be attempted by the + // mapper parser. If the type is already known, it won't try. + // 解析 Mapper 的注解配置 + MapperAnnotationBuilder parser = new MapperAnnotationBuilder(config, type); + parser.parse(); + // 标记加载完成 + loadCompleted = true; + } finally { + // 若加载未完成,从 knownMappers 中移除 + if (!loadCompleted) { + knownMappers.remove(type); + } + } + } + } + + /** + * @since 3.2.2 + */ + public Collection> getMappers() { + return Collections.unmodifiableCollection(knownMappers.keySet()); + } + + /** + * 扫描指定包,并将符合的类,添加到 {@link #knownMappers} 中 + * + * @since 3.2.2 + */ + public void addMappers(String packageName, Class superType) { + // 扫描指定包下的指定类 + ResolverUtil> resolverUtil = new ResolverUtil<>(); + resolverUtil.find(new ResolverUtil.IsA(superType), packageName); + Set>> mapperSet = resolverUtil.getClasses(); + // 遍历,添加到 knownMappers 中 + for (Class mapperClass : mapperSet) { + addMapper(mapperClass); + } + } + + /** + * @since 3.2.2 + */ + public void addMappers(String packageName) { + addMappers(packageName, Object.class); + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/binding/package-info.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/binding/package-info.java new file mode 100644 index 0000000..48fac33 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/binding/package-info.java @@ -0,0 +1,19 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Bings mapper interfaces with mapped statements + */ +package org.apache.ibatis.binding; diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/BaseBuilder.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/BaseBuilder.java new file mode 100644 index 0000000..251c856 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/BaseBuilder.java @@ -0,0 +1,173 @@ +/** + * Copyright 2009-2018 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.builder; + +import org.apache.ibatis.mapping.ParameterMode; +import org.apache.ibatis.mapping.ResultSetType; +import org.apache.ibatis.session.Configuration; +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.TypeAliasRegistry; +import org.apache.ibatis.type.TypeHandler; +import org.apache.ibatis.type.TypeHandlerRegistry; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; +import java.util.regex.Pattern; + +/** + * 基础构造器抽象类,为子类提供通用的工具类 + * + * @author Clinton Begin + */ +public abstract class BaseBuilder { + + /** + * MyBatis Configuration 对象 + */ + protected final Configuration configuration; + protected final TypeAliasRegistry typeAliasRegistry; + protected final TypeHandlerRegistry typeHandlerRegistry; + + public BaseBuilder(Configuration configuration) { + this.configuration = configuration; + this.typeAliasRegistry = this.configuration.getTypeAliasRegistry(); + this.typeHandlerRegistry = this.configuration.getTypeHandlerRegistry(); + } + + public Configuration getConfiguration() { + return configuration; + } + + /** + * 创建正则表达式 + * + * @param regex 指定表达式 + * @param defaultValue 默认表达式 + * @return 正则表达式 + */ + @SuppressWarnings("SameParameterValue") + protected Pattern parseExpression(String regex, String defaultValue) { + return Pattern.compile(regex == null ? defaultValue : regex); + } + + protected Boolean booleanValueOf(String value, Boolean defaultValue) { + return value == null ? defaultValue : Boolean.valueOf(value); + } + + @SuppressWarnings("SameParameterValue") + protected Integer integerValueOf(String value, Integer defaultValue) { + return value == null ? defaultValue : Integer.valueOf(value); + } + + @SuppressWarnings("SameParameterValue") + protected Set stringSetValueOf(String value, String defaultValue) { + value = (value == null ? defaultValue : value); + return new HashSet<>(Arrays.asList(value.split(","))); + } + + protected JdbcType resolveJdbcType(String alias) { + if (alias == null) { + return null; + } + try { + return JdbcType.valueOf(alias); + } catch (IllegalArgumentException e) { + throw new BuilderException("Error resolving JdbcType. Cause: " + e, e); + } + } + + protected ResultSetType resolveResultSetType(String alias) { + if (alias == null) { + return null; + } + try { + return ResultSetType.valueOf(alias); + } catch (IllegalArgumentException e) { + throw new BuilderException("Error resolving ResultSetType. Cause: " + e, e); + } + } + + protected ParameterMode resolveParameterMode(String alias) { + if (alias == null) { + return null; + } + try { + return ParameterMode.valueOf(alias); + } catch (IllegalArgumentException e) { + throw new BuilderException("Error resolving ParameterMode. Cause: " + e, e); + } + } + + protected Object createInstance(String alias) { + // 获得对应的类型 + Class clazz = resolveClass(alias); + if (clazz == null) { + return null; + } + try { + // 创建对象 + return resolveClass(alias).newInstance(); // 这里重复获得了一次 + } catch (Exception e) { + throw new BuilderException("Error creating instance. Cause: " + e, e); + } + } + + protected Class resolveClass(String alias) { + if (alias == null) { + return null; + } + try { + return resolveAlias(alias); + } catch (Exception e) { + throw new BuilderException("Error resolving class. Cause: " + e, e); + } + } + + protected TypeHandler resolveTypeHandler(Class javaType, String typeHandlerAlias) { + if (typeHandlerAlias == null) { + return null; + } + // 获得对应的类 + Class type = resolveClass(typeHandlerAlias); + // 判断是否继承 TypeHandler 类,则抛出 BuilderException 异常 + if (type != null && !TypeHandler.class.isAssignableFrom(type)) { + throw new BuilderException("Type " + type.getName() + " is not a valid TypeHandler because it does not implement TypeHandler interface"); + } + @SuppressWarnings("unchecked") // already verified it is a TypeHandler + // 获得对应的 TypeHandler 对象 + Class> typeHandlerType = (Class>) type; + return resolveTypeHandler(javaType, typeHandlerType); + } + + protected TypeHandler resolveTypeHandler(Class javaType, Class> typeHandlerType) { + if (typeHandlerType == null) { + return null; + } + // javaType ignored for injected handlers see issue #746 for full detail + // 先获得 TypeHandler 对象 + TypeHandler handler = typeHandlerRegistry.getMappingTypeHandler(typeHandlerType); + if (handler == null) { // 如果不存在,进行创建 TypeHandler 对象 + // not in registry, create a new one + handler = typeHandlerRegistry.getInstance(javaType, typeHandlerType); + } + return handler; + } + + protected Class resolveAlias(String alias) { + return typeAliasRegistry.resolveAlias(alias); + } +} diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/BuilderException.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/BuilderException.java new file mode 100644 index 0000000..1d0eb80 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/BuilderException.java @@ -0,0 +1,46 @@ +/** + * Copyright 2009-2015 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.builder; + +import org.apache.ibatis.exceptions.PersistenceException; + +/** + * 构造异常 + * + * + * @author Clinton Begin + */ +public class BuilderException extends PersistenceException { + + private static final long serialVersionUID = -3885164021020443281L; + + public BuilderException() { + super(); + } + + public BuilderException(String message) { + super(message); + } + + public BuilderException(String message, Throwable cause) { + super(message, cause); + } + + public BuilderException(Throwable cause) { + super(cause); + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/CacheRefResolver.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/CacheRefResolver.java new file mode 100644 index 0000000..a2d564d --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/CacheRefResolver.java @@ -0,0 +1,42 @@ +/** + * Copyright 2009-2015 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.builder; + +import org.apache.ibatis.cache.Cache; + +/** + * Cache 指向解析器 + * + * @author Clinton Begin + */ +public class CacheRefResolver { + + private final MapperBuilderAssistant assistant; + /** + * Cache 指向的命名空间 + */ + private final String cacheRefNamespace; + + public CacheRefResolver(MapperBuilderAssistant assistant, String cacheRefNamespace) { + this.assistant = assistant; + this.cacheRefNamespace = cacheRefNamespace; + } + + public Cache resolveCacheRef() { + return assistant.useCacheRef(cacheRefNamespace); + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/IncompleteElementException.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/IncompleteElementException.java new file mode 100644 index 0000000..0a22dd7 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/IncompleteElementException.java @@ -0,0 +1,43 @@ +/** + * Copyright 2009-2015 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.builder; + +/** + * 不完整元素异常 + * + * @author Eduardo Macarron + */ +public class IncompleteElementException extends BuilderException { + + private static final long serialVersionUID = -3697292286890900315L; + + public IncompleteElementException() { + super(); + } + + public IncompleteElementException(String message, Throwable cause) { + super(message, cause); + } + + public IncompleteElementException(String message) { + super(message); + } + + public IncompleteElementException(Throwable cause) { + super(cause); + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/InitializingObject.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/InitializingObject.java new file mode 100644 index 0000000..0725b53 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/InitializingObject.java @@ -0,0 +1,39 @@ +/** + * Copyright 2009-2016 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.builder; + +/** + * Interface that indicate to provide a initialization method. + * + * 初始化对象的接口 + * + * @since 3.4.2 + * @author Kazuki Shimizu + */ +public interface InitializingObject { + + /** + * 初始化对象 + * + * Initialize a instance. + *

+ * This method will be invoked after it has set all properties. + *

+ * @throws Exception in the event of misconfiguration (such as failure to set an essential property) or if initialization fails + */ + void initialize() throws Exception; + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/MapperBuilderAssistant.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/MapperBuilderAssistant.java new file mode 100644 index 0000000..def9eec --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/MapperBuilderAssistant.java @@ -0,0 +1,584 @@ +/** + * Copyright 2009-2018 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.builder; + +import org.apache.ibatis.cache.Cache; +import org.apache.ibatis.cache.decorators.LruCache; +import org.apache.ibatis.cache.impl.PerpetualCache; +import org.apache.ibatis.executor.ErrorContext; +import org.apache.ibatis.executor.keygen.KeyGenerator; +import org.apache.ibatis.mapping.*; +import org.apache.ibatis.reflection.MetaClass; +import org.apache.ibatis.scripting.LanguageDriver; +import org.apache.ibatis.session.Configuration; +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.TypeHandler; + +import java.util.*; + +/** + * Mapper 构造器的小助手,提供了一些公用的方法,例如创建 ParameterMap、MappedStatement 对象等等。 + * + * @author Clinton Begin + */ +public class MapperBuilderAssistant extends BaseBuilder { + + /** + * 当前 Mapper 命名空间 + */ + private String currentNamespace; + /** + * 资源引用的地址 + */ + private final String resource; + /** + * 当前 Cache 对象 + */ + private Cache currentCache; + /** + * 是否未解析成功 Cache 引用 + */ + private boolean unresolvedCacheRef; // issue #676 + + public MapperBuilderAssistant(Configuration configuration, String resource) { + super(configuration); + ErrorContext.instance().resource(resource); + this.resource = resource; + } + + public String getCurrentNamespace() { + return currentNamespace; + } + + public void setCurrentNamespace(String currentNamespace) { + // 如果传入的 currentNamespace 参数为空,抛出 BuilderException 异常 + if (currentNamespace == null) { + throw new BuilderException("The mapper element requires a namespace attribute to be specified."); + } + + // 如果当前已经设置,并且还和传入的不相等,抛出 BuilderException 异常 + if (this.currentNamespace != null && !this.currentNamespace.equals(currentNamespace)) { + throw new BuilderException("Wrong namespace. Expected '" + + this.currentNamespace + "' but found '" + currentNamespace + "'."); + } + + // 设置 + this.currentNamespace = currentNamespace; + } + + public String applyCurrentNamespace(String base, boolean isReference) { + if (base == null) { + return null; + } + if (isReference) { + // is it qualified with any namespace yet? + if (base.contains(".")) { + return base; + } + } else { + // is it qualified with this namespace yet? + if (base.startsWith(currentNamespace + ".")) { + return base; + } + if (base.contains(".")) { + throw new BuilderException("Dots are not allowed in element names, please remove it from " + base); + } + } + // 拼接 currentNamespace + base + return currentNamespace + "." + base; + } + + /** + * 获得指向的 Cache 对象 + * + * @param namespace 指向的命名空间 + * @return Cache 对象 + */ + public Cache useCacheRef(String namespace) { + if (namespace == null) { + throw new BuilderException("cache-ref element requires a namespace attribute."); + } + try { + unresolvedCacheRef = true; // 标记未解决 + // 获得 Cache 对象 + Cache cache = configuration.getCache(namespace); + // 获得不到,抛出 IncompleteElementException 异常 + if (cache == null) { + throw new IncompleteElementException("No cache for namespace '" + namespace + "' could be found."); + } + // 记录当前 Cache 对象 + currentCache = cache; + unresolvedCacheRef = false; // 标记已解决 + return cache; + } catch (IllegalArgumentException e) { + throw new IncompleteElementException("No cache for namespace '" + namespace + "' could be found.", e); + } + } + + /** + * 创建 Cache 对象 + * + * @param typeClass 负责存储的 Cache 实现类 + * @param evictionClass 负责过期的 Cache 实现类 + * @param flushInterval 清空缓存的频率。0 代表不清空 + * @param size 缓存容器大小 + * @param readWrite 是否序列化 + * @param blocking 是否阻塞 + * @param props Properties 对象 + * @return Cache 对象 + */ + public Cache useNewCache(Class typeClass, + Class evictionClass, + Long flushInterval, + Integer size, + boolean readWrite, + boolean blocking, + Properties props) { + + // 1.生成Cache对象 + Cache cache = new CacheBuilder(currentNamespace) + //这里如果我们定义了中的type,就使用自定义的Cache,否则使用和一级缓存相同的PerpetualCache + .implementation(valueOrDefault(typeClass, PerpetualCache.class)) + .addDecorator(valueOrDefault(evictionClass, LruCache.class)) + .clearInterval(flushInterval) + .size(size) + .readWrite(readWrite) + .blocking(blocking) + .properties(props) + .build(); + // 2.添加到Configuration中 + configuration.addCache(cache); + // 3.并将cache赋值给MapperBuilderAssistant.currentCache + currentCache = cache; + return cache; + } + + // 可以不看,因为 ParameterMap 官方不建议使用 + public ParameterMap addParameterMap(String id, Class parameterClass, List parameterMappings) { + id = applyCurrentNamespace(id, false); + ParameterMap parameterMap = new ParameterMap.Builder(configuration, id, parameterClass, parameterMappings).build(); + configuration.addParameterMap(parameterMap); + return parameterMap; + } + + // 可以不看,因为 ParameterMap 官方不建议使用 + public ParameterMapping buildParameterMapping( + Class parameterType, + String property, + Class javaType, + JdbcType jdbcType, + String resultMap, + ParameterMode parameterMode, + Class> typeHandler, + Integer numericScale) { + resultMap = applyCurrentNamespace(resultMap, true); + + // Class parameterType = parameterMapBuilder.type(); + Class javaTypeClass = resolveParameterJavaType(parameterType, property, javaType, jdbcType); + TypeHandler typeHandlerInstance = resolveTypeHandler(javaTypeClass, typeHandler); + + return new ParameterMapping.Builder(configuration, property, javaTypeClass) + .jdbcType(jdbcType) + .resultMapId(resultMap) + .mode(parameterMode) + .numericScale(numericScale) + .typeHandler(typeHandlerInstance) + .build(); + } + + // 创建 ResultMap 对象,并添加到 Configuration 中。 + public ResultMap addResultMap( + String id, + Class type, + String extend, + Discriminator discriminator, + List resultMappings, + Boolean autoMapping) { + // 获得 ResultMap 编号,即格式为 `${namespace}.${id}` 。 + id = applyCurrentNamespace(id, false); + // 获取完整的 extend 属性,即格式为 `${namespace}.${extend}` 。从这里的逻辑来看,貌似只能自己 namespace 下的 ResultMap 。 + extend = applyCurrentNamespace(extend, true); + + // 如果有父类,则将父类的 ResultMap 集合,添加到 resultMappings 中。 + if (extend != null) { + // 获得 extend 对应的 ResultMap 对象。如果不存在,则抛出 IncompleteElementException 异常 + if (!configuration.hasResultMap(extend)) { + throw new IncompleteElementException("Could not find a parent resultmap with id '" + extend + "'"); + } + ResultMap resultMap = configuration.getResultMap(extend); + // 获取 extend 的 ResultMap 对象的 ResultMapping 集合,并移除 resultMappings + List extendedResultMappings = new ArrayList<>(resultMap.getResultMappings()); + extendedResultMappings.removeAll(resultMappings); + // Remove parent constructor if this resultMap declares a constructor. + // 判断当前的 resultMappings 是否有构造方法,如果有,则从 extendedResultMappings 移除所有的构造类型的 ResultMapping 们 + boolean declaresConstructor = false; + for (ResultMapping resultMapping : resultMappings) { + if (resultMapping.getFlags().contains(ResultFlag.CONSTRUCTOR)) { + declaresConstructor = true; + break; + } + } + if (declaresConstructor) { + extendedResultMappings.removeIf(resultMapping -> resultMapping.getFlags().contains(ResultFlag.CONSTRUCTOR)); + } + // 将 extendedResultMappings 添加到 resultMappings 中 + resultMappings.addAll(extendedResultMappings); + } + // 创建 ResultMap 对象 + ResultMap resultMap = new ResultMap.Builder(configuration, id, type, resultMappings, autoMapping) + .discriminator(discriminator) + .build(); + // 添加到 configuration 中 + configuration.addResultMap(resultMap); + return resultMap; + } + + // 构建 Discriminator 对象 + public Discriminator buildDiscriminator( + Class resultType, + String column, + Class javaType, + JdbcType jdbcType, + Class> typeHandler, + Map discriminatorMap) { + // 构建 ResultMapping 对象 + ResultMapping resultMapping = buildResultMapping( + resultType, + null, + column, + javaType, + jdbcType, + null, + null, + null, + null, + typeHandler, + new ArrayList(), + null, + null, + false); + // 创建 namespaceDiscriminatorMap 映射 + Map namespaceDiscriminatorMap = new HashMap<>(); + for (Map.Entry e : discriminatorMap.entrySet()) { + String resultMap = e.getValue(); + resultMap = applyCurrentNamespace(resultMap, true); // 生成 resultMap 标识 + namespaceDiscriminatorMap.put(e.getKey(), resultMap); + } + // 构建 Discriminator 对象 + return new Discriminator.Builder(configuration, resultMapping, namespaceDiscriminatorMap).build(); + } + + // 构建 MappedStatement 对象 + public MappedStatement addMappedStatement( + String id, + SqlSource sqlSource, + StatementType statementType, + SqlCommandType sqlCommandType, + Integer fetchSize, + Integer timeout, + String parameterMap, + Class parameterType, + String resultMap, + Class resultType, + ResultSetType resultSetType, + boolean flushCache, + boolean useCache, + boolean resultOrdered, + KeyGenerator keyGenerator, + String keyProperty, + String keyColumn, + String databaseId, + LanguageDriver lang, + String resultSets) { + + // 如果只想的 Cache 未解析,抛出 IncompleteElementException 异常 + if (unresolvedCacheRef) { + throw new IncompleteElementException("Cache-ref not yet resolved"); + } + + // 获得 id 编号,格式为 `${namespace}.${id}` + id = applyCurrentNamespace(id, false); + boolean isSelect = sqlCommandType == SqlCommandType.SELECT; + + // 创建 MappedStatement.Builder 对象 + MappedStatement.Builder statementBuilder = new MappedStatement.Builder(configuration, id, sqlSource, sqlCommandType) + .resource(resource) + .fetchSize(fetchSize) + .timeout(timeout) + .statementType(statementType) + .keyGenerator(keyGenerator) + .keyProperty(keyProperty) + .keyColumn(keyColumn) + .databaseId(databaseId) + .lang(lang) + .resultOrdered(resultOrdered) + .resultSets(resultSets) + .resultMaps(getStatementResultMaps(resultMap, resultType, id)) // 获得 ResultMap 集合 + .resultSetType(resultSetType) + .flushCacheRequired(valueOrDefault(flushCache, !isSelect)) + .useCache(valueOrDefault(useCache, isSelect)) + .cache(currentCache); // 在这里将之前生成的Cache封装到MappedStatement + + // 获得 ParameterMap ,并设置到 MappedStatement.Builder 中 + ParameterMap statementParameterMap = getStatementParameterMap(parameterMap, parameterType, id); + if (statementParameterMap != null) { + statementBuilder.parameterMap(statementParameterMap); + } + + // 创建 MappedStatement 对象 + MappedStatement statement = statementBuilder.build(); + // 添加到 configuration 中 + configuration.addMappedStatement(statement); + return statement; + } + + private T valueOrDefault(T value, T defaultValue) { + return value == null ? defaultValue : value; + } + + // 获得 ParameterMap + private ParameterMap getStatementParameterMap( + String parameterMapName, + Class parameterTypeClass, + String statementId) { + // 获得 ParameterMap 的编号,格式为 `${namespace}.${parameterMapName}` + parameterMapName = applyCurrentNamespace(parameterMapName, true); + ParameterMap parameterMap = null; + // 如果 parameterMapName 非空,则获得 parameterMapName 对应的 ParameterMap 对象 + if (parameterMapName != null) { + try { + parameterMap = configuration.getParameterMap(parameterMapName); + } catch (IllegalArgumentException e) { + throw new IncompleteElementException("Could not find parameter map " + parameterMapName, e); + } + // 如果 parameterTypeClass 非空,则创建 ParameterMap 对象 + } else if (parameterTypeClass != null) { + List parameterMappings = new ArrayList<>(); + parameterMap = new ParameterMap.Builder( + configuration, + statementId + "-Inline", + parameterTypeClass, + parameterMappings).build(); + } + return parameterMap; + } + + // 获得 ResultMap 集合 + private List getStatementResultMaps( + String resultMap, + Class resultType, + String statementId) { + // 获得 resultMap 的编号 + resultMap = applyCurrentNamespace(resultMap, true); + + // 创建 ResultMap 集合 + List resultMaps = new ArrayList<>(); + // 如果 resultMap 非空,则获得 resultMap 对应的 ResultMap 对象(们) + if (resultMap != null) { + String[] resultMapNames = resultMap.split(","); + for (String resultMapName : resultMapNames) { + try { + resultMaps.add(configuration.getResultMap(resultMapName.trim())); // 从 configuration 中获得 + } catch (IllegalArgumentException e) { + throw new IncompleteElementException("Could not find result map " + resultMapName, e); + } + } + // 如果 resultType 非空,则创建 ResultMap 对象 + } else if (resultType != null) { + ResultMap inlineResultMap = new ResultMap.Builder( + configuration, + statementId + "-Inline", + resultType, + new ArrayList<>(), + null).build(); + resultMaps.add(inlineResultMap); + } + return resultMaps; + } + + // 构造 ResultMapping 对象 + public ResultMapping buildResultMapping( + Class resultType, + String property, + String column, + Class javaType, + JdbcType jdbcType, + String nestedSelect, + String nestedResultMap, + String notNullColumn, + String columnPrefix, + Class> typeHandler, + List flags, + String resultSet, + String foreignColumn, + boolean lazy) { + // 解析对应的 Java Type 类和 TypeHandler 对象 + Class javaTypeClass = resolveResultJavaType(resultType, property, javaType); + TypeHandler typeHandlerInstance = resolveTypeHandler(javaTypeClass, typeHandler); + // 解析组合字段名称成 ResultMapping 集合。涉及「关联的嵌套查询」 + List composites = parseCompositeColumnName(column); + // 创建 ResultMapping 对象 + return new ResultMapping.Builder(configuration, property, column, javaTypeClass) + .jdbcType(jdbcType) + .nestedQueryId(applyCurrentNamespace(nestedSelect, true)) + .nestedResultMapId(applyCurrentNamespace(nestedResultMap, true)) + .resultSet(resultSet) + .typeHandler(typeHandlerInstance) + .flags(flags == null ? new ArrayList<>() : flags) + .composites(composites) + .notNullColumns(parseMultipleColumnNames(notNullColumn)) + .columnPrefix(columnPrefix) + .foreignColumn(foreignColumn) + .lazy(lazy) + .build(); + } + + + private Set parseMultipleColumnNames(String columnName) { + Set columns = new HashSet<>(); + if (columnName != null) { + // 多个字段,使用 ,分隔 + if (columnName.indexOf(',') > -1) { + StringTokenizer parser = new StringTokenizer(columnName, "{}, ", false); + while (parser.hasMoreTokens()) { + String column = parser.nextToken(); + columns.add(column); + } + } else { + columns.add(columnName); + } + } + return columns; + } + + // 解析组合字段名称成 ResultMapping 集合。涉及「关联的嵌套查询」 + // 例如 column= ” {prop1=col1,prop2=col2} ” + private List parseCompositeColumnName(String columnName) { + List composites = new ArrayList<>(); + // 分词,解析其中的 property 和 column 的组合对 + if (columnName != null && (columnName.indexOf('=') > -1 || columnName.indexOf(',') > -1)) { + StringTokenizer parser = new StringTokenizer(columnName, "{}=, ", false); + while (parser.hasMoreTokens()) { + String property = parser.nextToken(); + String column = parser.nextToken(); + // 创建 ResultMapping 对象 + ResultMapping complexResultMapping = new ResultMapping.Builder( + configuration, property, column, configuration.getTypeHandlerRegistry().getUnknownTypeHandler()).build(); + // 添加到 composites 中 + composites.add(complexResultMapping); + } + } + return composites; + } + + private Class resolveResultJavaType(Class resultType, String property, Class javaType) { + if (javaType == null && property != null) { + try { + MetaClass metaResultType = MetaClass.forClass(resultType, configuration.getReflectorFactory()); + javaType = metaResultType.getSetterType(property); + } catch (Exception e) { + //ignore, following null check statement will deal with the situation + } + } + if (javaType == null) { + javaType = Object.class; + } + return javaType; + } + + private Class resolveParameterJavaType(Class resultType, String property, Class javaType, JdbcType jdbcType) { + if (javaType == null) { + if (JdbcType.CURSOR.equals(jdbcType)) { + javaType = java.sql.ResultSet.class; + } else if (Map.class.isAssignableFrom(resultType)) { + javaType = Object.class; + } else { + MetaClass metaResultType = MetaClass.forClass(resultType, configuration.getReflectorFactory()); + javaType = metaResultType.getGetterType(property); + } + } + if (javaType == null) { + javaType = Object.class; + } + return javaType; + } + + /** Backward compatibility signature */ + @Deprecated // add by 芋艿 保持兼容,目前未调用 + public ResultMapping buildResultMapping( + Class resultType, + String property, + String column, + Class javaType, + JdbcType jdbcType, + String nestedSelect, + String nestedResultMap, + String notNullColumn, + String columnPrefix, + Class> typeHandler, + List flags) { + return buildResultMapping( + resultType, property, column, javaType, jdbcType, nestedSelect, + nestedResultMap, notNullColumn, columnPrefix, typeHandler, flags, null, null, configuration.isLazyLoadingEnabled()); + } + + /** + * 获得对应的 LanguageDriver 对象 + * + * @param langClass 指定类 + * @return LanguageDriver 对象 + */ + public LanguageDriver getLanguageDriver(Class langClass) { + // 获得 langClass 类 + if (langClass != null) { + configuration.getLanguageRegistry().register(langClass); + } else { // 如果为空,则使用默认类 + langClass = configuration.getLanguageRegistry().getDefaultDriverClass(); + } + // 获得 LanguageDriver 对象 + return configuration.getLanguageRegistry().getDriver(langClass); + } + + /** Backward compatibility signature */ + @Deprecated // add by 芋艿 保持兼容,目前未调用 + public MappedStatement addMappedStatement( + String id, + SqlSource sqlSource, + StatementType statementType, + SqlCommandType sqlCommandType, + Integer fetchSize, + Integer timeout, + String parameterMap, + Class parameterType, + String resultMap, + Class resultType, + ResultSetType resultSetType, + boolean flushCache, + boolean useCache, + boolean resultOrdered, + KeyGenerator keyGenerator, + String keyProperty, + String keyColumn, + String databaseId, + LanguageDriver lang) { + return addMappedStatement( + id, sqlSource, statementType, sqlCommandType, fetchSize, timeout, + parameterMap, parameterType, resultMap, resultType, resultSetType, + flushCache, useCache, resultOrdered, keyGenerator, keyProperty, + keyColumn, databaseId, lang, null); + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/ParameterExpression.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/ParameterExpression.java new file mode 100644 index 0000000..b60cefb --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/ParameterExpression.java @@ -0,0 +1,144 @@ +/** + * Copyright 2009-2016 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.builder; + +import java.util.HashMap; + +/** + * 参数表达式 + * + * Inline parameter expression parser. Supported grammar (simplified): + * + *

+ * inline-parameter = (propertyName | expression) oldJdbcType attributes
+ * propertyName = /expression language's property navigation path/
+ * expression = '(' /expression language's expression/ ')'
+ * oldJdbcType = ':' /any valid jdbc type/
+ * attributes = (',' attribute)*
+ * attribute = name '=' value
+ * 
+ * + * @author Frank D. Martinez [mnesarco] + */ +public class ParameterExpression extends HashMap { + + private static final long serialVersionUID = -2417552199605158680L; + + public ParameterExpression(String expression) { + // 解析表达式 + parse(expression); + } + + private void parse(String expression) { + int p = skipWS(expression, 0); + // 如果是 ( 字母, + if (expression.charAt(p) == '(') { + expression(expression, p + 1); + } else { + property(expression, p); + } + } + + private void expression(String expression, int left) { + int match = 1; + int right = left + 1; + while (match > 0) { + if (expression.charAt(right) == ')') { + match--; + } else if (expression.charAt(right) == '(') { + match++; + } + right++; + } + put("expression", expression.substring(left, right - 1)); + jdbcTypeOpt(expression, right); + } + + private void property(String expression, int left) { + if (left < expression.length()) { + int right = skipUntil(expression, left, ",:"); + put("property", trimmedStr(expression, left, right)); + jdbcTypeOpt(expression, right); + } + } + + private int skipWS(String expression, int p) { + for (int i = p; i < expression.length(); i++) { + if (expression.charAt(i) > 0x20) { + return i; + } + } + return expression.length(); + } + + private int skipUntil(String expression, int p, final String endChars) { + for (int i = p; i < expression.length(); i++) { + char c = expression.charAt(i); + if (endChars.indexOf(c) > -1) { + return i; + } + } + return expression.length(); + } + + private void jdbcTypeOpt(String expression, int p) { + p = skipWS(expression, p); + if (p < expression.length()) { + if (expression.charAt(p) == ':') { + jdbcType(expression, p + 1); + } else if (expression.charAt(p) == ',') { + option(expression, p + 1); + } else { + throw new BuilderException("Parsing error in {" + expression + "} in position " + p); + } + } + } + + private void jdbcType(String expression, int p) { + int left = skipWS(expression, p); + int right = skipUntil(expression, left, ","); + if (right > left) { + put("jdbcType", trimmedStr(expression, left, right)); + } else { + throw new BuilderException("Parsing error in {" + expression + "} in position " + p); + } + option(expression, right + 1); + } + + private void option(String expression, int p) { + int left = skipWS(expression, p); + if (left < expression.length()) { + int right = skipUntil(expression, left, "="); + String name = trimmedStr(expression, left, right); + left = right + 1; + right = skipUntil(expression, left, ","); + String value = trimmedStr(expression, left, right); + put(name, value); + option(expression, right + 1); + } + } + + private String trimmedStr(String str, int start, int end) { + while (str.charAt(start) <= 0x20) { + start++; + } + while (str.charAt(end - 1) <= 0x20) { + end--; + } + return start >= end ? "" : str.substring(start, end); + } + +} diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/ResultMapResolver.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/ResultMapResolver.java new file mode 100644 index 0000000..183b5f3 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/ResultMapResolver.java @@ -0,0 +1,71 @@ +/** + * Copyright 2009-2017 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.builder; + +import org.apache.ibatis.mapping.Discriminator; +import org.apache.ibatis.mapping.ResultMap; +import org.apache.ibatis.mapping.ResultMapping; + +import java.util.List; + +/** + * {@link ResultMap} 解析器 + * + * @author Eduardo Macarron + */ +public class ResultMapResolver { + + private final MapperBuilderAssistant assistant; + /** + * ResultMap 编号 + */ + private final String id; + /** + * 类型 + */ + private final Class type; + /** + * 继承自哪个 ResultMap + */ + private final String extend; + /** + * Discriminator 对象 + */ + private final Discriminator discriminator; + /** + * ResultMapping 集合 + */ + private final List resultMappings; + /** + * 是否自动匹配 + */ + private final Boolean autoMapping; + + public ResultMapResolver(MapperBuilderAssistant assistant, String id, Class type, String extend, Discriminator discriminator, List resultMappings, Boolean autoMapping) { + this.assistant = assistant; + this.id = id; + this.type = type; + this.extend = extend; + this.discriminator = discriminator; + this.resultMappings = resultMappings; + this.autoMapping = autoMapping; + } + + public ResultMap resolve() { + return assistant.addResultMap(this.id, this.type, this.extend, this.discriminator, this.resultMappings, this.autoMapping); + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/SqlSourceBuilder.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/SqlSourceBuilder.java new file mode 100644 index 0000000..2e8dc88 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/SqlSourceBuilder.java @@ -0,0 +1,169 @@ +/** + * Copyright 2009-2018 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.builder; + +import org.apache.ibatis.mapping.ParameterMapping; +import org.apache.ibatis.mapping.SqlSource; +import org.apache.ibatis.parsing.GenericTokenParser; +import org.apache.ibatis.parsing.TokenHandler; +import org.apache.ibatis.reflection.MetaClass; +import org.apache.ibatis.reflection.MetaObject; +import org.apache.ibatis.session.Configuration; +import org.apache.ibatis.type.JdbcType; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * {@link SqlSource} 构建器,负责将 SQL 语句中的 `#{}` 替换成相应的 ? 占位符,并获取该占位符对应的 {@link org.apache.ibatis.mapping.ParameterMapping} 对象 + * + * @author Clinton Begin + */ +public class SqlSourceBuilder extends BaseBuilder { + + private static final String parameterProperties = "javaType,jdbcType,mode,numericScale,resultMap,typeHandler,jdbcTypeName"; + + public SqlSourceBuilder(Configuration configuration) { + super(configuration); + } + + /** + * 执行解析原始 SQL ,成为 SqlSource 对象 + * + * @param originalSql 原始 SQL + * @param parameterType 参数类型 + * @param additionalParameters 附加参数集合。可能是空集合,也可能是 {@link org.apache.ibatis.scripting.xmltags.DynamicContext#bindings} 集合 + * @return SqlSource 对象 + */ + public SqlSource parse(String originalSql, Class parameterType, Map additionalParameters) { + // 创建 ParameterMappingTokenHandler 对象 + ParameterMappingTokenHandler handler = new ParameterMappingTokenHandler(configuration, parameterType, additionalParameters); + // 创建 GenericTokenParser 对象 + GenericTokenParser parser = new GenericTokenParser("#{", "}", handler); + // 执行解析 + String sql = parser.parse(originalSql); + // 创建 StaticSqlSource 对象 + return new StaticSqlSource(configuration, sql, handler.getParameterMappings()); + } + + private static class ParameterMappingTokenHandler extends BaseBuilder implements TokenHandler { + + /** + * ParameterMapping 数组 + */ + private List parameterMappings = new ArrayList<>(); + /** + * 参数类型 + */ + private Class parameterType; + /** + * additionalParameters 参数的对应的 MetaObject 对象 + */ + private MetaObject metaParameters; + + public ParameterMappingTokenHandler(Configuration configuration, Class parameterType, Map additionalParameters) { + super(configuration); + this.parameterType = parameterType; + // 创建 additionalParameters 参数的对应的 MetaObject 对象 + this.metaParameters = configuration.newMetaObject(additionalParameters); + } + + public List getParameterMappings() { + return parameterMappings; + } + + @Override + public String handleToken(String content) { + // 构建 ParameterMapping 对象,并添加到 parameterMappings 中 + parameterMappings.add(buildParameterMapping(content)); + // 返回 ? 占位符 + return "?"; + } + + private ParameterMapping buildParameterMapping(String content) { + // 解析成 Map 集合 + Map propertiesMap = parseParameterMapping(content); + // 获得属性的名字和类型 + String property = propertiesMap.get("property"); // 名字 + Class propertyType; // 类型 + if (metaParameters.hasGetter(property)) { // issue #448 get type from additional params + propertyType = metaParameters.getGetterType(property); + } else if (typeHandlerRegistry.hasTypeHandler(parameterType)) { + propertyType = parameterType; + } else if (JdbcType.CURSOR.name().equals(propertiesMap.get("jdbcType"))) { + propertyType = java.sql.ResultSet.class; + } else if (property == null || Map.class.isAssignableFrom(parameterType)) { + propertyType = Object.class; + } else { + MetaClass metaClass = MetaClass.forClass(parameterType, configuration.getReflectorFactory()); + if (metaClass.hasGetter(property)) { + propertyType = metaClass.getGetterType(property); + } else { + propertyType = Object.class; + } + } + // 创建 ParameterMapping.Builder 对象 + ParameterMapping.Builder builder = new ParameterMapping.Builder(configuration, property, propertyType); + // 初始化 ParameterMapping.Builder 对象的属性 + Class javaType = propertyType; + String typeHandlerAlias = null; + for (Map.Entry entry : propertiesMap.entrySet()) { + String name = entry.getKey(); + String value = entry.getValue(); + if ("javaType".equals(name)) { + javaType = resolveClass(value); + builder.javaType(javaType); + } else if ("jdbcType".equals(name)) { + builder.jdbcType(resolveJdbcType(value)); + } else if ("mode".equals(name)) { + builder.mode(resolveParameterMode(value)); + } else if ("numericScale".equals(name)) { + builder.numericScale(Integer.valueOf(value)); + } else if ("resultMap".equals(name)) { + builder.resultMapId(value); + } else if ("typeHandler".equals(name)) { + typeHandlerAlias = value; + } else if ("jdbcTypeName".equals(name)) { + builder.jdbcTypeName(value); + } else if ("property".equals(name)) { + // Do Nothing + } else if ("expression".equals(name)) { + throw new BuilderException("Expression based parameters are not supported yet"); + } else { + throw new BuilderException("An invalid property '" + name + "' was found in mapping #{" + content + "}. Valid properties are " + parameterProperties); + } + } + // 如果 typeHandlerAlias 非空,则获得对应的 TypeHandler 对象,并设置到 ParameterMapping.Builder 对象中 + if (typeHandlerAlias != null) { + builder.typeHandler(resolveTypeHandler(javaType, typeHandlerAlias)); + } + // 创建 ParameterMapping 对象 + return builder.build(); + } + + private Map parseParameterMapping(String content) { + try { + return new ParameterExpression(content); + } catch (BuilderException ex) { + throw ex; + } catch (Exception ex) { + throw new BuilderException("Parsing error was found in mapping #{" + content + "}. Check syntax #{property|(expression), var1=value1, var2=value2, ...} ", ex); + } + } + } + +} diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/StaticSqlSource.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/StaticSqlSource.java new file mode 100644 index 0000000..52b8b2b --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/StaticSqlSource.java @@ -0,0 +1,58 @@ +/** + * Copyright 2009-2017 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.builder; + +import org.apache.ibatis.mapping.BoundSql; +import org.apache.ibatis.mapping.ParameterMapping; +import org.apache.ibatis.mapping.SqlSource; +import org.apache.ibatis.session.Configuration; + +import java.util.List; + +/** + * 静态的 SqlSource 实现类 + * + * @author Clinton Begin + */ +public class StaticSqlSource implements SqlSource { + + /** + * 静态的 SQL + */ + private final String sql; + /** + * ParameterMapping 集合 + */ + private final List parameterMappings; + private final Configuration configuration; + + public StaticSqlSource(Configuration configuration, String sql) { + this(configuration, sql, null); + } + + public StaticSqlSource(Configuration configuration, String sql, List parameterMappings) { + this.sql = sql; + this.parameterMappings = parameterMappings; + this.configuration = configuration; + } + + @Override + public BoundSql getBoundSql(Object parameterObject) { + // 创建 BoundSql 对象 + return new BoundSql(configuration, sql, parameterMappings, parameterObject); + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/annotation/MapperAnnotationBuilder.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/annotation/MapperAnnotationBuilder.java new file mode 100644 index 0000000..448b135 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/annotation/MapperAnnotationBuilder.java @@ -0,0 +1,888 @@ +/** + * Copyright 2009-2018 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.builder.annotation; + +import org.apache.ibatis.annotations.*; +import org.apache.ibatis.annotations.Options.FlushCachePolicy; +import org.apache.ibatis.annotations.ResultMap; +import org.apache.ibatis.binding.BindingException; +import org.apache.ibatis.binding.MapperMethod.ParamMap; +import org.apache.ibatis.builder.BuilderException; +import org.apache.ibatis.builder.IncompleteElementException; +import org.apache.ibatis.builder.MapperBuilderAssistant; +import org.apache.ibatis.builder.xml.XMLMapperBuilder; +import org.apache.ibatis.cursor.Cursor; +import org.apache.ibatis.executor.keygen.Jdbc3KeyGenerator; +import org.apache.ibatis.executor.keygen.KeyGenerator; +import org.apache.ibatis.executor.keygen.NoKeyGenerator; +import org.apache.ibatis.executor.keygen.SelectKeyGenerator; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.mapping.*; +import org.apache.ibatis.parsing.PropertyParser; +import org.apache.ibatis.parsing.XNode; +import org.apache.ibatis.reflection.TypeParameterResolver; +import org.apache.ibatis.scripting.LanguageDriver; +import org.apache.ibatis.session.Configuration; +import org.apache.ibatis.session.ResultHandler; +import org.apache.ibatis.session.RowBounds; +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.TypeHandler; +import org.apache.ibatis.type.UnknownTypeHandler; + +import java.io.IOException; +import java.io.InputStream; +import java.lang.annotation.Annotation; +import java.lang.reflect.*; +import java.util.*; + +/** + * Mapper 注解构造器,负责解析 Mapper 接口上的注解 + * + * @author Clinton Begin + * @author Kazuki Shimizu + */ +public class MapperAnnotationBuilder { + + /** + * SQL 操作注解集合 + */ + private static final Set> SQL_ANNOTATION_TYPES = new HashSet<>(); + /** + * SQL 操作提供者注解集合 + */ + private static final Set> SQL_PROVIDER_ANNOTATION_TYPES = new HashSet<>(); + + private final Configuration configuration; + private final MapperBuilderAssistant assistant; + /** + * Mapper 接口类 + */ + private final Class type; + + static { + SQL_ANNOTATION_TYPES.add(Select.class); + SQL_ANNOTATION_TYPES.add(Insert.class); + SQL_ANNOTATION_TYPES.add(Update.class); + SQL_ANNOTATION_TYPES.add(Delete.class); + + SQL_PROVIDER_ANNOTATION_TYPES.add(SelectProvider.class); + SQL_PROVIDER_ANNOTATION_TYPES.add(InsertProvider.class); + SQL_PROVIDER_ANNOTATION_TYPES.add(UpdateProvider.class); + SQL_PROVIDER_ANNOTATION_TYPES.add(DeleteProvider.class); + } + + public MapperAnnotationBuilder(Configuration configuration, Class type) { + // 创建 MapperBuilderAssistant 对象 + String resource = type.getName().replace('.', '/') + ".java (best guess)"; + this.assistant = new MapperBuilderAssistant(configuration, resource); + this.configuration = configuration; + this.type = type; + } + + /** + * 解析注解 + */ + public void parse() { + // 判断当前 Mapper 接口是否应加载过。 + String resource = type.toString(); + if (!configuration.isResourceLoaded(resource)) { + // 加载对应的 XML Mapper + loadXmlResource(); + // 标记该 Mapper 接口已经加载过 + configuration.addLoadedResource(resource); + // 设置 namespace 属性 + assistant.setCurrentNamespace(type.getName()); + // 解析 @CacheNamespace 注解 + parseCache(); + // 解析 @CacheNamespaceRef 注解 + parseCacheRef(); + // 遍历每个方法,解析其上的注解 + Method[] methods = type.getMethods(); + for (Method method : methods) { + try { + // issue #237 + if (!method.isBridge()) { + // 执行解析 + parseStatement(method); + } + } catch (IncompleteElementException e) { + // 解析失败,添加到 configuration 中 + configuration.addIncompleteMethod(new MethodResolver(this, method)); + } + } + } + // 解析待定的方法 + parsePendingMethods(); + } + + private void parsePendingMethods() { + // 获得 MethodResolver 集合,并遍历进行处理 + Collection incompleteMethods = configuration.getIncompleteMethods(); + synchronized (incompleteMethods) { + Iterator iter = incompleteMethods.iterator(); + while (iter.hasNext()) { + try { + // 执行解析 + iter.next().resolve(); + iter.remove(); + iter.remove(); + } catch (IncompleteElementException e) { + // This method is still missing a resource + } + } + } + } + + /** + * 加载对应的 XML Mapper + */ + private void loadXmlResource() { + // Spring may not know the real resource name so we check a flag + // to prevent loading again a resource twice + // this flag is set at XMLMapperBuilder#bindMapperForNamespace + // 判断 Mapper XML 是否已经加载过,如果加载过,就不加载了。 + // 此处,是为了避免和 XMLMapperBuilder#parse() 方法冲突,重复解析 + if (!configuration.isResourceLoaded("namespace:" + type.getName())) { + // 获得 InputStream 对象 + String xmlResource = type.getName().replace('.', '/') + ".xml"; + // #1347 + InputStream inputStream = type.getResourceAsStream("/" + xmlResource); + if (inputStream == null) { + // Search XML mapper that is not in the module but in the classpath. + try { + inputStream = Resources.getResourceAsStream(type.getClassLoader(), xmlResource); + } catch (IOException e2) { + // ignore, resource is not required + } + } + // 创建 XMLMapperBuilder 对象,执行解析 + if (inputStream != null) { + XMLMapperBuilder xmlParser = new XMLMapperBuilder(inputStream, assistant.getConfiguration(), xmlResource, configuration.getSqlFragments(), type.getName()); + xmlParser.parse(); + } + } + } + + /** + * 解析 @CacheNamespace 注解 + */ + private void parseCache() { + // 获得类上的 @CacheNamespace 注解 + CacheNamespace cacheDomain = type.getAnnotation(CacheNamespace.class); + if (cacheDomain != null) { + // 获得各种属性 + Integer size = cacheDomain.size() == 0 ? null : cacheDomain.size(); + Long flushInterval = cacheDomain.flushInterval() == 0 ? null : cacheDomain.flushInterval(); + // 获得 Properties 属性 + Properties props = convertToProperties(cacheDomain.properties()); + // 创建 Cache 对象 + assistant.useNewCache(cacheDomain.implementation(), cacheDomain.eviction(), flushInterval, size, cacheDomain.readWrite(), cacheDomain.blocking(), props); + } + } + + /** + * 将 @Property 注解数组,转换成 Properties 对象 + * + * @param properties @Property 注解数组 + * @return Properties 对象 + */ + private Properties convertToProperties(Property[] properties) { + if (properties.length == 0) { + return null; + } + Properties props = new Properties(); + for (Property property : properties) { + props.setProperty(property.name(), + PropertyParser.parse(property.value(), configuration.getVariables())); // 替换 + } + return props; + } + + /** + * 解析 @CacheNamespaceRef 注解 + */ + private void parseCacheRef() { + // 获得类上的 @CacheNamespaceRef 注解 + CacheNamespaceRef cacheDomainRef = type.getAnnotation(CacheNamespaceRef.class); + if (cacheDomainRef != null) { + // 获得各种属性 + Class refType = cacheDomainRef.value(); + String refName = cacheDomainRef.name(); + // 校验,如果 refType 和 refName 都为空,则抛出 BuilderException 异常 + if (refType == void.class && refName.isEmpty()) { + throw new BuilderException("Should be specified either value() or name() attribute in the @CacheNamespaceRef"); + } + // 校验,如果 refType 和 refName 都不为空,则抛出 BuilderException 异常 + if (refType != void.class && !refName.isEmpty()) { + throw new BuilderException("Cannot use both value() and name() attribute in the @CacheNamespaceRef"); + } + // 获得最终的 namespace 属性 + String namespace = (refType != void.class) ? refType.getName() : refName; + // 获得指向的 Cache 对象 + assistant.useCacheRef(namespace); + } + } + + /** + * 解析其它注解,返回 resultMapId 属性 + * + * 逻辑上,和 {@link XMLMapperBuilder#resultMapElement(XNode, List)} 是类似的。 + * + * @param method 方法 + * @return resultMapId + */ + private String parseResultMap(Method method) { + // 获得返回类型 + Class returnType = getReturnType(method); + // 获得 @ConstructorArgs、@Results、@TypeDiscriminator 注解 + ConstructorArgs args = method.getAnnotation(ConstructorArgs.class); + Results results = method.getAnnotation(Results.class); + TypeDiscriminator typeDiscriminator = method.getAnnotation(TypeDiscriminator.class); + // 生成 resultMapId + String resultMapId = generateResultMapName(method); + // 生成 ResultMap 对象 + applyResultMap(resultMapId, returnType, argsIf(args), resultsIf(results), typeDiscriminator); + return resultMapId; + } + + /** + * 生成 resultMapId + * + * @param method 方法签名 + * @return resultMapId + */ + private String generateResultMapName(Method method) { + // 第一种情况,已经声明 + // 如果有 @Results 注解,并且有设置 id 属性,则直接返回。格式为:`${type.name}.${Results.id}` 。 + Results results = method.getAnnotation(Results.class); + if (results != null && !results.id().isEmpty()) { + return type.getName() + "." + results.id(); + } + // 第二种情况,自动生成 + // 获得 suffix 前缀,相当于方法参数构成的签名 + StringBuilder suffix = new StringBuilder(); + for (Class c : method.getParameterTypes()) { + suffix.append("-"); + suffix.append(c.getSimpleName()); + } + if (suffix.length() < 1) { + suffix.append("-void"); + } + // 拼接返回。格式为 `${type.name}.${method.name}${suffix}` 。 + return type.getName() + "." + method.getName() + suffix; + } + + // 创建 ResultMap 对象 + private void applyResultMap(String resultMapId, Class returnType, Arg[] args, Result[] results, TypeDiscriminator discriminator) { + // 创建 ResultMapping 数组 + List resultMappings = new ArrayList<>(); + // 将 @Arg[] 注解数组,解析成对应的 ResultMapping 对象们,并添加到 resultMappings 中。 + applyConstructorArgs(args, returnType, resultMappings); + // 将 @Result[] 注解数组,解析成对应的 ResultMapping 对象们,并添加到 resultMappings 中。 + applyResults(results, returnType, resultMappings); + // 创建 Discriminator 对象 + Discriminator disc = applyDiscriminator(resultMapId, returnType, discriminator); + // TODO add AutoMappingBehaviour + // 创建 ResultMap 对象 + assistant.addResultMap(resultMapId, returnType, null, disc, resultMappings, null); + // 创建 Discriminator 的 ResultMap 对象们 + createDiscriminatorResultMaps(resultMapId, returnType, discriminator); + } + + // 创建 Discriminator 的 ResultMap 对象们 + private void createDiscriminatorResultMaps(String resultMapId, Class resultType, TypeDiscriminator discriminator) { + if (discriminator != null) { + // 遍历 @Case 注解 + for (Case c : discriminator.cases()) { + // 创建 @Case 注解的 ResultMap 的编号 + String caseResultMapId = resultMapId + "-" + c.value(); + // 创建 ResultMapping 数组 + List resultMappings = new ArrayList<>(); + // issue #136 + // 将 @Arg[] 注解数组,解析成对应的 ResultMapping 对象们,并添加到 resultMappings 中。 + applyConstructorArgs(c.constructArgs(), resultType, resultMappings); + // 将 @Result[] 注解数组,解析成对应的 ResultMapping 对象们,并添加到 resultMappings 中。 + applyResults(c.results(), resultType, resultMappings); + // TODO add AutoMappingBehaviour + // 创建 ResultMap 对象 + assistant.addResultMap(caseResultMapId, c.type(), resultMapId, null, resultMappings, null); + } + } + } + + // 创建 Discriminator 对象 + // 和 `XMLMapperBuilder#processDiscriminatorElement(...)` 方法的逻辑是一致的 + private Discriminator applyDiscriminator(String resultMapId, Class resultType, TypeDiscriminator discriminator) { + if (discriminator != null) { + // 解析各种属性 + String column = discriminator.column(); + Class javaType = discriminator.javaType() == void.class ? String.class : discriminator.javaType(); + JdbcType jdbcType = discriminator.jdbcType() == JdbcType.UNDEFINED ? null : discriminator.jdbcType(); + @SuppressWarnings("unchecked") + // 获得 TypeHandler 类 + Class> typeHandler = (Class>) + (discriminator.typeHandler() == UnknownTypeHandler.class ? null : discriminator.typeHandler()); + // 遍历 @Case[] 注解数组,解析成 discriminatorMap 集合 + Case[] cases = discriminator.cases(); + Map discriminatorMap = new HashMap<>(); + for (Case c : cases) { + String value = c.value(); + String caseResultMapId = resultMapId + "-" + value; + discriminatorMap.put(value, caseResultMapId); + } + // 创建 Discriminator 对象 + return assistant.buildDiscriminator(resultType, column, javaType, jdbcType, typeHandler, discriminatorMap); + } + return null; + } + + /** + * 解析方法上的 SQL 操作相关的注解。 + * + * @param method 方法 + */ + @SuppressWarnings("ConstantConditions") + void parseStatement(Method method) { + // 获得参数的类型 + Class parameterTypeClass = getParameterType(method); + // 获得 LanguageDriver 对象 + LanguageDriver languageDriver = getLanguageDriver(method); + // 获得 SqlSource 对象 + SqlSource sqlSource = getSqlSourceFromAnnotations(method, parameterTypeClass, languageDriver); + if (sqlSource != null) { + // 获得各种属性 + Options options = method.getAnnotation(Options.class); + final String mappedStatementId = type.getName() + "." + method.getName(); + Integer fetchSize = null; + Integer timeout = null; + StatementType statementType = StatementType.PREPARED; + ResultSetType resultSetType = null; + SqlCommandType sqlCommandType = getSqlCommandType(method); + boolean isSelect = sqlCommandType == SqlCommandType.SELECT; + boolean flushCache = !isSelect; + boolean useCache = isSelect; + + // 获得 KeyGenerator 对象 + KeyGenerator keyGenerator; + String keyProperty = null; + String keyColumn = null; + if (SqlCommandType.INSERT.equals(sqlCommandType) || SqlCommandType.UPDATE.equals(sqlCommandType)) { // 有 + // first check for SelectKey annotation - that overrides everything else + // 如果有 @SelectKey 注解,则进行处理 + SelectKey selectKey = method.getAnnotation(SelectKey.class); + if (selectKey != null) { + keyGenerator = handleSelectKeyAnnotation(selectKey, mappedStatementId, getParameterType(method), languageDriver); + keyProperty = selectKey.keyProperty(); + // 如果无 @Options 注解,则根据全局配置处理 + } else if (options == null) { + keyGenerator = configuration.isUseGeneratedKeys() ? Jdbc3KeyGenerator.INSTANCE : NoKeyGenerator.INSTANCE; + // 如果有 @Options 注解,则使用该注解的配置处理 + } else { + keyGenerator = options.useGeneratedKeys() ? Jdbc3KeyGenerator.INSTANCE : NoKeyGenerator.INSTANCE; + keyProperty = options.keyProperty(); + keyColumn = options.keyColumn(); + } + // 无 + } else { + keyGenerator = NoKeyGenerator.INSTANCE; + } + + // 初始化各种属性 + if (options != null) { + if (FlushCachePolicy.TRUE.equals(options.flushCache())) { + flushCache = true; + } else if (FlushCachePolicy.FALSE.equals(options.flushCache())) { + flushCache = false; + } + useCache = options.useCache(); + fetchSize = options.fetchSize() > -1 || options.fetchSize() == Integer.MIN_VALUE ? options.fetchSize() : null; //issue #348 + timeout = options.timeout() > -1 ? options.timeout() : null; + statementType = options.statementType(); + resultSetType = options.resultSetType(); + } + + // 获得 resultMapId 编号字符串 + String resultMapId = null; + // 如果有 @ResultMap 注解,使用该注解为 resultMapId 属性 + ResultMap resultMapAnnotation = method.getAnnotation(ResultMap.class); + if (resultMapAnnotation != null) { + String[] resultMaps = resultMapAnnotation.value(); + StringBuilder sb = new StringBuilder(); + for (String resultMap : resultMaps) { + if (sb.length() > 0) { + sb.append(","); + } + sb.append(resultMap); + } + resultMapId = sb.toString(); + // 如果无 @ResultMap 注解,解析其它注解,作为 resultMapId 属性 + } else if (isSelect) { + resultMapId = parseResultMap(method); + } + + // 构建 MappedStatement 对象 + assistant.addMappedStatement( + mappedStatementId, + sqlSource, + statementType, + sqlCommandType, + fetchSize, + timeout, + // ParameterMapID + null, + parameterTypeClass, + resultMapId, + getReturnType(method), // 获得返回类型 + resultSetType, + flushCache, + useCache, + // TODO gcode issue #577 + false, + keyGenerator, + keyProperty, + keyColumn, + // DatabaseID + null, + languageDriver, + // ResultSets + options != null ? nullOrEmpty(options.resultSets()) : null); + } + } + + /** + * 获得 LanguageDriver 对象 + * + * @param method 方法 + * @return LanguageDriver 对象 + */ + private LanguageDriver getLanguageDriver(Method method) { + // 解析 @Lang 注解,获得对应的类型 + Lang lang = method.getAnnotation(Lang.class); + Class langClass = null; + if (lang != null) { + langClass = lang.value(); + } + // 获得 LanguageDriver 对象 + // 如果 langClass 为空,即无 @Lang 注解,则会使用默认 LanguageDriver 类型 + return assistant.getLanguageDriver(langClass); + } + + /** + * 获得参数的类型 + * + * @param method 方法 + * @return 参数的类型 + */ + private Class getParameterType(Method method) { + Class parameterType = null; + // 遍历参数类型数组 + // 排除 RowBounds 和 ResultHandler 两种参数 + // 1. 如果是多参数,则是 ParamMap 类型 + // 2. 如果是单参数,则是该参数的类型 + Class[] parameterTypes = method.getParameterTypes(); + for (Class currentParameterType : parameterTypes) { + if (!RowBounds.class.isAssignableFrom(currentParameterType) && !ResultHandler.class.isAssignableFrom(currentParameterType)) { + if (parameterType == null) { + parameterType = currentParameterType; + } else { + // issue #135 + parameterType = ParamMap.class; + } + } + } + return parameterType; + } + + /** + * 获得获得返回类型 + * + * @param method 方法 + * @return 返回类型 + */ + private Class getReturnType(Method method) { + // 获得方法的返回类型 + Class returnType = method.getReturnType(); + // 解析成对应的 Type + Type resolvedReturnType = TypeParameterResolver.resolveReturnType(method, type); + // 如果 Type 是 Class ,普通类 + if (resolvedReturnType instanceof Class) { + returnType = (Class) resolvedReturnType; + // 如果是数组类型,则使用 componentType + if (returnType.isArray()) { + returnType = returnType.getComponentType(); + } + // gcode issue #508 + // 如果返回类型是 void ,则尝试使用 @ResultType 注解 + if (void.class.equals(returnType)) { + ResultType rt = method.getAnnotation(ResultType.class); + if (rt != null) { + returnType = rt.value(); + } + } + // 如果 Type 是 ParameterizedType ,泛型 + } else if (resolvedReturnType instanceof ParameterizedType) { + // 获得泛型 rawType + ParameterizedType parameterizedType = (ParameterizedType) resolvedReturnType; + Class rawType = (Class) parameterizedType.getRawType(); + // 如果是 Collection 或者 Cursor 类型时 + if (Collection.class.isAssignableFrom(rawType) || Cursor.class.isAssignableFrom(rawType)) { + // 获得 <> 中实际类型 + Type[] actualTypeArguments = parameterizedType.getActualTypeArguments(); + // 如果 actualTypeArguments 的大小为 1 ,进一步处理 + if (actualTypeArguments != null && actualTypeArguments.length == 1) { + Type returnTypeParameter = actualTypeArguments[0]; + // 如果是 Class ,则直接使用 Class + if (returnTypeParameter instanceof Class) { + returnType = (Class) returnTypeParameter; + // 如果是 ParameterizedType ,则获取 <> 中实际类型 + } else if (returnTypeParameter instanceof ParameterizedType) { + // (gcode issue #443) actual type can be a also a parameterized type + returnType = (Class) ((ParameterizedType) returnTypeParameter).getRawType(); + // 如果是泛型数组类型,则获得 genericComponentType 对应的类 + } else if (returnTypeParameter instanceof GenericArrayType) { + Class componentType = (Class) ((GenericArrayType) returnTypeParameter).getGenericComponentType(); + // (gcode issue #525) support List + returnType = Array.newInstance(componentType, 0).getClass(); + } + } + // 如果有 @MapKey 注解,并且是 Map 类型 + } else if (method.isAnnotationPresent(MapKey.class) && Map.class.isAssignableFrom(rawType)) { + // (gcode issue 504) Do not look into Maps if there is not MapKey annotation + // 获得 <> 中实际类型 + Type[] actualTypeArguments = parameterizedType.getActualTypeArguments(); + // 如果 actualTypeArguments 的大小为 2 ,进一步处理。 + // 为什么是 2 ,因为 Map 呀,有 K、V 两个泛型 + if (actualTypeArguments != null && actualTypeArguments.length == 2) { + // 处理 V 泛型 + Type returnTypeParameter = actualTypeArguments[1]; + // 如果 V 泛型为 Class ,则直接使用 Class + if (returnTypeParameter instanceof Class) { + returnType = (Class) returnTypeParameter; + // 如果 V 泛型为 ParameterizedType ,则获取 <> 中实际类型 + } else if (returnTypeParameter instanceof ParameterizedType) { + // (gcode issue 443) actual type can be a also a parameterized type + returnType = (Class) ((ParameterizedType) returnTypeParameter).getRawType(); + } + } + // 如果是 Optional 类型时 + } else if (Optional.class.equals(rawType)) { + // 获得 <> 中实际类型 + Type[] actualTypeArguments = parameterizedType.getActualTypeArguments(); + // 因为是 Optional 类型,所以 actualTypeArguments 数组大小是一 + Type returnTypeParameter = actualTypeArguments[0]; + // 如果 泛型为 Class ,则直接使用 Class + if (returnTypeParameter instanceof Class) { + returnType = (Class) returnTypeParameter; + } + } + } + + return returnType; + } + + // 从注解中,获得 SqlSource 对象 + private SqlSource getSqlSourceFromAnnotations(Method method, Class parameterType, LanguageDriver languageDriver) { + try { + // 获得方法上的 SQL_ANNOTATION_TYPES 和 SQL_PROVIDER_ANNOTATION_TYPES 对应的类型 + Class sqlAnnotationType = getSqlAnnotationType(method); + Class sqlProviderAnnotationType = getSqlProviderAnnotationType(method); + // 如果 SQL_ANNOTATION_TYPES 对应的类型非空 + if (sqlAnnotationType != null) { + // 如果 SQL_PROVIDER_ANNOTATION_TYPES 对应的类型非空,则抛出 BindingException 异常,因为冲突了。 + if (sqlProviderAnnotationType != null) { + throw new BindingException("You cannot supply both a static SQL and SqlProvider to method named " + method.getName()); + } + // 获得 SQL_ANNOTATION_TYPES 对应的注解 + Annotation sqlAnnotation = method.getAnnotation(sqlAnnotationType); + // 获得 value 属性 + final String[] strings = (String[]) sqlAnnotation.getClass().getMethod("value").invoke(sqlAnnotation); + // 创建 SqlSource 对象 + return buildSqlSourceFromStrings(strings, parameterType, languageDriver); + // 如果 SQL_PROVIDER_ANNOTATION_TYPES 对应的类型非空 + } else if (sqlProviderAnnotationType != null) { + // 获得 SQL_PROVIDER_ANNOTATION_TYPES 对应的注解 + Annotation sqlProviderAnnotation = method.getAnnotation(sqlProviderAnnotationType); + // 创建 ProviderSqlSource 对象 + return new ProviderSqlSource(assistant.getConfiguration(), sqlProviderAnnotation, type, method); + } + return null; + } catch (Exception e) { + throw new BuilderException("Could not find value method on SQL annotation. Cause: " + e, e); + } + } + + // 创建 SqlSource 对象 + private SqlSource buildSqlSourceFromStrings(String[] strings, Class parameterTypeClass, LanguageDriver languageDriver) { + // 拼接 SQL + final StringBuilder sql = new StringBuilder(); + for (String fragment : strings) { + sql.append(fragment); + sql.append(" "); + } + // 创建 SqlSource 对象 + return languageDriver.createSqlSource(configuration, sql.toString().trim(), parameterTypeClass); + } + + /** + * 获得方法对应的 SQL 命令类型 + * + * @param method 方法 + * @return SQL 命令类型 + */ + private SqlCommandType getSqlCommandType(Method method) { + // 获得符合 SQL_ANNOTATION_TYPES 类型的注解类型 + Class type = getSqlAnnotationType(method); + + if (type == null) { + // 获得符合 SQL_PROVIDER_ANNOTATION_TYPES 类型的注解类型 + type = getSqlProviderAnnotationType(method); + + // 找不到,返回 SqlCommandType.UNKNOWN + if (type == null) { + return SqlCommandType.UNKNOWN; + } + + // 转换成对应的枚举 + if (type == SelectProvider.class) { + type = Select.class; + } else if (type == InsertProvider.class) { + type = Insert.class; + } else if (type == UpdateProvider.class) { + type = Update.class; + } else if (type == DeleteProvider.class) { + type = Delete.class; + } + } + + // 转换成对应的枚举 + return SqlCommandType.valueOf(type.getSimpleName().toUpperCase(Locale.ENGLISH)); + } + + /** + * 获得符合 SQL_ANNOTATION_TYPES 类型的注解类型 + * + * @param method 方法 + * @return 查到的注解 + */ + private Class getSqlAnnotationType(Method method) { + return chooseAnnotationType(method, SQL_ANNOTATION_TYPES); + } + + /** + * 获得符合 SQL_PROVIDER_ANNOTATION_TYPES 类型的注解类型 + * + * @param method 方法 + * @return 查到的注解 + */ + private Class getSqlProviderAnnotationType(Method method) { + return chooseAnnotationType(method, SQL_PROVIDER_ANNOTATION_TYPES); + } + + /** + * 获得符合指定类型的注解类型 + * + * @param method 方法 + * @param types 指定类型 + * @return 查到的注解类型 + */ + private Class chooseAnnotationType(Method method, Set> types) { + for (Class type : types) { + Annotation annotation = method.getAnnotation(type); + if (annotation != null) { + return type; + } + } + return null; + } + + // 将 `@Result[]` 注解数组,解析成对应的 ResultMapping 对象们,并添加到 `resultMappings` 中。 + // 和 `XMLMapperBuilder#buildResultMappingFromContext(...)` 方法的逻辑是一致的 + private void applyResults(Result[] results, Class resultType, List resultMappings) { + // 遍历 @Result[] 数组 + for (Result result : results) { + // 创建 ResultFlag 数组 + List flags = new ArrayList<>(); + if (result.id()) { + flags.add(ResultFlag.ID); + } + @SuppressWarnings("unchecked") + // 获得 TypeHandler 类 + Class> typeHandler = (Class>) + ((result.typeHandler() == UnknownTypeHandler.class) ? null : result.typeHandler()); + // 构建 ResultMapping 对象 + ResultMapping resultMapping = assistant.buildResultMapping( + resultType, + nullOrEmpty(result.property()), + nullOrEmpty(result.column()), + result.javaType() == void.class ? null : result.javaType(), + result.jdbcType() == JdbcType.UNDEFINED ? null : result.jdbcType(), + hasNestedSelect(result) ? nestedSelectId(result) : null, + null, + null, + null, + typeHandler, + flags, + null, + null, + isLazy(result)); + // 添加到 resultMappings 中 + resultMappings.add(resultMapping); + } + } + + /** + * 获得内嵌的查询编号 + * + * @param result @Result 注解 + * @return 查询编号 + */ + private String nestedSelectId(Result result) { + // 先获得 @One 注解 + String nestedSelect = result.one().select(); + // 获得不到,则再获得 @Many + if (nestedSelect.length() < 1) { + nestedSelect = result.many().select(); + } + // 获得内嵌查询编号,格式为 `{type.name}.${select}` + if (!nestedSelect.contains(".")) { + nestedSelect = type.getName() + "." + nestedSelect; + } + return nestedSelect; + } + + /** + * 判断是否懒加载 + * + * @param result @Result 注解 + * @return 是否懒加载 + */ + private boolean isLazy(Result result) { + // 判断是否开启懒加载 + boolean isLazy = configuration.isLazyLoadingEnabled(); + // 如果有 @One 注解,则判断是否懒加载 + if (result.one().select().length() > 0 && FetchType.DEFAULT != result.one().fetchType()) { + isLazy = result.one().fetchType() == FetchType.LAZY; + // 如果有 @Many 注解,则判断是否懒加载 + } else if (result.many().select().length() > 0 && FetchType.DEFAULT != result.many().fetchType()) { + isLazy = result.many().fetchType() == FetchType.LAZY; + } + return isLazy; + } + + /** + * 判断是否有内嵌的查询 + * + * @param result @Result 注解 + * @return 是否有内嵌的查询 + */ + private boolean hasNestedSelect(Result result) { + if (result.one().select().length() > 0 && result.many().select().length() > 0) { + throw new BuilderException("Cannot use both @One and @Many annotations in the same @Result"); + } + // 判断有 @One 或 @Many 注解 + return result.one().select().length() > 0 || result.many().select().length() > 0; + } + + // 将 `@Arg[]` 注解数组,解析成对应的 ResultMapping 对象们,并添加到 `resultMappings` 中。 + // 和 `XMLMapperBuilder#processConstructorElement(...)` 方法是一致的 + private void applyConstructorArgs(Arg[] args, Class resultType, List resultMappings) { + // 遍历 @Arg[] 数组 + for (Arg arg : args) { + // 创建 ResultFlag 数组 + List flags = new ArrayList<>(); + flags.add(ResultFlag.CONSTRUCTOR); + if (arg.id()) { + flags.add(ResultFlag.ID); + } + @SuppressWarnings("unchecked") + // 获得 TypeHandler 乐 + Class> typeHandler = (Class>) + (arg.typeHandler() == UnknownTypeHandler.class ? null : arg.typeHandler()); + // 将当前 @Arg 注解构建成 ResultMapping 对象 + ResultMapping resultMapping = assistant.buildResultMapping( + resultType, + nullOrEmpty(arg.name()), + nullOrEmpty(arg.column()), + arg.javaType() == void.class ? null : arg.javaType(), + arg.jdbcType() == JdbcType.UNDEFINED ? null : arg.jdbcType(), + nullOrEmpty(arg.select()), + nullOrEmpty(arg.resultMap()), + null, + nullOrEmpty(arg.columnPrefix()), + typeHandler, + flags, + null, + null, + false); + // 添加到 resultMappings 中 + resultMappings.add(resultMapping); + } + } + + private String nullOrEmpty(String value) { + return value == null || value.trim().length() == 0 ? null : value; + } + + private Result[] resultsIf(Results results) { + return results == null ? new Result[0] : results.value(); + } + + private Arg[] argsIf(ConstructorArgs args) { + return args == null ? new Arg[0] : args.value(); + } + + // 处理 `@@SelectKey` 注解,生成对应的 SelectKey 对象 + // 和 `XMLStatementBuilder#parseSelectKeyNode(...)` 方法,类似。 + private KeyGenerator handleSelectKeyAnnotation(SelectKey selectKeyAnnotation, String baseStatementId, Class parameterTypeClass, LanguageDriver languageDriver) { + // 获得各种属性和对应的类 + String id = baseStatementId + SelectKeyGenerator.SELECT_KEY_SUFFIX; + Class resultTypeClass = selectKeyAnnotation.resultType(); + StatementType statementType = selectKeyAnnotation.statementType(); + String keyProperty = selectKeyAnnotation.keyProperty(); + String keyColumn = selectKeyAnnotation.keyColumn(); + boolean executeBefore = selectKeyAnnotation.before(); + + // defaults + // 创建 MappedStatement 需要用到的默认值 + boolean useCache = false; + KeyGenerator keyGenerator = NoKeyGenerator.INSTANCE; + Integer fetchSize = null; + Integer timeout = null; + boolean flushCache = false; + String parameterMap = null; + String resultMap = null; + ResultSetType resultSetTypeEnum = null; + + // 创建 SqlSource 对象 + SqlSource sqlSource = buildSqlSourceFromStrings(selectKeyAnnotation.statement(), parameterTypeClass, languageDriver); + SqlCommandType sqlCommandType = SqlCommandType.SELECT; + + // 创建 MappedStatement 对象 + assistant.addMappedStatement(id, sqlSource, statementType, sqlCommandType, fetchSize, timeout, parameterMap, parameterTypeClass, resultMap, resultTypeClass, resultSetTypeEnum, + flushCache, useCache, false, + keyGenerator, keyProperty, keyColumn, null, languageDriver, null); + + // 获得 SelectKeyGenerator 的编号,格式为 `${namespace}.${id}` + id = assistant.applyCurrentNamespace(id, false); + // 获得 MappedStatement 对象 + MappedStatement keyStatement = configuration.getMappedStatement(id, false); + // 创建 SelectKeyGenerator 对象,并添加到 configuration 中 + SelectKeyGenerator answer = new SelectKeyGenerator(keyStatement, executeBefore); + configuration.addKeyGenerator(id, answer); + return answer; + } + +} diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/annotation/MethodResolver.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/annotation/MethodResolver.java new file mode 100644 index 0000000..74807f5 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/annotation/MethodResolver.java @@ -0,0 +1,46 @@ +/** + * Copyright 2009-2017 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.builder.annotation; + +import java.lang.reflect.Method; + +/** + * 注解方法的处理器 + * + * @author Eduardo Macarron + */ +public class MethodResolver { + + /** + * MapperAnnotationBuilder 对象 + */ + private final MapperAnnotationBuilder annotationBuilder; + /** + * Method 方法 + */ + private final Method method; + + public MethodResolver(MapperAnnotationBuilder annotationBuilder, Method method) { + this.annotationBuilder = annotationBuilder; + this.method = method; + } + + public void resolve() { + // 执行注解方法的解析 + annotationBuilder.parseStatement(method); + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/annotation/ProviderContext.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/annotation/ProviderContext.java new file mode 100644 index 0000000..d050d85 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/annotation/ProviderContext.java @@ -0,0 +1,68 @@ +/** + * Copyright 2009-2017 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.builder.annotation; + +import java.lang.reflect.Method; + +/** + * The context object for sql provider method. + * + * {@link ProviderSqlSource} 的上下文 + * + * @author Kazuki Shimizu + * @since 3.4.5 + */ +public final class ProviderContext { + + /** + * Mapper 接口 + */ + private final Class mapperType; + /** + * Mapper 的方法 + */ + private final Method mapperMethod; + + /** + * Constructor. + * + * @param mapperType A mapper interface type that specified provider + * @param mapperMethod A mapper method that specified provider + */ + ProviderContext(Class mapperType, Method mapperMethod) { + this.mapperType = mapperType; + this.mapperMethod = mapperMethod; + } + + /** + * Get a mapper interface type that specified provider. + * + * @return A mapper interface type that specified provider + */ + public Class getMapperType() { + return mapperType; + } + + /** + * Get a mapper method that specified provider. + * + * @return A mapper method that specified provider + */ + public Method getMapperMethod() { + return mapperMethod; + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/annotation/ProviderSqlSource.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/annotation/ProviderSqlSource.java new file mode 100644 index 0000000..8072d37 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/annotation/ProviderSqlSource.java @@ -0,0 +1,206 @@ +/** + * Copyright 2009-2017 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.builder.annotation; + +import org.apache.ibatis.builder.BuilderException; +import org.apache.ibatis.builder.SqlSourceBuilder; +import org.apache.ibatis.mapping.BoundSql; +import org.apache.ibatis.mapping.SqlSource; +import org.apache.ibatis.parsing.PropertyParser; +import org.apache.ibatis.reflection.ParamNameResolver; +import org.apache.ibatis.session.Configuration; + +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.HashMap; +import java.util.Map; + +/** + * 基于方法上的 @ProviderXXX 注解的 SqlSource 实现类 + * + * @author Clinton Begin + * @author Kazuki Shimizu + */ +public class ProviderSqlSource implements SqlSource { + + private final Configuration configuration; + private final SqlSourceBuilder sqlSourceParser; + /** + * `@ProviderXXX` 注解的对应的类 + */ + private final Class providerType; + /** + * `@ProviderXXX` 注解的对应的方法 + */ + private Method providerMethod; + /** + * `@ProviderXXX` 注解的对应的方法的参数名数组 + */ + private String[] providerMethodArgumentNames; + /** + * `@ProviderXXX` 注解的对应的方法的参数类型数组 + */ + private Class[] providerMethodParameterTypes; + /** + * 若 {@link #providerMethodParameterTypes} 参数有 ProviderContext 类型的,创建 ProviderContext 对象 + */ + private ProviderContext providerContext; + /** + * {@link #providerMethodParameterTypes} 参数中,ProviderContext 类型的参数,在数组中的位置 + */ + private Integer providerContextIndex; + + /** + * @deprecated Please use the {@link #ProviderSqlSource(Configuration, Object, Class, Method)} instead of this. + */ + @Deprecated + public ProviderSqlSource(Configuration configuration, Object provider) { + this(configuration, provider, null, null); + } + + /** + * @since 3.4.5 + */ + public ProviderSqlSource(Configuration configuration, Object provider, Class mapperType, Method mapperMethod) { + String providerMethodName; + try { + this.configuration = configuration; + // 创建 SqlSourceBuilder 对象 + this.sqlSourceParser = new SqlSourceBuilder(configuration); + // 获得 @ProviderXXX 注解的对应的类 + this.providerType = (Class) provider.getClass().getMethod("type").invoke(provider); + // 获得 @ProviderXXX 注解的对应的方法相关的信息 + providerMethodName = (String) provider.getClass().getMethod("method").invoke(provider); + for (Method m : this.providerType.getMethods()) { + if (providerMethodName.equals(m.getName()) && CharSequence.class.isAssignableFrom(m.getReturnType())) { + if (providerMethod != null) { + throw new BuilderException("Error creating SqlSource for SqlProvider. Method '" + + providerMethodName + "' is found multiple in SqlProvider '" + this.providerType.getName() + + "'. Sql provider method can not overload."); + } + this.providerMethod = m; + this.providerMethodArgumentNames = new ParamNameResolver(configuration, m).getNames(); + this.providerMethodParameterTypes = m.getParameterTypes(); + } + } + } catch (BuilderException e) { + throw e; + } catch (Exception e) { + throw new BuilderException("Error creating SqlSource for SqlProvider. Cause: " + e, e); + } + if (this.providerMethod == null) { + throw new BuilderException("Error creating SqlSource for SqlProvider. Method '" + + providerMethodName + "' not found in SqlProvider '" + this.providerType.getName() + "'."); + } + // 初始化 providerContext 和 providerContextIndex 属性 + for (int i = 0; i < this.providerMethodParameterTypes.length; i++) { + Class parameterType = this.providerMethodParameterTypes[i]; + if (parameterType == ProviderContext.class) { + if (this.providerContext != null) { + throw new BuilderException("Error creating SqlSource for SqlProvider. ProviderContext found multiple in SqlProvider method (" + + this.providerType.getName() + "." + providerMethod.getName() + + "). ProviderContext can not define multiple in SqlProvider method argument."); + } + this.providerContext = new ProviderContext(mapperType, mapperMethod); + this.providerContextIndex = i; + } + } + } + + @Override + public BoundSql getBoundSql(Object parameterObject) { + // 创建 SqlSource 对象 + SqlSource sqlSource = createSqlSource(parameterObject); + // 获得 BoundSql 对象 + return sqlSource.getBoundSql(parameterObject); + } + + private SqlSource createSqlSource(Object parameterObject) { + try { + // 获得 SQL + int bindParameterCount = providerMethodParameterTypes.length - (providerContext == null ? 0 : 1); + String sql; + if (providerMethodParameterTypes.length == 0) { + sql = invokeProviderMethod(); + } else if (bindParameterCount == 0) { + sql = invokeProviderMethod(providerContext); + } else if (bindParameterCount == 1 && + (parameterObject == null || providerMethodParameterTypes[(providerContextIndex == null || providerContextIndex == 1) ? 0 : 1].isAssignableFrom(parameterObject.getClass()))) { + sql = invokeProviderMethod(extractProviderMethodArguments(parameterObject)); + } else if (parameterObject instanceof Map) { + @SuppressWarnings("unchecked") + Map params = (Map) parameterObject; + sql = invokeProviderMethod(extractProviderMethodArguments(params, providerMethodArgumentNames)); + } else { + throw new BuilderException("Error invoking SqlProvider method (" + + providerType.getName() + "." + providerMethod.getName() + + "). Cannot invoke a method that holds " + + (bindParameterCount == 1 ? "named argument(@Param)" : "multiple arguments") + + " using a specifying parameterObject. In this case, please specify a 'java.util.Map' object."); + } + // 获得参数 + Class parameterType = parameterObject == null ? Object.class : parameterObject.getClass(); + // 替换掉 SQL 上的属性 + // 解析出 SqlSource 对象 + return sqlSourceParser.parse(replacePlaceholder(sql), parameterType, new HashMap<>()); + } catch (BuilderException e) { + throw e; + } catch (Exception e) { + throw new BuilderException("Error invoking SqlProvider method (" + + providerType.getName() + "." + providerMethod.getName() + + "). Cause: " + e, e); + } + } + + private Object[] extractProviderMethodArguments(Object parameterObject) { + if (providerContext != null) { + Object[] args = new Object[2]; + args[providerContextIndex == 0 ? 1 : 0] = parameterObject; + args[providerContextIndex] = providerContext; + return args; + } else { + return new Object[]{parameterObject}; + } + } + + private Object[] extractProviderMethodArguments(Map params, String[] argumentNames) { + Object[] args = new Object[argumentNames.length]; + for (int i = 0; i < args.length; i++) { + if (providerContextIndex != null && providerContextIndex == i) { + args[i] = providerContext; + } else { + args[i] = params.get(argumentNames[i]); + } + } + return args; + } + + private String invokeProviderMethod(Object... args) throws Exception { + Object targetObject = null; + // 获得对象 + if (!Modifier.isStatic(providerMethod.getModifiers())) { + targetObject = providerType.newInstance(); + } + // 反射调用方法 + CharSequence sql = (CharSequence) providerMethod.invoke(targetObject, args); + return sql != null ? sql.toString() : null; + } + + private String replacePlaceholder(String sql) { + return PropertyParser.parse(sql, configuration.getVariables()); + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/annotation/package-info.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/annotation/package-info.java new file mode 100644 index 0000000..7e564b7 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/annotation/package-info.java @@ -0,0 +1,19 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Parses annotions to create a Configuration + */ +package org.apache.ibatis.builder.annotation; diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/package-info.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/package-info.java new file mode 100644 index 0000000..e061745 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/package-info.java @@ -0,0 +1,19 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Base package for the Configuration building code + */ +package org.apache.ibatis.builder; diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/xml/XMLConfigBuilder.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/xml/XMLConfigBuilder.java new file mode 100644 index 0000000..a8ebe10 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/xml/XMLConfigBuilder.java @@ -0,0 +1,551 @@ +/** + * Copyright 2009-2017 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.builder.xml; + +import org.apache.ibatis.builder.BaseBuilder; +import org.apache.ibatis.builder.BuilderException; +import org.apache.ibatis.datasource.DataSourceFactory; +import org.apache.ibatis.executor.ErrorContext; +import org.apache.ibatis.executor.loader.ProxyFactory; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.io.VFS; +import org.apache.ibatis.logging.Log; +import org.apache.ibatis.mapping.DatabaseIdProvider; +import org.apache.ibatis.mapping.Environment; +import org.apache.ibatis.parsing.XNode; +import org.apache.ibatis.parsing.XPathParser; +import org.apache.ibatis.plugin.Interceptor; +import org.apache.ibatis.reflection.DefaultReflectorFactory; +import org.apache.ibatis.reflection.MetaClass; +import org.apache.ibatis.reflection.ReflectorFactory; +import org.apache.ibatis.reflection.factory.ObjectFactory; +import org.apache.ibatis.reflection.wrapper.ObjectWrapperFactory; +import org.apache.ibatis.session.*; +import org.apache.ibatis.transaction.TransactionFactory; +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.TypeHandler; + +import javax.sql.DataSource; +import java.io.InputStream; +import java.io.Reader; +import java.util.Properties; + +/** + * XML 配置构建器,主要负责解析 mybatis-config.xml 配置文件 + * + * @author Clinton Begin + * @author Kazuki Shimizu + */ +public class XMLConfigBuilder extends BaseBuilder { + + /** + * 是否已解析 + */ + private boolean parsed; + /** + * 基于 Java XPath 解析器 + */ + private final XPathParser parser; + /** + * 环境 + */ + private String environment; + /** + * ReflectorFactory 对象 + */ + private final ReflectorFactory localReflectorFactory = new DefaultReflectorFactory(); + + public XMLConfigBuilder(Reader reader) { + this(reader, null, null); + } + + public XMLConfigBuilder(Reader reader, String environment) { + this(reader, environment, null); + } + + public XMLConfigBuilder(Reader reader, String environment, Properties props) { + this(new XPathParser(reader, true, props, new XMLMapperEntityResolver()), environment, props); + } + + public XMLConfigBuilder(InputStream inputStream) { + this(inputStream, null, null); + } + + public XMLConfigBuilder(InputStream inputStream, String environment) { + this(inputStream, environment, null); + } + + public XMLConfigBuilder(InputStream inputStream, String environment, Properties props) { + this(new XPathParser(inputStream, true, props, new XMLMapperEntityResolver()), environment, props); + } + + private XMLConfigBuilder(XPathParser parser, String environment, Properties props) { + // 创建 Configuration 对象 + super(new Configuration()); + ErrorContext.instance().resource("SQL Mapper Configuration"); + // 设置 Configuration 的 variables 属性 + this.configuration.setVariables(props); + this.parsed = false; + this.environment = environment; + this.parser = parser; + } + + /** + * 解析 XML 成 Configuration 对象。 + * + * @return Configuration 对象 + */ + public Configuration parse() { + // 若已解析,抛出 BuilderException 异常 + if (parsed) { + throw new BuilderException("Each XMLConfigBuilder can only be used once."); + } + // 标记已解析 + parsed = true; + ///parser是XPathParser解析器对象,读取节点内数据,是MyBatis配置文件中的顶层标签 + // 解析 XML configuration 节点 + parseConfiguration(parser.evalNode("/configuration")); + return configuration; + } + + /** + * 解析 XML + * + * 具体 MyBatis 有哪些 XML 标签,参见 《XML 映射配置文件》http://www.mybatis.org/mybatis-3/zh/configuration.html + * + * @param root 根节点 + */ + private void parseConfiguration(XNode root) { + try { + //issue #117 read properties first + // 解析 标签 + propertiesElement(root.evalNode("properties")); + // 解析 标签 + Properties settings = settingsAsProperties(root.evalNode("settings")); + // 加载自定义的 VFS 实现类 + loadCustomVfs(settings); + // 解析 标签 + typeAliasesElement(root.evalNode("typeAliases")); + // 解析 标签 + pluginElement(root.evalNode("plugins")); + // 解析 标签 + objectFactoryElement(root.evalNode("objectFactory")); + // 解析 标签 + objectWrapperFactoryElement(root.evalNode("objectWrapperFactory")); + // 解析 标签 + reflectorFactoryElement(root.evalNode("reflectorFactory")); + // 赋值 到 Configuration 属性 + settingsElement(settings); + // read it after objectFactory and objectWrapperFactory issue #631 + // 解析 标签 + environmentsElement(root.evalNode("environments")); + // 解析 标签 + databaseIdProviderElement(root.evalNode("databaseIdProvider")); + // 解析 标签 + typeHandlerElement(root.evalNode("typeHandlers")); + // 解析 标签 + mapperElement(root.evalNode("mappers")); + } catch (Exception e) { + throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e); + } + } + + /** + * 将 标签解析为 Properties 对象 + * + * @param context 节点 + * @return Properties 对象 + */ + private Properties settingsAsProperties(XNode context) { + // 将子标签,解析成 Properties 对象 + if (context == null) { + return new Properties(); + } + Properties props = context.getChildrenAsProperties(); + // Check that all settings are known to the configuration class + // 校验每个属性,在 Configuration 中,有相应的 setting 方法,否则抛出 BuilderException 异常 + MetaClass metaConfig = MetaClass.forClass(Configuration.class, localReflectorFactory); + for (Object key : props.keySet()) { + if (!metaConfig.hasSetter(String.valueOf(key))) { + throw new BuilderException("The setting " + key + " is not known. Make sure you spelled it correctly (case sensitive)."); + } + } + return props; + } + + /** + * 加载自定义 VFS 类 + * + * @param props Properties 对象 + * @throws ClassNotFoundException 当 VFS 类不存在时 + */ + private void loadCustomVfs(Properties props) throws ClassNotFoundException { + // 获得 vfsImpl 属性 + String value = props.getProperty("vfsImpl"); + if (value != null) { + // 使用 , 作为分隔符,拆成 VFS 类名的数组 + String[] clazzes = value.split(","); + // 遍历 VFS 类名的数组 + for (String clazz : clazzes) { + if (!clazz.isEmpty()) { + // 获得 VFS 类 + @SuppressWarnings("unchecked") + Class vfsImpl = (Class) Resources.classForName(clazz); + // 设置到 Configuration 中 + configuration.setVfsImpl(vfsImpl); + } + } + } + } + + /** + * 解析 标签,将配置类注册到 {@link org.apache.ibatis.type.TypeAliasRegistry} 中。 + * + * @param parent 节点 + */ + private void typeAliasesElement(XNode parent) { + if (parent != null) { + // 遍历子节点 + for (XNode child : parent.getChildren()) { + // 指定为包的情况下,注册包下的每个类 + if ("package".equals(child.getName())) { + String typeAliasPackage = child.getStringAttribute("name"); + configuration.getTypeAliasRegistry().registerAliases(typeAliasPackage); + // 指定为类的情况下,直接注册类和别名 + } else { + String alias = child.getStringAttribute("alias"); + String type = child.getStringAttribute("type"); + try { + Class clazz = Resources.classForName(type); // 获得类是否存在 + // 注册到 typeAliasRegistry 中 + if (alias == null) { + typeAliasRegistry.registerAlias(clazz); + } else { + typeAliasRegistry.registerAlias(alias, clazz); + } + } catch (ClassNotFoundException e) { // 若类不存在,则抛出 BuilderException 异常 + throw new BuilderException("Error registering typeAlias for '" + alias + "'. Cause: " + e, e); + } + } + } + } + } + + /** + * 解析 标签,添加到 {@link Configuration#interceptorChain} 中 + * + * @param parent 节点 + * @throws Exception 发生异常时 + */ + private void pluginElement(XNode parent) throws Exception { + if (parent != null) { + // 遍历 标签 + for (XNode child : parent.getChildren()) { + String interceptor = child.getStringAttribute("interceptor"); + Properties properties = child.getChildrenAsProperties(); + // 创建 Interceptor 对象,并设置属性 + Interceptor interceptorInstance = (Interceptor) resolveClass(interceptor).newInstance(); + interceptorInstance.setProperties(properties); + // 添加到 configuration 中 + configuration.addInterceptor(interceptorInstance); + } + } + } + + private void objectFactoryElement(XNode context) throws Exception { + if (context != null) { + // 获得 ObjectFactory 的实现类 + String type = context.getStringAttribute("type"); + // 获得 Properties 属性 + Properties properties = context.getChildrenAsProperties(); + // 创建 ObjectFactory 对象,并设置 Properties 属性 + ObjectFactory factory = (ObjectFactory) resolveClass(type).newInstance(); + factory.setProperties(properties); + // 设置 Configuration 的 objectFactory 属性 + configuration.setObjectFactory(factory); + } + } + + private void objectWrapperFactoryElement(XNode context) throws Exception { + if (context != null) { + // 获得 ObjectWrapperFactory 的实现类 + String type = context.getStringAttribute("type"); + // 创建 ObjectWrapperFactory 对象 + ObjectWrapperFactory factory = (ObjectWrapperFactory) resolveClass(type).newInstance(); + // 设置 Configuration 的 objectWrapperFactory 属性 + configuration.setObjectWrapperFactory(factory); + } + } + + private void reflectorFactoryElement(XNode context) throws Exception { + if (context != null) { + // 获得 ReflectorFactory 的实现类 + String type = context.getStringAttribute("type"); + // 创建 ReflectorFactory 对象 + ReflectorFactory factory = (ReflectorFactory) resolveClass(type).newInstance(); + // 设置 Configuration 的 reflectorFactory 属性 + configuration.setReflectorFactory(factory); + } + } + + /** + * 1. 解析 标签,成 Properties 对象。 + * 2. 覆盖 configuration 中的 Properties 对象到上面的结果。 + * 3. 设置结果到 parser 和 configuration 中 + * + * @param context 节点 + * @throws Exception 解析发生异常 + */ + private void propertiesElement(XNode context) throws Exception { + if (context != null) { + // 读取子标签们,为 Properties 对象 + Properties defaults = context.getChildrenAsProperties(); + // 读取 resource 和 url 属性 + String resource = context.getStringAttribute("resource"); + String url = context.getStringAttribute("url"); + if (resource != null && url != null) { // resource 和 url 都存在的情况下,抛出 BuilderException 异常 + throw new BuilderException("The properties element cannot specify both a URL and a resource based property file reference. Please specify one or the other."); + } + // 读取本地 Properties 配置文件到 defaults 中。 + if (resource != null) { + defaults.putAll(Resources.getResourceAsProperties(resource)); + // 读取远程 Properties 配置文件到 defaults 中。 + } else if (url != null) { + defaults.putAll(Resources.getUrlAsProperties(url)); + } + // 覆盖 configuration 中的 Properties 对象到 defaults 中。 + Properties vars = configuration.getVariables(); + if (vars != null) { + defaults.putAll(vars); + } + // 设置 defaults 到 parser 和 configuration 中。 + parser.setVariables(defaults); + configuration.setVariables(defaults); + } + } + + private void settingsElement(Properties props) throws Exception { + configuration.setAutoMappingBehavior(AutoMappingBehavior.valueOf(props.getProperty("autoMappingBehavior", "PARTIAL"))); + configuration.setAutoMappingUnknownColumnBehavior(AutoMappingUnknownColumnBehavior.valueOf(props.getProperty("autoMappingUnknownColumnBehavior", "NONE"))); + configuration.setCacheEnabled(booleanValueOf(props.getProperty("cacheEnabled"), true)); + configuration.setProxyFactory((ProxyFactory) createInstance(props.getProperty("proxyFactory"))); + configuration.setLazyLoadingEnabled(booleanValueOf(props.getProperty("lazyLoadingEnabled"), false)); + configuration.setAggressiveLazyLoading(booleanValueOf(props.getProperty("aggressiveLazyLoading"), false)); + configuration.setMultipleResultSetsEnabled(booleanValueOf(props.getProperty("multipleResultSetsEnabled"), true)); + configuration.setUseColumnLabel(booleanValueOf(props.getProperty("useColumnLabel"), true)); + configuration.setUseGeneratedKeys(booleanValueOf(props.getProperty("useGeneratedKeys"), false)); + configuration.setDefaultExecutorType(ExecutorType.valueOf(props.getProperty("defaultExecutorType", "SIMPLE"))); + configuration.setDefaultStatementTimeout(integerValueOf(props.getProperty("defaultStatementTimeout"), null)); + configuration.setDefaultFetchSize(integerValueOf(props.getProperty("defaultFetchSize"), null)); + configuration.setMapUnderscoreToCamelCase(booleanValueOf(props.getProperty("mapUnderscoreToCamelCase"), false)); + configuration.setSafeRowBoundsEnabled(booleanValueOf(props.getProperty("safeRowBoundsEnabled"), false)); + configuration.setLocalCacheScope(LocalCacheScope.valueOf(props.getProperty("localCacheScope", "SESSION"))); + configuration.setJdbcTypeForNull(JdbcType.valueOf(props.getProperty("jdbcTypeForNull", "OTHER"))); + configuration.setLazyLoadTriggerMethods(stringSetValueOf(props.getProperty("lazyLoadTriggerMethods"), "equals,clone,hashCode,toString")); + configuration.setSafeResultHandlerEnabled(booleanValueOf(props.getProperty("safeResultHandlerEnabled"), true)); + configuration.setDefaultScriptingLanguage(resolveClass(props.getProperty("defaultScriptingLanguage"))); + @SuppressWarnings("unchecked") + Class typeHandler = resolveClass(props.getProperty("defaultEnumTypeHandler")); + configuration.setDefaultEnumTypeHandler(typeHandler); + configuration.setCallSettersOnNulls(booleanValueOf(props.getProperty("callSettersOnNulls"), false)); + configuration.setUseActualParamName(booleanValueOf(props.getProperty("useActualParamName"), true)); + configuration.setReturnInstanceForEmptyRow(booleanValueOf(props.getProperty("returnInstanceForEmptyRow"), false)); + configuration.setLogPrefix(props.getProperty("logPrefix")); + @SuppressWarnings("unchecked") + Class logImpl = resolveClass(props.getProperty("logImpl")); + configuration.setLogImpl(logImpl); + configuration.setConfigurationFactory(resolveClass(props.getProperty("configurationFactory"))); + } + + private void environmentsElement(XNode context) throws Exception { + if (context != null) { + // environment 属性非空,从 default 属性获得 + if (environment == null) { + environment = context.getStringAttribute("default"); + } + // 遍历 XNode 节点 + for (XNode child : context.getChildren()) { + // 判断 environment 是否匹配 + String id = child.getStringAttribute("id"); + if (isSpecifiedEnvironment(id)) { + // 解析 `` 标签,返回 TransactionFactory 对象 + TransactionFactory txFactory = transactionManagerElement(child.evalNode("transactionManager")); + // 解析 `` 标签,返回 DataSourceFactory 对象 + DataSourceFactory dsFactory = dataSourceElement(child.evalNode("dataSource")); + DataSource dataSource = dsFactory.getDataSource(); + // 创建 Environment.Builder 对象 + Environment.Builder environmentBuilder = new Environment.Builder(id) + .transactionFactory(txFactory) + .dataSource(dataSource); + // 构造 Environment 对象,并设置到 configuration 中 + configuration.setEnvironment(environmentBuilder.build()); + } + } + } + } + + private void databaseIdProviderElement(XNode context) throws Exception { + DatabaseIdProvider databaseIdProvider = null; + if (context != null) { + // 获得 DatabaseIdProvider 的类 + String type = context.getStringAttribute("type"); + // awful patch to keep backward compatibility 保持兼容 + if ("VENDOR".equals(type)) { + type = "DB_VENDOR"; + } + // 获得 Properties 对象 + Properties properties = context.getChildrenAsProperties(); + // 创建 DatabaseIdProvider 对象,并设置对应的属性 + databaseIdProvider = (DatabaseIdProvider) resolveClass(type).newInstance(); + databaseIdProvider.setProperties(properties); + } + Environment environment = configuration.getEnvironment(); + if (environment != null && databaseIdProvider != null) { + // 获得对应的 databaseId 编号 + String databaseId = databaseIdProvider.getDatabaseId(environment.getDataSource()); + // 设置到 configuration 中 + configuration.setDatabaseId(databaseId); + } + } + + private TransactionFactory transactionManagerElement(XNode context) throws Exception { + if (context != null) { + // 获得 TransactionFactory 的类 + String type = context.getStringAttribute("type"); + // 获得 Properties 属性 + Properties props = context.getChildrenAsProperties(); + // 创建 TransactionFactory 对象,并设置属性 + TransactionFactory factory = (TransactionFactory) resolveClass(type).newInstance(); + factory.setProperties(props); + return factory; + } + throw new BuilderException("Environment declaration requires a TransactionFactory."); + } + + private DataSourceFactory dataSourceElement(XNode context) throws Exception { + if (context != null) { + // 获得 DataSourceFactory 的类 + String type = context.getStringAttribute("type"); + // 获得 Properties 属性 + Properties props = context.getChildrenAsProperties(); + // 创建 DataSourceFactory 对象,并设置属性 + DataSourceFactory factory = (DataSourceFactory) resolveClass(type).newInstance(); + factory.setProperties(props); + return factory; + } + throw new BuilderException("Environment declaration requires a DataSourceFactory."); + } + + private void typeHandlerElement(XNode parent) throws Exception { + if (parent != null) { + // 遍历子节点 + for (XNode child : parent.getChildren()) { + // 如果是 package 标签,则扫描该包 + if ("package".equals(child.getName())) { + String typeHandlerPackage = child.getStringAttribute("name"); + typeHandlerRegistry.register(typeHandlerPackage); + // 如果是 typeHandler 标签,则注册该 typeHandler 信息 + } else { + // 获得 javaType、jdbcType、handler + String javaTypeName = child.getStringAttribute("javaType"); + String jdbcTypeName = child.getStringAttribute("jdbcType"); + String handlerTypeName = child.getStringAttribute("handler"); + Class javaTypeClass = resolveClass(javaTypeName); + JdbcType jdbcType = resolveJdbcType(jdbcTypeName); + Class typeHandlerClass = resolveClass(handlerTypeName); // 非空 + // 注册 typeHandler + if (javaTypeClass != null) { + if (jdbcType == null) { + typeHandlerRegistry.register(javaTypeClass, typeHandlerClass); + } else { + typeHandlerRegistry.register(javaTypeClass, jdbcType, typeHandlerClass); + } + } else { + typeHandlerRegistry.register(typeHandlerClass); + } + } + } + } + } + + private void mapperElement(XNode parent) throws Exception { + if (parent != null) { + // 遍历子节点 + for (XNode child : parent.getChildren()) { + // 如果是 package 标签,则扫描该包 + if ("package".equals(child.getName())) { + // 获取 节点中的 name 属性 + String mapperPackage = child.getStringAttribute("name"); + // 从指定包中查找 mapper 接口,并根据 mapper 接口解析映射配置 + configuration.addMappers(mapperPackage); + // 如果是 mapper 标签, + } else { + // 获得 resource、url、class 属性 + String resource = child.getStringAttribute("resource"); + String url = child.getStringAttribute("url"); + String mapperClass = child.getStringAttribute("class"); + + // resource 不为空,且其他两者为空,则从指定路径中加载配置 + if (resource != null && url == null && mapperClass == null) { + ErrorContext.instance().resource(resource); + // 获得 resource 的 InputStream 对象 + InputStream inputStream = Resources.getResourceAsStream(resource); + // 创建 XMLMapperBuilder 对象 + XMLMapperBuilder mapperParser = new XMLMapperBuilder(inputStream, configuration, resource, configuration.getSqlFragments()); + // 执行解析 + mapperParser.parse(); + // url 不为空,且其他两者为空,则通过 url 加载配置 + } else if (resource == null && url != null && mapperClass == null) { + ErrorContext.instance().resource(url); + // 获得 url 的 InputStream 对象 + InputStream inputStream = Resources.getUrlAsStream(url); + // 创建 XMLMapperBuilder 对象 + XMLMapperBuilder mapperParser = new XMLMapperBuilder(inputStream, configuration, url, configuration.getSqlFragments()); + // 执行解析 + mapperParser.parse(); + // mapperClass 不为空,且其他两者为空,则通过 mapperClass 解析映射配置 + } else if (resource == null && url == null && mapperClass != null) { + // 获得 Mapper 接口 + Class mapperInterface = Resources.classForName(mapperClass); + // 添加到 configuration 中 + configuration.addMapper(mapperInterface); + // 以上条件不满足,则抛出异常 + } else { + throw new BuilderException("A mapper element may only specify a url, resource or class, but not more than one."); + } + } + } + } + } + + /** + * 判断是否为匹配的环境 + * + * @param id 环境编号 + * @return 是否匹配 + */ + private boolean isSpecifiedEnvironment(String id) { + if (environment == null) { + throw new BuilderException("No environment specified."); + } else if (id == null) { + throw new BuilderException("Environment requires an id attribute."); + } else if (environment.equals(id)) { // 相等 + return true; + } + return false; + } + +} diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/xml/XMLIncludeTransformer.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/xml/XMLIncludeTransformer.java new file mode 100644 index 0000000..eece855 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/xml/XMLIncludeTransformer.java @@ -0,0 +1,175 @@ +/** + * Copyright 2009-2018 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.builder.xml; + +import org.apache.ibatis.builder.BuilderException; +import org.apache.ibatis.builder.IncompleteElementException; +import org.apache.ibatis.builder.MapperBuilderAssistant; +import org.apache.ibatis.parsing.PropertyParser; +import org.apache.ibatis.parsing.XNode; +import org.apache.ibatis.session.Configuration; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; + +/** + * XML 标签的转换器 + * + * @author Frank D. Martinez [mnesarco] + */ +public class XMLIncludeTransformer { + + private final Configuration configuration; + private final MapperBuilderAssistant builderAssistant; + + public XMLIncludeTransformer(Configuration configuration, MapperBuilderAssistant builderAssistant) { + this.configuration = configuration; + this.builderAssistant = builderAssistant; + } + + public void applyIncludes(Node source) { + // 创建 variablesContext ,并将 configurationVariables 添加到其中 + Properties variablesContext = new Properties(); + Properties configurationVariables = configuration.getVariables(); + if (configurationVariables != null) { + variablesContext.putAll(configurationVariables); + } + // 处理 + applyIncludes(source, variablesContext, false); + } + + /** + * Recursively apply includes through all SQL fragments. + * + * 使用递归的方式,将 标签,替换成引用的 + * + * @param source Include node in DOM tree + * @param variablesContext Current context for static variables with values + * @param included 是否在处理 标签中 + */ + private void applyIncludes(Node source, final Properties variablesContext, boolean included) { + // 如果是 标签 + if (source.getNodeName().equals("include")) { + // 获得 对应的节点 + Node toInclude = findSqlFragment(getStringAttribute(source, "refid"), variablesContext); + // 获得包含 标签内的属性 + Properties toIncludeContext = getVariablesContext(source, variablesContext); + // 递归调用 #applyIncludes(...) 方法,继续替换。注意,此处是 对应的节点 + applyIncludes(toInclude, toIncludeContext, true); + if (toInclude.getOwnerDocument() != source.getOwnerDocument()) { + toInclude = source.getOwnerDocument().importNode(toInclude, true); + } + // 将 节点替换成 节点 + source.getParentNode().replaceChild(toInclude, source); // 注意,这是一个奇葩的 API ,前者为 newNode ,后者为 oldNode + // 将 子节点添加到 节点前面 + while (toInclude.hasChildNodes()) { + toInclude.getParentNode().insertBefore(toInclude.getFirstChild(), toInclude); // 这里有个点,一定要注意,卡了艿艿很久。当子节点添加到其它节点下面后,这个子节点会不见了,相当于是“移动操作” + } + // 移除 标签自身 + toInclude.getParentNode().removeChild(toInclude); + // 如果节点类型为 Node.ELEMENT_NODE + } else if (source.getNodeType() == Node.ELEMENT_NODE) { + // 如果在处理 标签中,则替换其上的属性,例如 的情况,lang 属性是可以被替换的 + if (included && !variablesContext.isEmpty()) { + // replace variables in attribute values + NamedNodeMap attributes = source.getAttributes(); + for (int i = 0; i < attributes.getLength(); i++) { + Node attr = attributes.item(i); + attr.setNodeValue(PropertyParser.parse(attr.getNodeValue(), variablesContext)); + } + } + // 遍历子节点,递归调用 #applyIncludes(...) 方法,继续替换 + NodeList children = source.getChildNodes(); + for (int i = 0; i < children.getLength(); i++) { + applyIncludes(children.item(i), variablesContext, included); + } + // 如果在处理 标签中,并且节点类型为 Node.TEXT_NODE ,并且变量非空 + // 则进行变量的替换,并修改原节点 source + } else if (included && source.getNodeType() == Node.TEXT_NODE + && !variablesContext.isEmpty()) { + // replace variables in text node + source.setNodeValue(PropertyParser.parse(source.getNodeValue(), variablesContext)); + } + } + + /** + * 获得 对应的节点 + * + * @param refid 指定编号 + * @param variables 变量 + * @return 对应的节点 + */ + private Node findSqlFragment(String refid, Properties variables) { + // 因为 refid 可能是动态变量,所以进行替换 + refid = PropertyParser.parse(refid, variables); + // 获得完整的 refid ,格式为 "${namespace}.${refid}" + refid = builderAssistant.applyCurrentNamespace(refid, true); + try { + // 获得对应的 节点 + XNode nodeToInclude = configuration.getSqlFragments().get(refid); + // 获得 Node 节点,进行克隆 + return nodeToInclude.getNode().cloneNode(true); + } catch (IllegalArgumentException e) { + throw new IncompleteElementException("Could not find SQL statement to include with refid '" + refid + "'", e); + } + } + + private String getStringAttribute(Node node, String name) { + return node.getAttributes().getNamedItem(name).getNodeValue(); + } + + /** + * 获得包含 标签内的属性 Properties 对象 + * + * Read placeholders and their values from include node definition. + * @param node Include node instance + * @param inheritedVariablesContext Current context used for replace variables in new variables values + * @return variables context from include instance (no inherited values) + */ + private Properties getVariablesContext(Node node, Properties inheritedVariablesContext) { + // 获得 标签的属性集合 + Map declaredProperties = null; + NodeList children = node.getChildNodes(); + for (int i = 0; i < children.getLength(); i++) { + Node n = children.item(i); + if (n.getNodeType() == Node.ELEMENT_NODE) { + String name = getStringAttribute(n, "name"); + // Replace variables inside + String value = PropertyParser.parse(getStringAttribute(n, "value"), inheritedVariablesContext); + if (declaredProperties == null) { + declaredProperties = new HashMap<>(); + } + if (declaredProperties.put(name, value) != null) { // 如果重复定义,抛出异常 + throw new BuilderException("Variable " + name + " defined twice in the same include definition"); + } + } + } + // 如果 标签内没有属性,直接使用 inheritedVariablesContext 即可 + if (declaredProperties == null) { + return inheritedVariablesContext; + // 如果 标签内有属性,则创建新的 newProperties 集合,将 inheritedVariablesContext + declaredProperties 合并 + } else { + Properties newProperties = new Properties(); + newProperties.putAll(inheritedVariablesContext); + newProperties.putAll(declaredProperties); + return newProperties; + } + } +} diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/xml/XMLMapperBuilder.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/xml/XMLMapperBuilder.java new file mode 100644 index 0000000..ed562e4 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/builder/xml/XMLMapperBuilder.java @@ -0,0 +1,513 @@ +/** + * Copyright 2009-2018 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.builder.xml; + +import org.apache.ibatis.builder.*; +import org.apache.ibatis.cache.Cache; +import org.apache.ibatis.executor.ErrorContext; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.mapping.*; +import org.apache.ibatis.parsing.XNode; +import org.apache.ibatis.parsing.XPathParser; +import org.apache.ibatis.session.Configuration; +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.TypeHandler; + +import java.io.InputStream; +import java.io.Reader; +import java.util.*; + +/** + * Mapper XML 配置构建器,主要负责解析 Mapper 映射配置文件 + * + * @author Clinton Begin + */ +public class XMLMapperBuilder extends BaseBuilder { + + /** + * 基于 Java XPath 解析器 + */ + private final XPathParser parser; + /** + * Mapper 构造器助手 + */ + private final MapperBuilderAssistant builderAssistant; + /** + * 可被其他语句引用的可重用语句块的集合 + * + * 例如: ${alias}.id,${alias}.username,${alias}.password + */ + private final Map sqlFragments; + /** + * 资源引用的地址 + */ + private final String resource; + + @Deprecated + public XMLMapperBuilder(Reader reader, Configuration configuration, String resource, Map sqlFragments, String namespace) { + this(reader, configuration, resource, sqlFragments); + this.builderAssistant.setCurrentNamespace(namespace); + } + + @Deprecated + public XMLMapperBuilder(Reader reader, Configuration configuration, String resource, Map sqlFragments) { + this(new XPathParser(reader, true, configuration.getVariables(), new XMLMapperEntityResolver()), + configuration, resource, sqlFragments); + } + + public XMLMapperBuilder(InputStream inputStream, Configuration configuration, String resource, Map sqlFragments, String namespace) { + this(inputStream, configuration, resource, sqlFragments); + this.builderAssistant.setCurrentNamespace(namespace); + } + + public XMLMapperBuilder(InputStream inputStream, Configuration configuration, String resource, Map sqlFragments) { + this(new XPathParser(inputStream, true, configuration.getVariables(), new XMLMapperEntityResolver()), + configuration, resource, sqlFragments); + } + + private XMLMapperBuilder(XPathParser parser, Configuration configuration, String resource, Map sqlFragments) { + super(configuration); + // 创建 MapperBuilderAssistant 对象 + this.builderAssistant = new MapperBuilderAssistant(configuration, resource); + this.parser = parser; + this.sqlFragments = sqlFragments; + this.resource = resource; + } + + public void parse() { + // 判断当前 Mapper 是否已经加载过 + if (!configuration.isResourceLoaded(resource)) { + // 解析 `` 节点 + configurationElement(parser.evalNode("/mapper")); + // 标记该 Mapper 已经加载过 + configuration.addLoadedResource(resource); + // 绑定 Mapper + bindMapperForNamespace(); + } + + // 解析待定的 节点 + parsePendingResultMaps(); + // 解析待定的 节点 + parsePendingCacheRefs(); + // 解析待定的 SQL 语句的节点 + parsePendingStatements(); + } + + public XNode getSqlFragment(String refid) { + return sqlFragments.get(refid); + } + + // 解析 `` 节点 + private void configurationElement(XNode context) { + try { + // 获得 namespace 属性 + String namespace = context.getStringAttribute("namespace"); + if (namespace == null || namespace.equals("")) { + throw new BuilderException("Mapper's namespace cannot be empty"); + } + // 设置 namespace 属性 + builderAssistant.setCurrentNamespace(namespace); + // 解析 节点 + cacheRefElement(context.evalNode("cache-ref")); + // 解析 节点 + cacheElement(context.evalNode("cache")); + // 已废弃!老式风格的参数映射。内联参数是首选,这个元素可能在将来被移除,这里不会记录。 + parameterMapElement(context.evalNodes("/mapper/parameterMap")); + // 解析 节点们 + resultMapElements(context.evalNodes("/mapper/resultMap")); + // 解析 节点们 + sqlElement(context.evalNodes("/mapper/sql")); + // 解析 节点们 + private void buildStatementFromContext(List list) { + if (configuration.getDatabaseId() != null) { + buildStatementFromContext(list, configuration.getDatabaseId()); + } + buildStatementFromContext(list, null); + // 上面两块代码,可以简写成 buildStatementFromContext(list, configuration.getDatabaseId()); + } + + private void buildStatementFromContext(List list, String requiredDatabaseId) { + //遍历 标签。 + * + * @author Clinton Begin + */ +public class XMLStatementBuilder extends BaseBuilder { + + private final MapperBuilderAssistant builderAssistant; + /** + * 当前 XML 节点,例如: 对应一个 MappedStatement 对象 + * + * 另外,比较特殊的是,`` 解析后,也会对应一个 MappedStatement 对象 + * + * @author Clinton Begin + */ +public final class MappedStatement { + + /** + * 资源引用的地址 + */ + private String resource; + /** + * Configuration 对象 + */ + private Configuration configuration; + /** + * 编号 + */ + private String id; + /** + * 这是尝试影响驱动程序每次批量返回的结果行数和这个设置值相等。默认值为 unset(依赖驱动)。 + */ + private Integer fetchSize; + /** + * 这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为 unset(依赖驱动)。 + */ + private Integer timeout; + /** + * 语句类型 + */ + private StatementType statementType; + /** + * 结果集类型 + */ + private ResultSetType resultSetType; + /** + * SqlSource 对象 + */ + private SqlSource sqlSource; + /** + * Cache 对象 + */ + private Cache cache; + /** + * ParameterMap 对象 + */ + private ParameterMap parameterMap; + /** + * ResultMap 集合 + */ + private List resultMaps; + /** + * 将其设置为 true,任何时候只要语句被调用,都会导致本地缓存和二级缓存都会被清空,默认值:false。 + */ + private boolean flushCacheRequired; + /** + * 是否使用缓存 + */ + private boolean useCache; + /** + * 这个设置仅针对嵌套结果 select 语句适用:如果为 true,就是假设包含了嵌套结果集或是分组了,这样的话当返回一个主结果行的时候,就不会发生有对前面结果集的引用的情况。这就使得在获取嵌套的结果集的时候不至于导致内存不够用。默认值:false。 + */ + private boolean resultOrdered; + /** + * SQL 语句类型 + */ + private SqlCommandType sqlCommandType; + /** + * KeyGenerator 对象 + */ + private KeyGenerator keyGenerator; + /** + * (仅对 insert 和 update 有用)唯一标记一个属性,MyBatis 会通过 getGeneratedKeys 的返回值或者通过 insert 语句的 selectKey 子元素设置它的键值,默认:unset。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。 + */ + private String[] keyProperties; + /** + * (仅对 insert 和 update 有用)通过生成的键值设置表中的列名,这个设置仅在某些数据库(像 PostgreSQL)是必须的,当主键列不是表中的第一列的时候需要设置。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。 + */ + private String[] keyColumns; + /** + * 是否有内嵌的 ResultMap + */ + private boolean hasNestedResultMaps; + /** + * 数据库标识 + */ + private String databaseId; + /** + * Log 对象 + */ + private Log statementLog; + /** + * LanguageDriver 对象 + */ + private LanguageDriver lang; + /** + * 这个设置仅对多结果集的情况适用,它将列出语句执行后返回的结果集并每个结果集给一个名称,名称是逗号分隔的。 + */ + private String[] resultSets; + + MappedStatement() { + // constructor disabled + } + + public static class Builder { + + private MappedStatement mappedStatement = new MappedStatement(); + + public Builder(Configuration configuration, String id, SqlSource sqlSource, SqlCommandType sqlCommandType) { + mappedStatement.configuration = configuration; + mappedStatement.id = id; + mappedStatement.sqlSource = sqlSource; + mappedStatement.statementType = StatementType.PREPARED; + mappedStatement.resultSetType = ResultSetType.DEFAULT; + mappedStatement.parameterMap = new ParameterMap.Builder(configuration, "defaultParameterMap", null, new ArrayList<>()).build(); + mappedStatement.resultMaps = new ArrayList<>(); + mappedStatement.sqlCommandType = sqlCommandType; + mappedStatement.keyGenerator = configuration.isUseGeneratedKeys() && SqlCommandType.INSERT.equals(sqlCommandType) ? Jdbc3KeyGenerator.INSTANCE : NoKeyGenerator.INSTANCE; + // 获得 Log 对象 + String logId = id; + if (configuration.getLogPrefix() != null) { + logId = configuration.getLogPrefix() + id; + } + mappedStatement.statementLog = LogFactory.getLog(logId); + mappedStatement.lang = configuration.getDefaultScriptingLanguageInstance(); + } + + public Builder resource(String resource) { + mappedStatement.resource = resource; + return this; + } + + public String id() { + return mappedStatement.id; + } + + public Builder parameterMap(ParameterMap parameterMap) { + mappedStatement.parameterMap = parameterMap; + return this; + } + + public Builder resultMaps(List resultMaps) { + mappedStatement.resultMaps = resultMaps; + for (ResultMap resultMap : resultMaps) { + mappedStatement.hasNestedResultMaps = mappedStatement.hasNestedResultMaps || resultMap.hasNestedResultMaps(); + } + return this; + } + + public Builder fetchSize(Integer fetchSize) { + mappedStatement.fetchSize = fetchSize; + return this; + } + + public Builder timeout(Integer timeout) { + mappedStatement.timeout = timeout; + return this; + } + + public Builder statementType(StatementType statementType) { + mappedStatement.statementType = statementType; + return this; + } + + public Builder resultSetType(ResultSetType resultSetType) { + mappedStatement.resultSetType = resultSetType == null ? ResultSetType.DEFAULT : resultSetType; + return this; + } + + public Builder cache(Cache cache) { + mappedStatement.cache = cache; + return this; + } + + public Builder flushCacheRequired(boolean flushCacheRequired) { + mappedStatement.flushCacheRequired = flushCacheRequired; + return this; + } + + public Builder useCache(boolean useCache) { + mappedStatement.useCache = useCache; + return this; + } + + public Builder resultOrdered(boolean resultOrdered) { + mappedStatement.resultOrdered = resultOrdered; + return this; + } + + public Builder keyGenerator(KeyGenerator keyGenerator) { + mappedStatement.keyGenerator = keyGenerator; + return this; + } + + public Builder keyProperty(String keyProperty) { + mappedStatement.keyProperties = delimitedStringToArray(keyProperty); + return this; + } + + public Builder keyColumn(String keyColumn) { + mappedStatement.keyColumns = delimitedStringToArray(keyColumn); + return this; + } + + public Builder databaseId(String databaseId) { + mappedStatement.databaseId = databaseId; + return this; + } + + public Builder lang(LanguageDriver driver) { + mappedStatement.lang = driver; + return this; + } + + public Builder resultSets(String resultSet) { + mappedStatement.resultSets = delimitedStringToArray(resultSet); + return this; + } + + /** @deprecated Use {@link #resultSets} */ + @Deprecated + public Builder resulSets(String resultSet) { + mappedStatement.resultSets = delimitedStringToArray(resultSet); + return this; + } + + public MappedStatement build() { + assert mappedStatement.configuration != null; + assert mappedStatement.id != null; + assert mappedStatement.sqlSource != null; + assert mappedStatement.lang != null; + mappedStatement.resultMaps = Collections.unmodifiableList(mappedStatement.resultMaps); + return mappedStatement; + } + } + + public KeyGenerator getKeyGenerator() { + return keyGenerator; + } + + public SqlCommandType getSqlCommandType() { + return sqlCommandType; + } + + public String getResource() { + return resource; + } + + public Configuration getConfiguration() { + return configuration; + } + + public String getId() { + return id; + } + + public boolean hasNestedResultMaps() { + return hasNestedResultMaps; + } + + public Integer getFetchSize() { + return fetchSize; + } + + public Integer getTimeout() { + return timeout; + } + + public StatementType getStatementType() { + return statementType; + } + + public ResultSetType getResultSetType() { + return resultSetType; + } + + public SqlSource getSqlSource() { + return sqlSource; + } + + public ParameterMap getParameterMap() { + return parameterMap; + } + + public List getResultMaps() { + return resultMaps; + } + + public Cache getCache() { + return cache; + } + + public boolean isFlushCacheRequired() { + return flushCacheRequired; + } + + public boolean isUseCache() { + return useCache; + } + + public boolean isResultOrdered() { + return resultOrdered; + } + + public String getDatabaseId() { + return databaseId; + } + + public String[] getKeyProperties() { + return keyProperties; + } + + public String[] getKeyColumns() { + return keyColumns; + } + + public Log getStatementLog() { + return statementLog; + } + + public LanguageDriver getLang() { + return lang; + } + + public String[] getResultSets() { + return resultSets; + } + + /** @deprecated Use {@link #getResultSets()} */ + @Deprecated + public String[] getResulSets() { + return resultSets; + } + + // 获得 BoundSql 对象 + public BoundSql getBoundSql(Object parameterObject) { + // 获得 BoundSql 对象 + BoundSql boundSql = sqlSource.getBoundSql(parameterObject); + // 忽略,因为 已经废弃,参见 http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html 文档 + List parameterMappings = boundSql.getParameterMappings(); + if (parameterMappings == null || parameterMappings.isEmpty()) { + boundSql = new BoundSql(configuration, boundSql.getSql(), parameterMap.getParameterMappings(), parameterObject); + } + + // check for nested result maps in parameter mappings (issue #30) + // 判断传入的参数中,是否有内嵌的结果 ResultMap 。如果有,则修改 hasNestedResultMaps 为 true + // 存储过程相关,暂时无视 + for (ParameterMapping pm : boundSql.getParameterMappings()) { + String rmId = pm.getResultMapId(); + if (rmId != null) { + ResultMap rm = configuration.getResultMap(rmId); + if (rm != null) { + hasNestedResultMaps |= rm.hasNestedResultMaps(); + } + } + } + + return boundSql; + } + + private static String[] delimitedStringToArray(String in) { + if (in == null || in.trim().length() == 0) { + return null; + } else { + return in.split(","); + } + } + +} diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/ParameterMap.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/ParameterMap.java new file mode 100644 index 0000000..2aaf415 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/ParameterMap.java @@ -0,0 +1,84 @@ +/** + * Copyright 2009-2015 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.mapping; + +import org.apache.ibatis.session.Configuration; + +import java.util.Collections; +import java.util.List; + +/** + * 参数集合 + * + * @author Clinton Begin + */ +public class ParameterMap { + + /** + * 编号 + */ + private String id; + /** + * 类型 + * + * 适用于 paramType="" 标签属性 + */ + private Class type; + /** + * ParameterMapping 集合 + * + * 适用于 paramMap="" 标签属性 + */ + private List parameterMappings; + + private ParameterMap() { + } + + public static class Builder { + + private ParameterMap parameterMap = new ParameterMap(); + + public Builder(Configuration configuration, String id, Class type, List parameterMappings) { + parameterMap.id = id; + parameterMap.type = type; + parameterMap.parameterMappings = parameterMappings; + } + + public Class type() { + return parameterMap.type; + } + + public ParameterMap build() { + //lock down collections + parameterMap.parameterMappings = Collections.unmodifiableList(parameterMap.parameterMappings); + return parameterMap; + } + + } + + public String getId() { + return id; + } + + public Class getType() { + return type; + } + + public List getParameterMappings() { + return parameterMappings; + } + +} diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/ParameterMapping.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/ParameterMapping.java new file mode 100644 index 0000000..d2c3a34 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/ParameterMapping.java @@ -0,0 +1,256 @@ +/** + * Copyright 2009-2016 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.mapping; + +import org.apache.ibatis.session.Configuration; +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.TypeHandler; +import org.apache.ibatis.type.TypeHandlerRegistry; + +import java.sql.ResultSet; + +/** + * 参数映射 + * + * @author Clinton Begin + */ +public class ParameterMapping { + + private Configuration configuration; + + /** + * 属性的名字 + */ + private String property; + /** + * 参数类型。 + * + * 目前只需要关注 ParameterMode.IN 的情况,另外的 OUT、INOUT 是在存储过程中使用,暂时无视 + */ + private ParameterMode mode; + /** + * Java 类型 + */ + private Class javaType = Object.class; + /** + * JDBC 类型 + */ + private JdbcType jdbcType; + /** + * 对于数值类型,还有一个小数保留位数的设置,来确定小数点后保留的位数 + */ + private Integer numericScale; + /** + * TypeHandler 对象 + * + * {@link Builder#resolveTypeHandler()} + */ + private TypeHandler typeHandler; + /** + * 貌似只在 ParameterMode 在 OUT、INOUT 是在存储过程中使用 + */ + private String resultMapId; + /** + * 貌似只在 ParameterMode 在 OUT、INOUT 是在存储过程中使用 + */ + private String jdbcTypeName; + /** + * 表达式。 + * + * ps:目前暂时不支持 + */ + private String expression; + + private ParameterMapping() { + } + + public static class Builder { + + private ParameterMapping parameterMapping = new ParameterMapping(); + + public Builder(Configuration configuration, String property, TypeHandler typeHandler) { + parameterMapping.configuration = configuration; + parameterMapping.property = property; + parameterMapping.typeHandler = typeHandler; + parameterMapping.mode = ParameterMode.IN; + } + + public Builder(Configuration configuration, String property, Class javaType) { + parameterMapping.configuration = configuration; + parameterMapping.property = property; + parameterMapping.javaType = javaType; + parameterMapping.mode = ParameterMode.IN; + } + + public Builder mode(ParameterMode mode) { + parameterMapping.mode = mode; + return this; + } + + public Builder javaType(Class javaType) { + parameterMapping.javaType = javaType; + return this; + } + + public Builder jdbcType(JdbcType jdbcType) { + parameterMapping.jdbcType = jdbcType; + return this; + } + + public Builder numericScale(Integer numericScale) { + parameterMapping.numericScale = numericScale; + return this; + } + + public Builder resultMapId(String resultMapId) { + parameterMapping.resultMapId = resultMapId; + return this; + } + + public Builder typeHandler(TypeHandler typeHandler) { + parameterMapping.typeHandler = typeHandler; + return this; + } + + public Builder jdbcTypeName(String jdbcTypeName) { + parameterMapping.jdbcTypeName = jdbcTypeName; + return this; + } + + public Builder expression(String expression) { + parameterMapping.expression = expression; + return this; + } + + public ParameterMapping build() { + resolveTypeHandler(); + validate(); + return parameterMapping; + } + + private void validate() { + if (ResultSet.class.equals(parameterMapping.javaType)) { + if (parameterMapping.resultMapId == null) { + throw new IllegalStateException("Missing resultmap in property '" + + parameterMapping.property + "'. " + + "Parameters of type java.sql.ResultSet require a resultmap."); + } + } else { + if (parameterMapping.typeHandler == null) { + throw new IllegalStateException("Type handler was null on parameter mapping for property '" + + parameterMapping.property + "'. It was either not specified and/or could not be found for the javaType (" + + parameterMapping.javaType.getName() + ") : jdbcType (" + parameterMapping.jdbcType + ") combination."); + } + } + } + + private void resolveTypeHandler() { + // 如果不存在 typeHandler ,并且 javaType 非空,则基于 javaType + jdbcType 获得对应的 TypeHandler 对象 + if (parameterMapping.typeHandler == null && parameterMapping.javaType != null) { + Configuration configuration = parameterMapping.configuration; + TypeHandlerRegistry typeHandlerRegistry = configuration.getTypeHandlerRegistry(); + // 基于 javaType + jdbcType 获得对应的 TypeHandler 对象 + parameterMapping.typeHandler = typeHandlerRegistry.getTypeHandler(parameterMapping.javaType, parameterMapping.jdbcType); + } + } + + } + + public String getProperty() { + return property; + } + + /** + * Used for handling output of callable statements + * @return + */ + public ParameterMode getMode() { + return mode; + } + + /** + * Used for handling output of callable statements + * @return + */ + public Class getJavaType() { + return javaType; + } + + /** + * Used in the UnknownTypeHandler in case there is no handler for the property type + * @return + */ + public JdbcType getJdbcType() { + return jdbcType; + } + + /** + * Used for handling output of callable statements + * @return + */ + public Integer getNumericScale() { + return numericScale; + } + + /** + * Used when setting parameters to the PreparedStatement + * @return + */ + public TypeHandler getTypeHandler() { + return typeHandler; + } + + /** + * Used for handling output of callable statements + * @return + */ + public String getResultMapId() { + return resultMapId; + } + + /** + * Used for handling output of callable statements + * @return + */ + public String getJdbcTypeName() { + return jdbcTypeName; + } + + /** + * Not used + * @return + */ + public String getExpression() { + return expression; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("ParameterMapping{"); + //sb.append("configuration=").append(configuration); // configuration doesn't have a useful .toString() + sb.append("property='").append(property).append('\''); + sb.append(", mode=").append(mode); + sb.append(", javaType=").append(javaType); + sb.append(", jdbcType=").append(jdbcType); + sb.append(", numericScale=").append(numericScale); + //sb.append(", typeHandler=").append(typeHandler); // typeHandler also doesn't have a useful .toString() + sb.append(", resultMapId='").append(resultMapId).append('\''); + sb.append(", jdbcTypeName='").append(jdbcTypeName).append('\''); + sb.append(", expression='").append(expression).append('\''); + sb.append('}'); + return sb.toString(); + } +} diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/ParameterMode.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/ParameterMode.java new file mode 100644 index 0000000..70cbf6d --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/ParameterMode.java @@ -0,0 +1,38 @@ +/** + * Copyright 2009-2015 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.mapping; + +/** + * 参数类型 + * + * @author Clinton Begin + */ +public enum ParameterMode { + + /** + * 输入 + */ + IN, + /** + * 输出 + */ + OUT, + /** + * IN + OUT + */ + INOUT + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/ResultFlag.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/ResultFlag.java new file mode 100644 index 0000000..4e67102 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/ResultFlag.java @@ -0,0 +1,34 @@ +/** + * Copyright 2009-2015 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.mapping; + +/** + * 结果标识 + * + * @author Clinton Begin + */ +public enum ResultFlag { + + /** + * ID + */ + ID, + /** + * 构造方法 + */ + CONSTRUCTOR + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/ResultMap.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/ResultMap.java new file mode 100644 index 0000000..a12d722 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/ResultMap.java @@ -0,0 +1,344 @@ +/** + * Copyright 2009-2018 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.mapping; + +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.builder.BuilderException; +import org.apache.ibatis.logging.Log; +import org.apache.ibatis.logging.LogFactory; +import org.apache.ibatis.reflection.ParamNameUtil; +import org.apache.ibatis.session.Configuration; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Constructor; +import java.util.*; + +/** + * 结果集,例如 解析后的对象 + * + * @author Clinton Begin + */ +public class ResultMap { + + /** + * Configuration 对象 + */ + private Configuration configuration; + + /** + * ResultMap 对象 + */ + private String id; + /** + * 类型 + */ + private Class type; + /** + * ResultMapping 集合 + */ + private List resultMappings; + /** + * ID ResultMapping 集合 + * + * 当 idResultMappings 为空时,使用 {@link #resultMappings} 赋值 + */ + private List idResultMappings; + /** + * 构造方法 ResultMapping 集合 + * + * 和 {@link #propertyResultMappings} 只有一个值 + */ + private List constructorResultMappings; + /** + * 属性 ResultMapping 集合 + */ + private List propertyResultMappings; + /** + * 数据库的字段集合 + */ + private Set mappedColumns; + /** + * Java 对象的属性集合 + */ + private Set mappedProperties; + /** + * Discriminator 对象 + */ + private Discriminator discriminator; + /** + * 是否有内嵌的 ResultMap + */ + private boolean hasNestedResultMaps; + /** + * 是否有内嵌的查询 + */ + private boolean hasNestedQueries; + /** + * 是否开启自动匹配 + * + * 如果设置这个属性,MyBatis将会为这个ResultMap开启或者关闭自动映射。这个属性会覆盖全局的属性 autoMappingBehavior。默认值为:unset。 + */ + private Boolean autoMapping; + + private ResultMap() { + } + + public static class Builder { + + private static final Log log = LogFactory.getLog(Builder.class); + + private ResultMap resultMap = new ResultMap(); + + public Builder(Configuration configuration, String id, Class type, List resultMappings) { + this(configuration, id, type, resultMappings, null); + } + + public Builder(Configuration configuration, String id, Class type, List resultMappings, Boolean autoMapping) { + resultMap.configuration = configuration; + resultMap.id = id; + resultMap.type = type; + resultMap.resultMappings = resultMappings; + resultMap.autoMapping = autoMapping; + } + + public Builder discriminator(Discriminator discriminator) { + resultMap.discriminator = discriminator; + return this; + } + + public Class type() { + return resultMap.type; + } + + /** + * 构造 ResultMap 对象 + * + * @return ResultMap 对象 + */ + public ResultMap build() { + if (resultMap.id == null) { + throw new IllegalArgumentException("ResultMaps must have an id"); + } + resultMap.mappedColumns = new HashSet<>(); + resultMap.mappedProperties = new HashSet<>(); + resultMap.idResultMappings = new ArrayList<>(); + resultMap.constructorResultMappings = new ArrayList<>(); + resultMap.propertyResultMappings = new ArrayList<>(); + final List constructorArgNames = new ArrayList<>(); + for (ResultMapping resultMapping : resultMap.resultMappings) { + // 初始化 hasNestedQueries + resultMap.hasNestedQueries = resultMap.hasNestedQueries || resultMapping.getNestedQueryId() != null; + // 初始化 hasNestedResultMaps + resultMap.hasNestedResultMaps = resultMap.hasNestedResultMaps || (resultMapping.getNestedResultMapId() != null && resultMapping.getResultSet() == null); + // 添加到 mappedColumns + final String column = resultMapping.getColumn(); + if (column != null) { + resultMap.mappedColumns.add(column.toUpperCase(Locale.ENGLISH)); + } else if (resultMapping.isCompositeResult()) { + for (ResultMapping compositeResultMapping : resultMapping.getComposites()) { + final String compositeColumn = compositeResultMapping.getColumn(); + if (compositeColumn != null) { + resultMap.mappedColumns.add(compositeColumn.toUpperCase(Locale.ENGLISH)); + } + } + } + // 添加到 mappedProperties + final String property = resultMapping.getProperty(); + if (property != null) { + resultMap.mappedProperties.add(property); + } + // 初始化 constructorResultMappings + if (resultMapping.getFlags().contains(ResultFlag.CONSTRUCTOR)) { + resultMap.constructorResultMappings.add(resultMapping); + if (resultMapping.getProperty() != null) { + constructorArgNames.add(resultMapping.getProperty()); + } + // 初始化 propertyResultMappings + } else { + resultMap.propertyResultMappings.add(resultMapping); + } + // 初始化 idResultMappings + if (resultMapping.getFlags().contains(ResultFlag.ID)) { + resultMap.idResultMappings.add(resultMapping); + } + } + // 保证 idResultMappings 非空 + if (resultMap.idResultMappings.isEmpty()) { + resultMap.idResultMappings.addAll(resultMap.resultMappings); + } + // 将 constructorResultMappings 排序成符合的构造方法的参数顺序 + if (!constructorArgNames.isEmpty()) { + // 获得真正的构造方法的参数数组 actualArgNames + final List actualArgNames = argNamesOfMatchingConstructor(constructorArgNames); + if (actualArgNames == null) { + throw new BuilderException("Error in result map '" + resultMap.id + + "'. Failed to find a constructor in '" + + resultMap.getType().getName() + "' by arg names " + constructorArgNames + + ". There might be more info in debug log."); + } + // 基于 actualArgNames ,将 constructorResultMappings 排序 + resultMap.constructorResultMappings.sort((o1, o2) -> { + int paramIdx1 = actualArgNames.indexOf(o1.getProperty()); + int paramIdx2 = actualArgNames.indexOf(o2.getProperty()); + return paramIdx1 - paramIdx2; + }); + } + // lock down collections + resultMap.resultMappings = Collections.unmodifiableList(resultMap.resultMappings); + resultMap.idResultMappings = Collections.unmodifiableList(resultMap.idResultMappings); + resultMap.constructorResultMappings = Collections.unmodifiableList(resultMap.constructorResultMappings); + resultMap.propertyResultMappings = Collections.unmodifiableList(resultMap.propertyResultMappings); + resultMap.mappedColumns = Collections.unmodifiableSet(resultMap.mappedColumns); + return resultMap; + } + + private List argNamesOfMatchingConstructor(List constructorArgNames) { + // 获得所有构造方法 + Constructor[] constructors = resultMap.type.getDeclaredConstructors(); + // 遍历所有构造方法 + for (Constructor constructor : constructors) { + Class[] paramTypes = constructor.getParameterTypes(); + // 参数数量一致 + if (constructorArgNames.size() == paramTypes.length) { + // 获得构造方法的参数名的数组 + List paramNames = getArgNames(constructor); + if (constructorArgNames.containsAll(paramNames) // 判断名字 + && argTypesMatch(constructorArgNames, paramTypes, paramNames)) { // 判断类型 + return paramNames; + } + } + } + return null; + } + + /** + * 判断构造方法的参数类型是否符合 + * + * @param constructorArgNames 构造方法的参数名数组 + * @param paramTypes 构造方法的参数类型数组 + * @param paramNames 声明的参数名数组 + * @return 是否符合 + */ + private boolean argTypesMatch(final List constructorArgNames, + Class[] paramTypes, List paramNames) { + // 遍历所有参数名 + for (int i = 0; i < constructorArgNames.size(); i++) { + // 判断类型是否匹配 + Class actualType = paramTypes[paramNames.indexOf(constructorArgNames.get(i))]; + Class specifiedType = resultMap.constructorResultMappings.get(i).getJavaType(); + if (!actualType.equals(specifiedType)) { + if (log.isDebugEnabled()) { + log.debug("While building result map '" + resultMap.id + + "', found a constructor with arg names " + constructorArgNames + + ", but the type of '" + constructorArgNames.get(i) + + "' did not match. Specified: [" + specifiedType.getName() + "] Declared: [" + + actualType.getName() + "]"); + } + return false; + } + } + return true; + } + + /** + * 获得构造方法的参数名的数组 + * + * 因为参数上会有 {@link Param} 注解,所以会使用注解上设置的名字 + * + * @param constructor 构造方法 + * @return 参数名数组 + */ + private List getArgNames(Constructor constructor) { + // 结果 + List paramNames = new ArrayList<>(); + List actualParamNames = null; + final Annotation[][] paramAnnotations = constructor.getParameterAnnotations(); + int paramCount = paramAnnotations.length; + for (int paramIndex = 0; paramIndex < paramCount; paramIndex++) { + String name = null; + for (Annotation annotation : paramAnnotations[paramIndex]) { + if (annotation instanceof Param) { + name = ((Param) annotation).value(); + break; + } + } + if (name == null && resultMap.configuration.isUseActualParamName()) { + if (actualParamNames == null) { + actualParamNames = ParamNameUtil.getParamNames(constructor); + } + if (actualParamNames.size() > paramIndex) { + name = actualParamNames.get(paramIndex); + } + } + paramNames.add(name != null ? name : "arg" + paramIndex); + } + return paramNames; + } + } + + public String getId() { + return id; + } + + public boolean hasNestedResultMaps() { + return hasNestedResultMaps; + } + + public boolean hasNestedQueries() { + return hasNestedQueries; + } + + public Class getType() { + return type; + } + + public List getResultMappings() { + return resultMappings; + } + + public List getConstructorResultMappings() { + return constructorResultMappings; + } + + public List getPropertyResultMappings() { + return propertyResultMappings; + } + + public List getIdResultMappings() { + return idResultMappings; + } + + public Set getMappedColumns() { + return mappedColumns; + } + + public Set getMappedProperties() { + return mappedProperties; + } + + public Discriminator getDiscriminator() { + return discriminator; + } + + public void forceNestedResultMaps() { + hasNestedResultMaps = true; + } + + public Boolean getAutoMapping() { + return autoMapping; + } + +} diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/ResultMapping.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/ResultMapping.java new file mode 100644 index 0000000..ecd7d2e --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/ResultMapping.java @@ -0,0 +1,367 @@ +/** + * Copyright 2009-2018 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.mapping; + +import org.apache.ibatis.session.Configuration; +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.TypeHandler; +import org.apache.ibatis.type.TypeHandlerRegistry; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Set; + +/** + * {@link ResultMap} 中的每一条结果字段的映射 + * + * @author Clinton Begin + */ +public class ResultMapping { + + /** + * MyBatis Configuration 对象 + */ + private Configuration configuration; + /** + * Java 对象的属性名 + */ + private String property; + /** + * 数据库的字段名 + */ + private String column; + /** + * Java 对象的属性的类型 + */ + private Class javaType; + /** + * 数据库的字段的类型 + */ + private JdbcType jdbcType; + /** + * TypeHandler 对象 + */ + private TypeHandler typeHandler; + /** + * 内嵌的 ResultMap 编号 + */ + private String nestedResultMapId; + /** + * 内嵌的查询语句编号 + */ + private String nestedQueryId; + /** + * 非空字段集合 + */ + private Set notNullColumns; + /** + * 当连接多表时,你将不得不使用列别名来避免ResultSet中的重复列名。指定columnPrefix允许你映射列名到一个外部的结果集中。 + */ + private String columnPrefix; + /** + * ResultFlag 集合 + */ + private List flags; + /** + * 组合字段解析后的 ResultMapping 集合 + * + * {@link org.apache.ibatis.builder.MapperBuilderAssistant#parseCompositeColumnName(String)} + */ + private List composites; + /** + * 标识这个将会从哪里加载的复杂类型数据的结果集合的名称 + */ + private String resultSet; // 存储过程相关,忽略 + /** + * 标识出包含 foreign keys 的列的名称。这个 foreign keys的值将会和父类型中指定的列属性的值相匹配 + */ + private String foreignColumn; + /** + * 是否懒加载 + */ + private boolean lazy; + + ResultMapping() { + } + + /** + * 构造器 + */ + public static class Builder { + + private ResultMapping resultMapping = new ResultMapping(); + + public Builder(Configuration configuration, String property, String column, TypeHandler typeHandler) { + this(configuration, property); + resultMapping.column = column; + resultMapping.typeHandler = typeHandler; + } + + public Builder(Configuration configuration, String property, String column, Class javaType) { + this(configuration, property); + resultMapping.column = column; + resultMapping.javaType = javaType; + } + + public Builder(Configuration configuration, String property) { + resultMapping.configuration = configuration; + resultMapping.property = property; + resultMapping.flags = new ArrayList<>(); + resultMapping.composites = new ArrayList<>(); + resultMapping.lazy = configuration.isLazyLoadingEnabled(); + } + + public Builder javaType(Class javaType) { + resultMapping.javaType = javaType; + return this; + } + + public Builder jdbcType(JdbcType jdbcType) { + resultMapping.jdbcType = jdbcType; + return this; + } + + public Builder nestedResultMapId(String nestedResultMapId) { + resultMapping.nestedResultMapId = nestedResultMapId; + return this; + } + + public Builder nestedQueryId(String nestedQueryId) { + resultMapping.nestedQueryId = nestedQueryId; + return this; + } + + public Builder resultSet(String resultSet) { + resultMapping.resultSet = resultSet; + return this; + } + + public Builder foreignColumn(String foreignColumn) { + resultMapping.foreignColumn = foreignColumn; + return this; + } + + public Builder notNullColumns(Set notNullColumns) { + resultMapping.notNullColumns = notNullColumns; + return this; + } + + public Builder columnPrefix(String columnPrefix) { + resultMapping.columnPrefix = columnPrefix; + return this; + } + + public Builder flags(List flags) { + resultMapping.flags = flags; + return this; + } + + public Builder typeHandler(TypeHandler typeHandler) { + resultMapping.typeHandler = typeHandler; + return this; + } + + public Builder composites(List composites) { + resultMapping.composites = composites; + return this; + } + + public Builder lazy(boolean lazy) { + resultMapping.lazy = lazy; + return this; + } + + public ResultMapping build() { + // lock down collections + resultMapping.flags = Collections.unmodifiableList(resultMapping.flags); + resultMapping.composites = Collections.unmodifiableList(resultMapping.composites); + // 解析 TypeHandler + resolveTypeHandler(); + // 校验 + validate(); + return resultMapping; + } + + /** + * 校验 + */ + private void validate() { + // Issue #697: cannot define both nestedQueryId and nestedResultMapId + if (resultMapping.nestedQueryId != null && resultMapping.nestedResultMapId != null) { + throw new IllegalStateException("Cannot define both nestedQueryId and nestedResultMapId in property " + resultMapping.property); + } + // Issue #5: there should be no mappings without typehandler + if (resultMapping.nestedQueryId == null && resultMapping.nestedResultMapId == null && resultMapping.typeHandler == null) { + throw new IllegalStateException("No typehandler found for property " + resultMapping.property); + } + // Issue #4 and GH #39: column is optional only in nested resultmaps but not in the rest + if (resultMapping.nestedResultMapId == null && resultMapping.column == null && resultMapping.composites.isEmpty()) { + throw new IllegalStateException("Mapping is missing column attribute for property " + resultMapping.property); + } + if (resultMapping.getResultSet() != null) { + int numColumns = 0; + if (resultMapping.column != null) { + numColumns = resultMapping.column.split(",").length; + } + int numForeignColumns = 0; + if (resultMapping.foreignColumn != null) { + numForeignColumns = resultMapping.foreignColumn.split(",").length; + } + if (numColumns != numForeignColumns) { + throw new IllegalStateException("There should be the same number of columns and foreignColumns in property " + resultMapping.property); + } + } + } + + /** + * 解析 TypeHandler + */ + private void resolveTypeHandler() { + // 使用 javaType + jdbcType ,获取对应的 TypeHandler 对象 + if (resultMapping.typeHandler == null && resultMapping.javaType != null) { + Configuration configuration = resultMapping.configuration; + TypeHandlerRegistry typeHandlerRegistry = configuration.getTypeHandlerRegistry(); + resultMapping.typeHandler = typeHandlerRegistry.getTypeHandler(resultMapping.javaType, resultMapping.jdbcType); + } + } + + public Builder column(String column) { + resultMapping.column = column; + return this; + } + } + + public String getProperty() { + return property; + } + + public String getColumn() { + return column; + } + + public Class getJavaType() { + return javaType; + } + + public JdbcType getJdbcType() { + return jdbcType; + } + + public TypeHandler getTypeHandler() { + return typeHandler; + } + + public String getNestedResultMapId() { + return nestedResultMapId; + } + + public String getNestedQueryId() { + return nestedQueryId; + } + + public Set getNotNullColumns() { + return notNullColumns; + } + + public String getColumnPrefix() { + return columnPrefix; + } + + public List getFlags() { + return flags; + } + + public List getComposites() { + return composites; + } + + public boolean isCompositeResult() { + return this.composites != null && !this.composites.isEmpty(); + } + + public String getResultSet() { + return this.resultSet; + } + + public String getForeignColumn() { + return foreignColumn; + } + + public void setForeignColumn(String foreignColumn) { + this.foreignColumn = foreignColumn; + } + + public boolean isLazy() { + return lazy; + } + + public void setLazy(boolean lazy) { + this.lazy = lazy; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + ResultMapping that = (ResultMapping) o; + + if (property == null || !property.equals(that.property)) { + return false; + } + + return true; + } + + @Override + public int hashCode() { + if (property != null) { + return property.hashCode(); + } else if (column != null) { + return column.hashCode(); + } else { + return 0; + } + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("ResultMapping{"); + //sb.append("configuration=").append(configuration); // configuration doesn't have a useful .toString() + sb.append("property='").append(property).append('\''); + sb.append(", column='").append(column).append('\''); + sb.append(", javaType=").append(javaType); + sb.append(", jdbcType=").append(jdbcType); + //sb.append(", typeHandler=").append(typeHandler); // typeHandler also doesn't have a useful .toString() + sb.append(", nestedResultMapId='").append(nestedResultMapId).append('\''); + sb.append(", nestedQueryId='").append(nestedQueryId).append('\''); + sb.append(", notNullColumns=").append(notNullColumns); + sb.append(", columnPrefix='").append(columnPrefix).append('\''); + sb.append(", flags=").append(flags); + sb.append(", composites=").append(composites); + sb.append(", resultSet='").append(resultSet).append('\''); + sb.append(", foreignColumn='").append(foreignColumn).append('\''); + sb.append(", lazy=").append(lazy); + sb.append('}'); + return sb.toString(); + } + +} diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/ResultSetType.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/ResultSetType.java new file mode 100644 index 0000000..85e1fc5 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/ResultSetType.java @@ -0,0 +1,51 @@ +/** + * Copyright 2009-2018 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.mapping; + +import java.sql.ResultSet; + +/** + * {@link ResultSet} 的枚举值 + *

+ * 可参看 http://jinguo.iteye.com/blog/365373 + * + * @author Clinton Begin + */ +public enum ResultSetType { + + /** + * behavior with same as unset (driver dependent). + *

+ * 默认,即未设置 + * + * @since 3.5.0 + */ + DEFAULT(-1), + FORWARD_ONLY(ResultSet.TYPE_FORWARD_ONLY), + SCROLL_INSENSITIVE(ResultSet.TYPE_SCROLL_INSENSITIVE), + SCROLL_SENSITIVE(ResultSet.TYPE_SCROLL_SENSITIVE); + + private final int value; + + ResultSetType(int value) { + this.value = value; + } + + public int getValue() { + return value; + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/SqlCommandType.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/SqlCommandType.java new file mode 100644 index 0000000..7894bfe --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/SqlCommandType.java @@ -0,0 +1,50 @@ +/** + * Copyright 2009-2015 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.mapping; + +/** + * SQL 命令类型 + * + * @author Clinton Begin + */ +public enum SqlCommandType { + + /** + * 未知 + */ + UNKNOWN, + /** + * 插入 + */ + INSERT, + /** + * 更新 + */ + UPDATE, + /** + * 删除 + */ + DELETE, + /** + * 查询 + */ + SELECT, + /** + * FLUSH + */ + FLUSH + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/SqlSource.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/SqlSource.java new file mode 100644 index 0000000..eb46869 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/SqlSource.java @@ -0,0 +1,36 @@ +/** + * Copyright 2009-2015 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.mapping; + +/** + * Represents the content of a mapped statement read from an XML file or an annotation. + * It creates the SQL that will be passed to the database out of the input parameter received from the user. + * + * SQL 来源接口。它代表从 Mapper XML 或方法注解上,读取的一条 SQL 内容 + * + * @author Clinton Begin + */ +public interface SqlSource { + + /** + * 根据传入的参数对象,返回 BoundSql 对象 + * + * @param parameterObject 参数对象 + * @return BoundSql 对象 + */ + BoundSql getBoundSql(Object parameterObject); + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/StatementType.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/StatementType.java new file mode 100644 index 0000000..dd6e2ee --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/StatementType.java @@ -0,0 +1,38 @@ +/** + * Copyright 2009-2015 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.mapping; + +/** + * 语句类型枚举值 + * + * @author Clinton Begin + */ +public enum StatementType { + + /** + * 普通的 + */ + STATEMENT, + /** + * 预编译 + */ + PREPARED, + /** + * 存储过程 + */ + CALLABLE + +} diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/VendorDatabaseIdProvider.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/VendorDatabaseIdProvider.java new file mode 100644 index 0000000..6be1e69 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/VendorDatabaseIdProvider.java @@ -0,0 +1,95 @@ +/** + * Copyright 2009-2016 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.mapping; + +import org.apache.ibatis.logging.Log; +import org.apache.ibatis.logging.LogFactory; + +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.SQLException; +import java.util.Map; +import java.util.Properties; + +/** + * Vendor DatabaseId provider + * + * 供应商数据库标识提供器实现类 + * + * It returns database product name as a databaseId + * If the user provides a properties it uses it to translate database product name + * key="Microsoft SQL Server", value="ms" will return "ms" + * It can return null, if no database product name or + * a properties was specified and no translation was found + * + * @author Eduardo Macarron + */ +public class VendorDatabaseIdProvider implements DatabaseIdProvider { + + private static final Log log = LogFactory.getLog(VendorDatabaseIdProvider.class); + + /** + * Properties 对象 + */ + private Properties properties; + + @Override + public String getDatabaseId(DataSource dataSource) { + if (dataSource == null) { + throw new NullPointerException("dataSource cannot be null"); + } + try { + // 获得数据库标识 + return getDatabaseName(dataSource); + } catch (Exception e) { + log.error("Could not get a databaseId from dataSource", e); + } + return null; + } + + @Override + public void setProperties(Properties p) { + this.properties = p; + } + + private String getDatabaseName(DataSource dataSource) throws SQLException { + // 获得数据库产品名 + String productName = getDatabaseProductName(dataSource); + if (this.properties != null) { + for (Map.Entry property : properties.entrySet()) { + // 如果产品名包含 KEY ,则返回对应的 VALUE + if (productName.contains((String) property.getKey())) { + return (String) property.getValue(); + } + } + // no match, return null + return null; + } + // 不存在 properties ,则直接返回 productName + return productName; + } + + private String getDatabaseProductName(DataSource dataSource) throws SQLException { + try (Connection con = dataSource.getConnection()) { + // 获得数据库连接 + DatabaseMetaData metaData = con.getMetaData(); + // 获得数据库产品名 + return metaData.getDatabaseProductName(); + } + } + +} diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/package-info.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/package-info.java new file mode 100644 index 0000000..82d0fa8 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/mapping/package-info.java @@ -0,0 +1,19 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * TODO fillme. + */ +package org.apache.ibatis.mapping; diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/package-info.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/package-info.java new file mode 100644 index 0000000..17de2ac --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/package-info.java @@ -0,0 +1,19 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * The MyBatis data mapper framework makes it easier to use a relational database with object-oriented applications. + */ +package org.apache.ibatis; diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/parsing/GenericTokenParser.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/parsing/GenericTokenParser.java new file mode 100644 index 0000000..8abc974 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/parsing/GenericTokenParser.java @@ -0,0 +1,123 @@ +/** + * Copyright 2009-2017 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.parsing; + +/** + * 通用的 Token 解析器 + * + * @author Clinton Begin + */ +public class GenericTokenParser { + + /** + * 开始的 Token 字符串 + */ + private final String openToken; + /** + * 结束的 Token 字符串 + */ + private final String closeToken; + private final TokenHandler handler; + + public GenericTokenParser(String openToken, String closeToken, TokenHandler handler) { + this.openToken = openToken; + this.closeToken = closeToken; + this.handler = handler; + } + + public String parse(String text) { + if (text == null || text.isEmpty()) { + return ""; + } + // search open token + // 寻找开始的 openToken 的位置 + int start = text.indexOf(openToken, 0); + if (start == -1) { // 找不到,直接返回 + return text; + } + char[] src = text.toCharArray(); + int offset = 0; // 起始查找位置 + // 结果 + final StringBuilder builder = new StringBuilder(); + StringBuilder expression = null; // 匹配到 openToken 和 closeToken 之间的表达式 + // 循环匹配 + while (start > -1) { + // 转义字符 + if (start > 0 && src[start - 1] == '\\') { + // this open token is escaped. remove the backslash and continue. + // 因为 openToken 前面一个位置是 \ 转义字符,所以忽略 \ + // 添加 [offset, start - offset - 1] 和 openToken 的内容,添加到 builder 中 + builder.append(src, offset, start - offset - 1).append(openToken); + // 修改 offset + offset = start + openToken.length(); + // 非转义字符 + } else { + // found open token. let's search close token. + // 创建/重置 expression 对象 + if (expression == null) { + expression = new StringBuilder(); + } else { + expression.setLength(0); + } + // 添加 offset 和 openToken 之间的内容,添加到 builder 中 + builder.append(src, offset, start - offset); + // 修改 offset + offset = start + openToken.length(); + // 寻找结束的 closeToken 的位置 + int end = text.indexOf(closeToken, offset); + while (end > -1) { + // 转义 + if (end > offset && src[end - 1] == '\\') { + // this close token is escaped. remove the backslash and continue. + // 因为 endToken 前面一个位置是 \ 转义字符,所以忽略 \ + // 添加 [offset, end - offset - 1] 和 endToken 的内容,添加到 builder 中 + expression.append(src, offset, end - offset - 1).append(closeToken); + // 修改 offset + offset = end + closeToken.length(); + // 继续,寻找结束的 closeToken 的位置 + end = text.indexOf(closeToken, offset); + // 非转义 + } else { + // 添加 [offset, end - offset] 的内容,添加到 builder 中 + expression.append(src, offset, end - offset); + break; + } + } + // 拼接内容 + if (end == -1) { + // close token was not found. + // closeToken 未找到,直接拼接 + builder.append(src, start, src.length - start); + // 修改 offset + offset = src.length; + } else { + // closeToken 找到,将 expression 提交给 handler 处理 ,并将处理结果添加到 builder 中 + builder.append(handler.handleToken(expression.toString())); + // 修改 offset + offset = end + closeToken.length(); + } + } + // 继续,寻找开始的 openToken 的位置 + start = text.indexOf(openToken, offset); + } + // 拼接剩余的部分 + if (offset < src.length) { + builder.append(src, offset, src.length - offset); + } + return builder.toString(); + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/parsing/ParsingException.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/parsing/ParsingException.java new file mode 100644 index 0000000..aef335e --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/parsing/ParsingException.java @@ -0,0 +1,45 @@ +/** + * Copyright 2009-2015 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.parsing; + +import org.apache.ibatis.exceptions.PersistenceException; + +/** + * 解析异常 + * + * @author Clinton Begin + */ +public class ParsingException extends PersistenceException { + + private static final long serialVersionUID = -176685891441325943L; + + public ParsingException() { + super(); + } + + public ParsingException(String message) { + super(message); + } + + public ParsingException(String message, Throwable cause) { + super(message, cause); + } + + public ParsingException(Throwable cause) { + super(cause); + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/parsing/PropertyParser.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/parsing/PropertyParser.java new file mode 100644 index 0000000..c5f92be --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/parsing/PropertyParser.java @@ -0,0 +1,121 @@ +/** + * Copyright 2009-2016 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.parsing; + +import java.util.Properties; + +/** + * 动态属性解析器 + * + * @author Clinton Begin + * @author Kazuki Shimizu + */ +public class PropertyParser { + + private static final String KEY_PREFIX = "org.apache.ibatis.parsing.PropertyParser."; + /** + * The special property key that indicate whether enable a default value on placeholder. + *

+ * The default value is {@code false} (indicate disable a default value on placeholder) + * If you specify the {@code true}, you can specify key and default value on placeholder (e.g. {@code ${db.username:postgres}}). + *

+ * @since 3.4.2 + */ + public static final String KEY_ENABLE_DEFAULT_VALUE = KEY_PREFIX + "enable-default-value"; + + /** + * The special property key that specify a separator for key and default value on placeholder. + *

+ * The default separator is {@code ":"}. + *

+ * @since 3.4.2 + */ + public static final String KEY_DEFAULT_VALUE_SEPARATOR = KEY_PREFIX + "default-value-separator"; + + private static final String ENABLE_DEFAULT_VALUE = "false"; + private static final String DEFAULT_VALUE_SEPARATOR = ":"; + + private PropertyParser() { + // Prevent Instantiation + } + + public static String parse(String string, Properties variables) { + // 创建 VariableTokenHandler 对象 + VariableTokenHandler handler = new VariableTokenHandler(variables); + // 创建 GenericTokenParser 对象 + GenericTokenParser parser = new GenericTokenParser("${", "}", handler); + // 执行解析 + return parser.parse(string); + } + + /** + * 变量 Token 处理器 + */ + private static class VariableTokenHandler implements TokenHandler { + + /** + * 变量 Properties 对象 + */ + private final Properties variables; + /** + * 是否开启默认值功能。默认为 {@link #ENABLE_DEFAULT_VALUE} + */ + private final boolean enableDefaultValue; + /** + * 默认值的分隔符。默认为 {@link #KEY_DEFAULT_VALUE_SEPARATOR} ,即 ":" 。 + */ + private final String defaultValueSeparator; + + private VariableTokenHandler(Properties variables) { + this.variables = variables; + this.enableDefaultValue = Boolean.parseBoolean(getPropertyValue(KEY_ENABLE_DEFAULT_VALUE, ENABLE_DEFAULT_VALUE)); + this.defaultValueSeparator = getPropertyValue(KEY_DEFAULT_VALUE_SEPARATOR, DEFAULT_VALUE_SEPARATOR); + } + + private String getPropertyValue(String key, String defaultValue) { + return (variables == null) ? defaultValue : variables.getProperty(key, defaultValue); + } + + @Override + public String handleToken(String content) { + if (variables != null) { + String key = content; + // 开启默认值功能 + if (enableDefaultValue) { + // 查找默认值 + final int separatorIndex = content.indexOf(defaultValueSeparator); + String defaultValue = null; + if (separatorIndex >= 0) { + key = content.substring(0, separatorIndex); + defaultValue = content.substring(separatorIndex + defaultValueSeparator.length()); + } + // 有默认值,优先替换,不存在则返回默认值 + if (defaultValue != null) { + return variables.getProperty(key, defaultValue); + } + } + // 未开启默认值功能,直接替换 + if (variables.containsKey(key)) { + return variables.getProperty(key); + } + } + // 无 variables ,直接返回 + return "${" + content + "}"; + } + + } + +} diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/parsing/TokenHandler.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/parsing/TokenHandler.java new file mode 100644 index 0000000..9392f1e --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/parsing/TokenHandler.java @@ -0,0 +1,33 @@ +/** + * Copyright 2009-2015 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.parsing; + +/** + * Token 处理器接口 + * + * @author Clinton Begin + */ +public interface TokenHandler { + + /** + * 处理 Token + * + * @param content Token 字符串 + * @return 处理后的结果 + */ + String handleToken(String content); + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/parsing/XNode.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/parsing/XNode.java new file mode 100644 index 0000000..cc6f6ed --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/parsing/XNode.java @@ -0,0 +1,409 @@ +/** + * Copyright 2009-2018 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.parsing; + +import org.w3c.dom.CharacterData; +import org.w3c.dom.*; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Properties; + +/** + * {@link Node} 的封装对象,主要为了动态值的替换。 + * + * @author Clinton Begin + */ +public class XNode { + + /** + * Node 节点对象 + */ + private final Node node; + /** + * 标签名。例如: + */ + private final String name; + /** + * 标签内容。 + * + * @see #parseBody(Node) + */ + private final String body; + /** + * 标签自己的属性。 + * + * @see #parseAttributes(Node) + */ + private final Properties attributes; + /** + * 变量 Properties 对象 + */ + private final Properties variables; + /** + * XPathParser 对象 + */ + private final XPathParser xpathParser; + + public XNode(XPathParser xpathParser, Node node, Properties variables) { + this.xpathParser = xpathParser; + this.node = node; + this.name = node.getNodeName(); + this.variables = variables; + this.attributes = parseAttributes(node); + this.body = parseBody(node); + } + + public XNode newXNode(Node node) { + return new XNode(xpathParser, node, variables); + } + + public XNode getParent() { + Node parent = node.getParentNode(); + if (!(parent instanceof Element)) { + return null; + } else { + return new XNode(xpathParser, parent, variables); + } + } + + public String getPath() { + StringBuilder builder = new StringBuilder(); + Node current = node; + while (current instanceof Element) { + if (current != node) { + builder.insert(0, "/"); + } + builder.insert(0, current.getNodeName()); + current = current.getParentNode(); + } + return builder.toString(); + } + + public String getValueBasedIdentifier() { + StringBuilder builder = new StringBuilder(); + XNode current = this; + while (current != null) { + if (current != this) { + builder.insert(0, "_"); + } + String value = current.getStringAttribute("id", + current.getStringAttribute("value", + current.getStringAttribute("property", null))); + if (value != null) { + value = value.replace('.', '_'); + builder.insert(0, "]"); + builder.insert(0, + value); + builder.insert(0, "["); + } + builder.insert(0, current.getName()); + current = current.getParent(); + } + return builder.toString(); + } + + public String evalString(String expression) { + return xpathParser.evalString(node, expression); + } + + public Boolean evalBoolean(String expression) { + return xpathParser.evalBoolean(node, expression); + } + + public Double evalDouble(String expression) { + return xpathParser.evalDouble(node, expression); + } + + public List evalNodes(String expression) { + return xpathParser.evalNodes(node, expression); + } + + public XNode evalNode(String expression) { + return xpathParser.evalNode(node, expression); + } + + public Node getNode() { + return node; + } + + public String getName() { + return name; + } + + public String getStringBody() { + return getStringBody(null); + } + + public String getStringBody(String def) { + if (body == null) { + return def; + } else { + return body; + } + } + + public Boolean getBooleanBody() { + return getBooleanBody(null); + } + + public Boolean getBooleanBody(Boolean def) { + if (body == null) { + return def; + } else { + return Boolean.valueOf(body); + } + } + + public Integer getIntBody() { + return getIntBody(null); + } + + public Integer getIntBody(Integer def) { + if (body == null) { + return def; + } else { + return Integer.parseInt(body); + } + } + + public Long getLongBody() { + return getLongBody(null); + } + + public Long getLongBody(Long def) { + if (body == null) { + return def; + } else { + return Long.parseLong(body); + } + } + + public Double getDoubleBody() { + return getDoubleBody(null); + } + + public Double getDoubleBody(Double def) { + if (body == null) { + return def; + } else { + return Double.parseDouble(body); + } + } + + public Float getFloatBody() { + return getFloatBody(null); + } + + public Float getFloatBody(Float def) { + if (body == null) { + return def; + } else { + return Float.parseFloat(body); + } + } + + public > T getEnumAttribute(Class enumType, String name) { + return getEnumAttribute(enumType, name, null); + } + + public > T getEnumAttribute(Class enumType, String name, T def) { + String value = getStringAttribute(name); + if (value == null) { + return def; + } else { + return Enum.valueOf(enumType, value); + } + } + + public String getStringAttribute(String name) { + return getStringAttribute(name, null); + } + + public String getStringAttribute(String name, String def) { + String value = attributes.getProperty(name); + if (value == null) { + return def; + } else { + return value; + } + } + + public Boolean getBooleanAttribute(String name) { + return getBooleanAttribute(name, null); + } + + public Boolean getBooleanAttribute(String name, Boolean def) { + String value = attributes.getProperty(name); + if (value == null) { + return def; + } else { + return Boolean.valueOf(value); + } + } + + public Integer getIntAttribute(String name) { + return getIntAttribute(name, null); + } + + public Integer getIntAttribute(String name, Integer def) { + String value = attributes.getProperty(name); + if (value == null) { + return def; + } else { + return Integer.parseInt(value); + } + } + + public Long getLongAttribute(String name) { + return getLongAttribute(name, null); + } + + public Long getLongAttribute(String name, Long def) { + String value = attributes.getProperty(name); + if (value == null) { + return def; + } else { + return Long.parseLong(value); + } + } + + public Double getDoubleAttribute(String name) { + return getDoubleAttribute(name, null); + } + + public Double getDoubleAttribute(String name, Double def) { + String value = attributes.getProperty(name); + if (value == null) { + return def; + } else { + return Double.parseDouble(value); + } + } + + public Float getFloatAttribute(String name) { + return getFloatAttribute(name, null); + } + + public Float getFloatAttribute(String name, Float def) { + String value = attributes.getProperty(name); + if (value == null) { + return def; + } else { + return Float.parseFloat(value); + } + } + + public List getChildren() { + List children = new ArrayList<>(); + NodeList nodeList = node.getChildNodes(); + if (nodeList != null) { + for (int i = 0, n = nodeList.getLength(); i < n; i++) { + Node node = nodeList.item(i); + if (node.getNodeType() == Node.ELEMENT_NODE) { + children.add(new XNode(xpathParser, node, variables)); + } + } + } + return children; + } + + public Properties getChildrenAsProperties() { + Properties properties = new Properties(); + for (XNode child : getChildren()) { + String name = child.getStringAttribute("name"); + String value = child.getStringAttribute("value"); + if (name != null && value != null) { + properties.setProperty(name, value); + } + } + return properties; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("<"); + builder.append(name); + for (Map.Entry entry : attributes.entrySet()) { + builder.append(" "); + builder.append(entry.getKey()); + builder.append("=\""); + builder.append(entry.getValue()); + builder.append("\""); + } + List children = getChildren(); + if (!children.isEmpty()) { + builder.append(">\n"); + for (XNode node : children) { + builder.append(node.toString()); + } + builder.append(""); + } else if (body != null) { + builder.append(">"); + builder.append(body); + builder.append(""); + } else { + builder.append("/>"); + } + builder.append("\n"); + return builder.toString(); + } + + private Properties parseAttributes(Node n) { + Properties attributes = new Properties(); + NamedNodeMap attributeNodes = n.getAttributes(); + if (attributeNodes != null) { + for (int i = 0; i < attributeNodes.getLength(); i++) { + Node attribute = attributeNodes.item(i); + String value = PropertyParser.parse(attribute.getNodeValue(), variables); + attributes.put(attribute.getNodeName(), value); + } + } + return attributes; + } + + private String parseBody(Node node) { + String data = getBodyData(node); + if (data == null) { + NodeList children = node.getChildNodes(); + for (int i = 0; i < children.getLength(); i++) { + Node child = children.item(i); + data = getBodyData(child); + if (data != null) { + break; + } + } + } + return data; + } + + private String getBodyData(Node child) { + if (child.getNodeType() == Node.CDATA_SECTION_NODE + || child.getNodeType() == Node.TEXT_NODE) { + String data = ((CharacterData) child).getData(); + data = PropertyParser.parse(data, variables); + return data; + } + return null; + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/parsing/XPathParser.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/parsing/XPathParser.java new file mode 100644 index 0000000..c79912d --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/parsing/XPathParser.java @@ -0,0 +1,324 @@ +/** + * Copyright 2009-2018 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.parsing; + +import org.apache.ibatis.builder.BuilderException; +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.*; + +import javax.xml.namespace.QName; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.xpath.XPath; +import javax.xml.xpath.XPathConstants; +import javax.xml.xpath.XPathFactory; +import java.io.InputStream; +import java.io.Reader; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.List; +import java.util.Properties; + +/** + * 基于 Java XPath 解析器 + * + * @author Clinton Begin + */ +public class XPathParser { + + /** + * XML Document 对象 + */ + private final Document document; + /** + * 是否校验 + */ + private boolean validation; + /** + * XML 实体解析器 + */ + private EntityResolver entityResolver; + /** + * 变量 Properties 对象 + */ + private Properties variables; + /** + * Java XPath 对象 + */ + private XPath xpath; + + public XPathParser(String xml) { + commonConstructor(false, null, null); + this.document = createDocument(new InputSource(new StringReader(xml))); + } + + public XPathParser(Reader reader) { + commonConstructor(false, null, null); + this.document = createDocument(new InputSource(reader)); + } + + public XPathParser(InputStream inputStream) { + commonConstructor(false, null, null); + this.document = createDocument(new InputSource(inputStream)); + } + + public XPathParser(Document document) { + commonConstructor(false, null, null); + this.document = document; + } + + public XPathParser(String xml, boolean validation) { + commonConstructor(validation, null, null); + this.document = createDocument(new InputSource(new StringReader(xml))); + } + + public XPathParser(Reader reader, boolean validation) { + commonConstructor(validation, null, null); + this.document = createDocument(new InputSource(reader)); + } + + public XPathParser(InputStream inputStream, boolean validation) { + commonConstructor(validation, null, null); + this.document = createDocument(new InputSource(inputStream)); + } + + public XPathParser(Document document, boolean validation) { + commonConstructor(validation, null, null); + this.document = document; + } + + public XPathParser(String xml, boolean validation, Properties variables) { + commonConstructor(validation, variables, null); + this.document = createDocument(new InputSource(new StringReader(xml))); + } + + public XPathParser(Reader reader, boolean validation, Properties variables) { + commonConstructor(validation, variables, null); + this.document = createDocument(new InputSource(reader)); + } + + public XPathParser(InputStream inputStream, boolean validation, Properties variables) { + commonConstructor(validation, variables, null); + this.document = createDocument(new InputSource(inputStream)); + } + + public XPathParser(Document document, boolean validation, Properties variables) { + commonConstructor(validation, variables, null); + this.document = document; + } + + /** + * 构造 XPathParser 对象 + * + * @param xml XML 文件地址 + * @param validation 是否校验 XML + * @param variables 变量 Properties 对象 + * @param entityResolver XML 实体解析器 + */ + public XPathParser(String xml, boolean validation, Properties variables, EntityResolver entityResolver) { + commonConstructor(validation, variables, entityResolver); + this.document = createDocument(new InputSource(new StringReader(xml))); + } + + public XPathParser(Reader reader, boolean validation, Properties variables, EntityResolver entityResolver) { + commonConstructor(validation, variables, entityResolver); + this.document = createDocument(new InputSource(reader)); + } + + public XPathParser(InputStream inputStream, boolean validation, Properties variables, EntityResolver entityResolver) { + commonConstructor(validation, variables, entityResolver); + this.document = createDocument(new InputSource(inputStream)); + } + + public XPathParser(Document document, boolean validation, Properties variables, EntityResolver entityResolver) { + commonConstructor(validation, variables, entityResolver); + this.document = document; + } + + public void setVariables(Properties variables) { + this.variables = variables; + } + + public String evalString(String expression) { + return evalString(document, expression); + } + + public String evalString(Object root, String expression) { + // 获得值 + String result = (String) evaluate(expression, root, XPathConstants.STRING); + // 基于 variables 替换动态值,如果 result 为动态值 + result = PropertyParser.parse(result, variables); + return result; + } + + public Boolean evalBoolean(String expression) { + return evalBoolean(document, expression); + } + + public Boolean evalBoolean(Object root, String expression) { + return (Boolean) evaluate(expression, root, XPathConstants.BOOLEAN); + } + + public Short evalShort(String expression) { + return evalShort(document, expression); + } + + public Short evalShort(Object root, String expression) { + return Short.valueOf(evalString(root, expression)); + } + + public Integer evalInteger(String expression) { + return evalInteger(document, expression); + } + + public Integer evalInteger(Object root, String expression) { + return Integer.valueOf(evalString(root, expression)); + } + + public Long evalLong(String expression) { + return evalLong(document, expression); + } + + public Long evalLong(Object root, String expression) { + return Long.valueOf(evalString(root, expression)); + } + + public Float evalFloat(String expression) { + return evalFloat(document, expression); + } + + public Float evalFloat(Object root, String expression) { + return Float.valueOf(evalString(root, expression)); + } + + public Double evalDouble(String expression) { + return evalDouble(document, expression); + } + + public Double evalDouble(Object root, String expression) { + return (Double) evaluate(expression, root, XPathConstants.NUMBER); + } + + public List evalNodes(String expression) { // Node 数组 + return evalNodes(document, expression); + } + + public List evalNodes(Object root, String expression) { // Node 数组 + // 获得 Node 数组 + NodeList nodes = (NodeList) evaluate(expression, root, XPathConstants.NODESET); + // 封装成 XNode 数组 + List xnodes = new ArrayList<>(); + for (int i = 0; i < nodes.getLength(); i++) { + xnodes.add(new XNode(this, nodes.item(i), variables)); + } + return xnodes; + } + + public XNode evalNode(String expression) { // Node 对象 + return evalNode(document, expression); + } + + public XNode evalNode(Object root, String expression) { // Node 对象 + // 获得 Node 对象 + Node node = (Node) evaluate(expression, root, XPathConstants.NODE); + if (node == null) { + return null; + } + // 封装成 XNode 对象 + return new XNode(this, node, variables); + } + + /** + * 获得指定元素或节点的值 + * + * @param expression 表达式 + * @param root 指定节点 + * @param returnType 返回类型 + * @return 值 + */ + private Object evaluate(String expression, Object root, QName returnType) { + try { + return xpath.evaluate(expression, root, returnType); + } catch (Exception e) { + throw new BuilderException("Error evaluating XPath. Cause: " + e, e); + } + } + + /** + * 创建 Document 对象 + * + * @param inputSource XML 的 InputSource 对象 + * @return Document 对象 + */ + private Document createDocument(InputSource inputSource) { + // important: this must only be called AFTER common constructor + try { + // 1> 创建 DocumentBuilderFactory 对象 + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setValidating(validation); // 设置是否验证 XML + + factory.setNamespaceAware(false); + factory.setIgnoringComments(true); + factory.setIgnoringElementContentWhitespace(false); + factory.setCoalescing(false); + factory.setExpandEntityReferences(true); + + // 2> 创建 DocumentBuilder 对象 + DocumentBuilder builder = factory.newDocumentBuilder(); + builder.setEntityResolver(entityResolver); // 设置实体解析器 + builder.setErrorHandler(new ErrorHandler() { // 实现都空的 + + @Override + public void error(SAXParseException exception) throws SAXException { + throw exception; + } + + @Override + public void fatalError(SAXParseException exception) throws SAXException { + throw exception; + } + + @Override + public void warning(SAXParseException exception) throws SAXException { + } + + }); + // 3> 解析 XML 文件 + return builder.parse(inputSource); + } catch (Exception e) { + throw new BuilderException("Error creating document instance. Cause: " + e, e); + } + } + + /** + * 公用的构造方法逻辑 + * + * @param validation 是否校验 XML + * @param variables 变量 Properties 对象 + * @param entityResolver XML 实体解析器 + */ + private void commonConstructor(boolean validation, Properties variables, EntityResolver entityResolver) { + this.validation = validation; + this.entityResolver = entityResolver; + this.variables = variables; + // 创建 XPathFactory 对象 + XPathFactory factory = XPathFactory.newInstance(); + this.xpath = factory.newXPath(); + } + +} diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/parsing/package-info.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/parsing/package-info.java new file mode 100644 index 0000000..6ff524b --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/parsing/package-info.java @@ -0,0 +1,19 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Parsing utils + */ +package org.apache.ibatis.parsing; diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/plugin/Interceptor.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/plugin/Interceptor.java new file mode 100644 index 0000000..75f4720 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/plugin/Interceptor.java @@ -0,0 +1,51 @@ +/** + * Copyright 2009-2015 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.plugin; + +import java.util.Properties; + +/** + * 拦截器接口 + * + * @author Clinton Begin + */ +public interface Interceptor { + + /** + * 拦截方法 + * + * @param invocation 调用信息 + * @return 调用结果 + * @throws Throwable 若发生异常 + */ + Object intercept(Invocation invocation) throws Throwable; + + /** + * 应用插件。如应用成功,则会创建目标对象的代理对象 + * + * @param target 目标对象 + * @return 应用的结果对象,可以是代理对象,也可以是 target 对象,也可以是任意对象。具体的,看代码实现 + */ + Object plugin(Object target); + + /** + * 设置拦截器属性 + * + * @param properties 属性 + */ + void setProperties(Properties properties); + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/plugin/InterceptorChain.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/plugin/InterceptorChain.java new file mode 100644 index 0000000..e1a4408 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/plugin/InterceptorChain.java @@ -0,0 +1,55 @@ +/** + * Copyright 2009-2018 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.plugin; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * 拦截器链 + * + * @author Clinton Begin + */ +public class InterceptorChain { + + /** + * 拦截器数组 + */ + private final List interceptors = new ArrayList<>(); + + /** + * 应用所有插件 + * + * @param target 目标对象 + * @return 应用结果 + */ + public Object pluginAll(Object target) { + for (Interceptor interceptor : interceptors) { + target = interceptor.plugin(target); + } + return target; + } + + public void addInterceptor(Interceptor interceptor) { + interceptors.add(interceptor); + } + + public List getInterceptors() { + return Collections.unmodifiableList(interceptors); + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/plugin/Intercepts.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/plugin/Intercepts.java new file mode 100644 index 0000000..ddb0c01 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/plugin/Intercepts.java @@ -0,0 +1,35 @@ +/** + * Copyright 2009-2016 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.plugin; + +import java.lang.annotation.*; + +/** + * 拦截器注解 + * + * @author Clinton Begin + */ +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface Intercepts { + + /** + * @return 拦截的方法签名的数组 + */ + Signature[] value(); + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/plugin/Invocation.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/plugin/Invocation.java new file mode 100644 index 0000000..7422c6e --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/plugin/Invocation.java @@ -0,0 +1,68 @@ +/** + * Copyright 2009-2017 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.plugin; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +/** + * 方法调用信息 + * + * @author Clinton Begin + */ +public class Invocation { + + /** + * 目标对象 + */ + private final Object target; + /** + * 方法对象 + */ + private final Method method; + /** + * 方法参数数组 + */ + private final Object[] args; + + public Invocation(Object target, Method method, Object[] args) { + this.target = target; + this.method = method; + this.args = args; + } + + public Object getTarget() { + return target; + } + + public Method getMethod() { + return method; + } + + public Object[] getArgs() { + return args; + } + + /** + * 调用方法 + * + * @return 调用结果 + */ + public Object proceed() throws InvocationTargetException, IllegalAccessException { + return method.invoke(target, args); + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/plugin/Plugin.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/plugin/Plugin.java new file mode 100644 index 0000000..0e34526 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/plugin/Plugin.java @@ -0,0 +1,136 @@ +/** + * Copyright 2009-2018 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.plugin; + +import org.apache.ibatis.reflection.ExceptionUtil; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +/** + * 插件类,一方面提供创建动态代理对象的方法,另一方面实现对指定类的指定方法的拦截处理。 + * + * @author Clinton Begin + */ +public class Plugin implements InvocationHandler { + + /** + * 目标对象 + */ + private final Object target; + /** + * 拦截器 + */ + private final Interceptor interceptor; + /** + * 拦截的方法映射 + * + * KEY:类 + * VALUE:方法集合 + */ + private final Map, Set> signatureMap; + + private Plugin(Object target, Interceptor interceptor, Map, Set> signatureMap) { + this.target = target; + this.interceptor = interceptor; + this.signatureMap = signatureMap; + } + + /** + * 创建目标类的代理对象 + * + * @param target 目标类 + * @param interceptor 拦截器对象 + * @return 代理对象 + */ + public static Object wrap(Object target, Interceptor interceptor) { + // 获得拦截的方法映射 + Map, Set> signatureMap = getSignatureMap(interceptor); + // 获得目标类的类型 + Class type = target.getClass(); + // 获得目标类的接口集合 + Class[] interfaces = getAllInterfaces(type, signatureMap); + // 若有接口,则创建目标对象的 JDK Proxy 对象 + if (interfaces.length > 0) { + return Proxy.newProxyInstance( + type.getClassLoader(), + interfaces, + new Plugin(target, interceptor, signatureMap)); // 因为 Plugin 实现了 InvocationHandler 接口,所以可以作为 JDK 动态代理的调用处理器 + } + // 如果没有,则返回原始的目标对象 + return target; + } + + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + try { + // 获得目标方法是否被拦截 + Set methods = signatureMap.get(method.getDeclaringClass()); + if (methods != null && methods.contains(method)) { + // 如果是,则拦截处理该方法 + return interceptor.intercept(new Invocation(target, method, args)); + } + // 如果不是,则调用原方法 + return method.invoke(target, args); + } catch (Exception e) { + throw ExceptionUtil.unwrapThrowable(e); + } + } + + private static Map, Set> getSignatureMap(Interceptor interceptor) { + Intercepts interceptsAnnotation = interceptor.getClass().getAnnotation(Intercepts.class); + // issue #251 + if (interceptsAnnotation == null) { + throw new PluginException("No @Intercepts annotation was found in interceptor " + interceptor.getClass().getName()); + } + Signature[] sigs = interceptsAnnotation.value(); + Map, Set> signatureMap = new HashMap<>(); + for (Signature sig : sigs) { + Set methods = signatureMap.computeIfAbsent(sig.type(), k -> new HashSet<>()); + try { + Method method = sig.type().getMethod(sig.method(), sig.args()); + methods.add(method); + } catch (NoSuchMethodException e) { + throw new PluginException("Could not find method on " + sig.type() + " named " + sig.method() + ". Cause: " + e, e); + } + } + return signatureMap; + } + + private static Class[] getAllInterfaces(Class type, Map, Set> signatureMap) { + // 接口的集合 + Set> interfaces = new HashSet<>(); + // 循环递归 type 类,机器父类 + while (type != null) { + // 遍历接口集合,若在 signatureMap 中,则添加到 interfaces 中 + for (Class c : type.getInterfaces()) { + if (signatureMap.containsKey(c)) { + interfaces.add(c); + } + } + // 获得父类 + type = type.getSuperclass(); + } + // 创建接口的数组 + return interfaces.toArray(new Class[interfaces.size()]); + } + +} diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/plugin/PluginException.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/plugin/PluginException.java new file mode 100644 index 0000000..29d18c9 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/plugin/PluginException.java @@ -0,0 +1,42 @@ +/** + * Copyright 2009-2015 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.plugin; + +import org.apache.ibatis.exceptions.PersistenceException; + +/** + * @author Clinton Begin + */ +public class PluginException extends PersistenceException { + + private static final long serialVersionUID = 8548771664564998595L; + + public PluginException() { + super(); + } + + public PluginException(String message) { + super(message); + } + + public PluginException(String message, Throwable cause) { + super(message, cause); + } + + public PluginException(Throwable cause) { + super(cause); + } +} diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/plugin/Signature.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/plugin/Signature.java new file mode 100644 index 0000000..b87658d --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/plugin/Signature.java @@ -0,0 +1,48 @@ +/** + * Copyright 2009-2016 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.plugin; + +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 方法签名的注解 + * + * @author Clinton Begin + */ +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({}) +public @interface Signature { + + /** + * @return 类 + */ + Class type(); + + /** + * @return 方法名 + */ + String method(); + + /** + * @return 参数类型 + */ + Class[] args(); + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/plugin/package-info.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/plugin/package-info.java new file mode 100644 index 0000000..a4b5b13 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/plugin/package-info.java @@ -0,0 +1,19 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Base package for handing plugins. + */ +package org.apache.ibatis.plugin; diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/ArrayUtil.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/ArrayUtil.java new file mode 100644 index 0000000..b58e95e --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/ArrayUtil.java @@ -0,0 +1,161 @@ +/** + * Copyright 2009-2017 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ibatis.reflection; + +import java.util.Arrays; + +/** + * 数组工具类 + * + * Provides hashCode, equals and toString methods that can handle array. + */ +public class ArrayUtil { + + /** + * Returns a hash code for {@code obj}. + * + * @param obj + * The object to get a hash code for. May be an array or null. + * @return A hash code of {@code obj} or 0 if {@code obj} is null + */ + public static int hashCode(Object obj) { + if (obj == null) { + // for consistency with Arrays#hashCode() and Objects#hashCode() + return 0; + } + // 普通类 + final Class clazz = obj.getClass(); + if (!clazz.isArray()) { + return obj.hashCode(); + } + // 数组类型 + final Class componentType = clazz.getComponentType(); + if (long.class.equals(componentType)) { + return Arrays.hashCode((long[]) obj); + } else if (int.class.equals(componentType)) { + return Arrays.hashCode((int[]) obj); + } else if (short.class.equals(componentType)) { + return Arrays.hashCode((short[]) obj); + } else if (char.class.equals(componentType)) { + return Arrays.hashCode((char[]) obj); + } else if (byte.class.equals(componentType)) { + return Arrays.hashCode((byte[]) obj); + } else if (boolean.class.equals(componentType)) { + return Arrays.hashCode((boolean[]) obj); + } else if (float.class.equals(componentType)) { + return Arrays.hashCode((float[]) obj); + } else if (double.class.equals(componentType)) { + return Arrays.hashCode((double[]) obj); + } else { + return Arrays.hashCode((Object[]) obj); + } + } + + /** + * Compares two objects. Returns true if + *

    + *
  • {@code thisObj} and {@code thatObj} are both null
  • + *
  • {@code thisObj} and {@code thatObj} are instances of the same type and + * {@link Object#equals(Object)} returns true
  • + *
  • {@code thisObj} and {@code thatObj} are arrays with the same component type and + * equals() method of {@link Arrays} returns true (not deepEquals())
  • + *
+ * + * @param thisObj + * The left hand object to compare. May be an array or null + * @param thatObj + * The right hand object to compare. May be an array or null + * @return true if two objects are equal; false otherwise. + */ + public static boolean equals(Object thisObj, Object thatObj) { + if (thisObj == null) { + return thatObj == null; + } else if (thatObj == null) { + return false; + } + final Class clazz = thisObj.getClass(); + if (!clazz.equals(thatObj.getClass())) { + return false; + } + // 普通类 + if (!clazz.isArray()) { + return thisObj.equals(thatObj); + } + // 数组类型 + final Class componentType = clazz.getComponentType(); + if (long.class.equals(componentType)) { + return Arrays.equals((long[]) thisObj, (long[]) thatObj); + } else if (int.class.equals(componentType)) { + return Arrays.equals((int[]) thisObj, (int[]) thatObj); + } else if (short.class.equals(componentType)) { + return Arrays.equals((short[]) thisObj, (short[]) thatObj); + } else if (char.class.equals(componentType)) { + return Arrays.equals((char[]) thisObj, (char[]) thatObj); + } else if (byte.class.equals(componentType)) { + return Arrays.equals((byte[]) thisObj, (byte[]) thatObj); + } else if (boolean.class.equals(componentType)) { + return Arrays.equals((boolean[]) thisObj, (boolean[]) thatObj); + } else if (float.class.equals(componentType)) { + return Arrays.equals((float[]) thisObj, (float[]) thatObj); + } else if (double.class.equals(componentType)) { + return Arrays.equals((double[]) thisObj, (double[]) thatObj); + } else { + return Arrays.equals((Object[]) thisObj, (Object[]) thatObj); + } + } + + /** + * If the {@code obj} is an array, toString() method of {@link Arrays} is called. Otherwise + * {@link Object#toString()} is called. Returns "null" if {@code obj} is null. + * + * @param obj + * An object. May be an array or null. + * @return String representation of the {@code obj}. + */ + public static String toString(Object obj) { + if (obj == null) { + return "null"; + } + // 普通类 + final Class clazz = obj.getClass(); + if (!clazz.isArray()) { + return obj.toString(); + } + // 数组类型 + final Class componentType = obj.getClass().getComponentType(); + if (long.class.equals(componentType)) { + return Arrays.toString((long[]) obj); + } else if (int.class.equals(componentType)) { + return Arrays.toString((int[]) obj); + } else if (short.class.equals(componentType)) { + return Arrays.toString((short[]) obj); + } else if (char.class.equals(componentType)) { + return Arrays.toString((char[]) obj); + } else if (byte.class.equals(componentType)) { + return Arrays.toString((byte[]) obj); + } else if (boolean.class.equals(componentType)) { + return Arrays.toString((boolean[]) obj); + } else if (float.class.equals(componentType)) { + return Arrays.toString((float[]) obj); + } else if (double.class.equals(componentType)) { + return Arrays.toString((double[]) obj); + } else { + return Arrays.toString((Object[]) obj); + } + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/DefaultReflectorFactory.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/DefaultReflectorFactory.java new file mode 100644 index 0000000..fd30a5f --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/DefaultReflectorFactory.java @@ -0,0 +1,63 @@ +/** + * Copyright 2009-2018 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.reflection; + +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +/** + * 默认 ReflectorFactory 实现类 + */ +public class DefaultReflectorFactory implements ReflectorFactory { + + /** + * 是否缓存 + */ + private boolean classCacheEnabled = true; + /** + * Reflector 的缓存映射 + * + * KEY:类 + * VALUE:Reflector 对象 + */ + private final ConcurrentMap, Reflector> reflectorMap = new ConcurrentHashMap<>(); + + public DefaultReflectorFactory() { + } + + @Override + public boolean isClassCacheEnabled() { + return classCacheEnabled; + } + + @Override + public void setClassCacheEnabled(boolean classCacheEnabled) { + this.classCacheEnabled = classCacheEnabled; + } + + @Override + public Reflector findForClass(Class type) { + // 开启缓存,则从 reflectorMap 中获取 + if (classCacheEnabled) { + // synchronized (type) removed see issue #461 + return reflectorMap.computeIfAbsent(type, Reflector::new); // 不存在,则进行创建 + // 关闭缓存,则创建 Reflector 对象 + } else { + return new Reflector(type); + } + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/ExceptionUtil.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/ExceptionUtil.java new file mode 100644 index 0000000..5c7c22b --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/ExceptionUtil.java @@ -0,0 +1,51 @@ +/** + * Copyright 2009-2015 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.reflection; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.UndeclaredThrowableException; + +/** + * 异常工具类 + * + * @author Clinton Begin + */ +public class ExceptionUtil { + + private ExceptionUtil() { + // Prevent Instantiation + } + + /** + * 去掉异常的包装 + * + * @param wrapped 被包装的异常 + * @return 去除包装后的异常 + */ + public static Throwable unwrapThrowable(Throwable wrapped) { + Throwable unwrapped = wrapped; + while (true) { + if (unwrapped instanceof InvocationTargetException) { + unwrapped = ((InvocationTargetException) unwrapped).getTargetException(); + } else if (unwrapped instanceof UndeclaredThrowableException) { + unwrapped = ((UndeclaredThrowableException) unwrapped).getUndeclaredThrowable(); + } else { + return unwrapped; + } + } + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/Jdk.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/Jdk.java new file mode 100644 index 0000000..9ffbf08 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/Jdk.java @@ -0,0 +1,81 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.reflection; + +import org.apache.ibatis.io.Resources; + +/** + * To check the existence of version dependent classes. + */ +@Deprecated // add by 芋艿,实际已经未使用了 +public class Jdk { + + /** + * true if java.lang.reflect.Parameter is available. + * @deprecated Since 3.5.0, Will remove this field at feature(next major version up) + */ + @Deprecated + public static final boolean parameterExists; + + static { + boolean available = false; + try { + Resources.classForName("java.lang.reflect.Parameter"); + available = true; + } catch (ClassNotFoundException e) { + // ignore + } + parameterExists = available; + } + + /** + * @deprecated Since 3.5.0, Will remove this field at feature(next major version up) + */ + @Deprecated + public static final boolean dateAndTimeApiExists; + + static { + boolean available = false; + try { + Resources.classForName("java.time.Clock"); + available = true; + } catch (ClassNotFoundException e) { + // ignore + } + dateAndTimeApiExists = available; + } + + /** + * @deprecated Since 3.5.0, Will remove this field at feature(next major version up) + */ + @Deprecated + public static final boolean optionalExists; + + static { + boolean available = false; + try { + Resources.classForName("java.util.Optional"); + available = true; + } catch (ClassNotFoundException e) { + // ignore + } + optionalExists = available; + } + + private Jdk() { + super(); + } +} diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/MetaClass.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/MetaClass.java new file mode 100644 index 0000000..02dc164 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/MetaClass.java @@ -0,0 +1,279 @@ +/** + * Copyright 2009-2018 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.reflection; + +import org.apache.ibatis.reflection.invoker.GetFieldInvoker; +import org.apache.ibatis.reflection.invoker.Invoker; +import org.apache.ibatis.reflection.invoker.MethodInvoker; +import org.apache.ibatis.reflection.property.PropertyTokenizer; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.Collection; + +/** + * 类的元数据。 + * + * 基于 {@link Reflector} 和 {@link PropertyTokenizer} ,提供对指定类的各种操作 + * + * @author Clinton Begin + */ +public class MetaClass { + + private final ReflectorFactory reflectorFactory; + private final Reflector reflector; + + private MetaClass(Class type, ReflectorFactory reflectorFactory) { + this.reflectorFactory = reflectorFactory; + this.reflector = reflectorFactory.findForClass(type); + } + + public static MetaClass forClass(Class type, ReflectorFactory reflectorFactory) { + return new MetaClass(type, reflectorFactory); + } + + /** + * 创建类的指定属性的类的 MetaClass 对象 + * + * @param name 指定属性 + * @return MetaClass 对象 + */ + public MetaClass metaClassForProperty(String name) { + // 获得属性的类 + Class propType = reflector.getGetterType(name); + // 创建 MetaClass 对象 + return MetaClass.forClass(propType, reflectorFactory); + } + + public String findProperty(String name) { + // 构建属性 + StringBuilder prop = buildProperty(name, new StringBuilder()); + return prop.length() > 0 ? prop.toString() : null; + } + + /** + * 获得属性 + * + * @param name 属性名 + * @param useCamelCaseMapping 是否下划线转驼峰 + * @return 属性结果 + */ + public String findProperty(String name, boolean useCamelCaseMapping) { + // 下划线转驼峰 + if (useCamelCaseMapping) { + name = name.replace("_", ""); + } + // 获得属性 + return findProperty(name); + } + + public String[] getGetterNames() { + return reflector.getGetablePropertyNames(); + } + + public String[] getSetterNames() { + return reflector.getSetablePropertyNames(); + } + + /** + * 获得指定属性的 setting 方法的参数类型 + * + * 和 {@link #getGetterType(String)} 方法的思路类似 + * + * @param name 属性 + * @return 方法参数的类型 + */ + public Class getSetterType(String name) { + PropertyTokenizer prop = new PropertyTokenizer(name); + if (prop.hasNext()) { + MetaClass metaProp = metaClassForProperty(prop.getName()); + return metaProp.getSetterType(prop.getChildren()); + } else { + return reflector.getSetterType(prop.getName()); + } + } + + /** + * 获得指定属性的 getting 方法的返回值的类型 + * + * @param name 属性 + * @return 返回值的类型 + */ + public Class getGetterType(String name) { + // 创建 PropertyTokenizer 对象,对 name 进行分词 + PropertyTokenizer prop = new PropertyTokenizer(name); + // 有子表达式 + if (prop.hasNext()) { + // 创建 MetaClass 对象 + MetaClass metaProp = metaClassForProperty(prop); + // 递归判断子表达式 children ,获得返回值的类型 + return metaProp.getGetterType(prop.getChildren()); + } + // issue #506. Resolve the type inside a Collection Object + // 直接获得返回值的类型 + return getGetterType(prop); + } + + private MetaClass metaClassForProperty(PropertyTokenizer prop) { + // 【调用】获得 getting 方法返回的类型 + Class propType = getGetterType(prop); + // 创建 MetaClass 对象 + return MetaClass.forClass(propType, reflectorFactory); + } + + private Class getGetterType(PropertyTokenizer prop) { + // 获得返回类型 + Class type = reflector.getGetterType(prop.getName()); + // 如果获取数组的某个位置的元素,则获取其泛型。例如说:list[0].field ,那么就会解析 list 是什么类型,这样才好通过该类型,继续获得 field + if (prop.getIndex() != null && Collection.class.isAssignableFrom(type)) { + // 【调用】获得返回的类型 + Type returnType = getGenericGetterType(prop.getName()); + // 如果是泛型,进行解析真正的类型 + if (returnType instanceof ParameterizedType) { + Type[] actualTypeArguments = ((ParameterizedType) returnType).getActualTypeArguments(); + if (actualTypeArguments != null && actualTypeArguments.length == 1) { // 为什么这里判断大小为 1 呢,因为 Collection 是 Collection ,至多一个。 + returnType = actualTypeArguments[0]; + if (returnType instanceof Class) { + type = (Class) returnType; + } else if (returnType instanceof ParameterizedType) { + type = (Class) ((ParameterizedType) returnType).getRawType(); + } + } + } + } + return type; + } + + private Type getGenericGetterType(String propertyName) { + try { + // 获得 Invoker 对象 + Invoker invoker = reflector.getGetInvoker(propertyName); + // 如果 MethodInvoker 对象,则说明是 getting 方法,解析方法返回类型 + if (invoker instanceof MethodInvoker) { + Field _method = MethodInvoker.class.getDeclaredField("method"); + _method.setAccessible(true); + Method method = (Method) _method.get(invoker); + return TypeParameterResolver.resolveReturnType(method, reflector.getType()); + // 如果 GetFieldInvoker 对象,则说明是 field ,直接访问 + } else if (invoker instanceof GetFieldInvoker) { + Field _field = GetFieldInvoker.class.getDeclaredField("field"); + _field.setAccessible(true); + Field field = (Field) _field.get(invoker); + return TypeParameterResolver.resolveFieldType(field, reflector.getType()); + } + } catch (NoSuchFieldException | IllegalAccessException ignored) { + } + return null; + } + + /** + * 判断指定属性是否有 setting 方法 + * + * 思路 {@link #hasGetter(String)} 方法类似 + * + * @param name 属性 + * @return 是否 + */ + public boolean hasSetter(String name) { + PropertyTokenizer prop = new PropertyTokenizer(name); + if (prop.hasNext()) { + if (reflector.hasSetter(prop.getName())) { + MetaClass metaProp = metaClassForProperty(prop.getName()); + return metaProp.hasSetter(prop.getChildren()); + } else { + return false; + } + } else { + return reflector.hasSetter(prop.getName()); + } + } + + /** + * 判断指定属性是否有 getting 方法 + * + * @param name 属性 + * @return 是否有 + */ + public boolean hasGetter(String name) { + // 创建 PropertyTokenizer 对象,对 name 进行分词 + PropertyTokenizer prop = new PropertyTokenizer(name); + // 有子表达式 + if (prop.hasNext()) { + // 判断是否有该属性的 getting 方法 + if (reflector.hasGetter(prop.getName())) { + // 创建 MetaClass 对象 + MetaClass metaProp = metaClassForProperty(prop); + // 递归判断子表达式 children ,是否有 getting 方法 + return metaProp.hasGetter(prop.getChildren()); + } else { + return false; + } + // 无子表达式 + } else { + // 判断是否有该属性的 getting 方法 + return reflector.hasGetter(prop.getName()); + } + } + + public Invoker getGetInvoker(String name) { + return reflector.getGetInvoker(name); + } + + public Invoker getSetInvoker(String name) { + return reflector.getSetInvoker(name); + } + + /** + * 构建属性 + * + * @param name 属性名 + * @param builder 字符串结果 + * @return 最终结果 + */ + private StringBuilder buildProperty(String name, StringBuilder builder) { + // 创建 PropertyTokenizer 对象,对 name 进行分词 + PropertyTokenizer prop = new PropertyTokenizer(name); + // 有子表达式 + if (prop.hasNext()) { + // 获得属性名,并添加到 builder 中 + String propertyName = reflector.findPropertyName(prop.getName()); + if (propertyName != null) { + // 拼接属性到 builder 中 + builder.append(propertyName); + builder.append("."); + // 创建 MetaClass 对象 + MetaClass metaProp = metaClassForProperty(propertyName); + // 递归解析子表达式 children ,并将结果添加到 builder 中 + metaProp.buildProperty(prop.getChildren(), builder); + } + // 无子表达式 + } else { + // 获得属性名,并添加到 builder 中 + String propertyName = reflector.findPropertyName(name); + if (propertyName != null) { + builder.append(propertyName); + } + } + return builder; + } + + public boolean hasDefaultConstructor() { + return reflector.hasDefaultConstructor(); + } + +} diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/MetaObject.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/MetaObject.java new file mode 100644 index 0000000..4857a5e --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/MetaObject.java @@ -0,0 +1,198 @@ +/** + * Copyright 2009-2018 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.reflection; + +import org.apache.ibatis.reflection.factory.ObjectFactory; +import org.apache.ibatis.reflection.property.PropertyTokenizer; +import org.apache.ibatis.reflection.wrapper.*; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 对象元数据,提供了对象的属性值的获得和设置 + * + * @author Clinton Begin + */ +public class MetaObject { + + /** + * 原始 Object 对象 + */ + private final Object originalObject; + /** + * 封装过的 Object 对象 + */ + private final ObjectWrapper objectWrapper; + private final ObjectFactory objectFactory; + private final ObjectWrapperFactory objectWrapperFactory; + private final ReflectorFactory reflectorFactory; + + private MetaObject(Object object, ObjectFactory objectFactory, ObjectWrapperFactory objectWrapperFactory, ReflectorFactory reflectorFactory) { + this.originalObject = object; + this.objectFactory = objectFactory; + this.objectWrapperFactory = objectWrapperFactory; + this.reflectorFactory = reflectorFactory; + + if (object instanceof ObjectWrapper) { + this.objectWrapper = (ObjectWrapper) object; + } else if (objectWrapperFactory.hasWrapperFor(object)) { + // 创建 ObjectWrapper 对象 + this.objectWrapper = objectWrapperFactory.getWrapperFor(this, object); + } else if (object instanceof Map) { + // 创建 MapWrapper 对象 + this.objectWrapper = new MapWrapper(this, (Map) object); + } else if (object instanceof Collection) { + // 创建 CollectionWrapper 对象 + this.objectWrapper = new CollectionWrapper(this, (Collection) object); + } else { + // 创建 BeanWrapper 对象 + this.objectWrapper = new BeanWrapper(this, object); + } + } + + /** + * 创建 MetaObject 对象 + * + * @param object 原始 Object 对象 + * @param objectFactory + * @param objectWrapperFactory + * @param reflectorFactory + * @return MetaObject 对象 + */ + public static MetaObject forObject(Object object, ObjectFactory objectFactory, ObjectWrapperFactory objectWrapperFactory, ReflectorFactory reflectorFactory) { + if (object == null) { + return SystemMetaObject.NULL_META_OBJECT; + } else { + return new MetaObject(object, objectFactory, objectWrapperFactory, reflectorFactory); + } + } + + public ObjectFactory getObjectFactory() { + return objectFactory; + } + + public ObjectWrapperFactory getObjectWrapperFactory() { + return objectWrapperFactory; + } + + public ReflectorFactory getReflectorFactory() { + return reflectorFactory; + } + + public Object getOriginalObject() { + return originalObject; + } + + public String findProperty(String propName, boolean useCamelCaseMapping) { + return objectWrapper.findProperty(propName, useCamelCaseMapping); + } + + public String[] getGetterNames() { + return objectWrapper.getGetterNames(); + } + + public String[] getSetterNames() { + return objectWrapper.getSetterNames(); + } + + public Class getSetterType(String name) { + return objectWrapper.getSetterType(name); + } + + public Class getGetterType(String name) { + return objectWrapper.getGetterType(name); + } + + public boolean hasSetter(String name) { + return objectWrapper.hasSetter(name); + } + + public boolean hasGetter(String name) { + return objectWrapper.hasGetter(name); + } + + public Object getValue(String name) { + // 创建 PropertyTokenizer 对象,对 name 分词 + PropertyTokenizer prop = new PropertyTokenizer(name); + // 有子表达式 + if (prop.hasNext()) { + // 创建 MetaObject 对象 + MetaObject metaValue = metaObjectForProperty(prop.getIndexedName()); + // 递归判断子表达式 children ,获取值 + if (metaValue == SystemMetaObject.NULL_META_OBJECT) { + return null; + } else { + return metaValue.getValue(prop.getChildren()); + } + // 无子表达式 + } else { + // 获取值 + return objectWrapper.get(prop); + } + } + + public void setValue(String name, Object value) { + // 创建 PropertyTokenizer 对象,对 name 分词 + PropertyTokenizer prop = new PropertyTokenizer(name); + // 有子表达式 + if (prop.hasNext()) { + // 创建 MetaObject 对象 + MetaObject metaValue = metaObjectForProperty(prop.getIndexedName()); + // 递归判断子表达式 children ,设置值 + if (metaValue == SystemMetaObject.NULL_META_OBJECT) { + if (value == null) { + // don't instantiate child path if value is null + return; + } else { + // 创建值 + metaValue = objectWrapper.instantiatePropertyValue(name, prop, objectFactory); + } + } + // 设置值 + metaValue.setValue(prop.getChildren(), value); + // 无子表达式 + } else { + // 设置值 + objectWrapper.set(prop, value); + } + } + + public MetaObject metaObjectForProperty(String name) { + // 获得属性值 + Object value = getValue(name); + // 创建 MetaObject 对象 + return MetaObject.forObject(value, objectFactory, objectWrapperFactory, reflectorFactory); + } + + public ObjectWrapper getObjectWrapper() { + return objectWrapper; + } + + public boolean isCollection() { + return objectWrapper.isCollection(); + } + + public void add(Object element) { + objectWrapper.add(element); + } + + public void addAll(List list) { + objectWrapper.addAll(list); + } + +} diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/OptionalUtil.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/OptionalUtil.java new file mode 100644 index 0000000..9024ff6 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/OptionalUtil.java @@ -0,0 +1,34 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ibatis.reflection; + +import java.util.Optional; + +/** + * @deprecated Since 3.5.0, Will remove this class at future(next major version up). + */ +@Deprecated +public abstract class OptionalUtil { + + public static Object ofNullable(Object value) { + return Optional.ofNullable(value); + } + + private OptionalUtil() { + super(); + } +} diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/ParamNameResolver.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/ParamNameResolver.java new file mode 100644 index 0000000..66efcb1 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/ParamNameResolver.java @@ -0,0 +1,159 @@ +/** + * Copyright 2009-2018 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.reflection; + +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.binding.MapperMethod.ParamMap; +import org.apache.ibatis.session.Configuration; +import org.apache.ibatis.session.ResultHandler; +import org.apache.ibatis.session.RowBounds; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Method; +import java.util.Collections; +import java.util.Map; +import java.util.SortedMap; +import java.util.TreeMap; + +/** + * 参数名解析器 + */ +public class ParamNameResolver { + + private static final String GENERIC_NAME_PREFIX = "param"; + + /** + *

+ * The key is the index and the value is the name of the parameter.
+ * The name is obtained from {@link Param} if specified. When {@link Param} is not specified, + * the parameter index is used. Note that this index could be different from the actual index + * when the method has special parameters (i.e. {@link RowBounds} or {@link ResultHandler}). + *

+ *
    + *
  • aMethod(@Param("M") int a, @Param("N") int b) -> {{0, "M"}, {1, "N"}}
  • + *
  • aMethod(int a, int b) -> {{0, "0"}, {1, "1"}}
  • + *
  • aMethod(int a, RowBounds rb, int b) -> {{0, "0"}, {2, "1"}}
  • + *
+ * + * 参数名映射 + * + * KEY:参数顺序 + * VALUE:参数名 + */ + private final SortedMap names; + /** + * 是否有 {@link Param} 注解的参数 + */ + private boolean hasParamAnnotation; + + public ParamNameResolver(Configuration config, Method method) { + final Class[] paramTypes = method.getParameterTypes(); + final Annotation[][] paramAnnotations = method.getParameterAnnotations(); + final SortedMap map = new TreeMap<>(); + int paramCount = paramAnnotations.length; + // get names from @Param annotations + for (int paramIndex = 0; paramIndex < paramCount; paramIndex++) { + // 忽略,如果是特殊参数 + if (isSpecialParameter(paramTypes[paramIndex])) { + // skip special parameters + continue; + } + String name = null; + // 首先,从 @Param 注解中获取参数 + for (Annotation annotation : paramAnnotations[paramIndex]) { + if (annotation instanceof Param) { + hasParamAnnotation = true; + name = ((Param) annotation).value(); + break; + } + } + if (name == null) { + // @Param was not specified. + // 其次,获取真实的参数名 + if (config.isUseActualParamName()) { // 默认开启 + name = getActualParamName(method, paramIndex); + } + // 最差,使用 map 的顺序,作为编号 + if (name == null) { + // use the parameter index as the name ("0", "1", ...) + // gcode issue #71 + name = String.valueOf(map.size()); + } + } + // 添加到 map 中 + map.put(paramIndex, name); + } + // 构建不可变集合 + names = Collections.unmodifiableSortedMap(map); + } + + private String getActualParamName(Method method, int paramIndex) { + return ParamNameUtil.getParamNames(method).get(paramIndex); + } + + private static boolean isSpecialParameter(Class clazz) { + return RowBounds.class.isAssignableFrom(clazz) || ResultHandler.class.isAssignableFrom(clazz); + } + + /** + * Returns parameter names referenced by SQL providers. + */ + public String[] getNames() { + return names.values().toArray(new String[0]); + } + + /** + *

+ * A single non-special parameter is returned without a name. + * Multiple parameters are named using the naming rule. + * In addition to the default names, this method also adds the generic names (param1, param2, + * ...). + *

+ * + * 获得参数名与值的映射 + */ + public Object getNamedParams(Object[] args) { + final int paramCount = names.size(); + // 无参数,则返回 null + if (args == null || paramCount == 0) { + return null; + // 只有一个非注解的参数,直接返回首元素 + } else if (!hasParamAnnotation && paramCount == 1) { + return args[names.firstKey()]; + } else { + // 集合。 + // 组合 1 :KEY:参数名,VALUE:参数值 + // 组合 2 :KEY:GENERIC_NAME_PREFIX + 参数顺序,VALUE :参数值 + final Map param = new ParamMap<>(); + int i = 0; + // 遍历 names 集合 + for (Map.Entry entry : names.entrySet()) { + // 组合 1 :添加到 param 中 + param.put(entry.getValue(), args[entry.getKey()]); + // add generic param names (param1, param2, ...) + // 组合 2 :添加到 param 中 + final String genericParamName = GENERIC_NAME_PREFIX + String.valueOf(i + 1); + // ensure not to overwrite parameter named with @Param + if (!names.containsValue(genericParamName)) { + param.put(genericParamName, args[entry.getKey()]); + } + i++; + } + return param; + } + } + +} diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/ParamNameUtil.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/ParamNameUtil.java new file mode 100644 index 0000000..9c397bc --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/ParamNameUtil.java @@ -0,0 +1,65 @@ +/** + * Copyright 2009-2018 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.reflection; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Executable; +import java.lang.reflect.Method; +import java.lang.reflect.Parameter; +import java.util.ArrayList; +import java.util.List; + +/** + * 参数名工具类 + */ +public class ParamNameUtil { + + /** + * 获得普通方法的参数列表 + * + * @param method 普通方法 + * @return 参数集合 + */ + public static List getParamNames(Method method) { + return getParameterNames(method); + } + + /** + * 获得构造方法的参数列表 + * + * @param constructor 构造方法 + * @return 参数集合 + */ + public static List getParamNames(Constructor constructor) { + return getParameterNames(constructor); + } + + private static List getParameterNames(Executable executable) { + final List names = new ArrayList<>(); + // 获得 Parameter 数组 + final Parameter[] params = executable.getParameters(); + // 获得参数名,并添加到 names 中 + for (Parameter param : params) { + names.add(param.getName()); + } + return names; + } + + private ParamNameUtil() { + super(); + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/ReflectionException.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/ReflectionException.java new file mode 100644 index 0000000..08b23e1 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/ReflectionException.java @@ -0,0 +1,45 @@ +/** + * Copyright 2009-2015 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.reflection; + +import org.apache.ibatis.exceptions.PersistenceException; + +/** + * 反射异常 + * + * @author Clinton Begin + */ +public class ReflectionException extends PersistenceException { + + private static final long serialVersionUID = 7642570221267566591L; + + public ReflectionException() { + super(); + } + + public ReflectionException(String message) { + super(message); + } + + public ReflectionException(String message, Throwable cause) { + super(message, cause); + } + + public ReflectionException(Throwable cause) { + super(cause); + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/Reflector.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/Reflector.java new file mode 100644 index 0000000..85f80e9 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/Reflector.java @@ -0,0 +1,619 @@ +/** + * Copyright 2009-2018 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.reflection; + +import org.apache.ibatis.reflection.invoker.GetFieldInvoker; +import org.apache.ibatis.reflection.invoker.Invoker; +import org.apache.ibatis.reflection.invoker.MethodInvoker; +import org.apache.ibatis.reflection.invoker.SetFieldInvoker; +import org.apache.ibatis.reflection.property.PropertyNamer; + +import java.lang.reflect.*; +import java.util.*; +import java.util.Map.Entry; + +/** + * This class represents a cached set of class definition information that + * allows for easy mapping between property names and getter/setter methods. + * + * 反射器,每个 Reflector 对应一个类。 + * + * Reflector 会缓存反射操作需要的类的信息,例如 构造方法、属性名、setting / getting 方法等等。 + * + * @author Clinton Begin + */ +public class Reflector { + + /** + * 对应的类 + */ + private final Class type; + /** + * 可读属性数组 + */ + private final String[] readablePropertyNames; + /** + * 可写属性集合 + */ + private final String[] writeablePropertyNames; + /** + * 属性对应的 setting 方法的映射。 + * + * key 为属性名称 + * value 为 Invoker 对象 + */ + private final Map setMethods = new HashMap<>(); + /** + * 属性对应的 getting 方法的映射。 + * + * key 为属性名称 + * value 为 Invoker 对象 + */ + private final Map getMethods = new HashMap<>(); + /** + * 属性对应的 setting 方法的方法参数类型的映射。{@link #setMethods} + * + * key 为属性名称 + * value 为方法参数类型 + */ + private final Map> setTypes = new HashMap<>(); + /** + * 属性对应的 getting 方法的返回值类型的映射。{@link #getMethods} + * + * key 为属性名称 + * value 为返回值的类型 + */ + private final Map> getTypes = new HashMap<>(); + /** + * 默认构造方法 + */ + private Constructor defaultConstructor; + /** + * 不区分大小写的属性集合 + */ + private Map caseInsensitivePropertyMap = new HashMap<>(); + + public Reflector(Class clazz) { + // 设置对应的类 + type = clazz; + // 初始化 defaultConstructor + addDefaultConstructor(clazz); + // 初始化 getMethods 和 getTypes ,通过遍历 getting 方法。 + addGetMethods(clazz); + // 初始化 setMethods 和 setTypes ,通过遍历 setting 方法。 + addSetMethods(clazz); + // 初始化 getMethods + getTypes 和 setMethods + setTypes ,通过遍历 fields 属性。 + addFields(clazz); + // 初始化 readablePropertyNames、writeablePropertyNames、caseInsensitivePropertyMap 属性 + readablePropertyNames = getMethods.keySet().toArray(new String[getMethods.keySet().size()]); + writeablePropertyNames = setMethods.keySet().toArray(new String[setMethods.keySet().size()]); + for (String propName : readablePropertyNames) { + caseInsensitivePropertyMap.put(propName.toUpperCase(Locale.ENGLISH), propName); + } + for (String propName : writeablePropertyNames) { + caseInsensitivePropertyMap.put(propName.toUpperCase(Locale.ENGLISH), propName); + } + } + + /** + * 寻找默认无参的构造方法 + * + * @param clazz 类 + */ + private void addDefaultConstructor(Class clazz) { + // 获得所有构造方法 + Constructor[] consts = clazz.getDeclaredConstructors(); + // 遍历所有构造方法,查找无参的构造方法 + for (Constructor constructor : consts) { + // 判断无参的构造方法 + if (constructor.getParameterTypes().length == 0) { + // 设置构造方法可以访问,避免是 private 等修饰符 + if (canControlMemberAccessible()) { + try { + constructor.setAccessible(true); + } catch (Exception e) { + // Ignored. This is only a final precaution, nothing we can do. + } + } + // 如果构造方法可以访问,赋值给 defaultConstructor + if (constructor.isAccessible()) { + this.defaultConstructor = constructor; + } + } + } + } + + private void addGetMethods(Class cls) { + // 属性与其 getting 方法的映射。 + Map> conflictingGetters = new HashMap<>(); + // 获得所有方法 + Method[] methods = getClassMethods(cls); + // 遍历所有方法 + for (Method method : methods) { + // 参数大于 0 ,说明不是 getting 方法,忽略 + if (method.getParameterTypes().length > 0) { + continue; + } + // 以 get 和 is 方法名开头,说明是 getting 方法 + String name = method.getName(); + if ((name.startsWith("get") && name.length() > 3) + || (name.startsWith("is") && name.length() > 2)) { + // 获得属性 + name = PropertyNamer.methodToProperty(name); + // 添加到 conflictingGetters 中 + addMethodConflict(conflictingGetters, name, method); + } + } + // 解决 getting 冲突方法 + resolveGetterConflicts(conflictingGetters); + } + + private void resolveGetterConflicts(Map> conflictingGetters) { + // 遍历每个属性,查找其最匹配的方法。因为子类可以覆写父类的方法,所以一个属性,可能对应多个 getting 方法 + for (Entry> entry : conflictingGetters.entrySet()) { + Method winner = null; // 最匹配的方法 + String propName = entry.getKey(); + for (Method candidate : entry.getValue()) { + // winner 为空,说明 candidate 为最匹配的方法 + if (winner == null) { + winner = candidate; + continue; + } + // 基于返回类型比较 + Class winnerType = winner.getReturnType(); + Class candidateType = candidate.getReturnType(); + // 类型相同 + if (candidateType.equals(winnerType)) { + // 返回值了诶选哪个相同,应该在 getClassMethods 方法中,已经合并。所以抛出 ReflectionException 异常 + if (!boolean.class.equals(candidateType)) { + throw new ReflectionException( + "Illegal overloaded getter method with ambiguous type for property " + + propName + " in class " + winner.getDeclaringClass() + + ". This breaks the JavaBeans specification and can cause unpredictable results."); + // 选择 boolean 类型的 is 方法 + } else if (candidate.getName().startsWith("is")) { + winner = candidate; + } + // 不符合选择子类 + } else if (candidateType.isAssignableFrom(winnerType)) { + // OK getter type is descendant + // 符合选择子类。因为子类可以修改放大返回值。例如,父类的一个方法的返回值为 List ,子类对该方法的返回值可以覆写为 ArrayList 。 + } else if (winnerType.isAssignableFrom(candidateType)) { + winner = candidate; + // 返回类型冲突,抛出 ReflectionException 异常 + } else { + throw new ReflectionException( + "Illegal overloaded getter method with ambiguous type for property " + + propName + " in class " + winner.getDeclaringClass() + + ". This breaks the JavaBeans specification and can cause unpredictable results."); + } + } + // 添加到 getMethods 和 getTypes 中 + addGetMethod(propName, winner); + } + } + + private void addGetMethod(String name, Method method) { + // 判断是合理的属性名 + if (isValidPropertyName(name)) { + // 添加到 getMethods 中 + getMethods.put(name, new MethodInvoker(method)); + // 添加到 getTypes 中 + Type returnType = TypeParameterResolver.resolveReturnType(method, type); + getTypes.put(name, typeToClass(returnType)); + } + } + + private void addSetMethods(Class cls) { + // 属性与其 setting 方法的映射。 + Map> conflictingSetters = new HashMap<>(); + // 获得所有方法 + Method[] methods = getClassMethods(cls); + // 遍历所有方法 + for (Method method : methods) { + String name = method.getName(); + // 方法名为 set 开头 + // 参数数量为 1 + if (name.startsWith("set") && name.length() > 3) { + if (method.getParameterTypes().length == 1) { + // 获得属性 + name = PropertyNamer.methodToProperty(name); + // 添加到 conflictingSetters 中 + addMethodConflict(conflictingSetters, name, method); + } + } + } + // 解决 setting 冲突方法 + resolveSetterConflicts(conflictingSetters); + } + + private void addMethodConflict(Map> conflictingMethods, String name, Method method) { + List list = conflictingMethods.computeIfAbsent(name, k -> new ArrayList<>()); + list.add(method); + } + + private void resolveSetterConflicts(Map> conflictingSetters) { + // 遍历每个属性,查找其最匹配的方法。因为子类可以覆写父类的方法,所以一个属性,可能对应多个 setting 方法 + for (String propName : conflictingSetters.keySet()) { + List setters = conflictingSetters.get(propName); + Class getterType = getTypes.get(propName); + Method match = null; + ReflectionException exception = null; + // 遍历属性对应的 setting 方法 + for (Method setter : setters) { + Class paramType = setter.getParameterTypes()[0]; + // 和 getterType 相同,直接使用 + if (paramType.equals(getterType)) { + // should be the best match + match = setter; + break; + } + if (exception == null) { + try { + // 选择一个更加匹配的 + match = pickBetterSetter(match, setter, propName); + } catch (ReflectionException e) { + // there could still be the 'best match' + match = null; + exception = e; + } + } + } + // 添加到 setMethods 和 setTypes 中 + if (match == null) { + throw exception; + } else { + addSetMethod(propName, match); + } + } + } + + private Method pickBetterSetter(Method setter1, Method setter2, String property) { + if (setter1 == null) { + return setter2; + } + Class paramType1 = setter1.getParameterTypes()[0]; + Class paramType2 = setter2.getParameterTypes()[0]; + if (paramType1.isAssignableFrom(paramType2)) { + return setter2; + } else if (paramType2.isAssignableFrom(paramType1)) { + return setter1; + } + throw new ReflectionException("Ambiguous setters defined for property '" + property + "' in class '" + + setter2.getDeclaringClass() + "' with types '" + paramType1.getName() + "' and '" + + paramType2.getName() + "'."); + } + + private void addSetMethod(String name, Method method) { + if (isValidPropertyName(name)) { + // 添加到 setMethods 中 + setMethods.put(name, new MethodInvoker(method)); + // 添加到 setTypes 中 + Type[] paramTypes = TypeParameterResolver.resolveParamTypes(method, type); + setTypes.put(name, typeToClass(paramTypes[0])); + } + } + + /** + * 获得 Type 对应的类 + * + * @param src Type + * @return 对应的类 + */ + private Class typeToClass(Type src) { + Class result = null; + // 普通类型,直接使用类 + if (src instanceof Class) { + result = (Class) src; + // 泛型类型,使用泛型 + } else if (src instanceof ParameterizedType) { + result = (Class) ((ParameterizedType) src).getRawType(); + // 泛型数组,获得具体类 + } else if (src instanceof GenericArrayType) { + Type componentType = ((GenericArrayType) src).getGenericComponentType(); + if (componentType instanceof Class) { // 普通类型 + result = Array.newInstance((Class) componentType, 0).getClass(); + } else { + Class componentClass = typeToClass(componentType); // 递归该方法,返回类 + result = Array.newInstance(componentClass, 0).getClass(); + } + } + // 都不符合,使用 Object 类 + if (result == null) { + result = Object.class; + } + return result; + } + + private void addFields(Class clazz) { + // 获得所有 field 们 + Field[] fields = clazz.getDeclaredFields(); + for (Field field : fields) { + // 设置 field 可访问 + if (canControlMemberAccessible()) { + try { + field.setAccessible(true); + } catch (Exception e) { + // Ignored. This is only a final precaution, nothing we can do. + } + } + if (field.isAccessible()) { + // 添加到 setMethods 和 setTypes 中 + if (!setMethods.containsKey(field.getName())) { + // issue #379 - removed the check for final because JDK 1.5 allows + // modification of final fields through reflection (JSR-133). (JGB) + // pr #16 - final static can only be set by the classloader + int modifiers = field.getModifiers(); + if (!(Modifier.isFinal(modifiers) && Modifier.isStatic(modifiers))) { + addSetField(field); + } + } + // 添加到 getMethods 和 getTypes 中 + if (!getMethods.containsKey(field.getName())) { + addGetField(field); + } + } + } + // 递归,处理父类 + if (clazz.getSuperclass() != null) { + addFields(clazz.getSuperclass()); + } + } + + private void addSetField(Field field) { + // 判断是合理的属性 + if (isValidPropertyName(field.getName())) { + // 添加到 setMethods 中 + setMethods.put(field.getName(), new SetFieldInvoker(field)); + // 添加到 setTypes 中 + Type fieldType = TypeParameterResolver.resolveFieldType(field, type); + setTypes.put(field.getName(), typeToClass(fieldType)); + } + } + + private void addGetField(Field field) { + // 判断是合理的属性 + if (isValidPropertyName(field.getName())) { + // 添加到 getMethods 中 + getMethods.put(field.getName(), new GetFieldInvoker(field)); + // 添加到 getMethods 中 + Type fieldType = TypeParameterResolver.resolveFieldType(field, type); + getTypes.put(field.getName(), typeToClass(fieldType)); + } + } + + private boolean isValidPropertyName(String name) { + return !(name.startsWith("$") || "serialVersionUID".equals(name) || "class".equals(name)); + } + + /** + * This method returns an array containing all methods + * declared in this class and any superclass. + * We use this method, instead of the simpler Class.getMethods(), + * because we want to look for private methods as well. + * + * @param cls The class + * @return An array containing all methods in this class + */ + private Method[] getClassMethods(Class cls) { + // 每个方法签名与该方法的映射 + Map uniqueMethods = new HashMap<>(); + // 循环类,类的父类,类的父类的父类,直到父类为 Object + Class currentClass = cls; + while (currentClass != null && currentClass != Object.class) { + // 记录当前类定义的方法 + addUniqueMethods(uniqueMethods, currentClass.getDeclaredMethods()); + + // we also need to look for interface methods - + // because the class may be abstract + // 记录接口中定义的方法 + Class[] interfaces = currentClass.getInterfaces(); + for (Class anInterface : interfaces) { + addUniqueMethods(uniqueMethods, anInterface.getMethods()); + } + + // 获得父类 + currentClass = currentClass.getSuperclass(); + } + + // 转换成 Method 数组返回 + Collection methods = uniqueMethods.values(); + return methods.toArray(new Method[methods.size()]); + } + + private void addUniqueMethods(Map uniqueMethods, Method[] methods) { + for (Method currentMethod : methods) { + if (!currentMethod.isBridge()) { // 忽略 bridge 方法,参见 https://www.zhihu.com/question/54895701/answer/141623158 文章 + // 获得方法签名 + String signature = getSignature(currentMethod); + // check to see if the method is already known + // if it is known, then an extended class must have + // overridden a method + // 当 uniqueMethods 不存在时,进行添加 + if (!uniqueMethods.containsKey(signature)) { + // 设置方法可访问 + if (canControlMemberAccessible()) { + try { + currentMethod.setAccessible(true); + } catch (Exception e) { + // Ignored. This is only a final precaution, nothing we can do. + } + } + // 添加到 uniqueMethods 中 + uniqueMethods.put(signature, currentMethod); + } + } + } + } + + /** + * 获得方法签名。 + * + * 格式:returnType#方法名:参数名1,参数名2,参数名3 + * 例如:void#checkPackageAccess:java.lang.ClassLoader,boolean + * + * @param method 方法 + * @return 方法签名 + */ + private String getSignature(Method method) { + StringBuilder sb = new StringBuilder(); + // 返回类型 + Class returnType = method.getReturnType(); + if (returnType != null) { + sb.append(returnType.getName()).append('#'); + } + // 方法名 + sb.append(method.getName()); + // 方法参数 + Class[] parameters = method.getParameterTypes(); + for (int i = 0; i < parameters.length; i++) { + if (i == 0) { + sb.append(':'); + } else { + sb.append(','); + } + sb.append(parameters[i].getName()); + } + return sb.toString(); + } + + /** + * Checks whether can control member accessible. + * + * 判断,是否可以修改可访问性 + * + * @return If can control member accessible, it return {@literal true} + * @since 3.5.0 + */ + public static boolean canControlMemberAccessible() { + try { + SecurityManager securityManager = System.getSecurityManager(); + if (null != securityManager) { + securityManager.checkPermission(new ReflectPermission("suppressAccessChecks")); + } + } catch (SecurityException e) { + return false; + } + return true; + } + + /** + * Gets the name of the class the instance provides information for + * + * @return The class name + */ + public Class getType() { + return type; + } + + public Constructor getDefaultConstructor() { + if (defaultConstructor != null) { + return defaultConstructor; + } else { + throw new ReflectionException("There is no default constructor for " + type); + } + } + + public boolean hasDefaultConstructor() { + return defaultConstructor != null; + } + + public Invoker getSetInvoker(String propertyName) { + Invoker method = setMethods.get(propertyName); + if (method == null) { + throw new ReflectionException("There is no setter for property named '" + propertyName + "' in '" + type + "'"); + } + return method; + } + + public Invoker getGetInvoker(String propertyName) { + Invoker method = getMethods.get(propertyName); + if (method == null) { + throw new ReflectionException("There is no getter for property named '" + propertyName + "' in '" + type + "'"); + } + return method; + } + + /** + * Gets the type for a property setter + * + * @param propertyName - the name of the property + * @return The Class of the property setter + */ + public Class getSetterType(String propertyName) { + Class clazz = setTypes.get(propertyName); + if (clazz == null) { + throw new ReflectionException("There is no setter for property named '" + propertyName + "' in '" + type + "'"); + } + return clazz; + } + + /** + * Gets the type for a property getter + * + * @param propertyName - the name of the property + * @return The Class of the property getter + */ + public Class getGetterType(String propertyName) { + Class clazz = getTypes.get(propertyName); + if (clazz == null) { + throw new ReflectionException("There is no getter for property named '" + propertyName + "' in '" + type + "'"); + } + return clazz; + } + + /** + * Gets an array of the readable properties for an object + * + * @return The array + */ + public String[] getGetablePropertyNames() { + return readablePropertyNames; + } + + /** + * Gets an array of the writable properties for an object + * + * @return The array + */ + public String[] getSetablePropertyNames() { + return writeablePropertyNames; + } + + /** + * Check to see if a class has a writable property by name + * + * @param propertyName - the name of the property to check + * @return True if the object has a writable property by the name + */ + public boolean hasSetter(String propertyName) { + return setMethods.keySet().contains(propertyName); + } + + /** + * Check to see if a class has a readable property by name + * + * @param propertyName - the name of the property to check + * @return True if the object has a readable property by the name + */ + public boolean hasGetter(String propertyName) { + return getMethods.keySet().contains(propertyName); + } + + public String findPropertyName(String name) { + return caseInsensitivePropertyMap.get(name.toUpperCase(Locale.ENGLISH)); + } +} diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/ReflectorFactory.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/ReflectorFactory.java new file mode 100644 index 0000000..44b7aea --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/ReflectorFactory.java @@ -0,0 +1,43 @@ +/** + * Copyright 2009-2015 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.reflection; + +/** + * {@link Reflector} 工厂 + */ +public interface ReflectorFactory { + + /** + * @return 是否缓存 Reflector 对象 + */ + boolean isClassCacheEnabled(); + + /** + * 设置是否缓存 Reflector 对象 + * + * @param classCacheEnabled 是否缓存 + */ + void setClassCacheEnabled(boolean classCacheEnabled); + + /** + * 获取 Reflector 对象 + * + * @param type 指定类 + * @return Reflector 对象 + */ + Reflector findForClass(Class type); + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/SystemMetaObject.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/SystemMetaObject.java new file mode 100644 index 0000000..a15fc41 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/SystemMetaObject.java @@ -0,0 +1,61 @@ +/** + * Copyright 2009-2015 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.reflection; + +import org.apache.ibatis.reflection.factory.DefaultObjectFactory; +import org.apache.ibatis.reflection.factory.ObjectFactory; +import org.apache.ibatis.reflection.wrapper.DefaultObjectWrapperFactory; +import org.apache.ibatis.reflection.wrapper.ObjectWrapperFactory; + +/** + * 系统级的 MetaObject 对象,主要提供了 ObjectFactory、ObjectWrapperFactory、空 MetaObject 的单例。 + * + * @author Clinton Begin + */ +public final class SystemMetaObject { + + /** + * ObjectFactory 的单例 + */ + public static final ObjectFactory DEFAULT_OBJECT_FACTORY = new DefaultObjectFactory(); + /** + * ObjectWrapperFactory 的单例 + */ + public static final ObjectWrapperFactory DEFAULT_OBJECT_WRAPPER_FACTORY = new DefaultObjectWrapperFactory(); + + /** + * 空对象的 MetaObject 对象单例 + */ + public static final MetaObject NULL_META_OBJECT = MetaObject.forObject(NullObject.class, DEFAULT_OBJECT_FACTORY, DEFAULT_OBJECT_WRAPPER_FACTORY, new DefaultReflectorFactory()); + + private SystemMetaObject() { + // Prevent Instantiation of Static Class + } + + private static class NullObject { + } + + /** + * 创建 MetaObject 对象 + * + * @param object 指定对象 + * @return MetaObject 对象 + */ + public static MetaObject forObject(Object object) { + return MetaObject.forObject(object, DEFAULT_OBJECT_FACTORY, DEFAULT_OBJECT_WRAPPER_FACTORY, new DefaultReflectorFactory()); + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/TypeParameterResolver.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/TypeParameterResolver.java new file mode 100644 index 0000000..e95433d --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/TypeParameterResolver.java @@ -0,0 +1,388 @@ +/** + * Copyright 2009-2018 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.reflection; + +import java.lang.reflect.*; +import java.util.Arrays; + +/** + * {@link Type} 参数解析器 + * + * 关于 Java Type 的体系,可以参考如下文章: + * 1> https://www.jianshu.com/p/7649f86614d3 + * 2> https://www.jianshu.com/p/cae76008b36b + * + * @author Iwao AVE! + */ +@SuppressWarnings("Duplicates") +public class TypeParameterResolver { + + /** + * 解析属性类型 + * + * @return The field type as {@link Type}. If it has type parameters in the declaration,
+ * they will be resolved to the actual runtime {@link Type}s. + */ + public static Type resolveFieldType(Field field, Type srcType) { + // 属性类型 + Type fieldType = field.getGenericType(); + // 定义的类 + Class declaringClass = field.getDeclaringClass(); + // 解析类型 + return resolveType(fieldType, srcType, declaringClass); + } + + /** + * 解析方法返回类型 + * + * @return The return type of the method as {@link Type}. If it has type parameters in the declaration,
+ * they will be resolved to the actual runtime {@link Type}s. + */ + public static Type resolveReturnType(Method method, Type srcType) { + // 属性类型 + Type returnType = method.getGenericReturnType(); + // 定义的类 + Class declaringClass = method.getDeclaringClass(); + // 解析类型 + return resolveType(returnType, srcType, declaringClass); + } + + /** + * 解析方法参数的类型数组 + * + * @return The parameter types of the method as an array of {@link Type}s. If they have type parameters in the declaration,
+ * they will be resolved to the actual runtime {@link Type}s. + */ + public static Type[] resolveParamTypes(Method method, Type srcType) { + // 获得方法参数类型数组 + Type[] paramTypes = method.getGenericParameterTypes(); + // 定义的类 + Class declaringClass = method.getDeclaringClass(); + // 解析类型们 + Type[] result = new Type[paramTypes.length]; + for (int i = 0; i < paramTypes.length; i++) { + result[i] = resolveType(paramTypes[i], srcType, declaringClass); + } + return result; + } + + /** + * 解析类型 + * + * @param type 类型 + * @param srcType 来源类型 + * @param declaringClass 定义的类 + * @return 解析后的类型 + */ + private static Type resolveType(Type type, Type srcType, Class declaringClass) { + if (type instanceof TypeVariable) { + return resolveTypeVar((TypeVariable) type, srcType, declaringClass); + } else if (type instanceof ParameterizedType) { + return resolveParameterizedType((ParameterizedType) type, srcType, declaringClass); + } else if (type instanceof GenericArrayType) { + return resolveGenericArrayType((GenericArrayType) type, srcType, declaringClass); + } else { + return type; + } + } + + /** + * 解析 GenericArrayType 类型 + * + * @param genericArrayType GenericArrayType 类型 + * @param srcType 来源类型 + * @param declaringClass 定义的类 + * @return 解析后的类型 + */ + private static Type resolveGenericArrayType(GenericArrayType genericArrayType, Type srcType, Class declaringClass) { + // 解析 componentType + Type componentType = genericArrayType.getGenericComponentType(); + Type resolvedComponentType = null; + if (componentType instanceof TypeVariable) { + resolvedComponentType = resolveTypeVar((TypeVariable) componentType, srcType, declaringClass); + } else if (componentType instanceof GenericArrayType) { + resolvedComponentType = resolveGenericArrayType((GenericArrayType) componentType, srcType, declaringClass); + } else if (componentType instanceof ParameterizedType) { + resolvedComponentType = resolveParameterizedType((ParameterizedType) componentType, srcType, declaringClass); + } + // 创建 GenericArrayTypeImpl 对象 + if (resolvedComponentType instanceof Class) { + return Array.newInstance((Class) resolvedComponentType, 0).getClass(); + } else { + return new GenericArrayTypeImpl(resolvedComponentType); + } + } + + /** + * 解析 ParameterizedType 类型 + * + * @param parameterizedType ParameterizedType 类型 + * @param srcType 来源类型 + * @param declaringClass 定义的类 + * @return 解析后的类型 + */ + private static ParameterizedType resolveParameterizedType(ParameterizedType parameterizedType, Type srcType, Class declaringClass) { + Class rawType = (Class) parameterizedType.getRawType(); + // 解析 <> 中实际类型 + Type[] typeArgs = parameterizedType.getActualTypeArguments(); + Type[] args = new Type[typeArgs.length]; + for (int i = 0; i < typeArgs.length; i++) { + if (typeArgs[i] instanceof TypeVariable) { + args[i] = resolveTypeVar((TypeVariable) typeArgs[i], srcType, declaringClass); + } else if (typeArgs[i] instanceof ParameterizedType) { + args[i] = resolveParameterizedType((ParameterizedType) typeArgs[i], srcType, declaringClass); + } else if (typeArgs[i] instanceof WildcardType) { + args[i] = resolveWildcardType((WildcardType) typeArgs[i], srcType, declaringClass); + } else { + args[i] = typeArgs[i]; + } + } + return new ParameterizedTypeImpl(rawType, null, args); + } + + private static Type resolveWildcardType(WildcardType wildcardType, Type srcType, Class declaringClass) { + // 解析泛型表达式下界(下限 super) + Type[] lowerBounds = resolveWildcardTypeBounds(wildcardType.getLowerBounds(), srcType, declaringClass); + // 解析泛型表达式上界(下限 extends) + Type[] upperBounds = resolveWildcardTypeBounds(wildcardType.getUpperBounds(), srcType, declaringClass); + // 创建 WildcardTypeImpl 对象 + return new WildcardTypeImpl(lowerBounds, upperBounds); + } + + private static Type[] resolveWildcardTypeBounds(Type[] bounds, Type srcType, Class declaringClass) { + Type[] result = new Type[bounds.length]; + for (int i = 0; i < bounds.length; i++) { + if (bounds[i] instanceof TypeVariable) { + result[i] = resolveTypeVar((TypeVariable) bounds[i], srcType, declaringClass); + } else if (bounds[i] instanceof ParameterizedType) { + result[i] = resolveParameterizedType((ParameterizedType) bounds[i], srcType, declaringClass); + } else if (bounds[i] instanceof WildcardType) { + result[i] = resolveWildcardType((WildcardType) bounds[i], srcType, declaringClass); + } else { + result[i] = bounds[i]; + } + } + return result; + } + + /** + * 解析 TypeVariable 类型 + * + * @param typeVar TypeVariable 类型 + * @param srcType 来源类型 + * @param declaringClass 定义的类 + * @return 解析后的类型 + */ + // TODO 芋艿 1001 ,看不太懂。 + private static Type resolveTypeVar(TypeVariable typeVar, Type srcType, Class declaringClass) { + Type result; + Class clazz; + if (srcType instanceof Class) { + clazz = (Class) srcType; + } else if (srcType instanceof ParameterizedType) { + ParameterizedType parameterizedType = (ParameterizedType) srcType; + clazz = (Class) parameterizedType.getRawType(); + } else { + throw new IllegalArgumentException("The 2nd arg must be Class or ParameterizedType, but was: " + srcType.getClass()); + } + + if (clazz == declaringClass) { + Type[] bounds = typeVar.getBounds(); + if (bounds.length > 0) { + return bounds[0]; + } + return Object.class; + } + + Type superclass = clazz.getGenericSuperclass(); + result = scanSuperTypes(typeVar, srcType, declaringClass, clazz, superclass); + if (result != null) { + return result; + } + + Type[] superInterfaces = clazz.getGenericInterfaces(); + for (Type superInterface : superInterfaces) { + result = scanSuperTypes(typeVar, srcType, declaringClass, clazz, superInterface); + if (result != null) { + return result; + } + } + return Object.class; + } + + private static Type scanSuperTypes(TypeVariable typeVar, Type srcType, Class declaringClass, Class clazz, Type superclass) { + if (superclass instanceof ParameterizedType) { + ParameterizedType parentAsType = (ParameterizedType) superclass; + Class parentAsClass = (Class) parentAsType.getRawType(); + TypeVariable[] parentTypeVars = parentAsClass.getTypeParameters(); + if (srcType instanceof ParameterizedType) { + parentAsType = translateParentTypeVars((ParameterizedType) srcType, clazz, parentAsType); + } + if (declaringClass == parentAsClass) { + for (int i = 0; i < parentTypeVars.length; i++) { + if (typeVar == parentTypeVars[i]) { + return parentAsType.getActualTypeArguments()[i]; + } + } + } + if (declaringClass.isAssignableFrom(parentAsClass)) { + return resolveTypeVar(typeVar, parentAsType, declaringClass); + } + } else if (superclass instanceof Class && declaringClass.isAssignableFrom((Class) superclass)) { + return resolveTypeVar(typeVar, superclass, declaringClass); + } + return null; + } + + private static ParameterizedType translateParentTypeVars(ParameterizedType srcType, Class srcClass, ParameterizedType parentType) { + Type[] parentTypeArgs = parentType.getActualTypeArguments(); + Type[] srcTypeArgs = srcType.getActualTypeArguments(); + TypeVariable[] srcTypeVars = srcClass.getTypeParameters(); + Type[] newParentArgs = new Type[parentTypeArgs.length]; + boolean noChange = true; + for (int i = 0; i < parentTypeArgs.length; i++) { + if (parentTypeArgs[i] instanceof TypeVariable) { + for (int j = 0; j < srcTypeVars.length; j++) { + if (srcTypeVars[j] == parentTypeArgs[i]) { + noChange = false; + newParentArgs[i] = srcTypeArgs[j]; + } + } + } else { + newParentArgs[i] = parentTypeArgs[i]; + } + } + return noChange ? parentType : new ParameterizedTypeImpl((Class) parentType.getRawType(), null, newParentArgs); + } + + private TypeParameterResolver() { + super(); + } + + /** + * ParameterizedType 实现类 + * + * 参数化类型,即泛型。例如:List、Map等带有参数化的配置 + */ + static class ParameterizedTypeImpl implements ParameterizedType { + + // 以 List 举例子 + + /** + * <> 前面实际类型 + * + * 例如:List + */ + private Class rawType; + /** + * 如果这个类型是某个属性所有,则获取这个所有者类型;否则,返回 null + */ + private Type ownerType; + /** + * <> 中实际类型 + * + * 例如:T + */ + private Type[] actualTypeArguments; + + public ParameterizedTypeImpl(Class rawType, Type ownerType, Type[] actualTypeArguments) { + super(); + this.rawType = rawType; + this.ownerType = ownerType; + this.actualTypeArguments = actualTypeArguments; + } + + @Override + public Type[] getActualTypeArguments() { + return actualTypeArguments; + } + + @Override + public Type getOwnerType() { + return ownerType; + } + + @Override + public Type getRawType() { + return rawType; + } + + @Override + public String toString() { + return "ParameterizedTypeImpl [rawType=" + rawType + ", ownerType=" + ownerType + ", actualTypeArguments=" + Arrays.toString(actualTypeArguments) + "]"; + } + + } + + /** + * WildcardType 实现类 + * + * 泛型表达式(或者通配符表达式),即 ? extend Number、? super Integer 这样的表达式。 + * WildcardType 虽然是 Type 的子接口,但却不是 Java 类型中的一种。 + */ + static class WildcardTypeImpl implements WildcardType { + + /** + * 泛型表达式下界(下限 super) + */ + private Type[] lowerBounds; + /** + * 泛型表达式上界(上界 extends) + */ + private Type[] upperBounds; + + WildcardTypeImpl(Type[] lowerBounds, Type[] upperBounds) { + super(); + this.lowerBounds = lowerBounds; + this.upperBounds = upperBounds; + } + + @Override + public Type[] getLowerBounds() { + return lowerBounds; + } + + @Override + public Type[] getUpperBounds() { + return upperBounds; + } + } + + /** + * GenericArrayType 实现类 + * + * 泛型数组类型,用来描述 ParameterizedType、TypeVariable 类型的数组;即 List[]、T[] 等; + */ + static class GenericArrayTypeImpl implements GenericArrayType { + + /** + * 数组元素类型 + */ + private Type genericComponentType; + + GenericArrayTypeImpl(Type genericComponentType) { + super(); + this.genericComponentType = genericComponentType; + } + + @Override + public Type getGenericComponentType() { + return genericComponentType; + } + + } + +} diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/factory/DefaultObjectFactory.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/factory/DefaultObjectFactory.java new file mode 100644 index 0000000..014da38 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/factory/DefaultObjectFactory.java @@ -0,0 +1,115 @@ +/** + * Copyright 2009-2018 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.reflection.factory; + +import org.apache.ibatis.reflection.ReflectionException; + +import java.io.Serializable; +import java.lang.reflect.Constructor; +import java.util.*; + +/** + * 默认 ObjectFactory 实现类 + * + * @author Clinton Begin + */ +public class DefaultObjectFactory implements ObjectFactory, Serializable { + + private static final long serialVersionUID = -8855120656740914948L; + + @Override + public T create(Class type) { + return create(type, null, null); + } + + @SuppressWarnings("unchecked") + @Override + public T create(Class type, List> constructorArgTypes, List constructorArgs) { + // 获得需要创建的类 + Class classToCreate = resolveInterface(type); + // we know types are assignable + // 创建指定类的对象 + return (T) instantiateClass(classToCreate, constructorArgTypes, constructorArgs); + } + + @Override + public void setProperties(Properties properties) { + // no props for default + } + + private T instantiateClass(Class type, List> constructorArgTypes, List constructorArgs) { + try { + Constructor constructor; + // 通过无参构造方法,创建指定类的对象 + if (constructorArgTypes == null || constructorArgs == null) { + constructor = type.getDeclaredConstructor(); + if (!constructor.isAccessible()) { + constructor.setAccessible(true); + } + return constructor.newInstance(); + } + // 使用特定构造方法,创建指定类的对象 + constructor = type.getDeclaredConstructor(constructorArgTypes.toArray(new Class[constructorArgTypes.size()])); + if (!constructor.isAccessible()) { + constructor.setAccessible(true); + } + return constructor.newInstance(constructorArgs.toArray(new Object[constructorArgs.size()])); + } catch (Exception e) { + // 拼接 argTypes + StringBuilder argTypes = new StringBuilder(); + if (constructorArgTypes != null && !constructorArgTypes.isEmpty()) { + for (Class argType : constructorArgTypes) { + argTypes.append(argType.getSimpleName()); + argTypes.append(","); + } + argTypes.deleteCharAt(argTypes.length() - 1); // remove trailing , + } + // 拼接 argValues + StringBuilder argValues = new StringBuilder(); + if (constructorArgs != null && !constructorArgs.isEmpty()) { + for (Object argValue : constructorArgs) { + argValues.append(String.valueOf(argValue)); + argValues.append(","); + } + argValues.deleteCharAt(argValues.length() - 1); // remove trailing , + } + // 抛出 ReflectionException 异常 + throw new ReflectionException("Error instantiating " + type + " with invalid types (" + argTypes + ") or values (" + argValues + "). Cause: " + e, e); + } + } + + protected Class resolveInterface(Class type) { + Class classToCreate; + if (type == List.class || type == Collection.class || type == Iterable.class) { + classToCreate = ArrayList.class; + } else if (type == Map.class) { + classToCreate = HashMap.class; + } else if (type == SortedSet.class) { // issue #510 Collections Support + classToCreate = TreeSet.class; + } else if (type == Set.class) { + classToCreate = HashSet.class; + } else { + classToCreate = type; + } + return classToCreate; + } + + @Override + public boolean isCollection(Class type) { + return Collection.class.isAssignableFrom(type); + } + +} diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/factory/ObjectFactory.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/factory/ObjectFactory.java new file mode 100644 index 0000000..d67f4a7 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/factory/ObjectFactory.java @@ -0,0 +1,71 @@ +/** + * Copyright 2009-2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.reflection.factory; + +import java.util.List; +import java.util.Properties; + +/** + * MyBatis uses an ObjectFactory to create all needed new Objects. + * + * Object 工厂接口,用于创建指定类的对象 + * + * @author Clinton Begin + */ +public interface ObjectFactory { + + /** + * 设置 Properties + * + * Sets configuration properties. + * @param properties configuration properties + */ + void setProperties(Properties properties); + + /** + * 创建指定类的对象,使用默认构造方法 + * + * Creates a new object with default constructor. + * @param type Object type + * @return 对象 + */ + T create(Class type); + + /** + * Creates a new object with the specified constructor and params. + * + * 创建指定类的对象,使用特定的构造方法 + * + * @param type Object type + * @param constructorArgTypes Constructor argument types 指定构造方法的参数列表 + * @param constructorArgs Constructor argument values 参数数组 + * @return 对象 + */ + T create(Class type, List> constructorArgTypes, List constructorArgs); + + /** + * Returns true if this object can have a set of other objects. + * It's main purpose is to support non-java.util.Collection objects like Scala collections. + * + * 判断指定类是否为集合类 + * + * @param type Object type + * @return whether it is a collection or not + * @since 3.1.0 + */ + boolean isCollection(Class type); + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/factory/package-info.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/factory/package-info.java new file mode 100644 index 0000000..ef174fb --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/factory/package-info.java @@ -0,0 +1,19 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Object factory. + */ +package org.apache.ibatis.reflection.factory; diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/invoker/GetFieldInvoker.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/invoker/GetFieldInvoker.java new file mode 100644 index 0000000..9080a39 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/invoker/GetFieldInvoker.java @@ -0,0 +1,49 @@ +/** + * Copyright 2009-2017 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.reflection.invoker; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; + +/** + * 获得 Field 调用者 + * + * @author Clinton Begin + */ +public class GetFieldInvoker implements Invoker { + + /** + * Field 对象 + */ + private final Field field; + + public GetFieldInvoker(Field field) { + this.field = field; + } + + // 获得属性 + @Override + public Object invoke(Object target, Object[] args) throws IllegalAccessException, InvocationTargetException { + return field.get(target); + } + + // 返回属性类型 + @Override + public Class getType() { + return field.getType(); + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/invoker/Invoker.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/invoker/Invoker.java new file mode 100644 index 0000000..897f872 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/invoker/Invoker.java @@ -0,0 +1,43 @@ +/** + * Copyright 2009-2015 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.reflection.invoker; + +import java.lang.reflect.InvocationTargetException; + +/** + * 调用者接口 + * + * @author Clinton Begin + */ +public interface Invoker { + + /** + * 执行调用 + * + * @param target 目标 + * @param args 参数 + * @return 结果 + * @throws IllegalAccessException + * @throws InvocationTargetException + */ + Object invoke(Object target, Object[] args) throws IllegalAccessException, InvocationTargetException; + + /** + * @return 类 + */ + Class getType(); + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/invoker/MethodInvoker.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/invoker/MethodInvoker.java new file mode 100644 index 0000000..0e94519 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/invoker/MethodInvoker.java @@ -0,0 +1,60 @@ +/** + * Copyright 2009-2017 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.reflection.invoker; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +/** + * 指定方法的调用器 + * + * @author Clinton Begin + */ +public class MethodInvoker implements Invoker { + + /** + * 类型 + */ + private final Class type; + /** + * 指定方法 + */ + private final Method method; + + public MethodInvoker(Method method) { + this.method = method; + + // 参数大小为 1 时,一般是 setting 方法,设置 type 为方法参数[0] + if (method.getParameterTypes().length == 1) { + type = method.getParameterTypes()[0]; + // 否则,一般是 getting 方法,设置 type 为返回类型 + } else { + type = method.getReturnType(); + } + } + + // 执行指定方法 + @Override + public Object invoke(Object target, Object[] args) throws IllegalAccessException, InvocationTargetException { + return method.invoke(target, args); + } + + @Override + public Class getType() { + return type; + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/invoker/SetFieldInvoker.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/invoker/SetFieldInvoker.java new file mode 100644 index 0000000..340d723 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/invoker/SetFieldInvoker.java @@ -0,0 +1,50 @@ +/** + * Copyright 2009-2017 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.reflection.invoker; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; + +/** + * 设置 Field 调用者 + * + * @author Clinton Begin + */ +public class SetFieldInvoker implements Invoker { + + /** + * Field 对象 + */ + private final Field field; + + public SetFieldInvoker(Field field) { + this.field = field; + } + + // 设置 Field 属性 + @Override + public Object invoke(Object target, Object[] args) throws IllegalAccessException, InvocationTargetException { + field.set(target, args[0]); + return null; + } + + // 返回属性类型 + @Override + public Class getType() { + return field.getType(); + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/invoker/package-info.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/invoker/package-info.java new file mode 100644 index 0000000..c59ceb0 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/invoker/package-info.java @@ -0,0 +1,19 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Unused. + */ +package org.apache.ibatis.reflection.invoker; diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/package-info.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/package-info.java new file mode 100644 index 0000000..dc7e827 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/package-info.java @@ -0,0 +1,19 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Reflection utils. + */ +package org.apache.ibatis.reflection; diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/property/PropertyCopier.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/property/PropertyCopier.java new file mode 100644 index 0000000..bb0495f --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/property/PropertyCopier.java @@ -0,0 +1,59 @@ +/** + * Copyright 2009-2015 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.reflection.property; + +import java.lang.reflect.Field; + +/** + * 属性复制器 + * + * @author Clinton Begin + */ +public final class PropertyCopier { + + private PropertyCopier() { + // Prevent Instantiation of Static Class + } + + /** + * 将 sourceBean 的属性,复制到 destinationBean 中 + * + * @param type 指定类 + * @param sourceBean 来源 Bean 对象 + * @param destinationBean 目标 Bean 对象 + */ + public static void copyBeanProperties(Class type, Object sourceBean, Object destinationBean) { + // 循环,从当前类开始,不断复制到父类,直到父类不存在 + Class parent = type; + while (parent != null) { + // 获得当前 parent 类定义的属性 + final Field[] fields = parent.getDeclaredFields(); + for (Field field : fields) { + try { + // 设置属性可访问 + field.setAccessible(true); + // 从 sourceBean 中,复制到 destinationBean 去 + field.set(destinationBean, field.get(sourceBean)); + } catch (Exception e) { + // Nothing useful to do, will only fail on final fields, which will be ignored. + } + } + // 获得父类 + parent = parent.getSuperclass(); + } + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/property/PropertyNamer.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/property/PropertyNamer.java new file mode 100644 index 0000000..a2ea662 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/property/PropertyNamer.java @@ -0,0 +1,89 @@ +/** + * Copyright 2009-2015 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.reflection.property; + +import org.apache.ibatis.reflection.ReflectionException; + +import java.util.Locale; + +/** + * 属性名相关的工具类方法 + * + * @author Clinton Begin + */ +public final class PropertyNamer { + + private PropertyNamer() { + // Prevent Instantiation of Static Class + } + + /** + * 根据方法名,获得对应的属性名 + * + * @param name 方法名 + * @return 属性名 + */ + public static String methodToProperty(String name) { + // is 方法 + if (name.startsWith("is")) { + name = name.substring(2); + // get 或者 set 方法 + } else if (name.startsWith("get") || name.startsWith("set")) { + name = name.substring(3); + // 抛出 ReflectionException 异常,因为只能处理 is、set、get 方法 + } else { + throw new ReflectionException("Error parsing property name '" + name + "'. Didn't start with 'is', 'get' or 'set'."); + } + + // 首字母小写 + if (name.length() == 1 || (name.length() > 1 && !Character.isUpperCase(name.charAt(1)))) { + name = name.substring(0, 1).toLowerCase(Locale.ENGLISH) + name.substring(1); + } + + return name; + } + + /** + * 判断是否为 is、get、set 方法 + * + * @param name 方法名 + * @return 是否 + */ + public static boolean isProperty(String name) { + return name.startsWith("get") || name.startsWith("set") || name.startsWith("is"); + } + + /** + * 判断是否为 get、is 方法 + * + * @param name 方法名 + * @return 是否 + */ + public static boolean isGetter(String name) { + return name.startsWith("get") || name.startsWith("is"); + } + + /** + * 判断是否为 set 方法 + * + * @param name 方法名 + * @return 是否 + */ + public static boolean isSetter(String name) { + return name.startsWith("set"); + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/property/PropertyTokenizer.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/property/PropertyTokenizer.java new file mode 100644 index 0000000..ab97dda --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/property/PropertyTokenizer.java @@ -0,0 +1,98 @@ +/** + * Copyright 2009-2017 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.reflection.property; + +import java.util.Iterator; + +/** + * 属性分词器 + * + * @author Clinton Begin + */ +public class PropertyTokenizer implements Iterator { + + /** + * 当前字符串 + */ + private String name; + /** + * 索引的 {@link #name} ,因为 {@link #name} 如果存在 {@link #index} 会被更改 + */ + private final String indexedName; + /** + * 编号。 + * + * 对于数组 name[0] ,则 index = 0 + * 对于 Map map[key] ,则 index = key + */ + private String index; + /** + * 剩余字符串 + */ + private final String children; + + public PropertyTokenizer(String fullname) { + // 初始化 name、children 字符串,使用 . 作为分隔 + int delim = fullname.indexOf('.'); + if (delim > -1) { + name = fullname.substring(0, delim); + children = fullname.substring(delim + 1); + } else { + name = fullname; + children = null; + } + // 记录当前 name + indexedName = name; + // 若存在 [ ,则获得 index ,并修改 name 。 + delim = name.indexOf('['); + if (delim > -1) { + index = name.substring(delim + 1, name.length() - 1); + name = name.substring(0, delim); + } + } + + public String getName() { + return name; + } + + public String getIndex() { + return index; + } + + public String getIndexedName() { + return indexedName; + } + + public String getChildren() { + return children; + } + + @Override + public boolean hasNext() { + return children != null; + } + + @Override + public PropertyTokenizer next() { + return new PropertyTokenizer(children); + } + + @Override + public void remove() { + throw new UnsupportedOperationException("Remove is not supported, as it has no meaning in the context of properties."); + } + +} diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/property/package-info.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/property/package-info.java new file mode 100644 index 0000000..fc1d743 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/property/package-info.java @@ -0,0 +1,19 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Tools for getting/setting properties + */ +package org.apache.ibatis.reflection.property; diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/wrapper/BaseWrapper.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/wrapper/BaseWrapper.java new file mode 100644 index 0000000..1074934 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/wrapper/BaseWrapper.java @@ -0,0 +1,134 @@ +/** + * Copyright 2009-2017 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.reflection.wrapper; + +import org.apache.ibatis.reflection.MetaObject; +import org.apache.ibatis.reflection.ReflectionException; +import org.apache.ibatis.reflection.property.PropertyTokenizer; + +import java.util.List; +import java.util.Map; + +/** + * ObjectWrapper 抽象类 + * + * @author Clinton Begin + */ +public abstract class BaseWrapper implements ObjectWrapper { + + protected static final Object[] NO_ARGUMENTS = new Object[0]; + + /** + * MetaObject 对象 + */ + protected final MetaObject metaObject; + + protected BaseWrapper(MetaObject metaObject) { + this.metaObject = metaObject; + } + + /** + * 获得指定属性的值 + * + * @param prop PropertyTokenizer 对象 + * @param object 指定 Object 对象 + * @return 值 + */ + protected Object resolveCollection(PropertyTokenizer prop, Object object) { + if ("".equals(prop.getName())) { + return object; + } else { + return metaObject.getValue(prop.getName()); + } + } + + /** + * 获得集合中指定位置的值 + * + * @param prop PropertyTokenizer 对象 + * @param collection 集合 + * @return 值 + */ + protected Object getCollectionValue(PropertyTokenizer prop, Object collection) { + if (collection instanceof Map) { + return ((Map) collection).get(prop.getIndex()); + } else { + int i = Integer.parseInt(prop.getIndex()); + if (collection instanceof List) { + return ((List) collection).get(i); + } else if (collection instanceof Object[]) { + return ((Object[]) collection)[i]; + } else if (collection instanceof char[]) { + return ((char[]) collection)[i]; + } else if (collection instanceof boolean[]) { + return ((boolean[]) collection)[i]; + } else if (collection instanceof byte[]) { + return ((byte[]) collection)[i]; + } else if (collection instanceof double[]) { + return ((double[]) collection)[i]; + } else if (collection instanceof float[]) { + return ((float[]) collection)[i]; + } else if (collection instanceof int[]) { + return ((int[]) collection)[i]; + } else if (collection instanceof long[]) { + return ((long[]) collection)[i]; + } else if (collection instanceof short[]) { + return ((short[]) collection)[i]; + } else { + throw new ReflectionException("The '" + prop.getName() + "' property of " + collection + " is not a List or Array."); + } + } + } + + /** + * 设置集合中指定位置的值 + * + * @param prop PropertyTokenizer 对象 + * @param collection 集合 + * @param value 值 + */ + protected void setCollectionValue(PropertyTokenizer prop, Object collection, Object value) { + if (collection instanceof Map) { + ((Map) collection).put(prop.getIndex(), value); + } else { + int i = Integer.parseInt(prop.getIndex()); + if (collection instanceof List) { + ((List) collection).set(i, value); + } else if (collection instanceof Object[]) { + ((Object[]) collection)[i] = value; + } else if (collection instanceof char[]) { + ((char[]) collection)[i] = (Character) value; + } else if (collection instanceof boolean[]) { + ((boolean[]) collection)[i] = (Boolean) value; + } else if (collection instanceof byte[]) { + ((byte[]) collection)[i] = (Byte) value; + } else if (collection instanceof double[]) { + ((double[]) collection)[i] = (Double) value; + } else if (collection instanceof float[]) { + ((float[]) collection)[i] = (Float) value; + } else if (collection instanceof int[]) { + ((int[]) collection)[i] = (Integer) value; + } else if (collection instanceof long[]) { + ((long[]) collection)[i] = (Long) value; + } else if (collection instanceof short[]) { + ((short[]) collection)[i] = (Short) value; + } else { + throw new ReflectionException("The '" + prop.getName() + "' property of " + collection + " is not a List or Array."); + } + } + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/wrapper/BeanWrapper.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/wrapper/BeanWrapper.java new file mode 100644 index 0000000..a74a6f0 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/wrapper/BeanWrapper.java @@ -0,0 +1,239 @@ +/** + * Copyright 2009-2017 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.reflection.wrapper; + +import org.apache.ibatis.reflection.*; +import org.apache.ibatis.reflection.factory.ObjectFactory; +import org.apache.ibatis.reflection.invoker.Invoker; +import org.apache.ibatis.reflection.property.PropertyTokenizer; + +import java.util.List; + +/** + * 普通对象的 ObjectWrapper 实现类 + * + * @author Clinton Begin + */ +public class BeanWrapper extends BaseWrapper { + + /** + * 普通对象 + */ + private final Object object; + private final MetaClass metaClass; + + public BeanWrapper(MetaObject metaObject, Object object) { + super(metaObject); + this.object = object; + // 创建 MetaClass 对象 + this.metaClass = MetaClass.forClass(object.getClass(), metaObject.getReflectorFactory()); + } + + @Override + public Object get(PropertyTokenizer prop) { + // 获得集合类型的属性的指定位置的值 + if (prop.getIndex() != null) { + // 获得集合类型的属性 + Object collection = resolveCollection(prop, object); + // 获得指定位置的值 + return getCollectionValue(prop, collection); + // 获得属性的值 + } else { + return getBeanProperty(prop, object); + } + } + + @Override + public void set(PropertyTokenizer prop, Object value) { + // 设置集合类型的属性的指定位置的值 + if (prop.getIndex() != null) { + // 获得集合类型的属性 + Object collection = resolveCollection(prop, object); + // 设置指定位置的值 + setCollectionValue(prop, collection, value); + // 设置属性的值 + } else { + setBeanProperty(prop, object, value); + } + } + + @Override + public String findProperty(String name, boolean useCamelCaseMapping) { + return metaClass.findProperty(name, useCamelCaseMapping); + } + + @Override + public String[] getGetterNames() { + return metaClass.getGetterNames(); + } + + @Override + public String[] getSetterNames() { + return metaClass.getSetterNames(); + } + + // 获得指定属性的 setting 方法的方法参数。 + @Override + public Class getSetterType(String name) { + PropertyTokenizer prop = new PropertyTokenizer(name); + if (prop.hasNext()) { + MetaObject metaValue = metaObject.metaObjectForProperty(prop.getIndexedName()); + if (metaValue == SystemMetaObject.NULL_META_OBJECT) { + return metaClass.getSetterType(name); + } else { + return metaValue.getSetterType(prop.getChildren()); + } + } else { + return metaClass.getSetterType(name); + } + } + + // 获得指定属性的 getting 方法的返回值。 + @Override + public Class getGetterType(String name) { + // 创建 PropertyTokenizer 对象,对 name 进行分词 + PropertyTokenizer prop = new PropertyTokenizer(name); + // 有子表达式 + if (prop.hasNext()) { + // 创建 MetaObject 对象 + MetaObject metaValue = metaObject.metaObjectForProperty(prop.getIndexedName()); + // 如果 metaValue 为空,则基于 metaClass 获得返回类型 + if (metaValue == SystemMetaObject.NULL_META_OBJECT) { + return metaClass.getGetterType(name); + // 如果 metaValue 非空,则基于 metaValue 获得返回类型。 + // 例如:richType.richMap.nihao ,其中 richMap 是 Map 类型,而 nihao 的类型,需要获得到 nihao 的具体值,才能做真正的判断。 + } else { + // 递归判断子表达式 children ,获得返回值的类型 + return metaValue.getGetterType(prop.getChildren()); + } + // 有子表达式 + } else { + // 直接获得返回值的类型 + return metaClass.getGetterType(name); + } + } + + @Override + public boolean hasSetter(String name) { + PropertyTokenizer prop = new PropertyTokenizer(name); + if (prop.hasNext()) { + if (metaClass.hasSetter(prop.getIndexedName())) { + MetaObject metaValue = metaObject.metaObjectForProperty(prop.getIndexedName()); + if (metaValue == SystemMetaObject.NULL_META_OBJECT) { + return metaClass.hasSetter(name); + } else { + return metaValue.hasSetter(prop.getChildren()); + } + } else { + return false; + } + } else { + return metaClass.hasSetter(name); + } + } + + // 是否有指定属性的 getting 方法 + @Override + public boolean hasGetter(String name) { + // 创建 PropertyTokenizer 对象,对 name 进行分词 + PropertyTokenizer prop = new PropertyTokenizer(name); + // 有子表达式 + if (prop.hasNext()) { + // 判断是否有该属性的 getting 方法 + if (metaClass.hasGetter(prop.getIndexedName())) { + // 创建 MetaObject 对象 + MetaObject metaValue = metaObject.metaObjectForProperty(prop.getIndexedName()); + // 如果 metaValue 为空,则基于 metaClass 判断是否有该属性的 getting 方法 + if (metaValue == SystemMetaObject.NULL_META_OBJECT) { + return metaClass.hasGetter(name); + // 如果 metaValue 非空,则基于 metaValue 判断是否有 getting 方法。 + } else { + // 递归判断子表达式 children ,判断是否有 getting 方法 + return metaValue.hasGetter(prop.getChildren()); + } + } else { + return false; + } + // 有子表达式 + } else { + // 判断是否有该属性的 getting 方法 + return metaClass.hasGetter(name); + } + } + + @Override + public MetaObject instantiatePropertyValue(String name, PropertyTokenizer prop, ObjectFactory objectFactory) { + MetaObject metaValue; + // 获得 setting 方法的方法参数类型 + Class type = getSetterType(prop.getName()); + try { + // 创建对象 + Object newObject = objectFactory.create(type); + // 创建 MetaObject 对象 + metaValue = MetaObject.forObject(newObject, metaObject.getObjectFactory(), metaObject.getObjectWrapperFactory(), metaObject.getReflectorFactory()); + // 设置当前对象的值 + set(prop, newObject); + } catch (Exception e) { + throw new ReflectionException("Cannot set value of property '" + name + "' because '" + name + "' is null and cannot be instantiated on instance of " + type.getName() + ". Cause:" + e.toString(), e); + } + return metaValue; + } + + private Object getBeanProperty(PropertyTokenizer prop, Object object) { + try { + Invoker method = metaClass.getGetInvoker(prop.getName()); + try { + return method.invoke(object, NO_ARGUMENTS); + } catch (Throwable t) { + throw ExceptionUtil.unwrapThrowable(t); + } + } catch (RuntimeException e) { + throw e; + } catch (Throwable t) { + throw new ReflectionException("Could not get property '" + prop.getName() + "' from " + object.getClass() + ". Cause: " + t.toString(), t); + } + } + + private void setBeanProperty(PropertyTokenizer prop, Object object, Object value) { + try { + Invoker method = metaClass.getSetInvoker(prop.getName()); + Object[] params = {value}; + try { + method.invoke(object, params); + } catch (Throwable t) { + throw ExceptionUtil.unwrapThrowable(t); + } + } catch (Throwable t) { + throw new ReflectionException("Could not set property '" + prop.getName() + "' of '" + object.getClass() + "' with value '" + value + "' Cause: " + t.toString(), t); + } + } + + @Override + public boolean isCollection() { + return false; + } + + @Override + public void add(Object element) { + throw new UnsupportedOperationException(); + } + + @Override + public void addAll(List list) { + throw new UnsupportedOperationException(); + } + +} diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/wrapper/CollectionWrapper.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/wrapper/CollectionWrapper.java new file mode 100644 index 0000000..f68550d --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/wrapper/CollectionWrapper.java @@ -0,0 +1,103 @@ +/** + * Copyright 2009-2017 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.reflection.wrapper; + +import org.apache.ibatis.reflection.MetaObject; +import org.apache.ibatis.reflection.factory.ObjectFactory; +import org.apache.ibatis.reflection.property.PropertyTokenizer; + +import java.util.Collection; +import java.util.List; + +/** + * 集合 ObjectWrapper 实现类 + * + * @author Clinton Begin + */ +public class CollectionWrapper implements ObjectWrapper { + + private final Collection object; + + public CollectionWrapper(MetaObject metaObject, Collection object) { + this.object = object; + } + + @Override + public Object get(PropertyTokenizer prop) { + throw new UnsupportedOperationException(); + } + + @Override + public void set(PropertyTokenizer prop, Object value) { + throw new UnsupportedOperationException(); + } + + @Override + public String findProperty(String name, boolean useCamelCaseMapping) { + throw new UnsupportedOperationException(); + } + + @Override + public String[] getGetterNames() { + throw new UnsupportedOperationException(); + } + + @Override + public String[] getSetterNames() { + throw new UnsupportedOperationException(); + } + + @Override + public Class getSetterType(String name) { + throw new UnsupportedOperationException(); + } + + @Override + public Class getGetterType(String name) { + throw new UnsupportedOperationException(); + } + + @Override + public boolean hasSetter(String name) { + throw new UnsupportedOperationException(); + } + + @Override + public boolean hasGetter(String name) { + throw new UnsupportedOperationException(); + } + + @Override + public MetaObject instantiatePropertyValue(String name, PropertyTokenizer prop, ObjectFactory objectFactory) { + throw new UnsupportedOperationException(); + } + + @Override + public boolean isCollection() { + return true; + } + + @Override + public void add(Object element) { + object.add(element); + } + + @Override + public void addAll(List element) { + object.addAll(element); + } + +} diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/wrapper/DefaultObjectWrapperFactory.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/wrapper/DefaultObjectWrapperFactory.java new file mode 100644 index 0000000..ed83388 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/wrapper/DefaultObjectWrapperFactory.java @@ -0,0 +1,38 @@ +/** + * Copyright 2009-2015 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.reflection.wrapper; + +import org.apache.ibatis.reflection.MetaObject; +import org.apache.ibatis.reflection.ReflectionException; + +/** + * 默认 ObjectWrapperFactory 实现类 + * + * @author Clinton Begin + */ +public class DefaultObjectWrapperFactory implements ObjectWrapperFactory { + + @Override + public boolean hasWrapperFor(Object object) { + return false; + } + + @Override + public ObjectWrapper getWrapperFor(MetaObject metaObject, Object object) { + throw new ReflectionException("The DefaultObjectWrapperFactory should never be called to provide an ObjectWrapper."); + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/wrapper/MapWrapper.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/wrapper/MapWrapper.java new file mode 100644 index 0000000..f3c4bbe --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/wrapper/MapWrapper.java @@ -0,0 +1,160 @@ +/** + * Copyright 2009-2018 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.reflection.wrapper; + +import org.apache.ibatis.reflection.MetaObject; +import org.apache.ibatis.reflection.SystemMetaObject; +import org.apache.ibatis.reflection.factory.ObjectFactory; +import org.apache.ibatis.reflection.property.PropertyTokenizer; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Map 对象的 ObjectWrapper 实现类 + * + * @author Clinton Begin + */ +public class MapWrapper extends BaseWrapper { + + private final Map map; + + public MapWrapper(MetaObject metaObject, Map map) { + super(metaObject); + this.map = map; + } + + @Override + public Object get(PropertyTokenizer prop) { + if (prop.getIndex() != null) { + Object collection = resolveCollection(prop, map); + return getCollectionValue(prop, collection); + } else { + return map.get(prop.getName()); + } + } + + @Override + public void set(PropertyTokenizer prop, Object value) { + if (prop.getIndex() != null) { + Object collection = resolveCollection(prop, map); + setCollectionValue(prop, collection, value); + } else { + map.put(prop.getName(), value); + } + } + + @Override + public String findProperty(String name, boolean useCamelCaseMapping) { + return name; + } + + @Override + public String[] getGetterNames() { + return map.keySet().toArray(new String[map.keySet().size()]); + } + + @Override + public String[] getSetterNames() { + return map.keySet().toArray(new String[map.keySet().size()]); + } + + @Override + public Class getSetterType(String name) { + PropertyTokenizer prop = new PropertyTokenizer(name); + if (prop.hasNext()) { + MetaObject metaValue = metaObject.metaObjectForProperty(prop.getIndexedName()); + if (metaValue == SystemMetaObject.NULL_META_OBJECT) { + return Object.class; + } else { + return metaValue.getSetterType(prop.getChildren()); + } + } else { + if (map.get(name) != null) { + return map.get(name).getClass(); + } else { + return Object.class; + } + } + } + + @Override + public Class getGetterType(String name) { + PropertyTokenizer prop = new PropertyTokenizer(name); + if (prop.hasNext()) { + MetaObject metaValue = metaObject.metaObjectForProperty(prop.getIndexedName()); + if (metaValue == SystemMetaObject.NULL_META_OBJECT) { + return Object.class; + } else { + return metaValue.getGetterType(prop.getChildren()); + } + } else { + if (map.get(name) != null) { + return map.get(name).getClass(); + } else { + return Object.class; + } + } + } + + @Override + public boolean hasSetter(String name) { + return true; + } + + @Override + public boolean hasGetter(String name) { + PropertyTokenizer prop = new PropertyTokenizer(name); + if (prop.hasNext()) { + if (map.containsKey(prop.getIndexedName())) { + MetaObject metaValue = metaObject.metaObjectForProperty(prop.getIndexedName()); + if (metaValue == SystemMetaObject.NULL_META_OBJECT) { + return true; + } else { + return metaValue.hasGetter(prop.getChildren()); + } + } else { + return false; + } + } else { + return map.containsKey(prop.getName()); + } + } + + @Override + public MetaObject instantiatePropertyValue(String name, PropertyTokenizer prop, ObjectFactory objectFactory) { + HashMap map = new HashMap<>(); + set(prop, map); + return MetaObject.forObject(map, metaObject.getObjectFactory(), metaObject.getObjectWrapperFactory(), metaObject.getReflectorFactory()); + } + + @Override + public boolean isCollection() { + return false; + } + + @Override + public void add(Object element) { + throw new UnsupportedOperationException(); + } + + @Override + public void addAll(List element) { + throw new UnsupportedOperationException(); + } + +} diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/wrapper/ObjectWrapper.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/wrapper/ObjectWrapper.java new file mode 100644 index 0000000..51c3199 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/wrapper/ObjectWrapper.java @@ -0,0 +1,104 @@ +/** + * Copyright 2009-2015 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.reflection.wrapper; + +import org.apache.ibatis.reflection.MetaClass; +import org.apache.ibatis.reflection.MetaObject; +import org.apache.ibatis.reflection.ReflectorFactory; +import org.apache.ibatis.reflection.factory.ObjectFactory; +import org.apache.ibatis.reflection.property.PropertyTokenizer; + +import java.util.List; + +/** + * 对象包装器接口,基于 {@link org.apache.ibatis.reflection.MetaClass} 工具类,定义对指定对象的各种操作。 + * + * @author Clinton Begin + */ +public interface ObjectWrapper { + + /** + * 获得值 + * + * @param prop PropertyTokenizer 对象,相当于键 + * @return 值 + */ + Object get(PropertyTokenizer prop); + + /** + * 设置值 + * + * @param prop PropertyTokenizer 对象,相当于键 + * @param value 值 + */ + void set(PropertyTokenizer prop, Object value); + + /** + * {@link MetaClass#findProperty(String, boolean)} + */ + String findProperty(String name, boolean useCamelCaseMapping); + + /** + * {@link MetaClass#getGetterNames()} + */ + String[] getGetterNames(); + + /** + * {@link MetaClass#getSetterNames()} + */ + String[] getSetterNames(); + + /** + * {@link MetaClass#getSetterType(String)} + */ + Class getSetterType(String name); + + /** + * {@link MetaClass#getGetterType(String)} + */ + Class getGetterType(String name); + + /** + * {@link MetaClass#hasSetter(String)} + */ + boolean hasSetter(String name); + + /** + * {@link MetaClass#hasGetter(String)} + */ + boolean hasGetter(String name); + + /** + * {@link MetaObject#forObject(Object, ObjectFactory, ObjectWrapperFactory, ReflectorFactory)} + */ + MetaObject instantiatePropertyValue(String name, PropertyTokenizer prop, ObjectFactory objectFactory); + + /** + * 是否为集合 + */ + boolean isCollection(); + + /** + * 添加元素到集合 + */ + void add(Object element); + + /** + * 添加多个元素到集合 + */ + void addAll(List element); + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/wrapper/ObjectWrapperFactory.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/wrapper/ObjectWrapperFactory.java new file mode 100644 index 0000000..97e8603 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/wrapper/ObjectWrapperFactory.java @@ -0,0 +1,44 @@ +/** + * Copyright 2009-2016 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.reflection.wrapper; + +import org.apache.ibatis.reflection.MetaObject; + +/** + * {@link ObjectWrapper} 工厂接口 + * + * @author Clinton Begin + */ +public interface ObjectWrapperFactory { + + /** + * 是否包装了指定对象 + * + * @param object 指定对象 + * @return 是否 + */ + boolean hasWrapperFor(Object object); + + /** + * 获得指定对象的 ObjectWrapper 对象 + * + * @param metaObject MetaObject 对象 + * @param object 指定对象 + * @return ObjectWrapper 对象 + */ + ObjectWrapper getWrapperFor(MetaObject metaObject, Object object); + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/wrapper/package-info.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/wrapper/package-info.java new file mode 100644 index 0000000..c0c7256 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/reflection/wrapper/package-info.java @@ -0,0 +1,19 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Object wrappers. + */ +package org.apache.ibatis.reflection.wrapper; diff --git a/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/scripting/LanguageDriver.java b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/scripting/LanguageDriver.java new file mode 100644 index 0000000..94b77e8 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/main/java/org/apache/ibatis/scripting/LanguageDriver.java @@ -0,0 +1,71 @@ +/** + * Copyright 2009-2016 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.scripting; + +import org.apache.ibatis.executor.parameter.ParameterHandler; +import org.apache.ibatis.mapping.BoundSql; +import org.apache.ibatis.mapping.MappedStatement; +import org.apache.ibatis.mapping.SqlSource; +import org.apache.ibatis.parsing.XNode; +import org.apache.ibatis.scripting.defaults.DefaultParameterHandler; +import org.apache.ibatis.session.Configuration; + +/** + * 语言驱动接口 + */ +public interface LanguageDriver { + + /** + * Creates a {@link ParameterHandler} that passes the actual parameters to the the JDBC statement. + * + * 创建 ParameterHandler 对象。 + * + * @param mappedStatement The mapped statement that is being executed + * @param parameterObject The input parameter object (can be null) + * @param boundSql The resulting SQL once the dynamic language has been executed. + * @return + * @author Frank D. Martinez [mnesarco] + * @see DefaultParameterHandler + */ + ParameterHandler createParameterHandler(MappedStatement mappedStatement, Object parameterObject, BoundSql boundSql); + + /** + * Creates an {@link SqlSource} that will hold the statement read from a mapper xml file. + * It is called during startup, when the mapped statement is read from a class or an xml file. + * + * 创建 SqlSource 对象,从 Mapper XML 配置的 Statement 标签中,即 + SELECT firstName #if($_parameter.includeLastName), lastName#end + FROM names + WHERE lastName LIKE @{name} + + + + + + + + + + + + FROM names + + + + + + + + + + + \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/language/MapperConfig.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/language/MapperConfig.xml new file mode 100644 index 0000000..a407860 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/language/MapperConfig.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/language/Name.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/language/Name.java new file mode 100644 index 0000000..ad5ceab --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/language/Name.java @@ -0,0 +1,49 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.language; + +public class Name { + + private int id; + private String firstName; + private String lastName; + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/language/Parameter.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/language/Parameter.java new file mode 100644 index 0000000..3721851 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/language/Parameter.java @@ -0,0 +1,37 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.language; + +public class Parameter { + + private final boolean includeLastName; + + private final String name; + + public Parameter(boolean includeLastName, String name) { + this.includeLastName = includeLastName; + this.name = name; + } + + public boolean isIncludeLastName() { + return includeLastName; + } + + public String getName() { + return name; + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/language/VelocityLanguageDriver.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/language/VelocityLanguageDriver.java new file mode 100644 index 0000000..e69de29 diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/language/VelocitySqlSource.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/language/VelocitySqlSource.java new file mode 100644 index 0000000..e69de29 diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/language/VelocitySqlSourceBuilder.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/language/VelocitySqlSourceBuilder.java new file mode 100644 index 0000000..545419a --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/language/VelocitySqlSourceBuilder.java @@ -0,0 +1,140 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.language; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.ibatis.builder.BaseBuilder; +import org.apache.ibatis.builder.BuilderException; +import org.apache.ibatis.builder.ParameterExpression; +import org.apache.ibatis.builder.StaticSqlSource; +import org.apache.ibatis.mapping.ParameterMapping; +import org.apache.ibatis.mapping.SqlSource; +import org.apache.ibatis.parsing.GenericTokenParser; +import org.apache.ibatis.parsing.TokenHandler; +import org.apache.ibatis.reflection.MetaClass; +import org.apache.ibatis.session.Configuration; +import org.apache.ibatis.type.JdbcType; + +/** + * Just a test case. Not a real Velocity implementation. + */ +public class VelocitySqlSourceBuilder extends BaseBuilder { + + private static final String parameterProperties = "javaType,jdbcType,mode,numericScale,resultMap,typeHandler,jdbcTypeName"; + + public VelocitySqlSourceBuilder(Configuration configuration) { + super(configuration); + } + + public SqlSource parse(String originalSql, Class parameterType) { + ParameterMappingTokenHandler handler = new ParameterMappingTokenHandler(configuration, parameterType); + GenericTokenParser parser = new GenericTokenParser("@{", "}", handler); + String sql = parser.parse(originalSql); + return new StaticSqlSource(configuration, sql, handler.getParameterMappings()); + } + + private static class ParameterMappingTokenHandler extends BaseBuilder implements TokenHandler { + + private List parameterMappings = new ArrayList(); + private Class parameterType; + + public ParameterMappingTokenHandler(Configuration configuration, Class parameterType) { + super(configuration); + this.parameterType = parameterType; + } + + public List getParameterMappings() { + return parameterMappings; + } + + @Override + public String handleToken(String content) { + parameterMappings.add(buildParameterMapping(content)); + return "?"; + } + + private ParameterMapping buildParameterMapping(String content) { + Map propertiesMap = parseParameterMapping(content); + String property = propertiesMap.get("property"); + String jdbcType = propertiesMap.get("jdbcType"); + Class propertyType; + if (typeHandlerRegistry.hasTypeHandler(parameterType)) { + propertyType = parameterType; + } else if (JdbcType.CURSOR.name().equals(jdbcType)) { + propertyType = java.sql.ResultSet.class; + } else if (property != null) { + MetaClass metaClass = MetaClass.forClass(parameterType, configuration.getReflectorFactory()); + if (metaClass.hasGetter(property)) { + propertyType = metaClass.getGetterType(property); + } else { + propertyType = Object.class; + } + } else { + propertyType = Object.class; + } + ParameterMapping.Builder builder = new ParameterMapping.Builder(configuration, property, propertyType); + if (jdbcType != null) { + builder.jdbcType(resolveJdbcType(jdbcType)); + } + Class javaType = null; + String typeHandlerAlias = null; + for (Map.Entry entry : propertiesMap.entrySet()) { + String name = entry.getKey(); + String value = entry.getValue(); + if ("javaType".equals(name)) { + javaType = resolveClass(value); + builder.javaType(javaType); + } else if ("jdbcType".equals(name)) { + builder.jdbcType(resolveJdbcType(value)); + } else if ("mode".equals(name)) { + builder.mode(resolveParameterMode(value)); + } else if ("numericScale".equals(name)) { + builder.numericScale(Integer.valueOf(value)); + } else if ("resultMap".equals(name)) { + builder.resultMapId(value); + } else if ("typeHandler".equals(name)) { + typeHandlerAlias = value; + } else if ("jdbcTypeName".equals(name)) { + builder.jdbcTypeName(value); + } else if ("property".equals(name)) { + // Do Nothing + } else if ("expression".equals(name)) { + builder.expression(value); + } else { + throw new BuilderException("An invalid property '" + name + "' was found in mapping @{" + content + "}. Valid properties are " + parameterProperties); + } + } + if (typeHandlerAlias != null) { + builder.typeHandler(resolveTypeHandler(javaType, typeHandlerAlias)); + } + return builder.build(); + } + + private Map parseParameterMapping(String content) { + try { + return new ParameterExpression(content); + } catch (BuilderException ex) { + throw ex; + } catch (Exception ex) { + throw new BuilderException("Parsing error was found in mapping @{" + content + "}. Check syntax #{property|(expression), var1=value1, var2=value2, ...} ", ex); + } + } + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_deserialize/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_deserialize/CreateDB.sql new file mode 100644 index 0000000..81f44bf --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_deserialize/CreateDB.sql @@ -0,0 +1,29 @@ +-- +-- Copyright 2009-2016 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +CREATE TABLE table_foo ( + id INTEGER PRIMARY KEY, + id_bar INTEGER NOT NULL); + +CREATE TABLE table_bar ( + id INTEGER PRIMARY KEY); + +ALTER TABLE table_foo ADD CONSTRAINT bar_fk +FOREIGN KEY (id_bar) REFERENCES table_bar (id) +ON UPDATE CASCADE ON DELETE RESTRICT; + +INSERT INTO table_bar (id) VALUES (10); +INSERT INTO table_foo (id, id_bar) VALUES (1, 10); diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_deserialize/LazyDeserializeTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_deserialize/LazyDeserializeTest.java new file mode 100644 index 0000000..3bbd1ed --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_deserialize/LazyDeserializeTest.java @@ -0,0 +1,110 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.lazy_deserialize; + +import static org.junit.Assert.*; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.Reader; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.executor.ExecutorException; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.Configuration; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.Before; +import org.junit.Test; + +/** + * + * @since 2011-04-06T10:58:55+0200 + * @author Franta Mejta + */ +public final class LazyDeserializeTest { + + private static final int FOO_ID = 1; + private static final int BAR_ID = 10; + private static SqlSessionFactory factory; + + public static Configuration getConfiguration() { + return factory.getConfiguration(); + } + + @Before + public void setupClass() throws Exception { + try (Reader reader = Resources + .getResourceAsReader("org/apache/ibatis/submitted/lazy_deserialize/ibatisConfig.xml")) { + factory = new SqlSessionFactoryBuilder().build(reader); + } + + BaseDataTest.runScript(factory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/lazy_deserialize/CreateDB.sql"); + } + + @Test + public void testLoadLazyDeserialize() throws Exception { + factory.getConfiguration().setConfigurationFactory(this.getClass()); + try (SqlSession session = factory.openSession()) { + final Mapper mapper = session.getMapper(Mapper.class); + final LazyObjectFoo foo = mapper.loadFoo(FOO_ID); + + final byte[] serializedFoo = this.serializeFoo(foo); + final LazyObjectFoo deserializedFoo = this.deserializeFoo(serializedFoo); + + assertNotNull(deserializedFoo); + assertEquals(Integer.valueOf(FOO_ID), deserializedFoo.getId()); + assertNotNull(deserializedFoo.getLazyObjectBar()); + assertEquals(Integer.valueOf(BAR_ID), deserializedFoo.getLazyObjectBar().getId()); + } + } + + @Test + public void testLoadLazyDeserializeWithoutConfigurationFactory() throws Exception { + try (SqlSession session = factory.openSession()) { + final Mapper mapper = session.getMapper(Mapper.class); + final LazyObjectFoo foo = mapper.loadFoo(FOO_ID); + final byte[] serializedFoo = this.serializeFoo(foo); + final LazyObjectFoo deserializedFoo = this.deserializeFoo(serializedFoo); + try { + deserializedFoo.getLazyObjectBar(); + fail(); + } catch (ExecutorException e) { + assertTrue(e.getMessage().contains("Cannot get Configuration as configuration factory was not set.")); + } + } + } + + private byte[] serializeFoo(final LazyObjectFoo foo) throws Exception { + try (ByteArrayOutputStream bos = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(bos)) { + oos.writeObject(foo); + return bos.toByteArray(); + } + } + + private LazyObjectFoo deserializeFoo(final byte[] serializedFoo) throws Exception { + try (ByteArrayInputStream bis = new ByteArrayInputStream(serializedFoo); + ObjectInputStream ios = new ObjectInputStream(bis)) { + return LazyObjectFoo.class.cast(ios.readObject()); + } + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_deserialize/LazyObjectBar.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_deserialize/LazyObjectBar.java new file mode 100644 index 0000000..ca6e839 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_deserialize/LazyObjectBar.java @@ -0,0 +1,37 @@ +/** + * Copyright 2009-2017 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.lazy_deserialize; + +import java.io.Serializable; + +/** + * @since 2011-04-06T10:57:41+0200 + * @author Franta Mejta + */ +public class LazyObjectBar implements Serializable { + + private static final long serialVersionUID = 1L; + private Integer id; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_deserialize/LazyObjectFoo.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_deserialize/LazyObjectFoo.java new file mode 100644 index 0000000..1c9b0c0 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_deserialize/LazyObjectFoo.java @@ -0,0 +1,46 @@ +/** + * Copyright 2009-2017 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.lazy_deserialize; + +import java.io.Serializable; + +/** + * @since 2011-04-06T10:57:30+0200 + * @author Franta Mejta + */ +public class LazyObjectFoo implements Serializable { + + private static final long serialVersionUID = 1L; + private Integer id; + private LazyObjectBar lazyObjectBar; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public LazyObjectBar getLazyObjectBar() { + return this.lazyObjectBar; + } + + public void setLazyObjectBar(final LazyObjectBar lazyObjectBar) { + this.lazyObjectBar = lazyObjectBar; + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_deserialize/Mapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_deserialize/Mapper.java new file mode 100644 index 0000000..4f1ccb5 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_deserialize/Mapper.java @@ -0,0 +1,27 @@ +/** + * Copyright 2009-2017 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.lazy_deserialize; + +import org.apache.ibatis.annotations.Param; + +/** + * @since 2011-04-06T11:00:30+0200 + * @author Franta Mejta + */ +public interface Mapper { + + LazyObjectFoo loadFoo(@Param("fooId") int fooId); +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_deserialize/Mapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_deserialize/Mapper.xml new file mode 100644 index 0000000..4879480 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_deserialize/Mapper.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_deserialize/ibatisConfig.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_deserialize/ibatisConfig.xml new file mode 100644 index 0000000..2db41dd --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_deserialize/ibatisConfig.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_immutable/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_immutable/CreateDB.sql new file mode 100644 index 0000000..246ffef --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_immutable/CreateDB.sql @@ -0,0 +1,23 @@ +-- +-- Copyright 2009-2016 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +CREATE TABLE immutables ( + id INTEGER PRIMARY KEY, + description VARCHAR (30) NOT NULL +); + +INSERT INTO immutables (id, description) VALUES (1, 'Description of immutable'); +INSERT INTO immutables (id, description) VALUES (2, 'Another immutable'); \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_immutable/ImmutablePOJO.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_immutable/ImmutablePOJO.java new file mode 100644 index 0000000..ee2205f --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_immutable/ImmutablePOJO.java @@ -0,0 +1,39 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.lazy_immutable; + +import java.io.Serializable; + +public class ImmutablePOJO implements Serializable { + + private static final long serialVersionUID = -7086198701202598455L; + private final Integer id; + private final String description; + + public ImmutablePOJO(Integer id, String description) { + this.id = id; + this.description = description; + } + + public String getDescription() { + return description; + } + + public Integer getId() { + return id; + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_immutable/ImmutablePOJOMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_immutable/ImmutablePOJOMapper.java new file mode 100644 index 0000000..ff92022 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_immutable/ImmutablePOJOMapper.java @@ -0,0 +1,24 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.lazy_immutable; + +import org.apache.ibatis.annotations.Param; + +public interface ImmutablePOJOMapper { + + public ImmutablePOJO getImmutablePOJO(@Param("pojoID") Integer pojoID); + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_immutable/ImmutablePOJOMapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_immutable/ImmutablePOJOMapper.xml new file mode 100644 index 0000000..43c3803 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_immutable/ImmutablePOJOMapper.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_immutable/ImmutablePOJOTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_immutable/ImmutablePOJOTest.java new file mode 100644 index 0000000..02a201a --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_immutable/ImmutablePOJOTest.java @@ -0,0 +1,62 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.lazy_immutable; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.jdbc.ScriptRunner; + +import java.io.PrintWriter; +import java.io.Reader; +import java.sql.Connection; +import java.sql.DriverManager; + +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.junit.BeforeClass; +import org.junit.Test; + +import static org.junit.Assert.*; + +public final class ImmutablePOJOTest { + + private static final Integer POJO_ID = 1; + private static SqlSessionFactory factory; + + @BeforeClass + public static void setupClass() throws Exception { + try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/lazy_immutable/ibatisConfig.xml")) { + factory = new SqlSessionFactoryBuilder().build(reader); + } + + BaseDataTest.runScript(factory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/lazy_immutable/CreateDB.sql"); + } + + @Test + public void testLoadLazyImmutablePOJO() { + try (SqlSession session = factory.openSession()) { + final ImmutablePOJOMapper mapper = session.getMapper(ImmutablePOJOMapper.class); + final ImmutablePOJO pojo = mapper.getImmutablePOJO(POJO_ID); + + assertEquals(POJO_ID, pojo.getId()); + assertNotNull("Description should not be null.", pojo.getDescription()); + assertFalse("Description should not be empty.", pojo.getDescription().length() == 0); + } + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_immutable/ibatisConfig.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_immutable/ibatisConfig.xml new file mode 100644 index 0000000..3feba7b --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_immutable/ibatisConfig.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_properties/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_properties/CreateDB.sql new file mode 100644 index 0000000..2354824 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_properties/CreateDB.sql @@ -0,0 +1,24 @@ +-- +-- Copyright 2009-2016 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +drop table users if exists; + +create table users ( + id int, + name varchar(20) +); + +insert into users (id, name) values(1, 'User1'); diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_properties/LazyPropertiesTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_properties/LazyPropertiesTest.java new file mode 100644 index 0000000..6fdf2bc --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_properties/LazyPropertiesTest.java @@ -0,0 +1,181 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.lazy_properties; + +import static org.junit.Assert.*; + +import java.io.Reader; +import java.util.Collections; +import java.util.HashSet; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.executor.loader.ProxyFactory; +import org.apache.ibatis.executor.loader.cglib.CglibProxyFactory; +import org.apache.ibatis.executor.loader.javassist.JavassistProxyFactory; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.Configuration; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.Before; +import org.junit.Test; + +public class LazyPropertiesTest { + + private static SqlSessionFactory sqlSessionFactory; + + @Before + public void setUp() throws Exception { + // create an SqlSessionFactory + try (Reader reader = Resources + .getResourceAsReader("org/apache/ibatis/submitted/lazy_properties/mybatis-config.xml")) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + } + + // populate in-memory database + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/lazy_properties/CreateDB.sql"); + } + + @Test + public void shouldLoadOnlyTheInvokedLazyProperty() { + sqlSessionFactory.getConfiguration().setAggressiveLazyLoading(false); + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + User user = mapper.getUser(1); + assertEquals(0, user.setterCounter); + assertNotNull(user.getLazy1()); + assertEquals("Should NOT load other lazy properties.", 1, user.setterCounter); + } + } + + @Test + public void verifyAggressiveLazyLoadingBehavior() { + sqlSessionFactory.getConfiguration().setAggressiveLazyLoading(true); + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + User user = mapper.getUser(1); + // Setter invocation by MyBatis triggers aggressive lazy-loading. + assertEquals("Should load all lazy properties.", 3, + user.setterCounter); + } + } + + @Test + public void shouldToStringTriggerLazyLoading() { + sqlSessionFactory.getConfiguration().setAggressiveLazyLoading(false); + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + User user = mapper.getUser(1); + user.toString(); + assertEquals(3, user.setterCounter); + } + } + + @Test + public void shouldHashCodeTriggerLazyLoading() { + sqlSessionFactory.getConfiguration().setAggressiveLazyLoading(false); + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + User user = mapper.getUser(1); + user.hashCode(); + assertEquals(3, user.setterCounter); + } + } + + @Test + public void shouldEqualsTriggerLazyLoading() { + sqlSessionFactory.getConfiguration().setAggressiveLazyLoading(false); + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + User user = mapper.getUser(1); + user.equals(null); + assertEquals(3, user.setterCounter); + } + } + + @Test + public void shouldCloneTriggerLazyLoading() { + sqlSessionFactory.getConfiguration().setAggressiveLazyLoading(false); + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + User user = mapper.getUser(1); + user.clone(); + assertEquals(3, user.setterCounter); + } + } + + @Test + public void verifyEmptyLazyLoadTriggerMethods() { + Configuration configuration = sqlSessionFactory.getConfiguration(); + configuration.setAggressiveLazyLoading(false); + configuration.setLazyLoadTriggerMethods(new HashSet()); + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + User user = mapper.getUser(1); + user.toString(); + user.hashCode(); + user.equals(null); + user.clone(); + assertEquals(0, user.setterCounter); + } + } + + @Test + public void verifyCustomLazyLoadTriggerMethods() { + Configuration configuration = sqlSessionFactory.getConfiguration(); + configuration.setAggressiveLazyLoading(false); + configuration + .setLazyLoadTriggerMethods(new HashSet(Collections.singleton("trigger"))); + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + User user = mapper.getUser(1); + user.toString(); + user.hashCode(); + user.equals(null); + user.clone(); + assertEquals(0, user.setterCounter); + user.trigger(); + assertEquals(3, user.setterCounter); + } + } + + @Test + public void shouldInvokingSetterInvalidateLazyLoading_Javassist() { + shoulInvokingSetterInvalidateLazyLoading(new JavassistProxyFactory()); + } + + @Test + public void shouldInvokingSetterInvalidateLazyLoading_Cglib() { + shoulInvokingSetterInvalidateLazyLoading(new CglibProxyFactory()); + } + + private void shoulInvokingSetterInvalidateLazyLoading(ProxyFactory proxyFactory) { + Configuration config = sqlSessionFactory.getConfiguration(); + config.setProxyFactory(proxyFactory); + config.setAggressiveLazyLoading(false); + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + User user = mapper.getUser(1); + User u2 = new User(); + u2.setId(99); + user.setLazy1(u2); + assertEquals(1, user.setterCounter); + assertEquals(Integer.valueOf(99), user.getLazy1().getId()); + assertEquals(1, user.setterCounter); + } + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_properties/Mapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_properties/Mapper.java new file mode 100644 index 0000000..e0c5e63 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_properties/Mapper.java @@ -0,0 +1,37 @@ +/** + * Copyright 2009-2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.lazy_properties; + +import java.util.List; + +import org.apache.ibatis.annotations.ResultMap; +import org.apache.ibatis.annotations.Select; + +public interface Mapper { + User getUser(Integer id); + + @ResultMap("user") + @Select("select 11 id, 'lazy1' name from (values(0))") + User getLazy1(); + + @ResultMap("user") + @Select("select 12 id, 'lazy2' name from (values(0))") + User getLazy2(); + + @ResultMap("user") + @Select("select 13 id, 'lazy3' name from (values(0))") + List getLazy3(); +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_properties/Mapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_properties/Mapper.xml new file mode 100644 index 0000000..09a6bf5 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_properties/Mapper.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_properties/User.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_properties/User.java new file mode 100644 index 0000000..017fe62 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_properties/User.java @@ -0,0 +1,79 @@ +/** + * Copyright 2009-2017 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.lazy_properties; + +import java.util.List; + +public class User implements Cloneable { + private Integer id; + private String name; + private User lazy1; + private User lazy2; + private List lazy3; + public int setterCounter; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public User getLazy1() { + return lazy1; + } + + public void setLazy1(User lazy1) { + setterCounter++; + this.lazy1 = lazy1; + } + + public User getLazy2() { + return lazy2; + } + + public void setLazy2(User lazy2) { + setterCounter++; + this.lazy2 = lazy2; + } + + public List getLazy3() { + return lazy3; + } + + public void setLazy3(List lazy3) { + setterCounter++; + this.lazy3 = lazy3; + } + + public void trigger() { + // nop + } + + @Override + public Object clone() { + return new User(); + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_properties/mybatis-config.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_properties/mybatis-config.xml new file mode 100644 index 0000000..8c681ea --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazy_properties/mybatis-config.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_common_property/Child.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_common_property/Child.java new file mode 100644 index 0000000..cb7fee2 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_common_property/Child.java @@ -0,0 +1,47 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.lazyload_common_property; + +public class Child { + private Integer id; + private String name; + private Father father; + private GrandFather grandFather; + public Integer getId() { + return id; + } + public void setId(Integer id) { + this.id = id; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public Father getFather() { + return father; + } + public void setFather(Father father) { + this.father = father; + } + public GrandFather getGrandFather() { + return grandFather; + } + public void setGrandFather(GrandFather grandFather) { + this.grandFather = grandFather; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_common_property/ChildMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_common_property/ChildMapper.java new file mode 100644 index 0000000..b75e45e --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_common_property/ChildMapper.java @@ -0,0 +1,20 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.lazyload_common_property; + +public interface ChildMapper { + public Child selectById(Integer id); +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_common_property/ChildMapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_common_property/ChildMapper.xml new file mode 100644 index 0000000..5e79a97 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_common_property/ChildMapper.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_common_property/CommonPropertyLazyLoadError.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_common_property/CommonPropertyLazyLoadError.java new file mode 100644 index 0000000..50661f8 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_common_property/CommonPropertyLazyLoadError.java @@ -0,0 +1,82 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.lazyload_common_property; + +import java.io.Reader; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.BeforeClass; +import org.junit.Test; + +public class CommonPropertyLazyLoadError { + + private static SqlSessionFactory sqlSessionFactory; + + @BeforeClass + public static void initDatabase() throws Exception { + try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/lazyload_common_property/ibatisConfig.xml")) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + } + + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/lazyload_common_property/CreateDB.sql"); + } + + @Test + public void testLazyLoadWithNoAncestor() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + ChildMapper childMapper = sqlSession.getMapper(ChildMapper.class); + + childMapper.selectById(1); + } + } + @Test + public void testLazyLoadWithFirstAncestor() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + FatherMapper fatherMapper = sqlSession.getMapper(FatherMapper.class); + ChildMapper childMapper = sqlSession.getMapper(ChildMapper.class); + + fatherMapper.selectById(1); + childMapper.selectById(1); + } + } + @Test + public void testLazyLoadWithAllAncestors() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + GrandFatherMapper grandFatherMapper = sqlSession.getMapper(GrandFatherMapper.class); + FatherMapper fatherMapper = sqlSession.getMapper(FatherMapper.class); + ChildMapper childMapper = sqlSession.getMapper(ChildMapper.class); + + grandFatherMapper.selectById(1); + fatherMapper.selectById(1); + childMapper.selectById(1); + } + } + @Test + public void testLazyLoadSkipFirstAncestor() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + GrandFatherMapper grandFatherMapper = sqlSession.getMapper(GrandFatherMapper.class); + ChildMapper childMapper = sqlSession.getMapper(ChildMapper.class); + + grandFatherMapper.selectById(1); + childMapper.selectById(1); + } + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_common_property/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_common_property/CreateDB.sql new file mode 100644 index 0000000..06f4b72 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_common_property/CreateDB.sql @@ -0,0 +1,40 @@ +-- +-- Copyright 2009-2016 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +create table Child ( + id int, + name varchar(100), + father_id int, + grand_father_id int +); +create table Father ( + id int, + name varchar(100), + grand_father_id int +); +create table GrandFather ( + id int, + name varchar(100) +); + +INSERT INTO Child (id, name, father_id, grand_father_id) +VALUES (1, 'John Smith jr', 1, 1); + +INSERT INTO Father (id, name, grand_father_id) +VALUES (1, 'John Smith', 1); + +INSERT INTO GrandFather (id, name) +VALUES (1, 'John Smith sen'); diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_common_property/Father.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_common_property/Father.java new file mode 100644 index 0000000..41d51cc --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_common_property/Father.java @@ -0,0 +1,40 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.lazyload_common_property; + +public class Father { + private Integer id; + private String name; + private GrandFather grandFather; + public Integer getId() { + return id; + } + public void setId(Integer id) { + this.id = id; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public GrandFather getGrandFather() { + return grandFather; + } + public void setGrandFather(GrandFather grandFather) { + this.grandFather = grandFather; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_common_property/FatherMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_common_property/FatherMapper.java new file mode 100644 index 0000000..f5e4b1e --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_common_property/FatherMapper.java @@ -0,0 +1,20 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.lazyload_common_property; + +public interface FatherMapper { + public Father selectById(Integer id); +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_common_property/FatherMapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_common_property/FatherMapper.xml new file mode 100644 index 0000000..e6a0020 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_common_property/FatherMapper.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_common_property/GrandFather.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_common_property/GrandFather.java new file mode 100644 index 0000000..ea26c34 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_common_property/GrandFather.java @@ -0,0 +1,33 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.lazyload_common_property; + +public class GrandFather { + private Integer id; + private String name; + public Integer getId() { + return id; + } + public void setId(Integer id) { + this.id = id; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_common_property/GrandFatherMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_common_property/GrandFatherMapper.java new file mode 100644 index 0000000..53f1b08 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_common_property/GrandFatherMapper.java @@ -0,0 +1,20 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.lazyload_common_property; + +public interface GrandFatherMapper { + public GrandFather selectById(Integer id); +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_common_property/GrandFatherMapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_common_property/GrandFatherMapper.xml new file mode 100644 index 0000000..bcbde73 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_common_property/GrandFatherMapper.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_common_property/ibatisConfig.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_common_property/ibatisConfig.xml new file mode 100644 index 0000000..e6805ae --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_common_property/ibatisConfig.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/AbstractLazyTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/AbstractLazyTest.java new file mode 100644 index 0000000..1c78ab1 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/AbstractLazyTest.java @@ -0,0 +1,89 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.lazyload_proxyfactory_comparison; + +import java.io.Reader; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public abstract class AbstractLazyTest { + + private SqlSessionFactory sqlSessionFactory; + private SqlSession sqlSession; + private Mapper mapper; + + protected abstract String getConfiguration(); + + @Before + public void before() throws Exception { + // create a SqlSessionFactory + try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/mybatis-config-" + getConfiguration() + ".xml")) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + } + + // populate in-memory database + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/CreateDB.sql"); + + sqlSession = sqlSessionFactory.openSession(); + mapper = sqlSession.getMapper(Mapper.class); + } + + @After + public void after() { + if (sqlSession != null) { + sqlSession.close(); + } + } + + @Test + public void lazyLoadUserWithGetObjectWithInterface() throws Exception { + Assert.assertNotNull(mapper.getUserWithGetObjectWithInterface(1).getOwner()); + } + + @Test + public void lazyLoadUserWithGetObjectWithoutInterface() throws Exception { + Assert.assertNotNull(mapper.getUserWithGetObjectWithoutInterface(1).getOwner()); + } + + @Test + public void lazyLoadUserWithGetXxxWithInterface() throws Exception { + Assert.assertNotNull(mapper.getUserWithGetXxxWithInterface(1).getOwner()); + } + + @Test + public void lazyLoadUserWithGetXxxWithoutInterface() throws Exception { + Assert.assertNotNull(mapper.getUserWithGetXxxWithoutInterface(1).getOwner()); + } + + @Test + public void lazyLoadUserWithNothingWithInterface() throws Exception { + Assert.assertNotNull(mapper.getUserWithNothingWithInterface(1).getOwner()); + } + + @Test + public void lazyLoadUserWithNothingWithoutInterface() throws Exception { + Assert.assertNotNull(mapper.getUserWithNothingWithoutInterface(1).getOwner()); + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/CglibLazyTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/CglibLazyTest.java new file mode 100644 index 0000000..e294455 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/CglibLazyTest.java @@ -0,0 +1,25 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.lazyload_proxyfactory_comparison; + + +public class CglibLazyTest +extends AbstractLazyTest { + @Override + protected String getConfiguration() { + return "cglib"; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/CreateDB.sql new file mode 100644 index 0000000..1935345 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/CreateDB.sql @@ -0,0 +1,33 @@ +-- +-- Copyright 2009-2016 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +drop table users if exists; +drop table groups if exists; +drop table categories if exists; + +create table users ( + id int, + name varchar(20), + owner_id int +); + +create table groups ( + id int, + name varchar(20) +); + +insert into groups (id, name) values(1, 'Group1'); +insert into users (id, name, owner_id) values(1, 'User1', 1); diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/DefaultLazyTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/DefaultLazyTest.java new file mode 100644 index 0000000..7873e21 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/DefaultLazyTest.java @@ -0,0 +1,25 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.lazyload_proxyfactory_comparison; + + +public class DefaultLazyTest +extends AbstractLazyTest { + @Override + protected String getConfiguration() { + return "default"; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/Group.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/Group.java new file mode 100644 index 0000000..4140953 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/Group.java @@ -0,0 +1,39 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.lazyload_proxyfactory_comparison; + + +public class Group { + + private Integer id; + private String name; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/JavassistLazyTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/JavassistLazyTest.java new file mode 100644 index 0000000..e357b91 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/JavassistLazyTest.java @@ -0,0 +1,27 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.lazyload_proxyfactory_comparison; + +import org.junit.Ignore; + +@Ignore("See Issue 664: Javassist ProxyFactory does not handle interfaces with generics correctly.") +public class JavassistLazyTest +extends AbstractLazyTest { + @Override + protected String getConfiguration() { + return "javassist"; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/Mapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/Mapper.java new file mode 100644 index 0000000..40bdbc6 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/Mapper.java @@ -0,0 +1,29 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.lazyload_proxyfactory_comparison; + +import org.apache.ibatis.annotations.Param; + +public interface Mapper { + UserWithGetObjectWithInterface getUserWithGetObjectWithInterface(@Param("id") Integer id); + UserWithGetObjectWithoutInterface getUserWithGetObjectWithoutInterface(@Param("id") Integer id); + + UserWithGetXxxWithInterface getUserWithGetXxxWithInterface(@Param("id") Integer id); + UserWithGetXxxWithoutInterface getUserWithGetXxxWithoutInterface(@Param("id") Integer id); + + UserWithNothingWithInterface getUserWithNothingWithInterface(@Param("id") Integer id); + UserWithNothingWithoutInterface getUserWithNothingWithoutInterface(@Param("id") Integer id); +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/Mapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/Mapper.xml new file mode 100644 index 0000000..8502440 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/Mapper.xml @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/Owned.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/Owned.java new file mode 100644 index 0000000..ff29afd --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/Owned.java @@ -0,0 +1,21 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.lazyload_proxyfactory_comparison; + +public interface Owned { + OWNERTYPE getOwner(); + void setOwner(OWNERTYPE owner); +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/UserWithGetObjectWithInterface.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/UserWithGetObjectWithInterface.java new file mode 100644 index 0000000..84a76c4 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/UserWithGetObjectWithInterface.java @@ -0,0 +1,54 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.lazyload_proxyfactory_comparison; + +public class UserWithGetObjectWithInterface +implements Owned { + + private Integer id; + private String name; + private Group owner; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public Group getOwner() { + return owner; + } + + @Override + public void setOwner(Group owner) { + this.owner = owner; + } + + public Object getObject() { + return null; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/UserWithGetObjectWithoutInterface.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/UserWithGetObjectWithoutInterface.java new file mode 100644 index 0000000..a66abcd --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/UserWithGetObjectWithoutInterface.java @@ -0,0 +1,51 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.lazyload_proxyfactory_comparison; + +public class UserWithGetObjectWithoutInterface { + + private Integer id; + private String name; + private Group owner; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Group getOwner() { + return owner; + } + + public void setOwner(Group owner) { + this.owner = owner; + } + + public Object getObject() { + return null; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/UserWithGetXxxWithInterface.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/UserWithGetXxxWithInterface.java new file mode 100644 index 0000000..e6ec3ac --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/UserWithGetXxxWithInterface.java @@ -0,0 +1,54 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.lazyload_proxyfactory_comparison; + +public class UserWithGetXxxWithInterface +implements Owned { + + private Integer id; + private String name; + private Group owner; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public Group getOwner() { + return owner; + } + + @Override + public void setOwner(Group owner) { + this.owner = owner; + } + + public Object getXxx() { + return null; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/UserWithGetXxxWithoutInterface.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/UserWithGetXxxWithoutInterface.java new file mode 100644 index 0000000..4e21521 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/UserWithGetXxxWithoutInterface.java @@ -0,0 +1,47 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.lazyload_proxyfactory_comparison; + +public class UserWithGetXxxWithoutInterface { + + private Integer id; + private String name; + private Group owner; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Group getOwner() { + return owner; + } + + public void setOwner(Group owner) { + this.owner = owner; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/UserWithNothingWithInterface.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/UserWithNothingWithInterface.java new file mode 100644 index 0000000..97863c7 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/UserWithNothingWithInterface.java @@ -0,0 +1,50 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.lazyload_proxyfactory_comparison; + +public class UserWithNothingWithInterface +implements Owned { + + private Integer id; + private String name; + private Group owner; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public Group getOwner() { + return owner; + } + + @Override + public void setOwner(Group owner) { + this.owner = owner; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/UserWithNothingWithoutInterface.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/UserWithNothingWithoutInterface.java new file mode 100644 index 0000000..184adb2 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/UserWithNothingWithoutInterface.java @@ -0,0 +1,47 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.lazyload_proxyfactory_comparison; + +public class UserWithNothingWithoutInterface { + + private Integer id; + private String name; + private Group owner; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Group getOwner() { + return owner; + } + + public void setOwner(Group owner) { + this.owner = owner; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/mybatis-config-cglib.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/mybatis-config-cglib.xml new file mode 100644 index 0000000..7158c7e --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/mybatis-config-cglib.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/mybatis-config-default.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/mybatis-config-default.xml new file mode 100644 index 0000000..9664e6e --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/mybatis-config-default.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/mybatis-config-javassist.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/mybatis-config-javassist.xml new file mode 100644 index 0000000..8954ec5 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/lazyload_proxyfactory_comparison/mybatis-config-javassist.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/manyanno/AnnoPost.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/manyanno/AnnoPost.java new file mode 100644 index 0000000..bab3094 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/manyanno/AnnoPost.java @@ -0,0 +1,59 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.manyanno; + +import java.util.List; + +public class AnnoPost { + + private int id; + private String subject; + private String body; + + private List tags; + + public String getBody() { + return body; + } + + public void setBody(String body) { + this.body = body; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getSubject() { + return subject; + } + + public void setSubject(String subject) { + this.subject = subject; + } + + public List getTags() { + return tags; + } + + public void setTags(List tags) { + this.tags = tags; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/manyanno/AnnoPostTag.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/manyanno/AnnoPostTag.java new file mode 100644 index 0000000..9db3312 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/manyanno/AnnoPostTag.java @@ -0,0 +1,35 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.manyanno; + +public class AnnoPostTag { + + private int id; + private String name; + + public AnnoPostTag(int id, String name) { + this.id = id; + this.name = name; + } + + public int getId() { + return id; + } + + public String getName() { + return name; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/manyanno/ManyAnnoTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/manyanno/ManyAnnoTest.java new file mode 100644 index 0000000..22829fd --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/manyanno/ManyAnnoTest.java @@ -0,0 +1,52 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.manyanno; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.mapping.Environment; +import org.apache.ibatis.session.Configuration; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; +import org.junit.Test; + +import java.util.List; + +import static org.junit.Assert.assertEquals; + +public class ManyAnnoTest extends BaseDataTest { + + @Test + public void testGetMessageForEmptyDatabase() throws Exception { + final Environment environment = new Environment("test", new JdbcTransactionFactory(), BaseDataTest.createBlogDataSource()); + final Configuration config = new Configuration(environment); + config.addMapper(PostMapper.class); + final SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(config); + try (SqlSession session = factory.openSession()) { + + PostMapper mapper = session.getMapper(PostMapper.class); + List posts = mapper.getPosts(101); + + + assertEquals(3, posts.size()); + assertEquals(3, posts.get(0).getTags().size()); + assertEquals(1, posts.get(1).getTags().size()); + assertEquals(0, posts.get(2).getTags().size()); + } + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/manyanno/PostMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/manyanno/PostMapper.java new file mode 100644 index 0000000..0f6f46f --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/manyanno/PostMapper.java @@ -0,0 +1,41 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.manyanno; + +import org.apache.ibatis.annotations.*; + +import java.util.List; + +public interface PostMapper { + + + @Select("select * from post where author_id = #{id} order by id") + @Results(value = { + @Result(property="id", column="id"), + @Result(property="subject", column="subject"), + @Result(property="body", column="body"), + @Result(property="tags", javaType=List.class, column="id", many=@Many(select="getTagsForPost")) + }) + List getPosts(int authorId); + + @Select("select t.id, t.name from tag t inner join post_tag pt on pt.tag_id = t.id where pt.post_id = #{postId} order by id") + @ConstructorArgs(value = { + @Arg(column="id",javaType=int.class), + @Arg(column="name",javaType=String.class) + }) + List getTagsForPost(int postId); + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/map_class_name_conflict/MapperNameTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/map_class_name_conflict/MapperNameTest.java new file mode 100644 index 0000000..112889f --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/map_class_name_conflict/MapperNameTest.java @@ -0,0 +1,33 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.map_class_name_conflict; + +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.Test; + +import java.io.IOException; +import java.io.Reader; + +public class MapperNameTest { + + @Test + public void initDatabase() throws IOException { + String resource = "org/apache/ibatis/submitted/map_class_name_conflict/ibatisConfig.xml"; + Reader reader = Resources.getResourceAsReader(resource); + new SqlSessionFactoryBuilder().build(reader); + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/map_class_name_conflict/Person.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/map_class_name_conflict/Person.java new file mode 100644 index 0000000..0377215 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/map_class_name_conflict/Person.java @@ -0,0 +1,46 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.map_class_name_conflict; + +public class Person { + private Long id; + private String firstName; + private String lastName; + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/map_class_name_conflict/PersonMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/map_class_name_conflict/PersonMapper.java new file mode 100644 index 0000000..bb2931b --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/map_class_name_conflict/PersonMapper.java @@ -0,0 +1,24 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.map_class_name_conflict; + + +public interface PersonMapper { + + public Person get(Long id); + + public void insert(Person person); +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/map_class_name_conflict/PersonMapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/map_class_name_conflict/PersonMapper.xml new file mode 100644 index 0000000..067f7ce --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/map_class_name_conflict/PersonMapper.xml @@ -0,0 +1,35 @@ + + + + + + + + + + INSERT INTO Person(firstName, lastName) + VALUES(#{firstName}, #{lastName}) + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/map_class_name_conflict/ibatisConfig.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/map_class_name_conflict/ibatisConfig.xml new file mode 100644 index 0000000..0543c5b --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/map_class_name_conflict/ibatisConfig.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_extend/ChildMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_extend/ChildMapper.java new file mode 100644 index 0000000..72b3299 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_extend/ChildMapper.java @@ -0,0 +1,20 @@ +/** + * Copyright 2009-2017 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.mapper_extend; + +public interface ChildMapper extends ParentMapper { + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_extend/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_extend/CreateDB.sql new file mode 100644 index 0000000..92c7f63 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_extend/CreateDB.sql @@ -0,0 +1,25 @@ +-- +-- Copyright 2009-2016 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +drop table users if exists; + +create table users ( + id int, + name varchar(20) +); + +insert into users (id, name) values(1, 'User1'); +insert into users (id, name) values(2, 'User2'); diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_extend/GrandpaMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_extend/GrandpaMapper.java new file mode 100644 index 0000000..2d01e86 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_extend/GrandpaMapper.java @@ -0,0 +1,25 @@ +/** + * Copyright 2009-2017 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ibatis.submitted.mapper_extend; + +public interface GrandpaMapper { + + User getUserByName(String name); + + User noMappedStatement(); + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_extend/Mapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_extend/Mapper.java new file mode 100644 index 0000000..9da35b5 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_extend/Mapper.java @@ -0,0 +1,20 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.mapper_extend; + +public interface Mapper extends ParentMapper { + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_extend/MapperExtendTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_extend/MapperExtendTest.java new file mode 100644 index 0000000..6dfa7ab --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_extend/MapperExtendTest.java @@ -0,0 +1,105 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.mapper_extend; + +import java.io.Reader; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.binding.BindingException; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; + +import static com.googlecode.catchexception.apis.BDDCatchException.*; +import static org.assertj.core.api.BDDAssertions.then; + +public class MapperExtendTest { + + private static SqlSessionFactory sqlSessionFactory; + + @BeforeClass + public static void setUp() throws Exception { + // create an SqlSessionFactory + try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/mapper_extend/mybatis-config.xml")) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + } + + // populate in-memory database + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/mapper_extend/CreateDB.sql"); + } + + @Test + public void shouldGetAUserWithAnExtendedXMLMethod() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + ParentMapper mapper = sqlSession.getMapper(Mapper.class); + User user = mapper.getUserXML(); + Assert.assertEquals("User1", user.getName()); + } + } + + + @Test + public void shouldGetAUserWithAnExtendedAnnotatedMethod() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + ParentMapper mapper = sqlSession.getMapper(Mapper.class); + User user = mapper.getUserAnnotated(); + Assert.assertEquals("User1", user.getName()); + } + } + + @Test + public void shouldGetAUserWithAnOverloadedXMLMethod() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + ParentMapper mapper = sqlSession.getMapper(MapperOverload.class); + User user = mapper.getUserXML(); + Assert.assertEquals("User2", user.getName()); + } + } + + @Test + public void shouldGetAUserWithAnOverloadedAnnotatedMethod() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + ParentMapper mapper = sqlSession.getMapper(MapperOverload.class); + User user = mapper.getUserAnnotated(); + Assert.assertEquals("User2", user.getName()); + } + } + + @Test + public void shouldFindStatementInSubInterfaceOfDeclaringClass() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + ChildMapper mapper = sqlSession.getMapper(ChildMapper.class); + User user = mapper.getUserByName("User1"); + Assert.assertNotNull(user); + } + } + + @Test + public void shouldThrowExceptionIfNoMatchingStatementFound() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + when(mapper).noMappedStatement(); + then(caughtException()).isInstanceOf(BindingException.class) + .hasMessage("Invalid bound statement (not found): " + + Mapper.class.getName() + ".noMappedStatement"); + } + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_extend/MapperOverload.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_extend/MapperOverload.java new file mode 100644 index 0000000..aa86f8c --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_extend/MapperOverload.java @@ -0,0 +1,29 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.mapper_extend; + +import org.apache.ibatis.annotations.Select; + +public interface MapperOverload extends ParentMapper { + + @Override + User getUserXML(); + + @Override + @Select("select * from users where id = 2") + User getUserAnnotated(); + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_extend/MapperOverload.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_extend/MapperOverload.xml new file mode 100644 index 0000000..967dd13 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_extend/MapperOverload.xml @@ -0,0 +1,29 @@ + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_extend/ParentMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_extend/ParentMapper.java new file mode 100644 index 0000000..fe55c57 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_extend/ParentMapper.java @@ -0,0 +1,27 @@ +/** + * Copyright 2009-2017 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.mapper_extend; + +import org.apache.ibatis.annotations.Select; + +public interface ParentMapper extends GrandpaMapper { + + User getUserXML(); + + @Select("select * from users where id = 1") + User getUserAnnotated(); + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_extend/ParentMapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_extend/ParentMapper.xml new file mode 100644 index 0000000..560a73b --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_extend/ParentMapper.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_extend/User.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_extend/User.java new file mode 100644 index 0000000..b3ee779 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_extend/User.java @@ -0,0 +1,38 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.mapper_extend; + +public class User { + + private Integer id; + private String name; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_extend/mybatis-config.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_extend/mybatis-config.xml new file mode 100644 index 0000000..6f445a2 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_extend/mybatis-config.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_type_parameter/BaseMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_type_parameter/BaseMapper.java new file mode 100644 index 0000000..673a55d --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_type_parameter/BaseMapper.java @@ -0,0 +1,91 @@ +/** + * Copyright 2009-2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.mapper_type_parameter; + +import java.util.List; +import java.util.Map; + +import org.apache.ibatis.annotations.InsertProvider; +import org.apache.ibatis.annotations.MapKey; +import org.apache.ibatis.annotations.Options; +import org.apache.ibatis.annotations.SelectProvider; +import org.apache.ibatis.annotations.UpdateProvider; + +public interface BaseMapper { + + @SelectProvider(type = StatementProvider.class, method = "provideSelect") + S select(S param); + + @SelectProvider(type = StatementProvider.class, method = "provideSelect") + List selectList(S param); + + @SelectProvider(type = StatementProvider.class, method = "provideSelect") + @MapKey("id") + Map selectMap(S param); + + @InsertProvider(type = StatementProvider.class, method = "provideInsert") + @Options(useGeneratedKeys = true, keyProperty = "id") + int insert(List param); + + @UpdateProvider(type = StatementProvider.class, method = "provideUpdate") + int update(S param); + + public class StatementProvider { + public String provideSelect(Object param) { + StringBuilder sql = new StringBuilder("select * from "); + if (param == null || param instanceof Person) { + sql.append(" person "); + if (param != null && ((Person) param).getId() != null) { + sql.append(" where id = #{id}"); + } + } else if (param instanceof Country) { + sql.append(" country "); + if (((Country) param).getId() != null) { + sql.append(" where id = #{id}"); + } + } + sql.append(" order by id"); + return sql.toString(); + } + + public String provideInsert(Map map) { + List params = (List) map.get("list"); + StringBuilder sql = null; + for (int i = 0; i < params.size(); i++) { + Object param = params.get(i); + if (sql == null) { + sql = new StringBuilder("insert into "); + sql.append(param instanceof Country ? " country " : " person"); + sql.append(" (id, name) values "); + } else { + sql.append(","); + } + sql.append(" (#{list[" + i + "].id}, #{list[" + i + "].name})"); + } + return sql == null ? "" : sql.toString(); + } + + public String provideUpdate(Object param) { + StringBuilder sql = new StringBuilder("update "); + if (param instanceof Person) { + sql.append(" person set name = #{name} where id = #{id}"); + } else if (param instanceof Country) { + sql.append(" country set name = #{name} where id = #{id}"); + } + return sql.toString(); + } + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_type_parameter/Country.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_type_parameter/Country.java new file mode 100644 index 0000000..c86d350 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_type_parameter/Country.java @@ -0,0 +1,53 @@ +/** + * Copyright 2009-2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.mapper_type_parameter; + +public class Country { + private Long id; + + private String name; + + public Country() { + super(); + } + + public Country(Long id) { + super(); + this.id = id; + } + + public Country(Long id, String name) { + super(); + this.id = id; + this.name = name; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_type_parameter/CountryMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_type_parameter/CountryMapper.java new file mode 100644 index 0000000..d970791 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_type_parameter/CountryMapper.java @@ -0,0 +1,19 @@ +/** + * Copyright 2009-2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.mapper_type_parameter; + +public interface CountryMapper extends BaseMapper { +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_type_parameter/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_type_parameter/CreateDB.sql new file mode 100644 index 0000000..0ab3252 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_type_parameter/CreateDB.sql @@ -0,0 +1,31 @@ +-- +-- Copyright 2009-2016 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +drop table person if exists; +drop table country if exists; + +create table person( + id int IDENTITY, + name varchar(20) +); + +create table country( + id bigint IDENTITY, + name varchar(20) +); + +insert into person (id, name) values (1, 'Jane'), (2, 'John'); +insert into country (id, name) values (1, 'Japan'), (2, 'New Zealand'); diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_type_parameter/MapperTypeParameterTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_type_parameter/MapperTypeParameterTest.java new file mode 100644 index 0000000..c96d8a3 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_type_parameter/MapperTypeParameterTest.java @@ -0,0 +1,107 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.mapper_type_parameter; + +import static org.junit.Assert.*; + +import java.io.Reader; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.BeforeClass; +import org.junit.Test; + +public class MapperTypeParameterTest { + private static SqlSessionFactory sqlSessionFactory; + + @BeforeClass + public static void setUp() throws Exception { + // create an SqlSessionFactory + try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/mapper_type_parameter/mybatis-config.xml")) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + } + + // populate in-memory database + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/mapper_type_parameter/CreateDB.sql"); + } + + @Test + public void shouldResolveReturnType() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + PersonMapper mapper = sqlSession.getMapper(PersonMapper.class); + Person person = mapper.select(new Person(1)); + assertEquals("Jane", person.getName()); + } + } + + @Test + public void shouldResolveListTypeParam() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + PersonMapper mapper = sqlSession.getMapper(PersonMapper.class); + List persons = mapper.selectList(null); + assertEquals(2, persons.size()); + assertEquals("Jane", persons.get(0).getName()); + assertEquals("John", persons.get(1).getName()); + } + } + + @Test + public void shouldResolveMultipleTypeParam() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + CountryMapper mapper = sqlSession.getMapper(CountryMapper.class); + Map results = mapper.selectMap(new Country()); + assertEquals(2, results.size()); + assertEquals("Japan", results.get(1L).getName()); + assertEquals("New Zealand", results.get(2L).getName()); + } + } + + @Test + public void shouldResolveParameterizedReturnType() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + PersonListMapper mapper = sqlSession.getMapper(PersonListMapper.class); + List persons = mapper.select(null); + assertEquals(2, persons.size()); + assertEquals("Jane", persons.get(0).getName()); + assertEquals("John", persons.get(1).getName()); + } + } + + @Test + public void shouldResolveParam() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + CountryMapper mapper = sqlSession.getMapper(CountryMapper.class); + assertEquals(1, mapper.update(new Country(2L, "Greenland"))); + } + } + + @Test + public void shouldResolveListParam() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + PersonMapper mapper = sqlSession.getMapper(PersonMapper.class); + Person person1 = new Person("James"); + assertEquals(1, mapper.insert(Arrays.asList(person1))); + assertNotNull(person1.getId()); + } + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_type_parameter/Person.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_type_parameter/Person.java new file mode 100644 index 0000000..29ddf63 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_type_parameter/Person.java @@ -0,0 +1,58 @@ +/** + * Copyright 2009-2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.mapper_type_parameter; + +public class Person { + private Integer id; + + private String name; + + public Person() { + super(); + } + + public Person(Integer id) { + super(); + this.id = id; + } + + public Person(String name) { + super(); + this.name = name; + } + + public Person(Integer id, String name) { + super(); + this.id = id; + this.name = name; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_type_parameter/PersonListMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_type_parameter/PersonListMapper.java new file mode 100644 index 0000000..a426dd1 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_type_parameter/PersonListMapper.java @@ -0,0 +1,21 @@ +/** + * Copyright 2009-2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.mapper_type_parameter; + +import java.util.List; + +public interface PersonListMapper extends BaseMapper, Integer> { +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_type_parameter/PersonMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_type_parameter/PersonMapper.java new file mode 100644 index 0000000..8f06a8c --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_type_parameter/PersonMapper.java @@ -0,0 +1,19 @@ +/** + * Copyright 2009-2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.mapper_type_parameter; + +public interface PersonMapper extends BaseMapper { +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_type_parameter/mybatis-config.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_type_parameter/mybatis-config.xml new file mode 100644 index 0000000..a550837 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/mapper_type_parameter/mybatis-config.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/maptypehandler/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/maptypehandler/CreateDB.sql new file mode 100644 index 0000000..2354824 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/maptypehandler/CreateDB.sql @@ -0,0 +1,24 @@ +-- +-- Copyright 2009-2016 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +drop table users if exists; + +create table users ( + id int, + name varchar(20) +); + +insert into users (id, name) values(1, 'User1'); diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/maptypehandler/LabelsTypeHandler.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/maptypehandler/LabelsTypeHandler.java new file mode 100644 index 0000000..373d1c2 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/maptypehandler/LabelsTypeHandler.java @@ -0,0 +1,54 @@ +/** + * Copyright 2009-2017 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.maptypehandler; + +import java.sql.CallableStatement; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Map; + +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.MappedTypes; +import org.apache.ibatis.type.TypeHandler; + +@MappedTypes(Map.class) +public class LabelsTypeHandler implements TypeHandler> { + + @Override + public void setParameter(PreparedStatement ps, int i, Map parameter, JdbcType jdbcType) throws SQLException { + // Not Implemented + } + + @Override + public Map getResult(ResultSet rs, String columnName) throws SQLException { + // Not Implemented + return null; + } + + @Override + public Map getResult(ResultSet rs, int columnIndex) throws SQLException { + // Not Implemented + return null; + } + + @Override + public Map getResult(CallableStatement cs, int columnIndex) throws SQLException { + // Not Implemented + return null; + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/maptypehandler/MapTypeHandlerTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/maptypehandler/MapTypeHandlerTest.java new file mode 100644 index 0000000..d49e388 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/maptypehandler/MapTypeHandlerTest.java @@ -0,0 +1,73 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.maptypehandler; + +import java.io.Reader; +import java.util.HashMap; +import java.util.Map; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.exceptions.PersistenceException; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; + +/** + * See issue #135 + * + */ +public class MapTypeHandlerTest { + + private static SqlSessionFactory sqlSessionFactory; + + @BeforeClass + public static void setUp() throws Exception { + // create an SqlSessionFactory + try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/maptypehandler/mybatis-config.xml")) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + } + + // populate in-memory database + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/maptypehandler/CreateDB.sql"); + } + + @Test + public void shouldGetAUserFromAnnotation() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + User user = mapper.getUser(1, "User1"); + Assert.assertEquals("User1", user.getName()); + } + } + + @Test(expected=PersistenceException.class) + public void shouldGetAUserFromXML() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + Map params = new HashMap(); + params.put("id", 1); + params.put("name", "User1"); + User user = mapper.getUserXML(params); + Assert.assertEquals("User1", user.getName()); + } + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/maptypehandler/Mapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/maptypehandler/Mapper.java new file mode 100644 index 0000000..32db73d --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/maptypehandler/Mapper.java @@ -0,0 +1,33 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.maptypehandler; + +import java.util.Map; + +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +public interface Mapper { + + @Select("select * from users where id = #{id}") + User getUser(@Param("id") Integer id, @Param("name") String name); + + @Select("select * from users where id = #{id} and name = #{name}") + User getUserFromAMap(Map params); + + User getUserXML(Map params); + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/maptypehandler/Mapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/maptypehandler/Mapper.xml new file mode 100644 index 0000000..cd98e7b --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/maptypehandler/Mapper.xml @@ -0,0 +1,29 @@ + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/maptypehandler/User.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/maptypehandler/User.java new file mode 100644 index 0000000..1583238 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/maptypehandler/User.java @@ -0,0 +1,38 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.maptypehandler; + +public class User { + + private Integer id; + private String name; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/maptypehandler/mybatis-config.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/maptypehandler/mybatis-config.xml new file mode 100644 index 0000000..be49130 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/maptypehandler/mybatis-config.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/member_access/MemberAccessTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/member_access/MemberAccessTest.java new file mode 100644 index 0000000..bf7372c --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/member_access/MemberAccessTest.java @@ -0,0 +1,390 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.member_access; + +import java.io.Reader; +import java.util.HashMap; +import java.util.Map; + +import org.apache.ibatis.annotations.Arg; +import org.apache.ibatis.annotations.ConstructorArgs; +import org.apache.ibatis.annotations.Result; +import org.apache.ibatis.annotations.Results; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.BeforeClass; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Tests for member access of Java Object. + */ +public class MemberAccessTest { + + private static SqlSessionFactory sqlSessionFactory; + + @BeforeClass + public static void setUp() throws Exception { + try (Reader reader = Resources + .getResourceAsReader("org/apache/ibatis/submitted/member_access/mybatis-config.xml")) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + sqlSessionFactory.getConfiguration().addMapper(Mapper.class); + } + } + + @Test + public void parameterMappingAndResultAutoMapping() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + + Params params = new Params(); + Bean bean = mapper.resultAutoMapping(params); + + assertEquals(params.privateField, bean.privateField); + assertEquals(params.packagePrivateField, bean.packagePrivateField); + assertEquals(params.protectedField, bean.protectedField); + assertEquals(params.publicField, bean.publicField); + assertEquals(params.getPrivateProperty(), bean.properties.get("privateProperty")); + assertEquals(params.getPackagePrivateProperty(), + bean.properties.get("packagePrivateProperty")); + assertEquals(params.getProtectedProperty(), bean.properties.get("protectedProperty")); + assertEquals(params.getPublicProperty(), bean.properties.get("publicProperty")); + } + } + + @Test // gh-1258 + public void parameterMappingAndResultAutoMappingUsingOgnl() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + + Params params = new Params(); + Bean bean = mapper.resultAutoMappingUsingOgnl(params); + + assertEquals(params.privateField + "%", bean.privateField); + assertEquals(params.packagePrivateField + "%", bean.packagePrivateField); + assertEquals(params.protectedField + "%", bean.protectedField); + assertEquals(params.publicField + "%", bean.publicField); + assertEquals(params.getPrivateProperty() + "%", bean.properties.get("privateProperty")); + assertEquals(params.getPackagePrivateProperty() + "%", + bean.properties.get("packagePrivateProperty")); + assertEquals(params.getProtectedProperty() + "%", bean.properties.get("protectedProperty")); + assertEquals(params.getPublicProperty() + "%", bean.properties.get("publicProperty")); + } + } + + @Test + public void parameterMappingAndResultMapping() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + + Params params = new Params(); + Bean bean = mapper.resultMapping(params); + + assertEquals(params.privateField, bean.privateField); + assertEquals(params.packagePrivateField, bean.packagePrivateField); + assertEquals(params.protectedField, bean.protectedField); + assertEquals(params.publicField, bean.publicField); + assertEquals(params.getPrivateProperty(), bean.properties.get("privateProperty")); + assertEquals(params.getPackagePrivateProperty(), + bean.properties.get("packagePrivateProperty")); + assertEquals(params.getProtectedProperty(), bean.properties.get("protectedProperty")); + assertEquals(params.getPublicProperty(), bean.properties.get("publicProperty")); + } + } + + @Test + public void constructorAutoMapping() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + + { + Immutable immutable = mapper.privateConstructorAutoMapping(); + assertEquals(1, immutable.properties.size()); + assertEquals("1", immutable.properties.get("arg1")); + } + + { + Immutable immutable = mapper.packagePrivateConstructorAutoMapping(); + assertEquals(2, immutable.properties.size()); + assertEquals("1", immutable.properties.get("arg1")); + assertEquals("2", immutable.properties.get("arg2")); + } + + { + Immutable immutable = mapper.protectedConstructorAutoMapping(); + assertEquals(3, immutable.properties.size()); + assertEquals("1", immutable.properties.get("arg1")); + assertEquals("2", immutable.properties.get("arg2")); + assertEquals("3", immutable.properties.get("arg3")); + } + + { + Immutable immutable = mapper.publicConstructorAutoMapping(); + assertEquals(4, immutable.properties.size()); + assertEquals("1", immutable.properties.get("arg1")); + assertEquals("2", immutable.properties.get("arg2")); + assertEquals("3", immutable.properties.get("arg3")); + assertEquals("4", immutable.properties.get("arg4")); + } + } + + } + + @Test + public void constructorMapping() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + + { + Immutable immutable = mapper.privateConstructorMapping(); + assertEquals(1, immutable.properties.size()); + assertEquals("1", immutable.properties.get("arg1")); + } + + { + Immutable immutable = mapper.packagePrivateConstructorMapping(); + assertEquals(2, immutable.properties.size()); + assertEquals("1", immutable.properties.get("arg1")); + assertEquals("2", immutable.properties.get("arg2")); + } + + { + Immutable immutable = mapper.protectedConstructorMapping(); + assertEquals(3, immutable.properties.size()); + assertEquals("1", immutable.properties.get("arg1")); + assertEquals("2", immutable.properties.get("arg2")); + assertEquals("3", immutable.properties.get("arg3")); + } + + { + Immutable immutable = mapper.publicConstructorMapping(); + assertEquals(4, immutable.properties.size()); + assertEquals("1", immutable.properties.get("arg1")); + assertEquals("2", immutable.properties.get("arg2")); + assertEquals("3", immutable.properties.get("arg3")); + assertEquals("4", immutable.properties.get("arg4")); + } + } + + } + + interface Mapper { + @Select({ + // @formatter:off + "SELECT" + ,"#{privateField} as privateField" + ,",#{packagePrivateField} as packagePrivateField" + ,",#{protectedField} as protectedField" + ,",#{publicField} as publicField" + ,",#{privateProperty} as privateProperty" + ,",#{packagePrivateProperty} as packagePrivateProperty" + ,",#{protectedProperty} as protectedProperty" + ,",#{publicProperty} as publicProperty" + ,"FROM" + ,"INFORMATION_SCHEMA.SYSTEM_USERS" + // @formatter:on + }) + Bean resultAutoMapping(Params params); + + @Select({ + // @formatter:off + ""} + // @formatter:on + ) + Bean resultAutoMappingUsingOgnl(Params params); + + @Results({ + // @formatter:off + @Result(property = "privateField", column = "private_field") + ,@Result(property = "packagePrivateField", column = "package_private_field") + ,@Result(property = "protectedField", column = "protected_field") + ,@Result(property = "publicField", column = "public_field") + ,@Result(property = "privateProperty", column = "private_property") + ,@Result(property = "packagePrivateProperty", column = "package_private_property") + ,@Result(property = "protectedProperty", column = "protected_property") + ,@Result(property = "publicProperty", column = "public_property") + // @formatter:on + }) + @Select({ + // @formatter:off + "SELECT" + ,"#{privateField} as private_field" + ,",#{packagePrivateField} as package_private_field" + ,",#{protectedField} as protected_field" + ,",#{publicField} as public_field" + ,",#{privateProperty} as private_property" + ,",#{packagePrivateProperty} as package_private_property" + ,",#{protectedProperty} as protected_property" + ,",#{publicProperty} as public_property" + ,"FROM" + ,"INFORMATION_SCHEMA.SYSTEM_USERS" + // @formatter:on + }) + Bean resultMapping(Params params); + + @Select("SELECT '1' FROM INFORMATION_SCHEMA.SYSTEM_USERS") + Immutable privateConstructorAutoMapping(); + + @Select("SELECT '1', '2' FROM INFORMATION_SCHEMA.SYSTEM_USERS") + Immutable packagePrivateConstructorAutoMapping(); + + @Select("SELECT '1', '2', '3' FROM INFORMATION_SCHEMA.SYSTEM_USERS") + Immutable protectedConstructorAutoMapping(); + + @Select("SELECT '1', '2', '3', '4' FROM INFORMATION_SCHEMA.SYSTEM_USERS") + Immutable publicConstructorAutoMapping(); + + @ConstructorArgs({@Arg(column = "c1", javaType = String.class)}) + @Select("SELECT '1' as c1 FROM INFORMATION_SCHEMA.SYSTEM_USERS") + Immutable privateConstructorMapping(); + + @ConstructorArgs({ + // @formatter:off + @Arg(column = "c1", javaType = String.class) + ,@Arg(column = "c2", javaType = String.class) + // @formatter:on + }) + @Select("SELECT '1' as c1, '2' as c2 FROM INFORMATION_SCHEMA.SYSTEM_USERS") + Immutable packagePrivateConstructorMapping(); + + @ConstructorArgs({ + // @formatter:off + @Arg(column = "c1", javaType = String.class) + ,@Arg(column = "c2", javaType = String.class) + ,@Arg(column = "c3", javaType = String.class) + // @formatter:on + }) + @Select("SELECT '1' as c1, '2' as c2, '3' as c3 FROM INFORMATION_SCHEMA.SYSTEM_USERS") + Immutable protectedConstructorMapping(); + + @ConstructorArgs({ + // @formatter:off + @Arg(column = "c1", javaType = String.class) + ,@Arg(column = "c2", javaType = String.class) + ,@Arg(column = "c3", javaType = String.class) + ,@Arg(column = "c4", javaType = String.class) + // @formatter:on + }) + @Select("SELECT '1' as c1, '2' as c2, '3' as c3, '4' as c4 FROM INFORMATION_SCHEMA.SYSTEM_USERS") + Immutable publicConstructorMapping(); + + } + + static class Params { + private String privateField = "privateField"; + String packagePrivateField = "packagePrivateField"; + protected String protectedField = "protectedField"; + public String publicField = "publicField"; + + private String getPrivateProperty() { + return "privateProperty"; + } + + String getPackagePrivateProperty() { + return "packagePrivateProperty"; + } + + protected String getProtectedProperty() { + return "protectedProperty"; + } + + public String getPublicProperty() { + return "publicProperty"; + } + } + + @SuppressWarnings("unused") + static class Bean { + private String privateField; + String packagePrivateField; + protected String protectedField; + public String publicField; + private Map properties = new HashMap<>(); + + private void setPrivateProperty(String value) { + properties.put("privateProperty", value); + } + + void setPackagePrivateProperty(String value) { + properties.put("packagePrivateProperty", value); + } + + protected void setProtectedProperty(String value) { + properties.put("protectedProperty", value); + } + + public void setPublicProperty(String value) { + properties.put("publicProperty", value); + } + } + + @SuppressWarnings("unused") + static class Immutable { + private Map properties = new HashMap<>(); + + private Immutable(String arg1) { + properties.put("arg1", arg1); + } + + Immutable(String arg1, String arg2) { + properties.put("arg1", arg1); + properties.put("arg2", arg2); + } + + protected Immutable(String arg1, String arg2, String arg3) { + properties.put("arg1", arg1); + properties.put("arg2", arg2); + properties.put("arg3", arg3); + } + + public Immutable(String arg1, String arg2, String arg3, String arg4) { + properties.put("arg1", arg1); + properties.put("arg2", arg2); + properties.put("arg3", arg3); + properties.put("arg4", arg4); + } + + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/member_access/mybatis-config.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/member_access/mybatis-config.xml new file mode 100644 index 0000000..f4f940b --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/member_access/mybatis-config.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/missing_id_property/Car.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/missing_id_property/Car.java new file mode 100644 index 0000000..089a682 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/missing_id_property/Car.java @@ -0,0 +1,40 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.missing_id_property; + +import java.util.List; + +public class Car { + // the result class doesn't need id for further processing + private String name ; + private List carParts ; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getCarParts() { + return carParts; + } + + public void setCarParts(List carParts) { + this.carParts = carParts; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/missing_id_property/CarMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/missing_id_property/CarMapper.java new file mode 100644 index 0000000..033f2cb --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/missing_id_property/CarMapper.java @@ -0,0 +1,21 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.missing_id_property; + + +public interface CarMapper { + Car getCarsInfo(Long id); +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/missing_id_property/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/missing_id_property/CreateDB.sql new file mode 100644 index 0000000..08b1ac6 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/missing_id_property/CreateDB.sql @@ -0,0 +1,37 @@ +-- +-- Copyright 2009-2016 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +drop table car if exists; +drop table part if exists; + +create table car ( + car_id int, + name varchar(20) +); + +create table part ( + part_id int, + name varchar(20), + car_id int +); + +insert into car (car_id, name) values(1, 'Audi'); +insert into car (car_id, name) values(2, 'Ford'); +insert into car (car_id, name) values(3, 'Fiat'); + +insert into part (part_id, name, car_id) values(100, 'door', 1); +insert into part (part_id, name, car_id) values(101, 'windshield', 1); +insert into part (part_id, name, car_id) values(101, 'brakes', 1); diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/missing_id_property/Map.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/missing_id_property/Map.xml new file mode 100644 index 0000000..4b98dcb --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/missing_id_property/Map.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/missing_id_property/MapperConfig.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/missing_id_property/MapperConfig.xml new file mode 100644 index 0000000..190c0e0 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/missing_id_property/MapperConfig.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/missing_id_property/MissingIdPropertyTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/missing_id_property/MissingIdPropertyTest.java new file mode 100644 index 0000000..d4b45d0 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/missing_id_property/MissingIdPropertyTest.java @@ -0,0 +1,56 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.missing_id_property; + +import java.io.Reader; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; + +public class MissingIdPropertyTest { + + private static SqlSessionFactory sqlSessionFactory; + + @BeforeClass + public static void setUp() throws Exception { + // create a SqlSessionFactory + try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/missing_id_property/MapperConfig.xml")) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + } + + // populate in-memory database + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/missing_id_property/CreateDB.sql"); + } + + @Test + public void shouldMapResultsWithoutActuallyWritingIdProperties() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + CarMapper carMapper = sqlSession.getMapper(CarMapper.class); + Car car = carMapper.getCarsInfo(1L); + Assert.assertNotNull(car.getName()); + Assert.assertNotNull(car.getCarParts()); + Assert.assertEquals(3, car.getCarParts().size()); + } + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/missing_id_property/Part.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/missing_id_property/Part.java new file mode 100644 index 0000000..fb0e650 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/missing_id_property/Part.java @@ -0,0 +1,28 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.missing_id_property; + +public class Part { + + private String name; + + public Part(String name) { + this.name = name; + } + public String getName() { + return name; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multidb/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multidb/CreateDB.sql new file mode 100644 index 0000000..f73943e --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multidb/CreateDB.sql @@ -0,0 +1,29 @@ +-- +-- Copyright 2009-2016 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +create table common ( +id int, +name varchar(20) +); + +create table hsql ( +id int, +name varchar(20) +); + +insert into common (id, name) values(1, 'common'); + +insert into hsql (id, name) values(1, 'hsql'); \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multidb/DummyDatabaseIdProvider.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multidb/DummyDatabaseIdProvider.java new file mode 100644 index 0000000..68c9b7a --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multidb/DummyDatabaseIdProvider.java @@ -0,0 +1,38 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.multidb; + +import java.util.Properties; + +import javax.sql.DataSource; + +import org.apache.ibatis.mapping.DatabaseIdProvider; + +public class DummyDatabaseIdProvider implements DatabaseIdProvider { + + private Properties properties; + + @Override + public String getDatabaseId(DataSource dataSource) { + return properties.getProperty("name"); + } + + @Override + public void setProperties(Properties p) { + this.properties = p; + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multidb/MultiDbConfig.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multidb/MultiDbConfig.xml new file mode 100644 index 0000000..0224ec8 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multidb/MultiDbConfig.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multidb/MultiDbMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multidb/MultiDbMapper.java new file mode 100644 index 0000000..ee6723a --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multidb/MultiDbMapper.java @@ -0,0 +1,25 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.multidb; + +public interface MultiDbMapper { + String select1(int id); + String select2(int id); + String select3(int id); + String select4(int id); + void insert(User user); + void insert2(User user); +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multidb/MultiDbMapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multidb/MultiDbMapper.xml new file mode 100644 index 0000000..6a40d03 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multidb/MultiDbMapper.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + hsql + + + + common + + + + + + + + select max(id) + 1 from hsql + + + select max(id) + 1 from common + + + + insert into hsql values (#{id}, #{name}) + + + insert into common values (#{id}, #{name}) + + + + + + select max(id) + 1 from common + + + select max(id) + 1 from hsql + + + insert into hsql values (#{id}, #{name}) + + + insert into common values (#{id}, #{name}) + + + + \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multidb/MultiDbTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multidb/MultiDbTest.java new file mode 100644 index 0000000..f4ba2fc --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multidb/MultiDbTest.java @@ -0,0 +1,101 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.multidb; + +import static org.junit.Assert.assertEquals; + +import java.io.Reader; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.BeforeClass; +import org.junit.Test; + +public class MultiDbTest { + + protected static SqlSessionFactory sqlSessionFactory; + protected static SqlSessionFactory sqlSessionFactory2; + + @BeforeClass + public static void setUp() throws Exception { + try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/multidb/MultiDbConfig.xml")) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + } + + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/multidb/CreateDB.sql"); + } + + @Test + public void shouldExecuteHsqlQuery() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + MultiDbMapper mapper = sqlSession.getMapper(MultiDbMapper.class); + String answer = mapper.select1(1); + assertEquals("hsql", answer); + } + } + + @Test + public void shouldExecuteCommonQuery() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + MultiDbMapper mapper = sqlSession.getMapper(MultiDbMapper.class); + String answer = mapper.select2(1); + assertEquals("common", answer); + } + } + + @Test + public void shouldExecuteHsqlQueryWithDynamicIf() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + MultiDbMapper mapper = sqlSession.getMapper(MultiDbMapper.class); + String answer = mapper.select3(1); + assertEquals("hsql", answer); + } + } + + @Test + public void shouldExecuteHsqlQueryWithInclude() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + MultiDbMapper mapper = sqlSession.getMapper(MultiDbMapper.class); + String answer = mapper.select4(1); + assertEquals("hsql", answer); + } + } + + @Test + public void shouldInsertInCommonWithSelectKey() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + MultiDbMapper mapper = sqlSession.getMapper(MultiDbMapper.class); + mapper.insert(new User(2, "test")); + String answer = mapper.select2(1); + assertEquals("common", answer); + } + } + + @Test + public void shouldInsertInCommonWithSelectKey2() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + MultiDbMapper mapper = sqlSession.getMapper(MultiDbMapper.class); + mapper.insert2(new User(2, "test")); + String answer = mapper.select2(1); + assertEquals("common", answer); + } + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multidb/ProviderConfig.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multidb/ProviderConfig.xml new file mode 100644 index 0000000..2965345 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multidb/ProviderConfig.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multidb/ProviderTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multidb/ProviderTest.java new file mode 100644 index 0000000..2968034 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multidb/ProviderTest.java @@ -0,0 +1,45 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.multidb; + +import static org.junit.Assert.assertEquals; + +import java.io.Reader; + +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.Configuration; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.apache.ibatis.session.defaults.DefaultSqlSessionFactory; +import org.junit.Test; + +public class ProviderTest { + + @Test + public void shouldUseDefaultId() throws Exception { + Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/multidb/MultiDbConfig.xml"); + DefaultSqlSessionFactory sqlSessionFactory = (DefaultSqlSessionFactory) new SqlSessionFactoryBuilder().build(reader); + Configuration c = sqlSessionFactory.getConfiguration(); + assertEquals("hsql", c.getDatabaseId()); + } + + @Test + public void shouldUseProvider() throws Exception { + Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/multidb/ProviderConfig.xml"); + DefaultSqlSessionFactory sqlSessionFactory = (DefaultSqlSessionFactory) new SqlSessionFactoryBuilder().build(reader); + Configuration c = sqlSessionFactory.getConfiguration(); + assertEquals("translated", c.getDatabaseId()); + } +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multidb/User.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multidb/User.java new file mode 100644 index 0000000..802e6b9 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multidb/User.java @@ -0,0 +1,43 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.multidb; + +public class User { + + private int id; + private String name; + + public User(int id, String name) { + this.id = id; + this.name = name; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_discriminator/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_discriminator/CreateDB.sql new file mode 100644 index 0000000..d9c85fa --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_discriminator/CreateDB.sql @@ -0,0 +1,31 @@ +-- +-- Copyright 2009-2016 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +create table person ( + id int, + firstName varchar(100), + lastName varchar(100), + jobTitle varchar(100), + department varchar(100), + personType varchar(100) DEFAULT NULL, + employeeType varchar(100) DEFAULT NULL +); + +INSERT INTO person (id, firstName, lastName, jobTitle, department, personType, employeeType) +VALUES (1, 'John', 'Smith', 'IT director', 'IT', 'EmployeeType', 'DirectorType'); + +INSERT INTO person (id, firstName, lastName, jobTitle, department, personType, employeeType) +VALUES (3, 'John', 'Smith', 'IT director', 'IT', 'EmployeeType', 'PersonType'); diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_discriminator/Director.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_discriminator/Director.java new file mode 100644 index 0000000..d710455 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_discriminator/Director.java @@ -0,0 +1,27 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.multiple_discriminator; + +public class Director extends Employee { + private String department; + + public String getDepartment() { + return department; + } + public void setDepartment(String department) { + this.department = department; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_discriminator/Employee.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_discriminator/Employee.java new file mode 100644 index 0000000..f29d730 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_discriminator/Employee.java @@ -0,0 +1,27 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.multiple_discriminator; + +public class Employee extends Person { + private String jobTitle; + + public String getJobTitle() { + return jobTitle; + } + public void setJobTitle(String jobTitle) { + this.jobTitle = jobTitle; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_discriminator/MultipleDiscriminatorTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_discriminator/MultipleDiscriminatorTest.java new file mode 100644 index 0000000..162f45b --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_discriminator/MultipleDiscriminatorTest.java @@ -0,0 +1,68 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.multiple_discriminator; + +import java.io.Reader; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; + +public class MultipleDiscriminatorTest { + + private static SqlSessionFactory sqlSessionFactory; + + @BeforeClass + public static void initDatabase() throws Exception { + try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/multiple_discriminator/ibatisConfig.xml")) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + } + + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/multiple_discriminator/CreateDB.sql"); + } + + @Test + public void testMultipleDiscriminator() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + PersonMapper personMapper = sqlSession.getMapper(PersonMapper.class); + Person person = personMapper.get(1L); + Assert.assertNotNull("Person must not be null", person); + Assert.assertEquals("Person must be a director", Director.class, person.getClass()); + } + } + @Test + public void testMultipleDiscriminator2() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + PersonMapper personMapper = sqlSession.getMapper(PersonMapper.class); + Person person = personMapper.get2(1L); + Assert.assertNotNull("Person must not be null", person); + Assert.assertEquals("Person must be a director", Director.class, person.getClass()); + } + } + @Test(timeout=20000) + public void testMultipleDiscriminatorLoop() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + PersonMapper personMapper = sqlSession.getMapper(PersonMapper.class); + personMapper.getLoop(); + } + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_discriminator/Person.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_discriminator/Person.java new file mode 100644 index 0000000..ed933e4 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_discriminator/Person.java @@ -0,0 +1,40 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.multiple_discriminator; + +public class Person { + private Long id; + private String firstName; + private String lastName; + public String getFirstName() { + return firstName; + } + public void setFirstName(String firstName) { + this.firstName = firstName; + } + public String getLastName() { + return lastName; + } + public void setLastName(String lastName) { + this.lastName = lastName; + } + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_discriminator/Person.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_discriminator/Person.xml new file mode 100644 index 0000000..6a5a5f5 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_discriminator/Person.xml @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_discriminator/PersonMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_discriminator/PersonMapper.java new file mode 100644 index 0000000..abc225f --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_discriminator/PersonMapper.java @@ -0,0 +1,23 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.multiple_discriminator; + +public interface PersonMapper { + + public Person get(Long id); + public Person get2(Long id); + public Person getLoop(); +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_discriminator/ibatisConfig.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_discriminator/ibatisConfig.xml new file mode 100644 index 0000000..5113272 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_discriminator/ibatisConfig.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_resultsets/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_resultsets/CreateDB.sql new file mode 100644 index 0000000..ab43e72 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_resultsets/CreateDB.sql @@ -0,0 +1,83 @@ +-- +-- Copyright 2009-2018 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +CREATE SCHEMA mbtest; + +CREATE TABLE mbtest.order_detail +( + order_id integer NOT NULL, + line_number integer NOT NULL, + quantity integer NOT NULL, + item_description character varying(50) NOT NULL, + CONSTRAINT order_detail_pkey PRIMARY KEY (order_id, line_number) +) +WITH ( + OIDS=FALSE +); + +ALTER TABLE mbtest.order_detail OWNER TO postgres; + +CREATE TABLE mbtest.order_header +( + order_id integer NOT NULL, + cust_name character varying(50) NOT NULL, + CONSTRAINT order_header_pkey PRIMARY KEY (order_id) +) +WITH ( + OIDS=FALSE +); + +ALTER TABLE mbtest.order_header OWNER TO postgres; + +INSERT INTO mbtest.order_header(order_id, cust_name) + VALUES (1, 'Fred'); +INSERT INTO mbtest.order_header(order_id, cust_name) + VALUES (2, 'Barney'); +INSERT INTO mbtest.order_detail(order_id, line_number, quantity, item_description) + VALUES (1, 1, 1, 'Pen'); +INSERT INTO mbtest.order_detail(order_id, line_number, quantity, item_description) + VALUES (1, 2, 3, 'Pencil'); +INSERT INTO mbtest.order_detail(order_id, line_number, quantity, item_description) + VALUES (1, 3, 2, 'Notepad'); +INSERT INTO mbtest.order_detail(order_id, line_number, quantity, item_description) + VALUES (2, 1, 1, 'Compass'); +INSERT INTO mbtest.order_detail(order_id, line_number, quantity, item_description) + VALUES (2, 2, 1, 'Protractor'); +INSERT INTO mbtest.order_detail(order_id, line_number, quantity, item_description) + VALUES (2, 3, 2, 'Pencil'); + +-- @DELIMITER | + +CREATE OR REPLACE FUNCTION mbtest.get_order(order_number integer) + RETURNS refcursor AS +$BODY$ +DECLARE + mycurs refcursor; +BEGIN + open mycurs for select a.*, b.* + from mbtest.order_header a join mbtest.order_detail b + on a.order_id = b.order_id + where a.order_id = ORDER_NUMBER; + return mycurs; +END; +$BODY$ + LANGUAGE plpgsql VOLATILE + COST 100| + +-- @DELIMITER ; + +ALTER FUNCTION mbtest.get_order(integer) OWNER TO postgres; + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_resultsets/Mapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_resultsets/Mapper.java new file mode 100644 index 0000000..0eaf179 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_resultsets/Mapper.java @@ -0,0 +1,26 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.multiple_resultsets; + +import java.util.List; + +public interface Mapper { + + List> getUsersAndGroups(); + + List> multiResultsWithUpdate(); + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_resultsets/Mapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_resultsets/Mapper.xml new file mode 100644 index 0000000..e6e6aa4 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_resultsets/Mapper.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_resultsets/MultipleResultTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_resultsets/MultipleResultTest.java new file mode 100644 index 0000000..e69de29 diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_resultsets/OrderDetail.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_resultsets/OrderDetail.java new file mode 100644 index 0000000..dcae455 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_resultsets/OrderDetail.java @@ -0,0 +1,56 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.multiple_resultsets; + +public class OrderDetail { + + private int orderId; + private int lineNumber; + private int quantity; + private String itemDescription; + + public int getOrderId() { + return orderId; + } + + public void setOrderId(int orderId) { + this.orderId = orderId; + } + + public int getLineNumber() { + return lineNumber; + } + + public void setLineNumber(int lineNumber) { + this.lineNumber = lineNumber; + } + + public int getQuantity() { + return quantity; + } + + public void setQuantity(int quantity) { + this.quantity = quantity; + } + + public String getItemDescription() { + return itemDescription; + } + + public void setItemDescription(String itemDescription) { + this.itemDescription = itemDescription; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_resultsets/OrderHeader.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_resultsets/OrderHeader.java new file mode 100644 index 0000000..51bacf2 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multiple_resultsets/OrderHeader.java @@ -0,0 +1,39 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.multiple_resultsets; + +public class OrderHeader { + + private int orderId; + private String custName; + + public int getOrderId() { + return orderId; + } + + public void setOrderId(int orderId) { + this.orderId = orderId; + } + + public String getCustName() { + return custName; + } + + public void setCustName(String custName) { + this.custName = custName; + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleiterates/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleiterates/CreateDB.sql new file mode 100644 index 0000000..ff98d90 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleiterates/CreateDB.sql @@ -0,0 +1,27 @@ +-- +-- Copyright 2009-2013 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +drop table users if exists; + +create table users ( + id int, + name varchar(20), + first_attr_1 varchar(3), + first_attr_2 varchar(3), + second_attr_1 varchar(3), + second_attr_2 varchar(3), +); + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleiterates/Mapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleiterates/Mapper.java new file mode 100644 index 0000000..c4dd380 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleiterates/Mapper.java @@ -0,0 +1,24 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.multipleiterates; + +public interface Mapper { + + User getUser(Integer id); + + void insertUser(User user); + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleiterates/Mapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleiterates/Mapper.xml new file mode 100644 index 0000000..9659ace --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleiterates/Mapper.xml @@ -0,0 +1,58 @@ + + + + + + + + + + insert into users + (id, + name, + + first_attr_${index + 1} + + , + + second_attr_${index + 1} + + ) + values( + 1, + 'User1', + + #{attr} + + , + + #{attr} + + ) + + + \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleiterates/MultipleIteratesTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleiterates/MultipleIteratesTest.java new file mode 100644 index 0000000..f713826 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleiterates/MultipleIteratesTest.java @@ -0,0 +1,57 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.multipleiterates; + +import java.io.Reader; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.BeforeClass; +import org.junit.Test; + +public class MultipleIteratesTest { + + private static SqlSessionFactory sqlSessionFactory; + + @BeforeClass + public static void setUp() throws Exception { + // create a SqlSessionFactory + try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/multipleiterates/mybatis-config.xml")) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + } + + // populate in-memory database + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/multipleiterates/CreateDB.sql"); + } + + @Test + public void shouldGetAUser() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + User user = new User(); + user.setId(1); + user.setName("Justin"); + user.setFirstAttr(new String[] { "asd", "asd" }); + user.setSecondAttr(new String[] { "fds", "fds" }); + mapper.insertUser(user); + } + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleiterates/User.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleiterates/User.java new file mode 100644 index 0000000..b4f86a0 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleiterates/User.java @@ -0,0 +1,59 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.multipleiterates; + +public class User { + + private Integer id; + + private String name; + + private String[] firstAttr; + + private String[] secondAttr; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String[] getFirstAttr() { + return firstAttr; + } + + public void setFirstAttr(String[] firstAttr) { + this.firstAttr = firstAttr; + } + + public String[] getSecondAttr() { + return secondAttr; + } + + public void setSecondAttr(String[] secondAttr) { + this.secondAttr = secondAttr; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleiterates/mybatis-config.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleiterates/mybatis-config.xml new file mode 100644 index 0000000..7a34298 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleiterates/mybatis-config.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleresultsetswithassociation/CreateDB1.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleresultsetswithassociation/CreateDB1.sql new file mode 100644 index 0000000..a04a427 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleresultsetswithassociation/CreateDB1.sql @@ -0,0 +1,35 @@ +-- +-- Copyright 2009-2016 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + + DROP PROCEDURE GetOrderDetailsAndHeaders IF EXISTS; + DROP TABLE order_detail IF EXISTS; + DROP TABLE order_header IF EXISTS; + + CREATE TABLE order_detail + ( + order_id integer NOT NULL, + line_number integer NOT NULL, + quantity integer NOT NULL, + item_description varchar(50) NOT NULL, + PRIMARY KEY (order_id, line_number) + ); + + CREATE TABLE order_header + ( + order_id integer NOT NULL, + cust_name varchar(50) NOT NULL, + PRIMARY KEY (order_id) + ); diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleresultsetswithassociation/CreateDB2.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleresultsetswithassociation/CreateDB2.sql new file mode 100644 index 0000000..3e83948 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleresultsetswithassociation/CreateDB2.sql @@ -0,0 +1,32 @@ +-- +-- Copyright 2009-2016 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + + CREATE PROCEDURE GetOrderDetailsAndHeaders() + READS SQL DATA + DYNAMIC RESULT SETS 1 + BEGIN ATOMIC + + DECLARE result1 CURSOR FOR + SELECT * FROM order_detail + FOR READ ONLY ; + + DECLARE result2 CURSOR FOR + SELECT * FROM order_header + FOR READ ONLY ; + + OPEN result1 ; + OPEN result2 ; + END; diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleresultsetswithassociation/CreateDB3.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleresultsetswithassociation/CreateDB3.sql new file mode 100644 index 0000000..4bf7bbb --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleresultsetswithassociation/CreateDB3.sql @@ -0,0 +1,35 @@ +-- +-- Copyright 2009-2016 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + + INSERT INTO order_header(order_id, cust_name) + VALUES (1, 'Fred'); + INSERT INTO order_header(order_id, cust_name) + VALUES (2, 'Barney'); + INSERT INTO order_header(order_id, cust_name) + VALUES (3, 'Homer'); + + INSERT INTO order_detail(order_id, line_number, quantity, item_description) + VALUES (1, 1, 1, 'Pen'); + INSERT INTO order_detail(order_id, line_number, quantity, item_description) + VALUES (1, 2, 3, 'Pencil'); + INSERT INTO order_detail(order_id, line_number, quantity, item_description) + VALUES (1, 3, 2, 'Notepad'); + INSERT INTO order_detail(order_id, line_number, quantity, item_description) + VALUES (2, 1, 1, 'Compass'); + INSERT INTO order_detail(order_id, line_number, quantity, item_description) + VALUES (2, 2, 1, 'Protractor'); + INSERT INTO order_detail(order_id, line_number, quantity, item_description) + VALUES (2, 3, 2, 'Pencil'); diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleresultsetswithassociation/Mapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleresultsetswithassociation/Mapper.java new file mode 100644 index 0000000..00f5ff2 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleresultsetswithassociation/Mapper.java @@ -0,0 +1,34 @@ +/** + * Copyright 2009-2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.multipleresultsetswithassociation; + +import org.apache.ibatis.annotations.Options; +import org.apache.ibatis.annotations.ResultMap; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.mapping.StatementType; + +import java.util.List; + +public interface Mapper { + + List getOrderDetailsWithHeaders(); + + @Select(value = "{ call GetOrderDetailsAndHeaders() }") + @ResultMap("orderDetailResultMap") + @Options(statementType= StatementType.CALLABLE, resultSets="orderDetailResultSet,orderHeaderResultSet") + List getOrderDetailsWithHeadersAnnotationBased(); + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleresultsetswithassociation/Mapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleresultsetswithassociation/Mapper.xml new file mode 100644 index 0000000..0d756bc --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleresultsetswithassociation/Mapper.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleresultsetswithassociation/MultipleResultSetTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleresultsetswithassociation/MultipleResultSetTest.java new file mode 100644 index 0000000..ee7a2c3 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleresultsetswithassociation/MultipleResultSetTest.java @@ -0,0 +1,109 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.multipleresultsetswithassociation; + +import java.io.IOException; +import java.io.Reader; +import java.sql.Connection; +import java.util.List; + +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.jdbc.ScriptRunner; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; + +/* + * This class contains tests for multiple result sets with an association mapping. + * This test is based on the org.apache.ibatis.submitted.multiple_resultsets test. + * + */ +public class MultipleResultSetTest { + + private static SqlSessionFactory sqlSessionFactory; + + @BeforeClass + public static void setUp() throws Exception { + try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/multipleresultsetswithassociation/mybatis-config.xml")) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + } + + // populate in-memory database + // Could not get the table creation, procedure creation, and data population to work from the same script. + // Once it was in three scripts, all seemed well. + try (SqlSession session = sqlSessionFactory.openSession(); + Connection conn = session.getConnection()) { + try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/multipleresultsetswithassociation/CreateDB1.sql")) { + runReaderScript(conn, session, reader); + } + try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/multipleresultsetswithassociation/CreateDB2.sql")) { + runReaderScript(conn, session, reader); + } + try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/multipleresultsetswithassociation/CreateDB3.sql")) { + runReaderScript(conn, session, reader); + } + } + } + + private static void runReaderScript(Connection conn, SqlSession session, Reader reader) throws Exception { + ScriptRunner runner = new ScriptRunner(conn); + runner.setLogWriter(null); + runner.setSendFullScript(true); + runner.setAutoCommit(true); + runner.setStopOnError(false); + runner.runScript(reader); + } + + @Test + public void shouldGetOrderDetailsEachHavingAnOrderHeader() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + List orderDetails = mapper.getOrderDetailsWithHeaders(); + + // There are six order detail records in the database + // As long as the data does not change this should be successful + Assert.assertEquals(6, orderDetails.size()); + + // Each order detail should have a corresponding OrderHeader + // Only 2 of 6 orderDetails have orderHeaders + for(OrderDetail orderDetail : orderDetails){ + Assert.assertNotNull(orderDetail.getOrderHeader()); + } + } + } + + @Test + public void shouldGetOrderDetailsEachHavingAnOrderHeaderAnnotationBased() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + List orderDetails = mapper.getOrderDetailsWithHeadersAnnotationBased(); + + // There are six order detail records in the database + // As long as the data does not change this should be successful + Assert.assertEquals(6, orderDetails.size()); + + // Each order detail should have a corresponding OrderHeader + // Only 2 of 6 orderDetails have orderHeaders + for(OrderDetail orderDetail : orderDetails){ + Assert.assertNotNull(orderDetail.getOrderHeader()); + } + } + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleresultsetswithassociation/OrderDetail.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleresultsetswithassociation/OrderDetail.java new file mode 100644 index 0000000..74363ec --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleresultsetswithassociation/OrderDetail.java @@ -0,0 +1,66 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.multipleresultsetswithassociation; + +public class OrderDetail { + + private int orderId; + private int lineNumber; + private int quantity; + private String itemDescription; + + private OrderHeader orderHeader; + + public int getOrderId() { + return orderId; + } + + public void setOrderId(int orderId) { + this.orderId = orderId; + } + + public int getLineNumber() { + return lineNumber; + } + + public void setLineNumber(int lineNumber) { + this.lineNumber = lineNumber; + } + + public int getQuantity() { + return quantity; + } + + public void setQuantity(int quantity) { + this.quantity = quantity; + } + + public String getItemDescription() { + return itemDescription; + } + + public void setItemDescription(String itemDescription) { + this.itemDescription = itemDescription; + } + + public OrderHeader getOrderHeader() { + return orderHeader; + } + + public void setOrderHeader(OrderHeader orderHeader) { + this.orderHeader = orderHeader; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleresultsetswithassociation/OrderHeader.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleresultsetswithassociation/OrderHeader.java new file mode 100644 index 0000000..300d947 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleresultsetswithassociation/OrderHeader.java @@ -0,0 +1,39 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.multipleresultsetswithassociation; + +public class OrderHeader { + + private int orderId; + private String custName; + + public int getOrderId() { + return orderId; + } + + public void setOrderId(int orderId) { + this.orderId = orderId; + } + + public String getCustName() { + return custName; + } + + public void setCustName(String custName) { + this.custName = custName; + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleresultsetswithassociation/mybatis-config.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleresultsetswithassociation/mybatis-config.xml new file mode 100644 index 0000000..16c9fd5 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/multipleresultsetswithassociation/mybatis-config.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/named_constructor_args/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/named_constructor_args/CreateDB.sql new file mode 100644 index 0000000..f1a5862 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/named_constructor_args/CreateDB.sql @@ -0,0 +1,26 @@ +-- +-- Copyright 2009-2017 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +drop table users if exists; + +create table users ( + id int, + name varchar(20), + team int +); + +insert into users (id, name, team) values +(1, 'User1', 99); diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/named_constructor_args/InvalidNamedConstructorArgsTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/named_constructor_args/InvalidNamedConstructorArgsTest.java new file mode 100644 index 0000000..d5001fc --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/named_constructor_args/InvalidNamedConstructorArgsTest.java @@ -0,0 +1,115 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.named_constructor_args; + +import java.io.Reader; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.annotations.Arg; +import org.apache.ibatis.annotations.ConstructorArgs; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.builder.BuilderException; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.Configuration; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.BeforeClass; +import org.junit.Test; + +import static com.googlecode.catchexception.apis.BDDCatchException.*; +import static org.assertj.core.api.BDDAssertions.then; + +public class InvalidNamedConstructorArgsTest { + + private static SqlSessionFactory sqlSessionFactory; + + @BeforeClass + public static void setUp() throws Exception { + // create an SqlSessionFactory + try (Reader reader = Resources.getResourceAsReader( + "org/apache/ibatis/submitted/named_constructor_args/mybatis-config.xml")) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + } + + // populate in-memory database + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/named_constructor_args/CreateDB.sql"); + } + + interface NoMatchingConstructorMapper { + @ConstructorArgs({ + @Arg(column = "id", name = "noSuchConstructorArg"), + }) + @Select("select * from users ") + User select(); + } + + @Test + public void noMatchingConstructorArgName() { + Configuration configuration = sqlSessionFactory.getConfiguration(); + when(configuration).addMapper(NoMatchingConstructorMapper.class); + + then(caughtException()).isInstanceOf(BuilderException.class) + .hasMessageContaining( + "'org.apache.ibatis.submitted.named_constructor_args.InvalidNamedConstructorArgsTest$NoMatchingConstructorMapper.select-void'") + .hasMessageContaining("'org.apache.ibatis.submitted.named_constructor_args.User'") + .hasMessageContaining("[noSuchConstructorArg]"); + } + + interface ConstructorWithWrongJavaType { + // There is a constructor with arg name 'id', but + // its type is different from the specified javaType. + @ConstructorArgs({ + @Arg(column = "id", name = "id", javaType = Integer.class), + }) + @Select("select * from users ") + User select(); + } + + @Test + public void wrongJavaType() { + Configuration configuration = sqlSessionFactory.getConfiguration(); + when(configuration).addMapper(ConstructorWithWrongJavaType.class); + then(caughtException()).isInstanceOf(BuilderException.class) + .hasMessageContaining( + "'org.apache.ibatis.submitted.named_constructor_args.InvalidNamedConstructorArgsTest$ConstructorWithWrongJavaType.select-void'") + .hasMessageContaining("'org.apache.ibatis.submitted.named_constructor_args.User'") + .hasMessageContaining("[id]"); + } + + interface ConstructorMissingRequiresJavaType { + // There is a constructor with arg name 'id', but its type + // is different from the type of a property with the same name. + // javaType is required in this case. + // Debug log shows the detail of the matching error. + @ConstructorArgs({ + @Arg(column = "id", name = "id"), + }) + @Select("select * from users ") + User select(); + } + + @Test + public void missingRequiredJavaType() { + Configuration configuration = sqlSessionFactory.getConfiguration(); + when(configuration).addMapper(ConstructorMissingRequiresJavaType.class); + then(caughtException()).isInstanceOf(BuilderException.class) + .hasMessageContaining( + "'org.apache.ibatis.submitted.named_constructor_args.InvalidNamedConstructorArgsTest$ConstructorMissingRequiresJavaType.select-void'") + .hasMessageContaining("'org.apache.ibatis.submitted.named_constructor_args.User'") + .hasMessageContaining("[id]"); + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/named_constructor_args/Mapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/named_constructor_args/Mapper.java new file mode 100644 index 0000000..d46f0cc --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/named_constructor_args/Mapper.java @@ -0,0 +1,34 @@ +/** + * Copyright 2009-2017 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.named_constructor_args; + +import org.apache.ibatis.annotations.Arg; +import org.apache.ibatis.annotations.ConstructorArgs; +import org.apache.ibatis.annotations.Select; + +public interface Mapper { + + @ConstructorArgs({ + @Arg(column = "name", name = "name"), + @Arg(id = true, column = "id", name = "id"), + @Arg(column = "team", name = "team", javaType = String.class), + }) + @Select("select * from users where id = #{id}") + User mapConstructorWithParamAnnos(Integer id); + + User mapConstructorWithParamAnnosXml(Integer id); + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/named_constructor_args/Mapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/named_constructor_args/Mapper.xml new file mode 100644 index 0000000..7b1c57e --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/named_constructor_args/Mapper.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/named_constructor_args/NamedConstructorArgsTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/named_constructor_args/NamedConstructorArgsTest.java new file mode 100644 index 0000000..566c3c1 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/named_constructor_args/NamedConstructorArgsTest.java @@ -0,0 +1,73 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.named_constructor_args; + +import static org.junit.Assert.*; + +import java.io.Reader; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.Configuration; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.BeforeClass; +import org.junit.Test; + +public class NamedConstructorArgsTest { + + private static SqlSessionFactory sqlSessionFactory; + + @BeforeClass + public static void setUp() throws Exception { + // create an SqlSessionFactory + try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/named_constructor_args/mybatis-config.xml")) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + } + + Configuration configuration = sqlSessionFactory.getConfiguration(); + configuration.setUseActualParamName(false); + configuration.addMapper(Mapper.class); + + // populate in-memory database + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/named_constructor_args/CreateDB.sql"); + } + + @Test + public void argsWithParamAnnos() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + User user = mapper.mapConstructorWithParamAnnos(1); + assertEquals(Integer.valueOf(1), user.getId()); + assertEquals("User1", user.getName()); + assertEquals(Long.valueOf(99L), user.getTeam()); + } + } + + @Test + public void argsWithParamAnnosXml() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + User user = mapper.mapConstructorWithParamAnnosXml(1); + assertEquals(Integer.valueOf(1), user.getId()); + assertEquals("User1", user.getName()); + assertEquals(Long.valueOf(99L), user.getTeam()); + } + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/named_constructor_args/NamedConstructorArgsUseActualNameTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/named_constructor_args/NamedConstructorArgsUseActualNameTest.java new file mode 100644 index 0000000..901acc0 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/named_constructor_args/NamedConstructorArgsUseActualNameTest.java @@ -0,0 +1,68 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.named_constructor_args; + +import static org.junit.Assert.*; + +import java.io.Reader; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.BeforeClass; +import org.junit.Test; + +public class NamedConstructorArgsUseActualNameTest { + + private static SqlSessionFactory sqlSessionFactory; + + @BeforeClass + public static void setUp() throws Exception { + // create an SqlSessionFactory + try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/named_constructor_args/mybatis-config.xml")) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + } + + sqlSessionFactory.getConfiguration().addMapper(UseActualNameMapper.class); + + // populate in-memory database + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/named_constructor_args/CreateDB.sql"); + } + + @Test + public void argsByActualNames() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + UseActualNameMapper mapper = sqlSession.getMapper(UseActualNameMapper.class); + User user = mapper.mapConstructorWithoutParamAnnos(1); + assertEquals(Integer.valueOf(1), user.getId()); + assertEquals("User1", user.getName()); + } + } + + @Test + public void argsByActualNamesXml() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + UseActualNameMapper mapper = sqlSession.getMapper(UseActualNameMapper.class); + User user = mapper.mapConstructorWithoutParamAnnosXml(1); + assertEquals(Integer.valueOf(1), user.getId()); + assertEquals("User1", user.getName()); + } + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/named_constructor_args/UseActualNameMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/named_constructor_args/UseActualNameMapper.java new file mode 100644 index 0000000..38ee0f7 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/named_constructor_args/UseActualNameMapper.java @@ -0,0 +1,33 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.named_constructor_args; + +import org.apache.ibatis.annotations.Arg; +import org.apache.ibatis.annotations.ConstructorArgs; +import org.apache.ibatis.annotations.Select; + +public interface UseActualNameMapper { + + @ConstructorArgs({ + @Arg(column = "name", name = "name"), + @Arg(id = true, column = "id", name = "userId", javaType = Integer.class) + }) + @Select("select * from users where id = #{id}") + User mapConstructorWithoutParamAnnos(Integer id); + + User mapConstructorWithoutParamAnnosXml(Integer id); + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/named_constructor_args/UseActualNameMapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/named_constructor_args/UseActualNameMapper.xml new file mode 100644 index 0000000..4f52a2c --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/named_constructor_args/UseActualNameMapper.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/named_constructor_args/User.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/named_constructor_args/User.java new file mode 100644 index 0000000..39258cb --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/named_constructor_args/User.java @@ -0,0 +1,60 @@ +/** + * Copyright 2009-2017 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.named_constructor_args; + +import org.apache.ibatis.annotations.Param; + +public class User { + + private Integer id; + private String name; + private Long team; + + public User(@Param("id") String id) { + super(); + this.id = Integer.valueOf(id); + } + + public User(Integer userId, @Param("name") String userName) { + super(); + this.id = userId; + this.name = userName; + } + + public User(@Param("id") int id, @Param("name") String name, @Param("team") String team) { + super(); + // NOP constructor to make sure MyBatis performs strict type matching. + } + + public User(@Param("id") Integer id, @Param("name") String name, @Param("team") String team) { + super(); + this.id = id; + this.name = name; + this.team = Long.valueOf(team); + } + + public Integer getId() { + return id; + } + + public String getName() { + return name; + } + + public Long getTeam() { + return team; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/named_constructor_args/mybatis-config.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/named_constructor_args/mybatis-config.xml new file mode 100644 index 0000000..96acd88 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/named_constructor_args/mybatis-config.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested/CreateDB.sql new file mode 100644 index 0000000..4bf2458 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested/CreateDB.sql @@ -0,0 +1,28 @@ +-- +-- Copyright 2009-2016 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +create table names ( +id int, +firstName varchar(20), +lastName varchar(20) +); + +insert into names (id, firstName, lastName) values(1, 'Fred', 'Flintstone'); +insert into names (id, firstName, lastName) values(2, 'Wilma', 'Flintstone'); +insert into names (id, firstName, lastName) values(3, 'Pebbles', 'Flintstone'); +insert into names (id, firstName, lastName) values(4, 'Barney', 'Rubble'); +insert into names (id, firstName, lastName) values(5, 'Betty', 'Rubble'); +insert into names (id, firstName, lastName) values(6, 'Bamm Bamm', 'Rubble'); diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested/Mapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested/Mapper.java new file mode 100644 index 0000000..ae2ff03 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested/Mapper.java @@ -0,0 +1,25 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.nested; + +import java.util.List; +import java.util.Map; + +import org.apache.ibatis.annotations.Param; + +public interface Mapper { + List> simpleSelectWithMapperAndPrimitives(@Param("ids") int... values); +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested/MapperConfig.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested/MapperConfig.xml new file mode 100644 index 0000000..a9615db --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested/MapperConfig.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested/Name.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested/Name.java new file mode 100644 index 0000000..20b5aa6 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested/Name.java @@ -0,0 +1,44 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.nested; + +import java.util.ArrayList; +import java.util.List; + +public class Name { + private String lastName; + private List firstNames; + + public Name() { + firstNames = new ArrayList(); + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public List getFirstNames() { + return firstNames; + } + + public void addFirstName(String firstName) { + firstNames.add(firstName); + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested/NestedForEach.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested/NestedForEach.xml new file mode 100644 index 0000000..96caebd --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested/NestedForEach.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested/NestedForEachTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested/NestedForEachTest.java new file mode 100644 index 0000000..24646c8 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested/NestedForEachTest.java @@ -0,0 +1,125 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.nested; + +import static org.junit.Assert.assertEquals; + +import java.io.Reader; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.BeforeClass; +import org.junit.Test; + +public class NestedForEachTest { + + protected static SqlSessionFactory sqlSessionFactory; + + @BeforeClass + public static void setUp() throws Exception { + try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/nested/MapperConfig.xml")) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + } + + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/nested/CreateDB.sql"); + } + + @Test + public void testSimpleSelect() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Name name = new Name(); + name.setLastName("Flintstone"); + Parameter parameter = new Parameter(); + parameter.addName(name); + + List> answer = + sqlSession.selectList("org.apache.ibatis.submitted.nested.Mapper.simpleSelect", parameter); + + assertEquals(3, answer.size()); + } + } + + @Test + public void testSimpleSelectWithPrimitives() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Map parameter = new HashMap(); + int[] array = new int[] {1, 3, 5}; + parameter.put("ids", array); + + List> answer = + sqlSession.selectList("org.apache.ibatis.submitted.nested.Mapper.simpleSelectWithPrimitives", parameter); + + assertEquals(3, answer.size()); + } + } + + @Test + public void testSimpleSelectWithMapperAndPrimitives() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + List> answer = mapper.simpleSelectWithMapperAndPrimitives(1, 3, 5); + assertEquals(3, answer.size()); + } + } + + @Test + public void testNestedSelect() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Name name = new Name(); + name.setLastName("Flintstone"); + name.addFirstName("Fred"); + name.addFirstName("Wilma"); + + Parameter parameter = new Parameter(); + parameter.addName(name); + + List> answer = + sqlSession.selectList("org.apache.ibatis.submitted.nested.Mapper.nestedSelect", parameter); + + assertEquals(2, answer.size()); + } + } + + @Test + public void testNestedSelect2() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Name name = new Name(); + name.setLastName("Flintstone"); + name.addFirstName("Fred"); + name.addFirstName("Wilma"); + + Parameter parameter = new Parameter(); + parameter.addName(name); + + name = new Name(); + name.setLastName("Rubble"); + name.addFirstName("Betty"); + parameter.addName(name); + + List> answer = + sqlSession.selectList("org.apache.ibatis.submitted.nested.Mapper.nestedSelect", parameter); + + assertEquals(3, answer.size()); + } + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested/Parameter.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested/Parameter.java new file mode 100644 index 0000000..386b5c3 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested/Parameter.java @@ -0,0 +1,35 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.nested; + +import java.util.ArrayList; +import java.util.List; + +public class Parameter { + private List names; + + public Parameter() { + names = new ArrayList(); + } + + public List getNames() { + return names; + } + + public void addName(Name name) { + names.add(name); + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested_query_cache/AuthorMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested_query_cache/AuthorMapper.java new file mode 100644 index 0000000..816fc9c --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested_query_cache/AuthorMapper.java @@ -0,0 +1,24 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.nested_query_cache; + +import org.apache.ibatis.domain.blog.Author; + +public interface AuthorMapper { + + Author selectAuthor(int id); + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested_query_cache/AuthorMapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested_query_cache/AuthorMapper.xml new file mode 100644 index 0000000..23a8150 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested_query_cache/AuthorMapper.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested_query_cache/BlogMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested_query_cache/BlogMapper.java new file mode 100644 index 0000000..68b0b0f --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested_query_cache/BlogMapper.java @@ -0,0 +1,26 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.nested_query_cache; + +import org.apache.ibatis.domain.blog.Blog; + +public interface BlogMapper { + + Blog selectBlog(int id); + + Blog selectBlogUsingConstructor(int id); + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested_query_cache/BlogMapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested_query_cache/BlogMapper.xml new file mode 100644 index 0000000..577e087 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested_query_cache/BlogMapper.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested_query_cache/MapperConfig.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested_query_cache/MapperConfig.xml new file mode 100644 index 0000000..c6f91e8 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested_query_cache/MapperConfig.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested_query_cache/NestedQueryCacheTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested_query_cache/NestedQueryCacheTest.java new file mode 100644 index 0000000..52d2a74 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested_query_cache/NestedQueryCacheTest.java @@ -0,0 +1,90 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.nested_query_cache; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.domain.blog.Author; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.BeforeClass; +import org.junit.Test; + +import java.io.Reader; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.*; + +public class NestedQueryCacheTest extends BaseDataTest { + + private static SqlSessionFactory sqlSessionFactory; + + @BeforeClass + public static void setUp() throws Exception { + // create a SqlSessionFactory + try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/nested_query_cache/MapperConfig.xml")) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + } + + createBlogDataSource(); + } + + @Test + public void testThatNestedQueryItemsAreRetrievedFromCache() throws Exception { + final Author author; + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + final AuthorMapper authorMapper = sqlSession.getMapper(AuthorMapper.class); + author = authorMapper.selectAuthor(101); + + // ensure that author is cached + final Author cachedAuthor = authorMapper.selectAuthor(101); + assertThat(author).isSameAs(cachedAuthor); + } + + // open a new session + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + final BlogMapper blogMapper = sqlSession.getMapper(BlogMapper.class); + + // ensure that nested author within blog is cached + assertThat(blogMapper.selectBlog(1).getAuthor()).isSameAs(author); + assertThat(blogMapper.selectBlogUsingConstructor(1).getAuthor()).isSameAs(author); + } + } + + @Test + public void testThatNestedQueryItemsAreRetrievedIfNotInCache() throws Exception { + Author author; + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + final BlogMapper blogMapper = sqlSession.getMapper(BlogMapper.class); + author = blogMapper.selectBlog(1).getAuthor(); + + // ensure that nested author within blog is cached + assertNotNull("blog author", blogMapper.selectBlog(1).getAuthor()); + assertNotNull("blog author", blogMapper.selectBlogUsingConstructor(1).getAuthor()); + } + + // open a new session + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + final AuthorMapper authorMapper = sqlSession.getMapper(AuthorMapper.class); + Author cachedAuthor = authorMapper.selectAuthor(101); + + // ensure that nested author within blog is cached + assertThat(cachedAuthor).isSameAs(author); + } + + } +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested_query_cache/mapper.properties b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested_query_cache/mapper.properties new file mode 100644 index 0000000..8e2a956 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nested_query_cache/mapper.properties @@ -0,0 +1,19 @@ +# +# Copyright 2009-2016 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +url=jdbc:derby:ibderby;create=true +username= +password= diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler/CreateDB.sql new file mode 100644 index 0000000..23ccf49 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler/CreateDB.sql @@ -0,0 +1,39 @@ +-- +-- Copyright 2009-2016 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +drop table persons if exists; +drop table items if exists; + +create table persons ( + id int, + name varchar(20) +); + +create table items ( + id int, + owner int, + name varchar(20) +); + +insert into persons (id, name) values (1, 'grandma'); +insert into persons (id, name) values (2, 'sister'); +insert into persons (id, name) values (3, 'brother'); + +insert into items (id, owner, name) values (1, 1, 'book'); +insert into items (id, owner, name) values (2, 1, 'tv'); +insert into items (id, owner, name) values (3, 2, 'shoes'); +insert into items (id, owner, name) values (4, 3, 'car'); +insert into items (id, owner, name) values (5, 2, 'phone'); diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler/Item.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler/Item.java new file mode 100644 index 0000000..6a3b1d1 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler/Item.java @@ -0,0 +1,47 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.nestedresulthandler; + +public class Item { + private Integer id; + private String name; + + public String toString(){ + return new StringBuilder() + .append("Item(") + .append(id) + .append(", ") + .append(name) + .append(" )") + .toString(); + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler/Mapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler/Mapper.java new file mode 100644 index 0000000..fab9723 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler/Mapper.java @@ -0,0 +1,24 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.nestedresulthandler; + +import java.util.List; + +public interface Mapper { + List getPersons(); + List getPersonsWithItemsOrdered(); + List getPersonItemPairs(); +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler/Mapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler/Mapper.xml new file mode 100644 index 0000000..50bab69 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler/Mapper.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler/NestedResultHandlerTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler/NestedResultHandlerTest.java new file mode 100644 index 0000000..941d28e --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler/NestedResultHandlerTest.java @@ -0,0 +1,151 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.nestedresulthandler; + +import java.io.Reader; +import java.util.List; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.exceptions.PersistenceException; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.ResultContext; +import org.apache.ibatis.session.ResultHandler; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; + +public class NestedResultHandlerTest { + private static SqlSessionFactory sqlSessionFactory; + + @BeforeClass + public static void setUp() throws Exception { + // create a SqlSessionFactory + try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/nestedresulthandler/mybatis-config.xml")) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + } + + // populate in-memory database + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/nestedresulthandler/CreateDB.sql"); + } + + @Test + public void testGetPerson() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + + List persons = mapper.getPersons(); + + Person person = persons.get(0); + Assert.assertEquals("grandma", person.getName()); + Assert.assertTrue(person.owns("book")); + Assert.assertTrue(person.owns("tv")); + Assert.assertEquals(2, person.getItems().size()); + + person = persons.get(1); + Assert.assertEquals("sister", person.getName()); + Assert.assertTrue(person.owns("phone")); + Assert.assertTrue(person.owns("shoes")); + Assert.assertEquals(2, person.getItems().size()); + + person = persons.get(2); + Assert.assertEquals("brother", person.getName()); + Assert.assertTrue(person.owns("car")); + Assert.assertEquals(1, person.getItems().size()); + } + } + + @Test + // issue #542 + public void testGetPersonWithHandler() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + sqlSession.select("getPersons", new ResultHandler() { + public void handleResult(ResultContext context) { + Person person = (Person) context.getResultObject(); + if ("grandma".equals(person.getName())) { + Assert.assertEquals(2, person.getItems().size()); + } + } + }); + } + } + + @Test(expected=PersistenceException.class) + public void testUnorderedGetPersonWithHandler() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + sqlSession.select("getPersonsWithItemsOrdered", new ResultHandler() { + public void handleResult(ResultContext context) { + Person person = (Person) context.getResultObject(); + if ("grandma".equals(person.getName())) { + Assert.assertEquals(2, person.getItems().size()); + } + } + }); + } + } + + /** + * Fix bug caused by issue #542, see new issue #22 on github If we order by a + * nested result map attribute we can miss some records and end up with + * duplicates instead. + */ + @Test + public void testGetPersonOrderedByItem() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + + List persons = mapper.getPersonsWithItemsOrdered(); + + Person person = persons.get(0); + Assert.assertEquals("grandma", person.getName()); + Assert.assertTrue(person.owns("book")); + Assert.assertTrue(person.owns("tv")); + Assert.assertEquals(2, person.getItems().size()); + + person = persons.get(1); + Assert.assertEquals("brother", person.getName()); + Assert.assertTrue(person.owns("car")); + Assert.assertEquals(1, person.getItems().size()); + + person = persons.get(2); + Assert.assertEquals("sister", person.getName()); + Assert.assertTrue(person.owns("phone")); + Assert.assertTrue(person.owns("shoes")); + Assert.assertEquals(2, person.getItems().size()); + } + } + + @Test //reopen issue 39? (not a bug?) + public void testGetPersonItemPairs(){ + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + List pairs = mapper.getPersonItemPairs(); + + Assert.assertNotNull( pairs ); +// System.out.println( new StringBuilder().append("selected pairs: ").append(pairs) ); + + Assert.assertEquals(5, pairs.size() ); + Assert.assertNotNull(pairs.get(0).getPerson()); + Assert.assertEquals(pairs.get(0).getPerson().getId(), Integer.valueOf(1)); + Assert.assertNotNull(pairs.get(0).getItem()); + Assert.assertEquals( pairs.get(0).getItem().getId(), Integer.valueOf(1)); + } + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler/Person.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler/Person.java new file mode 100644 index 0000000..8e5ad3f --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler/Person.java @@ -0,0 +1,66 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.nestedresulthandler; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +public class Person { + private Integer id; + private String name; + private List items=new ArrayList(); + + public String toString(){ + return new StringBuilder() + .append("Person(") + .append(id) + .append(", ") + .append(name) + .append(", ") + .append(items) + .append(" )") + .toString(); + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Collection getItems() { + return items; + } + + public boolean owns(String name) { + for (Item item : getItems()) { + if (item.getName().equals(name)) + return true; + } + return false; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler/PersonItemPair.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler/PersonItemPair.java new file mode 100644 index 0000000..60f53a1 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler/PersonItemPair.java @@ -0,0 +1,50 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.nestedresulthandler; + +/** + * Created by eyal on 12/9/2015. + */ +public class PersonItemPair { + private Person person; + private Item item; + + public String toString(){ + return new StringBuilder() + .append("PersonItemPair(") + .append(person) + .append(", ") + .append(item) + .append(" )") + .toString(); + } + + public Person getPerson() { + return person; + } + + public void setPerson(Person person) { + this.person = person; + } + + public Item getItem() { + return item; + } + + public void setItem(Item item) { + this.item = item; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler/mybatis-config.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler/mybatis-config.xml new file mode 100644 index 0000000..d9a5cae --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler/mybatis-config.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_association/Account.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_association/Account.java new file mode 100644 index 0000000..8f3ce5b --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_association/Account.java @@ -0,0 +1,60 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.nestedresulthandler_association; + +import java.util.Date; + +public class Account { + private String accountUuid; + + private String accountName; + + private Date birthDate; + + private AccountAddress address; + + public String getAccountUuid() { + return accountUuid; + } + + public void setAccountUuid(String accountUuid) { + this.accountUuid = accountUuid; + } + + public String getAccountName() { + return accountName; + } + + public void setAccountName(String accountName) { + this.accountName = accountName; + } + + public Date getBirthDate() { + return birthDate; + } + + public void setBirthDate(Date birthDate) { + this.birthDate = birthDate; + } + + public AccountAddress getAddress() { + return address; + } + + public void setAddress(AccountAddress address) { + this.address = address; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_association/AccountAddress.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_association/AccountAddress.java new file mode 100644 index 0000000..aa62053 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_association/AccountAddress.java @@ -0,0 +1,48 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.nestedresulthandler_association; + +public class AccountAddress { + private String accountUuid; + + private String zipCode; + + private String address; + + public String getAccountUuid() { + return accountUuid; + } + + public void setAccountUuid(String accountUuid) { + this.accountUuid = accountUuid; + } + + public String getZipCode() { + return zipCode; + } + + public void setZipCode(String zipCode) { + this.zipCode = zipCode; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_association/AccountRepository.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_association/AccountRepository.xml new file mode 100644 index 0000000..d36e497 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_association/AccountRepository.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_association/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_association/CreateDB.sql new file mode 100644 index 0000000..394f1f2 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_association/CreateDB.sql @@ -0,0 +1,37 @@ +-- +-- Copyright 2009-2014 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +DROP TABLE t_account_address if exists; +DROP TABLE t_account if exists; +CREATE TABLE t_account( + account_uuid CHAR(36) PRIMARY KEY + ,account_name VARCHAR(256) + ,birth_date DATETIME +); +CREATE TABLE t_account_address( + account_uuid CHAR(36) PRIMARY KEY + ,zip_code CHAR(7) + ,address VARCHAR(256) +); + +INSERT INTO t_account (account_uuid,account_name,birth_date) VALUES ('4d3c8bdd-5379-4aeb-bc56-fcb01eb7cc01', 'Bob1', '2014-01-01 00:00:00.000'); +INSERT INTO t_account (account_uuid,account_name,birth_date) VALUES ('4d3c8bdd-5379-4aeb-bc56-fcb01eb7cc02', 'Bob2', '2014-01-02 00:00:00.000'); +INSERT INTO t_account (account_uuid,account_name,birth_date) VALUES ('4d3c8bdd-5379-4aeb-bc56-fcb01eb7cc03', 'Bob3', '2014-01-03 00:00:00.000'); +INSERT INTO t_account (account_uuid,account_name,birth_date) VALUES ('4d3c8bdd-5379-4aeb-bc56-fcb01eb7cc04', 'Bob4', '2014-01-04 00:00:00.000'); +INSERT INTO t_account (account_uuid,account_name,birth_date) VALUES ('4d3c8bdd-5379-4aeb-bc56-fcb01eb7cc05', 'Bob5', '2014-01-05 00:00:00.000'); +INSERT INTO t_account (account_uuid,account_name,birth_date) VALUES ('4d3c8bdd-5379-4aeb-bc56-fcb01eb7cc11', 'Mark1', '2014-02-01 00:00:00.000'); + +INSERT INTO t_account_address (account_uuid,zip_code,address) VALUES ('4d3c8bdd-5379-4aeb-bc56-fcb01eb7cc02', '1710051', 'Tokyo Toshimaku Nagasaki'); diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_association/NestedResultHandlerAssociationTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_association/NestedResultHandlerAssociationTest.java new file mode 100644 index 0000000..15f8f91 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_association/NestedResultHandlerAssociationTest.java @@ -0,0 +1,93 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.nestedresulthandler_association; + +import static org.junit.Assert.*; + +import java.io.Reader; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.ResultContext; +import org.apache.ibatis.session.ResultHandler; +import org.apache.ibatis.session.RowBounds; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.BeforeClass; +import org.junit.Test; + +public class NestedResultHandlerAssociationTest { + + private static SqlSessionFactory sqlSessionFactory; + + @BeforeClass + public static void setUp() throws Exception { + // create an SqlSessionFactory + try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/nestedresulthandler_association/mybatis-config.xml")) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + } + + // populate in-memory database + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/nestedresulthandler_association/CreateDB.sql"); + } + + @Test + public void shouldHandleRowBounds() throws Exception { + final SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd"); + Date targetMonth = fmt.parse("2014-01-01"); + final List accounts = new ArrayList(); + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + sqlSession.select("collectPageByBirthMonth", targetMonth, new RowBounds(1, 2), new ResultHandler() { + @Override + public void handleResult(ResultContext context) { + Account account = (Account) context.getResultObject(); + accounts.add(account); + } + }); + } + assertEquals(2, accounts.size()); + assertEquals("Bob2", accounts.get(0).getAccountName()); + assertEquals("Bob3", accounts.get(1).getAccountName()); + } + + @Test + public void shouldHandleStop() throws Exception { + final SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd"); + final List accounts = new ArrayList(); + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Date targetMonth = fmt.parse("2014-01-01"); + sqlSession.select("collectPageByBirthMonth", targetMonth, new ResultHandler() { + @Override + public void handleResult(ResultContext context) { + Account account = (Account) context.getResultObject(); + accounts.add(account); + if (accounts.size() > 1) + context.stop(); + } + }); + } + assertEquals(2, accounts.size()); + assertEquals("Bob1", accounts.get(0).getAccountName()); + assertEquals("Bob2", accounts.get(1).getAccountName()); + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_association/mybatis-config.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_association/mybatis-config.xml new file mode 100644 index 0000000..7a09a05 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_association/mybatis-config.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_multiple_association/Binome.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_multiple_association/Binome.java new file mode 100644 index 0000000..a465ed7 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_multiple_association/Binome.java @@ -0,0 +1,66 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.nestedresulthandler_multiple_association; + +public class Binome { + private T one; + private U two; + + public Binome() { + } + + public Binome(final T one, final U two) { + this.one = one; + this.two = two; + } + + public T getOne() { + return one; + } + + public void setOne(T one) { + this.one = one; + } + + public U getTwo() { + return two; + } + + public void setTwo(U two) { + this.two = two; + } + + @Override + public int hashCode() { + return (one != null ? one.hashCode() : 0) + + (two != null ? two.hashCode() : 0); + } + + @Override + public boolean equals(final Object obj) { + if (obj instanceof Binome) { + Binome bin = (Binome) obj; + return one != null && one.equals(bin.getOne()) && two != null + && two.equals(bin.getTwo()); + } + return super.equals(obj); + } + + @Override + public String toString() { + return "Binome [one=" + one + ", two=" + two + "]"; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_multiple_association/ChildBean.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_multiple_association/ChildBean.java new file mode 100644 index 0000000..a344e26 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_multiple_association/ChildBean.java @@ -0,0 +1,42 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.nestedresulthandler_multiple_association; + +public class ChildBean { + private Integer id; + private String value; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + @Override + public String toString() { + return "ChildBean [id=" + id + ", value=" + value + "]"; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_multiple_association/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_multiple_association/CreateDB.sql new file mode 100644 index 0000000..0299425 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_multiple_association/CreateDB.sql @@ -0,0 +1,45 @@ +-- +-- Copyright 2009-2014 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +DROP TABLE parent if exists; +DROP TABLE child if exists; +create table parent( + id integer, + value varchar(20) +); + +create table child( + id integer, + value varchar(20) +); + +create table parent_child( + idparent integer, + idchild_from integer, + idchild_to integer +); + +insert into parent (id, value) values (1, 'parent1'); +insert into parent (id, value) values (2, 'parent2'); + +insert into child (id, value) values (1, 'child1'); +insert into child (id, value) values (2, 'child2'); +insert into child (id, value) values (3, 'child3'); +insert into child (id, value) values (4, 'child4'); + +insert into parent_child (idparent, idchild_from, idchild_to) values (1, 1, 2); +insert into parent_child (idparent, idchild_from, idchild_to) values (2, 2, 3); +insert into parent_child (idparent, idchild_from, idchild_to) values (2, 1, 2); \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_multiple_association/NestedResultHandlerMultipleAssociationTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_multiple_association/NestedResultHandlerMultipleAssociationTest.java new file mode 100644 index 0000000..11aa1a2 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_multiple_association/NestedResultHandlerMultipleAssociationTest.java @@ -0,0 +1,84 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.nestedresulthandler_multiple_association; + +import java.io.Reader; + +import java.util.List; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; + +public class NestedResultHandlerMultipleAssociationTest { + + private static SqlSessionFactory sqlSessionFactory; + + @BeforeClass + public static void setUp() throws Exception { + // create an SqlSessionFactory + try (Reader reader = Resources + .getResourceAsReader("org/apache/ibatis/submitted/nestedresulthandler_multiple_association/mybatis-config.xml")) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + } + + // populate in-memory database + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/nestedresulthandler_multiple_association/CreateDB.sql"); + } + + @Test + public void failure() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + + // Parents have child going from somewhere to somewhere, they are stored in + // a Binome object + // In this test we have 2 parents: + // Parent1 is going from Child1 to Child2 + // Parent2 is going from Child2 to Child3 and from Child1 to Child2 + // You'll see a NULL entry in the list instead of the Binome Child1/Child2 + List list = sqlSession.selectList("selectParentBeans"); + for (ParentBean pb : list) { + for (Binome childs : pb.getChilds()) { + Assert.assertNotNull(childs); + Assert.assertNotNull(childs.getOne()); + Assert.assertNotNull(childs.getTwo()); + } + } + } + } + + @Test + public void success() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + + ParentBean parent = sqlSession.selectOne("selectParentBeanById", 2); + + // If you only select the Parent2 it works + for (Binome childs : parent.getChilds()) { + Assert.assertNotNull(childs); + Assert.assertNotNull(childs.getOne()); + Assert.assertNotNull(childs.getTwo()); + } + } + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_multiple_association/ParentBean.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_multiple_association/ParentBean.java new file mode 100644 index 0000000..ed43f7c --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_multiple_association/ParentBean.java @@ -0,0 +1,58 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.nestedresulthandler_multiple_association; + +import java.util.List; + +public class ParentBean { + private Integer id; + private String value; + private List> childs; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public List> getChilds() { + return childs; + } + + public void setChilds(List> childs) { + this.childs = childs; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder("ParentBean [id=" + id + ", value=" + + value + "]\nChilds:\n"); + for (Binome binome : childs) { + sb.append("\tChild : ").append(binome).append('\n'); + } + return sb.toString(); + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_multiple_association/mapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_multiple_association/mapper.xml new file mode 100644 index 0000000..46f4fea --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_multiple_association/mapper.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_multiple_association/mybatis-config.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_multiple_association/mybatis-config.xml new file mode 100644 index 0000000..6bcddcf --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nestedresulthandler_multiple_association/mybatis-config.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/no_param_type/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/no_param_type/CreateDB.sql new file mode 100644 index 0000000..7b9fa9a --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/no_param_type/CreateDB.sql @@ -0,0 +1,22 @@ +-- +-- Copyright 2009-2016 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +drop table users if exists; + +create table users ( + id int, + name varchar(20) +); diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/no_param_type/Mapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/no_param_type/Mapper.xml new file mode 100644 index 0000000..39fb4b8 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/no_param_type/Mapper.xml @@ -0,0 +1,33 @@ + + + + + + + + insert into users (id, name) values (#{id}, #{name}) + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/no_param_type/NoParamTypeTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/no_param_type/NoParamTypeTest.java new file mode 100644 index 0000000..001cf1c --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/no_param_type/NoParamTypeTest.java @@ -0,0 +1,112 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.no_param_type; + +import static org.junit.Assert.*; + +import java.io.Reader; +import java.util.List; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.executor.BatchResult; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.ExecutorType; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.BeforeClass; +import org.junit.Test; + +public class NoParamTypeTest { + + private static SqlSessionFactory sqlSessionFactory; + + @BeforeClass + public static void setUp() throws Exception { + // create a SqlSessionFactory + try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/no_param_type/mybatis-config.xml")) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + } + + // populate in-memory database + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/no_param_type/CreateDB.sql"); + } + + @Test + public void shouldAcceptDifferentTypeInTheSameBatch() { + try (SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH)) { + ObjA a = new ObjA(); + a.setId(1); + a.setName(111); + sqlSession.insert("insertUser", a); + ObjB b = new ObjB(); + b.setId(2); + b.setName("222"); + sqlSession.insert("insertUser", b); + List batchResults = sqlSession.flushStatements(); + batchResults.clear(); + sqlSession.clearCache(); + sqlSession.commit(); + List users = sqlSession.selectList("selectUser"); + assertEquals(2, users.size()); + } + } + + public static class ObjA { + private Integer id; + + private Integer name; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Integer getName() { + return name; + } + + public void setName(Integer name) { + this.name = name; + } + } + + public static class ObjB { + private Integer id; + + private String name; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/no_param_type/User.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/no_param_type/User.java new file mode 100644 index 0000000..c8cf340 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/no_param_type/User.java @@ -0,0 +1,38 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.no_param_type; + +public class User { + + private Integer id; + private String name; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/no_param_type/mybatis-config.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/no_param_type/mybatis-config.xml new file mode 100644 index 0000000..a017d5d --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/no_param_type/mybatis-config.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nonexistentvariables/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nonexistentvariables/CreateDB.sql new file mode 100644 index 0000000..433c936 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nonexistentvariables/CreateDB.sql @@ -0,0 +1,25 @@ +-- +-- Copyright 2009-2016 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +-- WARNING: this file MUST be saved in UTF-8 +create table names ( +id int, +firstName varchar(20), +lastName varchar(20) +); + +insert into names (id, firstName, lastName) values(1, 'John', 'Smith'); +insert into names (id, firstName, lastName) values(2, 'Sara', 'Gomez'); diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nonexistentvariables/Mapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nonexistentvariables/Mapper.java new file mode 100644 index 0000000..96fa52f --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nonexistentvariables/Mapper.java @@ -0,0 +1,20 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.nonexistentvariables; + +public interface Mapper { + int count(int id, String name); +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nonexistentvariables/NonExistentVariablesTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nonexistentvariables/NonExistentVariablesTest.java new file mode 100644 index 0000000..cbc1d8c --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nonexistentvariables/NonExistentVariablesTest.java @@ -0,0 +1,53 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.nonexistentvariables; + +import static org.junit.Assert.fail; + +import java.io.Reader; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.exceptions.PersistenceException; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.BeforeClass; +import org.junit.Test; + +public class NonExistentVariablesTest { + + protected static SqlSessionFactory sqlSessionFactory; + + @BeforeClass + public static void setUp() throws Exception { + try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/nonexistentvariables/mybatis-config.xml")) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + } + + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/nonexistentvariables/CreateDB.sql"); + } + + @Test(expected = PersistenceException.class) + public void testWrongParameter() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + mapper.count(1, "John"); + fail("should have failed"); + } + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nonexistentvariables/mappers.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nonexistentvariables/mappers.xml new file mode 100644 index 0000000..7f9fd30 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nonexistentvariables/mappers.xml @@ -0,0 +1,27 @@ + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nonexistentvariables/mybatis-config.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nonexistentvariables/mybatis-config.xml new file mode 100644 index 0000000..d46fe14 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/nonexistentvariables/mybatis-config.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/not_null_column/Base.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/not_null_column/Base.java new file mode 100644 index 0000000..ca61f91 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/not_null_column/Base.java @@ -0,0 +1,35 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.not_null_column; + +import java.util.Date; + +public abstract class Base { + private int tempIntField; + private Date tempDateField; + public int getTempIntField() { + return tempIntField; + } + public void setTempIntField(int tempIntField) { + this.tempIntField = tempIntField; + } + public Date getTempDateField() { + return tempDateField; + } + public void setTempDateField(Date tempDateField) { + this.tempDateField = tempDateField; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/not_null_column/Child.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/not_null_column/Child.java new file mode 100644 index 0000000..21f3128 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/not_null_column/Child.java @@ -0,0 +1,44 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.not_null_column; + +public class Child extends Base { + private Integer id; + private Integer fatherId; + private String name; + public Integer getId() { + return id; + } + public void setId(Integer id) { + this.id = id; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + + public Integer getFatherId() + { + return fatherId; + } + + public void setFatherId(Integer fatherId) + { + this.fatherId = fatherId; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/not_null_column/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/not_null_column/CreateDB.sql new file mode 100644 index 0000000..18508c8 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/not_null_column/CreateDB.sql @@ -0,0 +1,35 @@ +-- +-- Copyright 2009-2016 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +create table Child ( + id int, + name varchar(100), + father_id int +); +create table Father ( + id int, + name varchar(100) +); + +INSERT INTO Child (id, name, father_id) +VALUES (1, 'John Smith jr 1', 1); +INSERT INTO Child (id, name, father_id) +VALUES (2, 'John Smith jr 2', 1); + +INSERT INTO Father (id, name) +VALUES (1, 'John Smith'); +INSERT INTO Father (id, name) +VALUES (2, 'Christian Poitras'); diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/not_null_column/Father.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/not_null_column/Father.java new file mode 100644 index 0000000..92e6c58 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/not_null_column/Father.java @@ -0,0 +1,48 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.not_null_column; + +import java.util.List; + +public class Father extends Base { + private Integer id; + private String name; + private List children; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getChildren() { + return children; + } + + public void setChildren(List children) { + this.children = children; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/not_null_column/FatherMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/not_null_column/FatherMapper.java new file mode 100644 index 0000000..c2f0d33 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/not_null_column/FatherMapper.java @@ -0,0 +1,26 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.not_null_column; + +public interface FatherMapper { + public Father selectByIdNoFid(Integer id); + public Father selectByIdFid(Integer id); + public Father selectByIdWithInternalResultMap(Integer id); + public Father selectByIdWithRefResultMap(Integer id); + public Father selectByIdFidMultipleNullColumns(Integer id); + public Father selectByIdFidMultipleNullColumnsAndBrackets(Integer id); + public Father selectByIdFidWorkaround(Integer id); +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/not_null_column/FatherMapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/not_null_column/FatherMapper.xml new file mode 100644 index 0000000..62373e6 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/not_null_column/FatherMapper.xml @@ -0,0 +1,151 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/not_null_column/NotNullColumnTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/not_null_column/NotNullColumnTest.java new file mode 100644 index 0000000..35cb45b --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/not_null_column/NotNullColumnTest.java @@ -0,0 +1,139 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.not_null_column; + +import static org.junit.Assert.*; + +import java.io.Reader; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.BeforeClass; +import org.junit.Test; + +public class NotNullColumnTest { + + private static SqlSessionFactory sqlSessionFactory; + + @BeforeClass + public static void initDatabase() throws Exception { + try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/not_null_column/ibatisConfig.xml")) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + } + + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/not_null_column/CreateDB.sql"); + } + + @Test + public void testNotNullColumnWithChildrenNoFid() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + FatherMapper fatherMapper = sqlSession.getMapper(FatherMapper.class); + + Father test = fatherMapper.selectByIdNoFid(1); + assertNotNull(test); + assertNotNull(test.getChildren()); + assertEquals(2, test.getChildren().size()); + } + } + + @Test + public void testNotNullColumnWithoutChildrenNoFid() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + FatherMapper fatherMapper = sqlSession.getMapper(FatherMapper.class); + + Father test = fatherMapper.selectByIdNoFid(2); + assertNotNull(test); + assertNotNull(test.getChildren()); + assertTrue(test.getChildren().isEmpty()); + } + } + + @Test + public void testNotNullColumnWithoutChildrenFid() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + FatherMapper fatherMapper = sqlSession.getMapper(FatherMapper.class); + + Father test = fatherMapper.selectByIdFid(2); + assertNotNull(test); + assertNotNull(test.getChildren()); + assertTrue(test.getChildren().isEmpty()); + } + } + + @Test + public void testNotNullColumnWithoutChildrenWithInternalResultMap() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + FatherMapper fatherMapper = sqlSession.getMapper(FatherMapper.class); + + Father test = fatherMapper.selectByIdWithInternalResultMap(2); + assertNotNull(test); + assertNotNull(test.getChildren()); + assertTrue(test.getChildren().isEmpty()); + } + } + + @Test + public void testNotNullColumnWithoutChildrenWithRefResultMap() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + FatherMapper fatherMapper = sqlSession.getMapper(FatherMapper.class); + + Father test = fatherMapper.selectByIdWithRefResultMap(2); + assertNotNull(test); + assertNotNull(test.getChildren()); + assertTrue(test.getChildren().isEmpty()); + } + } + + @Test + public void testNotNullColumnWithoutChildrenFidMultipleNullColumns() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + FatherMapper fatherMapper = sqlSession.getMapper(FatherMapper.class); + + Father test = fatherMapper.selectByIdFidMultipleNullColumns(2); + assertNotNull(test); + assertNotNull(test.getChildren()); + assertTrue(test.getChildren().isEmpty()); + } + } + + @Test + public void testNotNullColumnWithoutChildrenFidMultipleNullColumnsAndBrackets() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + FatherMapper fatherMapper = sqlSession.getMapper(FatherMapper.class); + + Father test = fatherMapper.selectByIdFidMultipleNullColumnsAndBrackets(2); + assertNotNull(test); + assertNotNull(test.getChildren()); + assertTrue(test.getChildren().isEmpty()); + } + } + + @Test + public void testNotNullColumnWithoutChildrenFidWorkaround() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + FatherMapper fatherMapper = sqlSession.getMapper(FatherMapper.class); + + Father test = fatherMapper.selectByIdFidWorkaround(2); + assertNotNull(test); + assertNotNull(test.getChildren()); + assertTrue(test.getChildren().isEmpty()); + } + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/not_null_column/ibatisConfig.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/not_null_column/ibatisConfig.xml new file mode 100644 index 0000000..929996f --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/not_null_column/ibatisConfig.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/null_associations/Bar.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/null_associations/Bar.java new file mode 100644 index 0000000..1d54eae --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/null_associations/Bar.java @@ -0,0 +1,61 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.null_associations; + +import java.io.Serializable; + +public class Bar implements Serializable { + + private long field1; + private long field2; + private long field3; + + public Bar() { + super(); + } + + public Bar(long field1, long field2, long field3) { + super(); + this.field1 = field1; + this.field2 = field2; + this.field3 = field3; + } + + public long getField1() { + return field1; + } + + public void setField1(long field1) { + this.field1 = field1; + } + + public long getField2() { + return field2; + } + + public void setField2(long field2) { + this.field2 = field2; + } + + public long getField3() { + return field3; + } + + public void setField3(long field3) { + this.field3 = field3; + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/null_associations/Foo.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/null_associations/Foo.java new file mode 100644 index 0000000..c0c7de0 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/null_associations/Foo.java @@ -0,0 +1,61 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.null_associations; + +import java.io.Serializable; + +public class Foo implements Serializable { + + private long field1; + private Bar field2; + private boolean field3; + + public Foo() { + super(); + } + + public Foo(long field1, Bar field2, boolean field3) { + super(); + this.field1 = field1; + this.field2 = field2; + this.field3 = field3; + } + + public long getField1() { + return field1; + } + + public void setField1(long field1) { + this.field1 = field1; + } + + public Bar getField2() { + return field2; + } + + public void setField2(Bar field2) { + this.field2 = field2; + } + + public boolean isField3() { + return field3; + } + + public void setField3(boolean field3) { + this.field3 = field3; + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/null_associations/FooMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/null_associations/FooMapper.java new file mode 100644 index 0000000..b044548 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/null_associations/FooMapper.java @@ -0,0 +1,26 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.null_associations; + +public interface FooMapper { + + void insertFoo(Foo foo); + + Foo selectFoo(); + + int deleteAllFoo(); + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/null_associations/FooMapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/null_associations/FooMapper.xml new file mode 100644 index 0000000..10fe526 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/null_associations/FooMapper.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + insert into FOO ( + F_FIELD1, + F_FIELD2_FIELD1, + F_FIELD2_FIELD2, + F_FIELD2_FIELD3, + F_FIELD3 + ) values ( + #{field1,jdbcType=BIGINT}, + #{field2.field1,jdbcType=BIGINT}, + #{field2.field2,jdbcType=BIGINT}, + #{field2.field3,jdbcType=BIGINT}, + #{field3,jdbcType=BOOLEAN} + ) + + + + + + delete from FOO; + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/null_associations/FooMapperTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/null_associations/FooMapperTest.java new file mode 100644 index 0000000..6b3fe86 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/null_associations/FooMapperTest.java @@ -0,0 +1,85 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.null_associations; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.*; + +import java.sql.Connection; +import java.sql.SQLException; + +public class FooMapperTest { + + private final static String SQL_MAP_CONFIG = "org/apache/ibatis/submitted/null_associations/sqlmap.xml"; + private static SqlSession session; + private static Connection conn; + + @BeforeClass + public static void setUpBeforeClass() throws Exception { + final SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader(SQL_MAP_CONFIG)); + session = factory.openSession(); + conn = session.getConnection(); + + BaseDataTest.runScript(factory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/null_associations/create-schema-mysql.sql"); + } + + @Before + public void setUp() { + final FooMapper mapper = session.getMapper(FooMapper.class); + mapper.deleteAllFoo(); + session.commit(); + } + + @Test + public void testNullAssociation() { + final FooMapper mapper = session.getMapper(FooMapper.class); + final Foo foo = new Foo(1L, null, true); + mapper.insertFoo(foo); + session.commit(); + final Foo read = mapper.selectFoo(); + Assert.assertEquals("Invalid mapping", 1L, read.getField1()); + Assert.assertNull("Invalid mapping - field2 (Bar) should be null", read.getField2()); + Assert.assertTrue("Invalid mapping", read.isField3()); + } + + @Test + public void testNotNullAssociation() { + final FooMapper mapper = session.getMapper(FooMapper.class); + final Bar bar = new Bar(1L, 2L, 3L); + final Foo foo = new Foo(1L, bar, true); + mapper.insertFoo(foo); + session.commit(); + final Foo read = mapper.selectFoo(); + Assert.assertEquals("Invalid mapping", 1L, read.getField1()); + Assert.assertNotNull("Bar should be not null", read.getField2()); + Assert.assertTrue("Invalid mapping", read.isField3()); + Assert.assertEquals("Invalid mapping", 1L, read.getField2().getField1()); + Assert.assertEquals("Invalid mapping", 2L, read.getField2().getField2()); + Assert.assertEquals("Invalid mapping", 3L, read.getField2().getField3()); + } + + @AfterClass + public static void tearDownAfterClass() throws SQLException { + conn.close(); + session.close(); + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/null_associations/create-schema-mysql.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/null_associations/create-schema-mysql.sql new file mode 100644 index 0000000..aa67307 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/null_associations/create-schema-mysql.sql @@ -0,0 +1,23 @@ +-- +-- Copyright 2009-2016 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +CREATE TABLE FOO ( +F_FIELD1 BIGINT NOT NULL, +F_FIELD2_FIELD1 BIGINT, +F_FIELD2_FIELD2 BIGINT, +F_FIELD2_FIELD3 BIGINT, +F_FIELD3 BOOLEAN NOT NULL +); diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/null_associations/sqlmap.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/null_associations/sqlmap.xml new file mode 100644 index 0000000..4c09dd7 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/null_associations/sqlmap.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognl_enum/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognl_enum/CreateDB.sql new file mode 100644 index 0000000..aa80453 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognl_enum/CreateDB.sql @@ -0,0 +1,31 @@ +-- +-- Copyright 2009-2016 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +create table person ( + id int, + firstName varchar(100), + lastName varchar(100), + personType varchar(100) DEFAULT NULL +); + +INSERT INTO person (id, firstName, lastName, personType) +VALUES (1, 'John', 'Smith', 'DIRECTOR'); + +INSERT INTO person (id, firstName, lastName, personType) +VALUES (2, 'Christian', 'Poitras', null); + +INSERT INTO person (id, firstName, lastName, personType) +VALUES (3, 'Clinton', 'Begin', 'EMPLOYEE'); diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognl_enum/EnumWithOgnlTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognl_enum/EnumWithOgnlTest.java new file mode 100644 index 0000000..7ade6ac --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognl_enum/EnumWithOgnlTest.java @@ -0,0 +1,99 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.ognl_enum; + +import java.io.Reader; +import java.util.List; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.apache.ibatis.submitted.ognl_enum.Person.Type; +import org.apache.ibatis.submitted.ognl_enum.PersonMapper.PersonType; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; + +public class EnumWithOgnlTest { + + private static SqlSessionFactory sqlSessionFactory; + + @BeforeClass + public static void initDatabase() throws Exception { + try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/ognl_enum/ibatisConfig.xml")) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + } + + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/ognl_enum/CreateDB.sql"); + } + + @Test + public void testEnumWithOgnl() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + PersonMapper personMapper = sqlSession.getMapper(PersonMapper.class); + List persons = personMapper.selectAllByType(null); + Assert.assertEquals("Persons must contain 3 persons", 3, persons.size()); + } + } + + @Test + public void testEnumWithOgnlDirector() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + PersonMapper personMapper = sqlSession.getMapper(PersonMapper.class); + List persons = personMapper.selectAllByType(Person.Type.DIRECTOR); + Assert.assertEquals("Persons must contain 1 persons", 1, persons.size()); + } + } + + @Test + public void testEnumWithOgnlDirectorNameAttribute() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + PersonMapper personMapper = sqlSession.getMapper(PersonMapper.class); + List persons = personMapper.selectAllByTypeNameAttribute(Person.Type.DIRECTOR); + Assert.assertEquals("Persons must contain 1 persons", 1, persons.size()); + } + } + + @Test + public void testEnumWithOgnlDirectorWithInterface() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + PersonMapper personMapper = sqlSession.getMapper(PersonMapper.class); + List persons = personMapper.selectAllByTypeWithInterface(new PersonType() { + @Override + public Type getType() { + return Person.Type.DIRECTOR; + } + }); + Assert.assertEquals("Persons must contain 1 persons", 1, persons.size()); + } + } + @Test + public void testEnumWithOgnlDirectorNameAttributeWithInterface() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + PersonMapper personMapper = sqlSession.getMapper(PersonMapper.class); + List persons = personMapper.selectAllByTypeNameAttributeWithInterface(new PersonType() { + @Override + public Type getType() { + return Person.Type.DIRECTOR; + } + }); + Assert.assertEquals("Persons must contain 1 persons", 1, persons.size()); + } + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognl_enum/Person.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognl_enum/Person.java new file mode 100644 index 0000000..d106b83 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognl_enum/Person.java @@ -0,0 +1,45 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.ognl_enum; + +public class Person { + public enum Type { + EMPLOYEE, + DIRECTOR + } + + private Long id; + private String firstName; + private String lastName; + public String getFirstName() { + return firstName; + } + public void setFirstName(String firstName) { + this.firstName = firstName; + } + public String getLastName() { + return lastName; + } + public void setLastName(String lastName) { + this.lastName = lastName; + } + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognl_enum/Person.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognl_enum/Person.xml new file mode 100644 index 0000000..17cc37d --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognl_enum/Person.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognl_enum/PersonMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognl_enum/PersonMapper.java new file mode 100644 index 0000000..85dd399 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognl_enum/PersonMapper.java @@ -0,0 +1,30 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.ognl_enum; + +import java.util.List; + +public interface PersonMapper { + + public interface PersonType { + public Person.Type getType(); + } + + public List selectAllByType(Person.Type type); + public List selectAllByTypeNameAttribute(Person.Type type); + public List selectAllByTypeWithInterface(PersonType personType); + public List selectAllByTypeNameAttributeWithInterface(PersonType personType); +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognl_enum/ibatisConfig.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognl_enum/ibatisConfig.xml new file mode 100644 index 0000000..690954a --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognl_enum/ibatisConfig.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognlstatic/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognlstatic/CreateDB.sql new file mode 100644 index 0000000..2354824 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognlstatic/CreateDB.sql @@ -0,0 +1,24 @@ +-- +-- Copyright 2009-2016 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +drop table users if exists; + +create table users ( + id int, + name varchar(20) +); + +insert into users (id, name) values(1, 'User1'); diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognlstatic/Mapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognlstatic/Mapper.java new file mode 100644 index 0000000..327270d --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognlstatic/Mapper.java @@ -0,0 +1,23 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.ognlstatic; + +public interface Mapper { + + User getUserStatic(Integer id); + User getUserIfNode(String id); + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognlstatic/Mapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognlstatic/Mapper.xml new file mode 100644 index 0000000..453b512 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognlstatic/Mapper.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognlstatic/OgnlStaticTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognlstatic/OgnlStaticTest.java new file mode 100644 index 0000000..49d9987 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognlstatic/OgnlStaticTest.java @@ -0,0 +1,71 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.ognlstatic; + +import java.io.Reader; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; + +public class OgnlStaticTest { + + private static SqlSessionFactory sqlSessionFactory; + + @BeforeClass + public static void setUp() throws Exception { + // create a SqlSessionFactory + try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/ognlstatic/mybatis-config.xml")) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + } + + // populate in-memory database + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/ognlstatic/CreateDB.sql"); + } + + /** + * This is the log output. + * DEBUG [main] - ooo Using Connection [org.hsqldb.jdbc.JDBCConnection@5ae1a5c7] + * DEBUG [main] - ==> Preparing: SELECT * FROM users WHERE name IN (?) AND id = ? + * DEBUG [main] - ==> Parameters: 1(Integer), 1(Integer) + * There are two parameter mappings but DefaulParameterHandler maps them both to input paremeter (integer) + */ + @Test // see issue #448 + public void shouldGetAUserStatic() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + User user = mapper.getUserStatic(1); + Assert.assertNotNull(user); + Assert.assertEquals("User1", user.getName()); + } + } + + @Test // see issue #61 (gh) + public void shouldGetAUserWithIfNode() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + User user = mapper.getUserIfNode("User1"); + Assert.assertEquals("User1", user.getName()); + } + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognlstatic/StaticClass.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognlstatic/StaticClass.java new file mode 100644 index 0000000..4b9fd3d --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognlstatic/StaticClass.java @@ -0,0 +1,21 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.ognlstatic; + +public class StaticClass { + + public static String value = "User1"; +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognlstatic/User.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognlstatic/User.java new file mode 100644 index 0000000..fe1c1bb --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognlstatic/User.java @@ -0,0 +1,38 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.ognlstatic; + +public class User { + + private Integer id; + private String name; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognlstatic/mybatis-config.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognlstatic/mybatis-config.xml new file mode 100644 index 0000000..fbd12c9 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/ognlstatic/mybatis-config.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/optional_on_mapper_method/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/optional_on_mapper_method/CreateDB.sql new file mode 100644 index 0000000..9a8a411 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/optional_on_mapper_method/CreateDB.sql @@ -0,0 +1,25 @@ +-- +-- Copyright 2009-2018 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +drop table users if exists; + +create table users ( + id int, + name varchar(20) +); + +insert into users (id, name) values +(1, 'User1'), (2, 'User2'); diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/optional_on_mapper_method/Mapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/optional_on_mapper_method/Mapper.java new file mode 100644 index 0000000..01a84f7 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/optional_on_mapper_method/Mapper.java @@ -0,0 +1,29 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.optional_on_mapper_method; + +import org.apache.ibatis.annotations.Select; + +import java.util.Optional; + +public interface Mapper { + + @Select("select * from users where id = #{id}") + Optional getUserUsingAnnotation(Integer id); + + Optional getUserUsingXml(Integer id); + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/optional_on_mapper_method/Mapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/optional_on_mapper_method/Mapper.xml new file mode 100644 index 0000000..0d8b698 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/optional_on_mapper_method/Mapper.xml @@ -0,0 +1,29 @@ + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/optional_on_mapper_method/OptionalOnMapperMethodTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/optional_on_mapper_method/OptionalOnMapperMethodTest.java new file mode 100644 index 0000000..be32dec --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/optional_on_mapper_method/OptionalOnMapperMethodTest.java @@ -0,0 +1,112 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.optional_on_mapper_method; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.BeforeClass; +import org.junit.Test; +import org.mockito.Mockito; + +import java.io.Reader; +import java.util.Optional; + +import static org.hamcrest.core.Is.is; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; + +import static org.mockito.Mockito.*; + +/** + * Tests for support the {@code java.util.Optional} as return type of mapper method. + * + * @since 3.5.0 + * @author Kazuki Shimizu + */ +public class OptionalOnMapperMethodTest { + + private static SqlSessionFactory sqlSessionFactory; + + @BeforeClass + public static void setUp() throws Exception { + // create an SqlSessionFactory + try (Reader reader = Resources.getResourceAsReader( + "org/apache/ibatis/submitted/optional_on_mapper_method/mybatis-config.xml")) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + } + + // populate in-memory database + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/optional_on_mapper_method/CreateDB.sql"); + } + + @Test + public void returnNotNullOnAnnotation() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + Optional user = mapper.getUserUsingAnnotation(1); + assertTrue(user.isPresent()); + assertThat(user.get().getName(), is("User1")); + } + } + + @Test + public void returnNullOnAnnotation() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + Optional user = mapper.getUserUsingAnnotation(3); + assertFalse(user.isPresent()); + } + } + + @Test + public void returnNotNullOnXml() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + Optional user = mapper.getUserUsingXml(2); + assertTrue(user.isPresent()); + assertThat(user.get().getName(), is("User2")); + } + } + + @Test + public void returnNullOnXml() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + Optional user = mapper.getUserUsingXml(3); + assertFalse(user.isPresent()); + } + } + + @Test + public void returnOptionalFromSqlSession() { + try (SqlSession sqlSession = Mockito.spy(sqlSessionFactory.openSession());) { + User mockUser = new User(); + mockUser.setName("mock user"); + Optional optionalMockUser = Optional.of(mockUser); + doReturn(optionalMockUser).when(sqlSession).selectOne(any(String.class), any(Object.class)); + + Mapper mapper = sqlSession.getMapper(Mapper.class); + Optional user = mapper.getUserUsingAnnotation(3); + assertTrue(user == optionalMockUser); + } + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/optional_on_mapper_method/User.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/optional_on_mapper_method/User.java new file mode 100644 index 0000000..5689d0f --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/optional_on_mapper_method/User.java @@ -0,0 +1,38 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.optional_on_mapper_method; + +public class User { + + private Integer id; + private String name; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/optional_on_mapper_method/mybatis-config.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/optional_on_mapper_method/mybatis-config.xml new file mode 100644 index 0000000..68880fd --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/optional_on_mapper_method/mybatis-config.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/order_prefix_removed/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/order_prefix_removed/CreateDB.sql new file mode 100644 index 0000000..b05ee97 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/order_prefix_removed/CreateDB.sql @@ -0,0 +1,31 @@ +-- +-- Copyright 2009-2016 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +create table person ( + id int, + firstName varchar(100), + lastName varchar(100), + order_type varchar(100) +); + +INSERT INTO person (id, firstName, lastName, order_type) +VALUES (1, 'John', 'Smith', 'fast'); + +INSERT INTO person (id, firstName, lastName, order_type) +VALUES (2, 'Christian', 'Poitras', 'fast'); + +INSERT INTO person (id, firstName, lastName, order_type) +VALUES (3, 'Clinton', 'Begin', 'slow'); diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/order_prefix_removed/OrderPrefixRemoved.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/order_prefix_removed/OrderPrefixRemoved.java new file mode 100644 index 0000000..68ed566 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/order_prefix_removed/OrderPrefixRemoved.java @@ -0,0 +1,57 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.order_prefix_removed; + +import static org.junit.Assert.assertNotNull; + +import java.io.Reader; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.ExecutorType; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.BeforeClass; +import org.junit.Test; + +public class OrderPrefixRemoved { + + private static SqlSessionFactory sqlSessionFactory; + + @BeforeClass + public static void initDatabase() throws Exception { + try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/order_prefix_removed/ibatisConfig.xml")) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + } + + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/order_prefix_removed/CreateDB.sql"); + } + + @Test + public void testOrderPrefixNotRemoved() { + try (SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.SIMPLE)) { + PersonMapper personMapper = sqlSession.getMapper(PersonMapper.class); + + Person person = personMapper.select(new String("slow")); + + assertNotNull(person); + + sqlSession.commit(); + } + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/order_prefix_removed/Person.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/order_prefix_removed/Person.java new file mode 100644 index 0000000..f4fe998 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/order_prefix_removed/Person.java @@ -0,0 +1,42 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.order_prefix_removed; + +import java.io.Serializable; + +public class Person implements Serializable { + private Integer id; + private String firstName; + private String lastName; + public String getFirstName() { + return firstName; + } + public void setFirstName(String firstName) { + this.firstName = firstName; + } + public String getLastName() { + return lastName; + } + public void setLastName(String lastName) { + this.lastName = lastName; + } + public Integer getId() { + return id; + } + public void setId(Integer id) { + this.id = id; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/order_prefix_removed/Person.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/order_prefix_removed/Person.xml new file mode 100644 index 0000000..c992e65 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/order_prefix_removed/Person.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/order_prefix_removed/PersonMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/order_prefix_removed/PersonMapper.java new file mode 100644 index 0000000..6ea30eb --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/order_prefix_removed/PersonMapper.java @@ -0,0 +1,20 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.order_prefix_removed; + +public interface PersonMapper { + public Person select(String orderType); +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/order_prefix_removed/ibatisConfig.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/order_prefix_removed/ibatisConfig.xml new file mode 100644 index 0000000..a735af9 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/order_prefix_removed/ibatisConfig.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/overwritingproperties/Bar.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/overwritingproperties/Bar.java new file mode 100644 index 0000000..1b3b20c --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/overwritingproperties/Bar.java @@ -0,0 +1,39 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.overwritingproperties; + +import java.io.Serializable; + +public class Bar implements Serializable { + + private Long field1; + + public Bar() { + super(); + } + + public Bar(long field1) { + this.field1 = field1; + } + + public Long getField1() { + return field1; + } + + public void setField1(Long field1) { + this.field1 = field1; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/overwritingproperties/Foo.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/overwritingproperties/Foo.java new file mode 100644 index 0000000..9fae331 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/overwritingproperties/Foo.java @@ -0,0 +1,69 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.overwritingproperties; + +import java.io.Serializable; + +public class Foo implements Serializable { + + private Long field1; + private Bar field2; + private Integer field3; + private Integer field4; + + public Foo() { + super(); + } + + public Foo(Long field1, Bar field2, Integer field3, Integer field4) { + this.field1 = field1; + this.field2 = field2; + this.field3 = field3; + this.field4 = field4; + } + + public Long getField1() { + return field1; + } + + public void setField1(Long field1) { + this.field1 = field1; + } + + public Bar getField2() { + return field2; + } + + public void setField2(Bar field2) { + this.field2 = field2; + } + + public Integer getField3() { + return field3; + } + + public void setField3(Integer field3) { + this.field3 = field3; + } + + public Integer getField4() { + return field4; + } + + public void setField4(Integer field4) { + this.field4 = field4; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/overwritingproperties/FooMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/overwritingproperties/FooMapper.java new file mode 100644 index 0000000..bbafcd4 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/overwritingproperties/FooMapper.java @@ -0,0 +1,26 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.overwritingproperties; + +public interface FooMapper { + + void insertFoo(Foo foo); + + Foo selectFoo(); + + int deleteAllFoo(); + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/overwritingproperties/FooMapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/overwritingproperties/FooMapper.xml new file mode 100644 index 0000000..df51c1b --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/overwritingproperties/FooMapper.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + insert into FOO + ( + field1, + field2, + field3, + field4 + ) + values + ( + #{field1,jdbcType=INTEGER}, + #{field2.field1,jdbcType=INTEGER}, + #{field3,jdbcType=INTEGER}, + #{field4,jdbcType=INTEGER} + ) + + + + + + delete from FOO; + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/overwritingproperties/FooMapperTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/overwritingproperties/FooMapperTest.java new file mode 100644 index 0000000..de806d0 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/overwritingproperties/FooMapperTest.java @@ -0,0 +1,91 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.overwritingproperties; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.*; +import org.junit.*; + +import java.sql.Connection; +import java.sql.SQLException; + +/* + * @author jjensen + */ +public class FooMapperTest { + + private final static String SQL_MAP_CONFIG = "org/apache/ibatis/submitted/overwritingproperties/sqlmap.xml"; + private static SqlSession session; + private static Connection conn; + + @BeforeClass + public static void setUpBeforeClass() throws Exception { + final SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader(SQL_MAP_CONFIG)); + session = factory.openSession(); + conn = session.getConnection(); + + BaseDataTest.runScript(factory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/overwritingproperties/create-schema-mysql.sql"); + } + + @Before + public void setUp() { + final FooMapper mapper = session.getMapper(FooMapper.class); + mapper.deleteAllFoo(); + session.commit(); + } + + @Test + public void testOverwriteWithDefault() { + final FooMapper mapper = session.getMapper(FooMapper.class); + final Bar bar = new Bar(2L); + final Foo inserted = new Foo(1L, bar, 3, 4); + mapper.insertFoo(inserted); + + final Foo selected = mapper.selectFoo(); + + // field1 is explicitly mapped properly + // + Assert.assertEquals(inserted.getField1(), selected.getField1()); + + // field4 is not mapped in the result map + // + Assert.assertEquals(inserted.getField3(), selected.getField4() ); + + // field4 is explicitly remapped to field3 in the resultmap + // + Assert.assertEquals(inserted.getField4(), selected.getField3()); + + // is automapped from the only column that matches... which is Field1 + // probably not the intention, but it's working correctly given the code + // + // + // + Assert.assertEquals(inserted.getField2().getField1(), selected.getField2().getField1()); + } + + @AfterClass + public static void tearDownAfterClass() { + try { + conn.close(); + } catch (SQLException e) { + Assert.fail(e.getMessage()); + } + session.close(); + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/overwritingproperties/create-schema-mysql.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/overwritingproperties/create-schema-mysql.sql new file mode 100644 index 0000000..06f114e --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/overwritingproperties/create-schema-mysql.sql @@ -0,0 +1,23 @@ +-- +-- Copyright 2009-2016 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +CREATE TABLE FOO +( +field1 integer, +field2 integer, +field3 integer, +field4 integer +); diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/overwritingproperties/sqlmap.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/overwritingproperties/sqlmap.xml new file mode 100644 index 0000000..802bec9 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/overwritingproperties/sqlmap.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parametrizedlist/Config.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parametrizedlist/Config.xml new file mode 100644 index 0000000..0437425 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parametrizedlist/Config.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parametrizedlist/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parametrizedlist/CreateDB.sql new file mode 100644 index 0000000..d9c0da8 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parametrizedlist/CreateDB.sql @@ -0,0 +1,26 @@ +-- +-- Copyright 2009-2016 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +drop table users if exists; +drop table users2 if exists; + +create table users ( +id int, +name varchar(16) +); + +insert into users values(1, 'Pocoyo'); +insert into users values(2, 'Valentina'); diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parametrizedlist/Mapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parametrizedlist/Mapper.java new file mode 100644 index 0000000..534d385 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parametrizedlist/Mapper.java @@ -0,0 +1,39 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.parametrizedlist; + +import java.util.List; +import java.util.Map; + +import org.apache.ibatis.annotations.MapKey; +import org.apache.ibatis.annotations.Select; + +public interface Mapper { + + @Select("select id, name from users") + List> getAListOfUsers(); + + @Select("select id, name from users") + @MapKey("id") + Map> getAMapOfUsers(); + + @Select("select id, name from users where id=1") + Map getUserAsAMap(); + + @Select("select id, name from users") + List> getAListOfMaps(); + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parametrizedlist/ParametrizedListTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parametrizedlist/ParametrizedListTest.java new file mode 100644 index 0000000..0e569ec --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parametrizedlist/ParametrizedListTest.java @@ -0,0 +1,82 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.parametrizedlist; + +import java.io.Reader; +import java.util.List; +import java.util.Map; + +import org.apache.ibatis.BaseDataTest; +import org.junit.Assert; + +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.Before; +import org.junit.Test; + +public class ParametrizedListTest { + + private SqlSessionFactory sqlSessionFactory; + + @Before + public void setUp() throws Exception { + try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/parametrizedlist/Config.xml")) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + } + + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/parametrizedlist/CreateDB.sql"); + } + + @Test + public void testShouldDetectUsersAsParameterInsideAList() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + List> list = mapper.getAListOfUsers(); + Assert.assertEquals(User.class, list.get(0).getClass()); + } + } + + @Test + public void testShouldDetectUsersAsParameterInsideAMap() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + Map> map = mapper.getAMapOfUsers(); + Assert.assertEquals(User.class, map.get(1).getClass()); + } + } + + @Test + public void testShouldGetAUserAsAMap() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + Map map = mapper.getUserAsAMap(); + Assert.assertEquals(1, map.get("ID")); + } + } + + @Test + public void testShouldGetAListOfMaps() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + List> map = mapper.getAListOfMaps(); + Assert.assertEquals(1, map.get(0).get("ID")); + } + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parametrizedlist/User.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parametrizedlist/User.java new file mode 100644 index 0000000..1df7540 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parametrizedlist/User.java @@ -0,0 +1,45 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.parametrizedlist; + +public class User { + private Integer id; + private String name; + + public User() { + } + + public User(Integer id, String name) { + this.id = id; + this.name = name; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_childs/Child.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_childs/Child.java new file mode 100644 index 0000000..79bd293 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_childs/Child.java @@ -0,0 +1,50 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.parent_childs; + +public class Child { + + private int id; + private String name; + private String surName; + private int age; + + public int getId() { + return id; + } + public void setId(int id) { + this.id = id; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public String getSurName() { + return surName; + } + public void setSurName(String surName) { + this.surName = surName; + } + public int getAge() { + return age; + } + public void setAge(int age) { + this.age = age; + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_childs/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_childs/CreateDB.sql new file mode 100644 index 0000000..91a7a91 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_childs/CreateDB.sql @@ -0,0 +1,38 @@ +-- +-- Copyright 2009-2013 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +drop table users if exists; + +create table Parent ( + id int, + Name varchar(20), + SurName varchar(20) +); + +create table Child ( + id int, + Name varchar(20), + SurName varchar(20), + Age int, + ParentId varchar(20) +); + +insert into Parent values (1, 'Jose', 'Garcia'); +insert into Parent values (2, 'Juan', 'Perez'); + +insert into Child values (1, 'Ana', 'Garcia', 1, 1); +insert into Child values (2, 'Rosa', 'Garcia', 4, 1); + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_childs/Mapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_childs/Mapper.java new file mode 100644 index 0000000..4cfcba6 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_childs/Mapper.java @@ -0,0 +1,24 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.parent_childs; + +import java.util.List; + +public interface Mapper { + + List getParents(); + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_childs/Mapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_childs/Mapper.xml new file mode 100644 index 0000000..c2ae56b --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_childs/Mapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_childs/Parent.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_childs/Parent.java new file mode 100644 index 0000000..dfe3767 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_childs/Parent.java @@ -0,0 +1,52 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.parent_childs; + +import java.util.List; + +public class Parent { + + private int id; + private String name; + private String surName; + private List childs; + + public int getId() { + return id; + } + public void setId(int id) { + this.id = id; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public String getSurName() { + return surName; + } + public void setSurName(String surName) { + this.surName = surName; + } + public List getChilds() { + return childs; + } + public void setChilds(List childs) { + this.childs = childs; + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_childs/ParentChildTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_childs/ParentChildTest.java new file mode 100644 index 0000000..fd7600d --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_childs/ParentChildTest.java @@ -0,0 +1,61 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.parent_childs; + +import java.io.Reader; +import java.util.List; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; + +public class ParentChildTest { + + private static SqlSessionFactory sqlSessionFactory; + + @BeforeClass + public static void setUp() throws Exception { + // create a SqlSessionFactory + try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/parent_childs/mybatis-config.xml")) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + } + + // populate in-memory database + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/parent_childs/CreateDB.sql"); + } + + @Test + public void shouldGetAUser() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + List parents = mapper.getParents(); + Assert.assertEquals(2, parents.size()); + Parent firstParent = parents.get(0); + Assert.assertEquals("Jose", firstParent.getName()); + Assert.assertEquals(2, firstParent.getChilds().size()); + Parent secondParent = parents.get(1); + Assert.assertEquals("Juan", secondParent.getName()); + Assert.assertEquals(0, secondParent.getChilds().size()); // note an empty list is inyected + } + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_childs/mybatis-config.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_childs/mybatis-config.xml new file mode 100644 index 0000000..8697233 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_childs/mybatis-config.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_reference_3level/Blog.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_reference_3level/Blog.java new file mode 100644 index 0000000..672df47 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_reference_3level/Blog.java @@ -0,0 +1,58 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.parent_reference_3level; + +import java.util.List; + +public class Blog { + + private int id; + private String title; + private List posts; + + public Blog() { + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + if (this.title != null) { + throw new RuntimeException("Setter called twice"); + } + this.title = title; + } + + public List getPosts() { + return posts; + } + + public void setPosts(List posts) { + if (this.posts != null) { + throw new RuntimeException("Setter called twice"); + } + this.posts = posts; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_reference_3level/BlogTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_reference_3level/BlogTest.java new file mode 100644 index 0000000..efc29ca --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_reference_3level/BlogTest.java @@ -0,0 +1,104 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.parent_reference_3level; + +import static org.junit.Assert.*; + +import java.io.Reader; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class BlogTest { + + protected SqlSessionFactory sqlSessionFactory; + + protected String getConfigPath() { + return "org/apache/ibatis/submitted/parent_reference_3level/mybatis-config.xml"; + } + + @Before + public void setUp() throws Exception { + try (Reader reader = Resources.getResourceAsReader(getConfigPath())) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + } + + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/parent_reference_3level/CreateDB.sql"); + } + + @Test + public void testSelectBlogWithPosts() { + try (SqlSession session = sqlSessionFactory.openSession()) { + Mapper mapper = session.getMapper(Mapper.class); + Blog result = mapper.selectBlogByPrimaryKey(1); + assertNotNull(result); + assertEquals("Blog with posts", result.getTitle()); + Assert.assertEquals(2, result.getPosts().size()); + Post firstPost = result.getPosts().get(0); + Assert.assertEquals(1, firstPost.getBlog().getId()); + Assert.assertEquals(2, firstPost.getComments().size()); + Post secondPost = result.getPosts().get(1); + Assert.assertEquals(1, secondPost.getComments().size()); + Assert.assertEquals(2, secondPost.getComments().get(0).getPost().getId()); + } + } + + @Test + public void testSelectBlogWithoutPosts() { + try (SqlSession session = sqlSessionFactory.openSession()) { + Mapper mapper = session.getMapper(Mapper.class); + Blog result = mapper.selectBlogByPrimaryKey(2); + assertNotNull(result); + assertEquals("Blog without posts", result.getTitle()); + Assert.assertEquals(0, result.getPosts().size()); + } + } + + @Test + public void testSelectBlogWithPostsColumnPrefix() { + try (SqlSession session = sqlSessionFactory.openSession()) { + Mapper mapper = session.getMapper(Mapper.class); + Blog result = mapper.selectBlogByPrimaryKeyColumnPrefix(1); + assertNotNull(result); + assertEquals("Blog with posts", result.getTitle()); + Assert.assertEquals(2, result.getPosts().size()); + Post firstPost = result.getPosts().get(0); + Assert.assertEquals(1, firstPost.getBlog().getId()); + Assert.assertEquals(2, firstPost.getComments().size()); + Post secondPost = result.getPosts().get(1); + Assert.assertEquals(1, secondPost.getComments().size()); + Assert.assertEquals(2, secondPost.getComments().get(0).getPost().getId()); + } + } + + @Test + public void testSelectBlogWithoutPostsColumnPrefix() { + try (SqlSession session = sqlSessionFactory.openSession()) { + Mapper mapper = session.getMapper(Mapper.class); + Blog result = mapper.selectBlogByPrimaryKeyColumnPrefix(2); + assertNotNull(result); + assertEquals("Blog without posts", result.getTitle()); + Assert.assertEquals(0, result.getPosts().size()); + } + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_reference_3level/Comment.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_reference_3level/Comment.java new file mode 100644 index 0000000..25fd133 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_reference_3level/Comment.java @@ -0,0 +1,53 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.parent_reference_3level; + +public class Comment { + + private int id; + private Post post; + private String comment; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public Post getPost() { + return post; + } + + public void setPost(Post post) { + if (this.post != null) { + throw new RuntimeException("Setter called twice"); + } + this.post = post; + } + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + if (this.comment != null) { + throw new RuntimeException("Setter called twice"); + } + this.comment = comment; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_reference_3level/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_reference_3level/CreateDB.sql new file mode 100644 index 0000000..03b5d0e --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_reference_3level/CreateDB.sql @@ -0,0 +1,47 @@ +-- +-- Copyright 2009-2016 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +DROP TABLE blog; +DROP TABLE post; +DROP TABLE comment; + +CREATE TABLE blog ( +id INT, +title VARCHAR(255) +); + +CREATE TABLE post ( +id INT, +blog_id INT, +body VARCHAR(255) +); + +CREATE TABLE comment ( +id INT, +post_id INT, +comment VARCHAR(255) +); + +-- Data load +INSERT INTO blog (id,title) VALUES (1,'Blog with posts'); +INSERT INTO blog (id,title) VALUES (2,'Blog without posts'); + +INSERT INTO post (id,blog_id,body) VALUES (1,1,'I think if I never smelled another corn nut it would be too soon...'); +INSERT INTO post (id,blog_id,body) VALUES (2,1,'That''s not a dog. THAT''s a dog!'); + +INSERT INTO comment (id,post_id,comment) VALUES (1,1,'I disagree and think...'); +INSERT INTO comment (id,post_id,comment) VALUES (2,1,'I agree and think troll is an...'); +INSERT INTO comment (id,post_id,comment) VALUES (3,2,'I don not agree and still think troll is an...'); \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_reference_3level/Mapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_reference_3level/Mapper.java new file mode 100644 index 0000000..4e636d1 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_reference_3level/Mapper.java @@ -0,0 +1,23 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.parent_reference_3level; + +public interface Mapper { + + public Blog selectBlogByPrimaryKey(int aId); + + public Blog selectBlogByPrimaryKeyColumnPrefix(int aId); +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_reference_3level/Mapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_reference_3level/Mapper.xml new file mode 100644 index 0000000..0edca95 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_reference_3level/Mapper.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_reference_3level/Post.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_reference_3level/Post.java new file mode 100644 index 0000000..9447557 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_reference_3level/Post.java @@ -0,0 +1,67 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.parent_reference_3level; + +import java.util.List; + +public class Post { + + private int id; + private String body; + private Blog blog; + private List comments; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public Blog getBlog() { + return blog; + } + + public void setBlog(Blog blog) { + if (this.blog != null) { + throw new RuntimeException("Setter called twice"); + } + this.blog = blog; + } + + public String getBody() { + return body; + } + + public void setBody(String body) { + if (this.body != null) { + throw new RuntimeException("Setter called twice"); + } + this.body = body; + } + + public List getComments() { + return comments; + } + + public void setComments(List comments) { + if (this.comments != null) { + throw new RuntimeException("Setter called twice"); + } + this.comments = comments; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_reference_3level/mybatis-config.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_reference_3level/mybatis-config.xml new file mode 100644 index 0000000..b37d9b7 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/parent_reference_3level/mybatis-config.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/permissions/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/permissions/CreateDB.sql new file mode 100644 index 0000000..d8bc4b7 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/permissions/CreateDB.sql @@ -0,0 +1,28 @@ +-- +-- Copyright 2009-2016 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +drop table permissions if exists; + +create table permissions ( + resourceName varchar(20), + principalName varchar(20), + permission varchar(20) +); + +insert into permissions values ('resource1', 'user1', 'read'); +insert into permissions values ('resource1', 'user1', 'create'); +insert into permissions values ('resource2', 'user1', 'delete'); +insert into permissions values ('resource2', 'user1', 'update'); \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/permissions/Permission.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/permissions/Permission.java new file mode 100644 index 0000000..6096683 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/permissions/Permission.java @@ -0,0 +1,36 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.permissions; + +public class Permission { + + private String permission; + private Resource resource; + + public String getPermission() { + return permission; + } + public void setPermission(String permission) { + this.permission = permission; + } + public Resource getResource() { + return resource; + } + public void setResource(Resource resource) { + this.resource = resource; + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/permissions/PermissionsMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/permissions/PermissionsMapper.java new file mode 100644 index 0000000..3e7d048 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/permissions/PermissionsMapper.java @@ -0,0 +1,25 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.permissions; + +import java.util.List; + +public interface PermissionsMapper { + + List getResources(); + List getResource(String permission); + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/permissions/PermissionsMapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/permissions/PermissionsMapper.xml new file mode 100644 index 0000000..733e954 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/permissions/PermissionsMapper.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/permissions/PermissionsTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/permissions/PermissionsTest.java new file mode 100644 index 0000000..4ff5a26 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/permissions/PermissionsTest.java @@ -0,0 +1,99 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.permissions; + +import java.io.Reader; +import java.util.List; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; + +public class PermissionsTest { + + private static SqlSessionFactory sqlSessionFactory; + + @BeforeClass + public static void setUp() throws Exception { + // create a SqlSessionFactory + try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/permissions/mybatis-config.xml")) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + } + + // populate in-memory database + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/permissions/CreateDB.sql"); + } + + @Test // see issue #168 + public void checkNestedResultMapLoop() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + final PermissionsMapper mapper = sqlSession.getMapper(PermissionsMapper.class); + + final List resources = mapper.getResources(); + Assert.assertEquals(2, resources.size()); + + final Resource firstResource = resources.get(0); + final List principalPermissions = firstResource.getPrincipals(); + Assert.assertEquals(1, principalPermissions.size()); + + final Principal firstPrincipal = principalPermissions.get(0); + final List permissions = firstPrincipal.getPermissions(); + Assert.assertEquals(2, permissions.size()); + + final Permission firstPermission = firstPrincipal.getPermissions().get(0); + Assert.assertSame(firstResource, firstPermission.getResource()); + final Permission secondPermission = firstPrincipal.getPermissions().get(1); + Assert.assertSame(firstResource, secondPermission.getResource()); + } + } + + @Test + public void checkNestedSelectLoop() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + final PermissionsMapper mapper = sqlSession.getMapper(PermissionsMapper.class); + + final List resources = mapper.getResource("read"); + Assert.assertEquals(1, resources.size()); + + final Resource firstResource = resources.get(0); + final List principalPermissions = firstResource.getPrincipals(); + Assert.assertEquals(1, principalPermissions.size()); + + final Principal firstPrincipal = principalPermissions.get(0); + final List permissions = firstPrincipal.getPermissions(); + Assert.assertEquals(4, permissions.size()); + + boolean readFound = false; + for (Permission permission : permissions) { + if ("read".equals(permission.getPermission())) { + Assert.assertSame(firstResource, permission.getResource()); + readFound = true; + } + } + + if (!readFound) { + Assert.fail(); + } + } + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/permissions/Principal.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/permissions/Principal.java new file mode 100644 index 0000000..67d7e9c --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/permissions/Principal.java @@ -0,0 +1,39 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.permissions; + +import java.util.ArrayList; +import java.util.List; + +public class Principal { + + private String principalName; + private List permissions = new ArrayList(); + + public String getPrincipalName() { + return principalName; + } + public void setPrincipalName(String principalName) { + this.principalName = principalName; + } + public List getPermissions() { + return permissions; + } + public void setPermissions(List permissions) { + this.permissions = permissions; + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/permissions/Resource.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/permissions/Resource.java new file mode 100644 index 0000000..13c94e1 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/permissions/Resource.java @@ -0,0 +1,37 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.permissions; + +import java.util.ArrayList; +import java.util.List; + +public class Resource { + private String name; + private List Principals = new ArrayList(); + + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public List getPrincipals() { + return Principals; + } + public void setPrincipals(List principals) { + this.Principals = principals; + } +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/permissions/mybatis-config.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/permissions/mybatis-config.xml new file mode 100644 index 0000000..7f4a399 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/permissions/mybatis-config.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/postgres_genkeys/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/postgres_genkeys/CreateDB.sql new file mode 100644 index 0000000..a45be0e --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/postgres_genkeys/CreateDB.sql @@ -0,0 +1,34 @@ +-- +-- Copyright 2009-2018 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +CREATE SCHEMA mbtest; + +CREATE TABLE mbtest.users ( + user_id serial PRIMARY KEY, + name character varying(30) +); + +INSERT INTO mbtest.users (name) values +('Jimmy'); + + +CREATE TABLE mbtest.sections ( + section_id int PRIMARY KEY, + name character varying(30) +); + +INSERT INTO mbtest.sections (section_id, name) values +(1, 'Section 1'); diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/postgres_genkeys/Mapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/postgres_genkeys/Mapper.java new file mode 100644 index 0000000..255e4c0 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/postgres_genkeys/Mapper.java @@ -0,0 +1,31 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.postgres_genkeys; + +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Update; + +public interface Mapper { + @Insert("insert into mbtest.sections (section_id, name) values (#{sectionId}, #{name})") + int insertSection(Section section); + + @Update("update mbtest.users set name = #{name} where user_id = #{userId}") + int updateUser(User user); + + @Insert("insert into mbtest.users (name) values (#{name})") + int insertUser(@Param("name") String name); +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/postgres_genkeys/PostgresGeneratedKeysTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/postgres_genkeys/PostgresGeneratedKeysTest.java new file mode 100644 index 0000000..e69de29 diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/postgres_genkeys/Section.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/postgres_genkeys/Section.java new file mode 100644 index 0000000..e8acdfb --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/postgres_genkeys/Section.java @@ -0,0 +1,38 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.postgres_genkeys; + +public class Section { + private Integer sectionId; + + private String name; + + public Integer getSectionId() { + return sectionId; + } + + public void setSectionId(Integer sectionId) { + this.sectionId = sectionId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/postgres_genkeys/User.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/postgres_genkeys/User.java new file mode 100644 index 0000000..1654d7e --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/postgres_genkeys/User.java @@ -0,0 +1,38 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.postgres_genkeys; + +public class User { + private Integer userId; + + private String name; + + public Integer getUserId() { + return userId; + } + + public void setUserId(Integer userId) { + this.userId = userId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_array/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_array/CreateDB.sql new file mode 100644 index 0000000..3b9b65e --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_array/CreateDB.sql @@ -0,0 +1,30 @@ +-- +-- Copyright 2009-2014 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +drop table users if exists; + +create table users ( + id int, + name varchar(20) +); +create table udata ( + user_id int, + num int +); + +insert into users (id, name) values(1, 'User1'); +insert into udata (user_id, num) values(1, 100); +insert into udata (user_id, num) values(1, 300); diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_array/Mapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_array/Mapper.java new file mode 100644 index 0000000..c5ea681 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_array/Mapper.java @@ -0,0 +1,22 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.primitive_array; + +public interface Mapper { + + User getUser(Integer id); + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_array/Mapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_array/Mapper.xml new file mode 100644 index 0000000..f415c76 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_array/Mapper.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_array/PrimitiveArrayTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_array/PrimitiveArrayTest.java new file mode 100644 index 0000000..41999c9 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_array/PrimitiveArrayTest.java @@ -0,0 +1,56 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.primitive_array; + +import java.io.Reader; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; + +public class PrimitiveArrayTest { + + private static SqlSessionFactory sqlSessionFactory; + + @BeforeClass + public static void setUp() throws Exception { + // create an SqlSessionFactory + try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/primitive_array/mybatis-config.xml")) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + } + + // populate in-memory database + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/primitive_array/CreateDB.sql"); + } + + @Test + public void shouldGetAUser() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + User user = mapper.getUser(1); + Assert.assertEquals("User1", user.getName()); + Assert.assertEquals(2, user.getNum().length); + Assert.assertEquals(100, user.getNum()[0]); + } + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_array/User.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_array/User.java new file mode 100644 index 0000000..a002137 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_array/User.java @@ -0,0 +1,47 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.primitive_array; + +public class User { + + private Integer id; + private String name; + private int[] num; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int[] getNum() { + return num; + } + + public void setNum(int[] num) { + this.num = num; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_array/mybatis-config.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_array/mybatis-config.xml new file mode 100644 index 0000000..e4fadaf --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_array/mybatis-config.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_result_type/IbatisConfig.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_result_type/IbatisConfig.java new file mode 100644 index 0000000..12d7bbd --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_result_type/IbatisConfig.java @@ -0,0 +1,55 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.primitive_result_type; + +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; + +import java.io.Reader; + +public class IbatisConfig { + + private static SqlSessionFactory sqlSessionFactory; + + private IbatisConfig() { + } + + private static synchronized void init() { + if (sqlSessionFactory == null) + try { + final String resource = "org/apache/ibatis/submitted/primitive_result_type/ibatis.xml"; + Reader reader = Resources.getResourceAsReader(resource); + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public static SqlSession getSession() { + if (sqlSessionFactory == null) { + init(); + } + return sqlSessionFactory.openSession(); + } + + public static SqlSessionFactory getSqlSessionFactory() { + init(); + return sqlSessionFactory; + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_result_type/PrimitiveResultTypeTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_result_type/PrimitiveResultTypeTest.java new file mode 100644 index 0000000..cf0410b --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_result_type/PrimitiveResultTypeTest.java @@ -0,0 +1,54 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.primitive_result_type; + +import org.apache.ibatis.BaseDataTest; +import static org.junit.Assert.assertTrue; +import org.junit.BeforeClass; +import org.junit.Test; + +import java.math.BigDecimal; +import java.util.List; + +public class PrimitiveResultTypeTest { + + @BeforeClass + public static void setup() throws Exception { + BaseDataTest.runScript(IbatisConfig.getSqlSessionFactory().getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/primitive_result_type/create.sql"); + } + + @Test + public void shouldReturnProperPrimitiveType() { + List codes = ProductDAO.selectProductCodes(); + for (Object code : codes) { + assertTrue(code instanceof Integer); + } + List lcodes = ProductDAO.selectProductCodesL(); + for (Object lcode : lcodes) { + assertTrue(!(lcode instanceof Integer)); + } + List bcodes = ProductDAO.selectProductCodesB(); + for (Object bcode : bcodes) { + assertTrue(bcode instanceof BigDecimal); + } + } + @Test + public void noErrorThrowOut(){ + List products=ProductDAO.selectAllProducts(); + assertTrue("should return 4 results", 4==products.size()); + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_result_type/Product.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_result_type/Product.java new file mode 100644 index 0000000..025ee16 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_result_type/Product.java @@ -0,0 +1,38 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.primitive_result_type; + +public class Product { + int productCod; + Integer productType; + + public int getProductCod() { + return productCod; + } + + public void setProductCod(int productCod) { + this.productCod = productCod; + } + + public Integer getProductType() { + return productType; + } + + public void setProductType(Integer productType) { + this.productType = productType; + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_result_type/ProductDAO.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_result_type/ProductDAO.java new file mode 100644 index 0000000..b84f957 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_result_type/ProductDAO.java @@ -0,0 +1,61 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.primitive_result_type; + +import org.apache.ibatis.session.SqlSession; + +import java.math.BigDecimal; +import java.util.List; + +public class ProductDAO { + + public static List selectProductCodes() { + try (SqlSession session = IbatisConfig.getSession()) { + ProductMapper productMapper = session.getMapper(ProductMapper.class); + return productMapper.selectProductCodes(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public static List selectProductCodesL() { + try (SqlSession session = IbatisConfig.getSession()) { + ProductMapper productMapper = session.getMapper(ProductMapper.class); + return productMapper.selectProductCodesL(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public static List selectProductCodesB() { + try (SqlSession session = IbatisConfig.getSession()) { + ProductMapper productMapper = session.getMapper(ProductMapper.class); + return productMapper.selectProductCodesB(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public static List selectAllProducts() { + try (SqlSession session = IbatisConfig.getSession()) { + ProductMapper productMapper = session.getMapper(ProductMapper.class); + return productMapper.selectAllProducts(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_result_type/ProductMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_result_type/ProductMapper.java new file mode 100644 index 0000000..a67b88a --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_result_type/ProductMapper.java @@ -0,0 +1,30 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.primitive_result_type; + +import java.math.BigDecimal; +import java.util.List; + +public interface ProductMapper { + + List selectProductCodes(); + + List selectProductCodesL(); + + List selectProductCodesB(); + + List selectAllProducts(); +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_result_type/ProductMapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_result_type/ProductMapper.xml new file mode 100644 index 0000000..262266a --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_result_type/ProductMapper.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_result_type/create.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_result_type/create.sql new file mode 100644 index 0000000..35bbde8 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_result_type/create.sql @@ -0,0 +1,21 @@ +-- +-- Copyright 2009-2016 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +CREATE MEMORY TABLE PRODUCT(PRODUCTCODE NUMERIC,PRODUCTTYPE NUMERIC); +INSERT INTO PRODUCT(PRODUCTCODE,PRODUCTTYPE) VALUES(5,1); +INSERT INTO PRODUCT(PRODUCTCODE,PRODUCTTYPE) VALUES(6,2); +INSERT INTO PRODUCT(PRODUCTCODE,PRODUCTTYPE) VALUES(1000,NULL); +INSERT INTO PRODUCT(PRODUCTCODE,PRODUCTTYPE) VALUES(2000,NULL); diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_result_type/ibatis.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_result_type/ibatis.xml new file mode 100644 index 0000000..db35008 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitive_result_type/ibatis.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitives/Assetright.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitives/Assetright.java new file mode 100644 index 0000000..f459cef --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitives/Assetright.java @@ -0,0 +1,50 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.primitives; + +import java.util.List; + +public class Assetright { + + private Integer id; + private String name; + private List values; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getValues() { + return values; + } + + public void setValues(List values) { + this.values = values; + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitives/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitives/CreateDB.sql new file mode 100644 index 0000000..c9c1205 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitives/CreateDB.sql @@ -0,0 +1,36 @@ +-- +-- Copyright 2009-2016 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +drop table a if exists; +drop table b if exists; + +create table a ( + id int, + name varchar(20) +); + +create table b ( + ref int, + entry int +); + +insert into a (id, name) values(0, 'some'); +insert into a (id, name) values(1, 'other'); + +insert into b (ref,entry) values (0, 1); +insert into b (ref,entry) values (1, 2); +insert into b (ref,entry) values (0, 3); + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitives/Mapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitives/Mapper.java new file mode 100644 index 0000000..78248a2 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitives/Mapper.java @@ -0,0 +1,24 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.primitives; + +import java.util.List; + +public interface Mapper { + + List select(); + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitives/Mapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitives/Mapper.xml new file mode 100644 index 0000000..bdfd3a9 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitives/Mapper.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitives/PrimitivesTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitives/PrimitivesTest.java new file mode 100644 index 0000000..f3b49cc --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitives/PrimitivesTest.java @@ -0,0 +1,56 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.primitives; + +import java.io.Reader; +import java.util.List; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; + +public class PrimitivesTest { + + private static SqlSessionFactory sqlSessionFactory; + + @BeforeClass + public static void setUp() throws Exception { + // create an SqlSessionFactory + try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/primitives/mybatis-config.xml")) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + } + + // populate in-memory database + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/primitives/CreateDB.sql"); + } + + @Test // issue #69 + public void shouldGetAUser() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + List assetrights = mapper.select(); + Assert.assertEquals(2, assetrights.size()); + } + } + + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitives/mybatis-config.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitives/mybatis-config.xml new file mode 100644 index 0000000..e709a57 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/primitives/mybatis-config.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/propertiesinmapperfiles/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/propertiesinmapperfiles/CreateDB.sql new file mode 100644 index 0000000..2354824 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/propertiesinmapperfiles/CreateDB.sql @@ -0,0 +1,24 @@ +-- +-- Copyright 2009-2016 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +drop table users if exists; + +create table users ( + id int, + name varchar(20) +); + +insert into users (id, name) values(1, 'User1'); diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/propertiesinmapperfiles/Mapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/propertiesinmapperfiles/Mapper.java new file mode 100644 index 0000000..4b35203 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/propertiesinmapperfiles/Mapper.java @@ -0,0 +1,22 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.propertiesinmapperfiles; + +public interface Mapper { + + User getUser(Integer id); + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/propertiesinmapperfiles/Mapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/propertiesinmapperfiles/Mapper.xml new file mode 100644 index 0000000..a9421f3 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/propertiesinmapperfiles/Mapper.xml @@ -0,0 +1,29 @@ + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/propertiesinmapperfiles/PropertiesInMappersTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/propertiesinmapperfiles/PropertiesInMappersTest.java new file mode 100644 index 0000000..10a4ccd --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/propertiesinmapperfiles/PropertiesInMappersTest.java @@ -0,0 +1,60 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.propertiesinmapperfiles; + +import java.io.Reader; +import java.util.Properties; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; + +public class PropertiesInMappersTest { + + private static SqlSessionFactory sqlSessionFactory; + + @BeforeClass + public static void setUp() throws Exception { + + // this property value should be replaced on all mapper files + Properties p = new Properties(); + p.put("property", "id"); + + // create a SqlSessionFactory + try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/propertiesinmapperfiles/mybatis-config.xml")) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader, p); + } + + // populate in-memory database + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/propertiesinmapperfiles/CreateDB.sql"); + } + + @Test + public void shouldGetAUser() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + User user = mapper.getUser(1); + Assert.assertEquals("User1", user.getName()); + } + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/propertiesinmapperfiles/User.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/propertiesinmapperfiles/User.java new file mode 100644 index 0000000..893c1b1 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/propertiesinmapperfiles/User.java @@ -0,0 +1,38 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.propertiesinmapperfiles; + +public class User { + + private Integer id; + private String name; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/propertiesinmapperfiles/mybatis-config.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/propertiesinmapperfiles/mybatis-config.xml new file mode 100644 index 0000000..75e70cf --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/propertiesinmapperfiles/mybatis-config.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/quotedcolumnnames/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/quotedcolumnnames/CreateDB.sql new file mode 100644 index 0000000..9aa8ea9 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/quotedcolumnnames/CreateDB.sql @@ -0,0 +1,30 @@ +-- +-- Copyright 2009-2016 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +drop table names if exists; + +create table names ( + ID int, + FIRST_NAME varchar(20), + LAST_NAME varchar(20) +); + +insert into names (ID, FIRST_NAME, LAST_NAME) values(1, 'Fred', 'Flintstone'); +insert into names (ID, FIRST_NAME, LAST_NAME) values(2, 'Wilma', 'Flintstone'); +insert into names (ID, FIRST_NAME, LAST_NAME) values(3, 'Pebbles', 'Flintstone'); +insert into names (ID, FIRST_NAME, LAST_NAME) values(4, 'Barney', 'Rubble'); +insert into names (ID, FIRST_NAME, LAST_NAME) values(5, 'Betty', 'Rubble'); +insert into names (ID, FIRST_NAME, LAST_NAME) values(6, 'Bamm Bamm', 'Rubble'); diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/quotedcolumnnames/Map.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/quotedcolumnnames/Map.xml new file mode 100644 index 0000000..d630708 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/quotedcolumnnames/Map.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/quotedcolumnnames/MapperConfig.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/quotedcolumnnames/MapperConfig.xml new file mode 100644 index 0000000..f74b5a4 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/quotedcolumnnames/MapperConfig.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/quotedcolumnnames/QuotedColumnNamesTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/quotedcolumnnames/QuotedColumnNamesTest.java new file mode 100644 index 0000000..8e29ecc --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/quotedcolumnnames/QuotedColumnNamesTest.java @@ -0,0 +1,78 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.quotedcolumnnames; + +import java.io.Reader; +import java.util.List; +import java.util.Map; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; + +public class QuotedColumnNamesTest { + + protected static SqlSessionFactory sqlSessionFactory; + + @BeforeClass + public static void setUp() throws Exception { + try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/quotedcolumnnames/MapperConfig.xml")) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + } + + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/quotedcolumnnames/CreateDB.sql"); + } + + @Test + public void testIt() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + List> list = sqlSession.selectList("org.apache.ibatis.submitted.quotedcolumnnames.Map.doSelect"); + printList(list); + assertColumnNames(list); + } + } + + @Test + public void testItWithResultMap() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + List> list = sqlSession.selectList("org.apache.ibatis.submitted.quotedcolumnnames.Map.doSelectWithResultMap"); + printList(list); + assertColumnNames(list); + } + } + + private void assertColumnNames(List> list) { + Map record = list.get(0); + + Assert.assertTrue(record.containsKey("firstName")); + Assert.assertTrue(record.containsKey("lastName")); + + Assert.assertFalse(record.containsKey("FIRST_NAME")); + Assert.assertFalse(record.containsKey("LAST_NAME")); + } + + private void printList(List> list) { + for (Map map : list) { + Assert.assertNotNull(map); + } + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/raw_sql_source/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/raw_sql_source/CreateDB.sql new file mode 100644 index 0000000..a6a5470 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/raw_sql_source/CreateDB.sql @@ -0,0 +1,24 @@ +-- +-- Copyright 2009-2013 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +drop table users if exists; + +create table users ( + id int, + name varchar(20) +); + +insert into users (id, name) values(1, 'User1'); diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/raw_sql_source/Mapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/raw_sql_source/Mapper.xml new file mode 100644 index 0000000..482621c --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/raw_sql_source/Mapper.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/raw_sql_source/RawSqlSourceTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/raw_sql_source/RawSqlSourceTest.java new file mode 100644 index 0000000..ea39fca --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/raw_sql_source/RawSqlSourceTest.java @@ -0,0 +1,73 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.raw_sql_source; + +import java.io.Reader; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.mapping.SqlSource; +import org.apache.ibatis.scripting.defaults.RawSqlSource; +import org.apache.ibatis.scripting.xmltags.DynamicSqlSource; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; + +public class RawSqlSourceTest { + + private static SqlSessionFactory sqlSessionFactory; + + @BeforeClass + public static void setUp() throws Exception { + // create an SqlSessionFactory + try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/raw_sql_source/mybatis-config.xml")) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + } + + // populate in-memory database + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/raw_sql_source/CreateDB.sql"); + } + + @Test + public void shouldUseRawSqlSourceForAnStaticStatement() { + test("getUser1", RawSqlSource.class); + } + + @Test + public void shouldUseDynamicSqlSourceForAnStatementWithInlineArguments() { + test("getUser2", DynamicSqlSource.class); + } + + @Test + public void shouldUseDynamicSqlSourceForAnStatementWithXmlTags() { + test("getUser3", DynamicSqlSource.class); + } + + private void test(String statement, Class sqlSource) { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Assert.assertEquals(sqlSource, sqlSession.getConfiguration().getMappedStatement(statement).getSqlSource().getClass()); + String sql = sqlSession.getConfiguration().getMappedStatement(statement).getSqlSource().getBoundSql('?').getSql(); + Assert.assertEquals("select * from users where id = ?", sql); + User user = sqlSession.selectOne(statement, 1); + Assert.assertEquals("User1", user.getName()); + } + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/raw_sql_source/User.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/raw_sql_source/User.java new file mode 100644 index 0000000..9685d65 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/raw_sql_source/User.java @@ -0,0 +1,38 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.raw_sql_source; + +public class User { + + private Integer id; + private String name; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/raw_sql_source/mybatis-config.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/raw_sql_source/mybatis-config.xml new file mode 100644 index 0000000..d67b774 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/raw_sql_source/mybatis-config.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/refcursor/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/refcursor/CreateDB.sql new file mode 100644 index 0000000..aff4971 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/refcursor/CreateDB.sql @@ -0,0 +1,102 @@ +-- +-- Copyright 2009-2018 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +CREATE SCHEMA mbtest; + +CREATE TABLE mbtest.order_detail +( + order_id integer NOT NULL, + line_number integer NOT NULL, + quantity integer NOT NULL, + item_description character varying(50) NOT NULL, + CONSTRAINT order_detail_pkey PRIMARY KEY (order_id, line_number) +) +WITH ( + OIDS=FALSE +); + +ALTER TABLE mbtest.order_detail OWNER TO postgres; + +CREATE TABLE mbtest.order_header +( + order_id integer NOT NULL, + cust_name character varying(50) NOT NULL, + CONSTRAINT order_header_pkey PRIMARY KEY (order_id) +) +WITH ( + OIDS=FALSE +); + +ALTER TABLE mbtest.order_header OWNER TO postgres; + +INSERT INTO mbtest.order_header(order_id, cust_name) + VALUES (1, 'Fred'); +INSERT INTO mbtest.order_header(order_id, cust_name) + VALUES (2, 'Barney'); + +INSERT INTO mbtest.order_detail(order_id, line_number, quantity, item_description) + VALUES (1, 1, 1, 'Pen'); +INSERT INTO mbtest.order_detail(order_id, line_number, quantity, item_description) + VALUES (1, 2, 3, 'Pencil'); +INSERT INTO mbtest.order_detail(order_id, line_number, quantity, item_description) + VALUES (1, 3, 2, 'Notepad'); +INSERT INTO mbtest.order_detail(order_id, line_number, quantity, item_description) + VALUES (2, 1, 1, 'Compass'); +INSERT INTO mbtest.order_detail(order_id, line_number, quantity, item_description) + VALUES (2, 2, 1, 'Protractor'); +INSERT INTO mbtest.order_detail(order_id, line_number, quantity, item_description) + VALUES (2, 3, 2, 'Pencil'); + +-- @DELIMITER | + +CREATE OR REPLACE FUNCTION mbtest.get_order(order_number integer) + RETURNS refcursor AS +$BODY$ +DECLARE + mycurs refcursor; +BEGIN + open mycurs for select a.*, b.* + from mbtest.order_header a join mbtest.order_detail b + on a.order_id = b.order_id + where a.order_id = ORDER_NUMBER; + return mycurs; +END; +$BODY$ + LANGUAGE plpgsql VOLATILE + COST 100 | + + +CREATE OR REPLACE FUNCTION mbtest.get_order_out_params( + order_number integer, + detail_count out integer, + header_curs out refcursor +) AS $BODY$ +DECLARE + order_exists boolean; +BEGIN + select order_id is not null into order_exists from mbtest.order_header where order_id = ORDER_NUMBER; + if order_exists then + open header_curs for select * from mbtest.order_header where order_id = ORDER_NUMBER; + end if; + select count(*) into detail_count from mbtest.order_detail where order_id = ORDER_NUMBER; +END; +$BODY$ + LANGUAGE plpgsql VOLATILE + COST 100 | + +-- @DELIMITER ; + +ALTER FUNCTION mbtest.get_order(integer) OWNER TO postgres; diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/refcursor/Order.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/refcursor/Order.java new file mode 100644 index 0000000..82d39e1 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/refcursor/Order.java @@ -0,0 +1,42 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.refcursor; + +import java.util.List; + +public class Order { + private Integer orderId; + private String customerName; + private List detailLines; + public Integer getOrderId() { + return orderId; + } + public void setOrderId(Integer orderId) { + this.orderId = orderId; + } + public String getCustomerName() { + return customerName; + } + public void setCustomerName(String customerName) { + this.customerName = customerName; + } + public List getDetailLines() { + return detailLines; + } + public void setDetailLines(List detailLines) { + this.detailLines = detailLines; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/refcursor/OrderDetail.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/refcursor/OrderDetail.java new file mode 100644 index 0000000..d1b0ac4 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/refcursor/OrderDetail.java @@ -0,0 +1,47 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.refcursor; + +public class OrderDetail { + private Integer orderNumber; + private Integer lineNumber; + private Integer quantity; + private String description; + public Integer getLineNumber() { + return lineNumber; + } + public void setLineNumber(Integer lineNumber) { + this.lineNumber = lineNumber; + } + public Integer getQuantity() { + return quantity; + } + public void setQuantity(Integer quantity) { + this.quantity = quantity; + } + public String getDescription() { + return description; + } + public void setDescription(String description) { + this.description = description; + } + public Integer getOrderNumber() { + return orderNumber; + } + public void setOrderNumber(Integer orderNumber) { + this.orderNumber = orderNumber; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/refcursor/OrdersMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/refcursor/OrdersMapper.java new file mode 100644 index 0000000..87c83d4 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/refcursor/OrdersMapper.java @@ -0,0 +1,28 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.refcursor; + +import java.util.Map; + +import org.apache.ibatis.session.ResultHandler; + +public interface OrdersMapper { + void getOrder1(Map parameter); + + void getOrder2(Map parameter); + + void getOrder3(Map parameter, ResultHandler resultHandler); +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/refcursor/OrdersMapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/refcursor/OrdersMapper.xml new file mode 100644 index 0000000..7f58bbd --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/refcursor/OrdersMapper.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + { #{order,jdbcType=OTHER,mode=OUT,resultMap=OrderResult,javaType=java.sql.ResultSet} = + call mbtest.get_order(#{orderId,jdbcType=INTEGER,mode=IN}) } + + + + { #{order,jdbcType=OTHER,mode=OUT,resultMap=org.apache.ibatis.submitted.refcursor.OrdersMapper.OrderResult,javaType=java.sql.ResultSet} = + call mbtest.get_order(#{orderId,jdbcType=INTEGER,mode=IN}) } + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/refcursor/RefCursorTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/refcursor/RefCursorTest.java new file mode 100644 index 0000000..e69de29 diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/refid_resolution/ExternalMapper1.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/refid_resolution/ExternalMapper1.xml new file mode 100644 index 0000000..94bb1fb --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/refid_resolution/ExternalMapper1.xml @@ -0,0 +1,39 @@ + + + + + + + + + CALL IDENTITY() + + insert into table1 ( + + ) values (#{field1},#{field2}) + + \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/refid_resolution/ExternalMapper2.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/refid_resolution/ExternalMapper2.xml new file mode 100644 index 0000000..7fc7b7d --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/refid_resolution/ExternalMapper2.xml @@ -0,0 +1,27 @@ + + + + + + + field1, field2 + + \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/refid_resolution/ExternalMapperConfig.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/refid_resolution/ExternalMapperConfig.xml new file mode 100644 index 0000000..0b677ee --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/refid_resolution/ExternalMapperConfig.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/refid_resolution/ExternalRefidResolutionTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/refid_resolution/ExternalRefidResolutionTest.java new file mode 100644 index 0000000..1a32592 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/refid_resolution/ExternalRefidResolutionTest.java @@ -0,0 +1,38 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.refid_resolution; + +import java.io.Reader; + +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.Test; + +/** + * @see http://code.google.com/p/mybatis/issues/detail?id=291 + */ +public class ExternalRefidResolutionTest { + @Test + public void testExternalRefAfterSelectKey() throws Exception { + String resource = "org/apache/ibatis/submitted/refid_resolution/ExternalMapperConfig.xml"; + try (Reader reader = Resources.getResourceAsReader(resource)) { + SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); + SqlSessionFactory sqlSessionFactory = builder.build(reader); + sqlSessionFactory.getConfiguration().getMappedStatementNames(); + } + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/refid_resolution/Mapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/refid_resolution/Mapper.xml new file mode 100644 index 0000000..2d62c59 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/refid_resolution/Mapper.xml @@ -0,0 +1,38 @@ + + + + + + + field1, field2 + + + + \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/refid_resolution/MapperConfig.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/refid_resolution/MapperConfig.xml new file mode 100644 index 0000000..f946665 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/refid_resolution/MapperConfig.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/refid_resolution/RefidResolutionTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/refid_resolution/RefidResolutionTest.java new file mode 100644 index 0000000..38c4b2f --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/refid_resolution/RefidResolutionTest.java @@ -0,0 +1,35 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.refid_resolution; + +import java.io.Reader; + +import org.apache.ibatis.exceptions.PersistenceException; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.Test; + +public class RefidResolutionTest { + @Test(expected = PersistenceException.class) + public void testIncludes() throws Exception { + String resource = "org/apache/ibatis/submitted/refid_resolution/MapperConfig.xml"; + Reader reader = Resources.getResourceAsReader(resource); + SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); + SqlSessionFactory sqlSessionFactory = builder.build(reader); + sqlSessionFactory.getConfiguration().getMappedStatementNames(); + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler/CreateDB.sql new file mode 100644 index 0000000..f59233b --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler/CreateDB.sql @@ -0,0 +1,26 @@ +-- +-- Copyright 2009-2016 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +drop table users if exists; + +create table users ( + id int, + name varchar(20) +); + +insert into users (id, name) values(1, 'User1'); +insert into users (id, name) values(2, 'User2'); +insert into users (id, name) values(3, 'User3'); diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler/Mapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler/Mapper.java new file mode 100644 index 0000000..28bac88 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler/Mapper.java @@ -0,0 +1,29 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.result_handler; + +import org.apache.ibatis.annotations.ResultType; +import org.apache.ibatis.annotations.Select; + +public interface Mapper { + + @Select("select * from users where id = #{value}") + User getUser(Integer id); + + @Select("select * from users") + @ResultType(User.class) + void getAllUsers(UserResultHandler resultHandler); +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler/ResulthandlerTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler/ResulthandlerTest.java new file mode 100644 index 0000000..d086022 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler/ResulthandlerTest.java @@ -0,0 +1,64 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.result_handler; + +import java.io.Reader; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; + +public class ResulthandlerTest { + + private static SqlSessionFactory sqlSessionFactory; + + @BeforeClass + public static void setUp() throws Exception { + // create a SqlSessionFactory + try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/result_handler/mybatis-config.xml")) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + sqlSessionFactory.getConfiguration().addMapper(Mapper.class); + } + + // populate in-memory database + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/result_handler/CreateDB.sql"); + } + + @Test + public void shouldGetAUser() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + User user = mapper.getUser(1); + Assert.assertEquals("User1", user.getName()); + } + } + + @Test + public void shouldGetAllUsers() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + UserResultHandler userResultHandler = new UserResultHandler(); + mapper.getAllUsers(userResultHandler); + Assert.assertEquals(3, userResultHandler.getUsers().size()); + } + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler/User.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler/User.java new file mode 100644 index 0000000..e5d11e9 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler/User.java @@ -0,0 +1,38 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.result_handler; + +public class User { + + private Integer id; + private String name; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler/UserResultHandler.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler/UserResultHandler.java new file mode 100644 index 0000000..ea766a0 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler/UserResultHandler.java @@ -0,0 +1,41 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.result_handler; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.ibatis.session.ResultContext; +import org.apache.ibatis.session.ResultHandler; + +public class UserResultHandler implements ResultHandler { + private List users; + + public UserResultHandler() { + super(); + users = new ArrayList(); + } + + @Override + public void handleResult(ResultContext context) { + User user = (User) context.getResultObject(); + users.add(user); + } + + public List getUsers() { + return users; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler/mybatis-config.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler/mybatis-config.xml new file mode 100644 index 0000000..03d6391 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler/mybatis-config.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler_type/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler_type/CreateDB.sql new file mode 100644 index 0000000..fa89feb --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler_type/CreateDB.sql @@ -0,0 +1,21 @@ +-- +-- Copyright 2009-2016 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +drop table if exists person; +create table person (id int, name varchar(32)); + +insert into person (id, name) values (1, 'John'); +insert into person (id, name) values (2, 'Rebecca'); diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler_type/DefaultResultHandlerTypeTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler_type/DefaultResultHandlerTypeTest.java new file mode 100644 index 0000000..b789b94 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler_type/DefaultResultHandlerTypeTest.java @@ -0,0 +1,79 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.result_handler_type; + +import static org.junit.Assert.*; + +import java.io.Reader; +import java.util.List; +import java.util.Map; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.Test; + +public class DefaultResultHandlerTypeTest { + + @Test + public void testSelectList() throws Exception { + String xmlConfig = "org/apache/ibatis/submitted/result_handler_type/MapperConfig.xml"; + SqlSessionFactory sqlSessionFactory = getSqlSessionFactoryXmlConfig(xmlConfig); + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + List list = sqlSession + .selectList("org.apache.ibatis.submitted.result_handler_type.PersonMapper.doSelect"); + assertEquals(list.size(), 2); + assertEquals("java.util.LinkedList", list.getClass().getCanonicalName()); + } + } + + @Test + public void testSelectMap() throws Exception { + String xmlConfig = "org/apache/ibatis/submitted/result_handler_type/MapperConfig.xml"; + SqlSessionFactory sqlSessionFactory = getSqlSessionFactoryXmlConfig(xmlConfig); + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Map map = sqlSession.selectMap( + "org.apache.ibatis.submitted.result_handler_type.PersonMapper.doSelect", "id"); + assertEquals(map.size(), 2); + assertEquals("java.util.LinkedHashMap", map.getClass().getCanonicalName()); + } + } + + @Test + public void testSelectMapAnnotation() throws Exception { + String xmlConfig = "org/apache/ibatis/submitted/result_handler_type/MapperConfig.xml"; + SqlSessionFactory sqlSessionFactory = getSqlSessionFactoryXmlConfig(xmlConfig); + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + PersonMapper mapper = sqlSession.getMapper(PersonMapper.class); + Map map = mapper.selectAsMap(); + assertEquals(map.size(), 2); + assertEquals("java.util.LinkedHashMap", map.getClass().getCanonicalName()); + } + } + + private SqlSessionFactory getSqlSessionFactoryXmlConfig(String resource) throws Exception { + try (Reader configReader = Resources.getResourceAsReader(resource)) { + SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configReader); + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/result_handler_type/CreateDB.sql"); + + return sqlSessionFactory; + } + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler_type/MapperConfig.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler_type/MapperConfig.xml new file mode 100644 index 0000000..9697639 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler_type/MapperConfig.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler_type/ObjectFactory.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler_type/ObjectFactory.java new file mode 100644 index 0000000..565c238 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler_type/ObjectFactory.java @@ -0,0 +1,42 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.result_handler_type; + +import java.util.Collection; +import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import org.apache.ibatis.reflection.factory.DefaultObjectFactory; + +public class ObjectFactory extends DefaultObjectFactory { + + private static final long serialVersionUID = -8855120656740914948L; + + @Override + protected Class resolveInterface(Class type) { + Class classToCreate; + if (type == Map.class) { + classToCreate = LinkedHashMap.class; + } else if (type == List.class || type == Collection.class) { + classToCreate = LinkedList.class; + } else { + classToCreate = super.resolveInterface(type); + } + return classToCreate; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler_type/Person.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler_type/Person.java new file mode 100644 index 0000000..ef7224c --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler_type/Person.java @@ -0,0 +1,43 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.result_handler_type; + +public class Person +{ + private Integer id; + + private String name; + + public Integer getId() + { + return id; + } + + public void setId(Integer id) + { + this.id = id; + } + + public String getName() + { + return name; + } + + public void setName(String name) + { + this.name = name; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler_type/PersonMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler_type/PersonMapper.java new file mode 100644 index 0000000..944a679 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler_type/PersonMapper.java @@ -0,0 +1,30 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.result_handler_type; + +import java.util.List; +import java.util.Map; + +import org.apache.ibatis.annotations.MapKey; +import org.apache.ibatis.annotations.Select; + +public interface PersonMapper { + List doSelect(); + + @Select("select * from person") + @MapKey("id") + Map selectAsMap(); +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler_type/PersonMapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler_type/PersonMapper.xml new file mode 100644 index 0000000..6b99b69 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_handler_type/PersonMapper.xml @@ -0,0 +1,29 @@ + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_set_type/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_set_type/CreateDB.sql new file mode 100644 index 0000000..eccf9e1 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_set_type/CreateDB.sql @@ -0,0 +1,54 @@ +-- +-- Copyright 2009-2018 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +drop table users if exists +go + +drop procedure getusers if exists +go + +create table users ( + id int, + name varchar(20) +) +go + +create procedure getusers() +modifies sql data +dynamic result sets 1 +BEGIN ATOMIC + declare cur cursor for select * from users order by id; + open cur; +END +go + +insert into users (id, name) values(1, 'User1') +go + +insert into users (id, name) values(2, 'User1') +go + +insert into users (id, name) values(3, 'User1') +go + +insert into users (id, name) values(4, 'User1') +go + +insert into users (id, name) values(5, 'User1') +go + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_set_type/Mapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_set_type/Mapper.java new file mode 100644 index 0000000..3104eea --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_set_type/Mapper.java @@ -0,0 +1,42 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.result_set_type; + +import org.apache.ibatis.session.RowBounds; + +import java.util.List; + +public interface Mapper { + + List getUserWithStatementAndUnset(RowBounds rowBounds); + List getUserWithStatementAndDefault(RowBounds rowBounds); + List getUserWithStatementAndForwardOnly(RowBounds rowBounds); + List getUserWithStatementAndScrollInsensitive(RowBounds rowBounds); + List getUserWithStatementAndScrollSensitive(RowBounds rowBounds); + + List getUserWithPreparedAndUnset(RowBounds rowBounds); + List getUserWithPreparedAndDefault(RowBounds rowBounds); + List getUserWithPreparedAndForwardOnly(RowBounds rowBounds); + List getUserWithPreparedAndScrollInsensitive(RowBounds rowBounds); + List getUserWithPreparedAndScrollSensitive(RowBounds rowBounds); + + List getUserWithCallableAndUnset(RowBounds rowBounds); + List getUserWithCallableAndDefault(RowBounds rowBounds); + List getUserWithCallableAndForwardOnly(RowBounds rowBounds); + List getUserWithCallableAndScrollInsensitive(RowBounds rowBounds); + List getUserWithCallableAndScrollSensitive(RowBounds rowBounds); + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_set_type/Mapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_set_type/Mapper.xml new file mode 100644 index 0000000..841356a --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_set_type/Mapper.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_set_type/ResultSetTypeTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_set_type/ResultSetTypeTest.java new file mode 100644 index 0000000..d3fc237 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_set_type/ResultSetTypeTest.java @@ -0,0 +1,87 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.result_set_type; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.jdbc.ScriptRunner; +import org.apache.ibatis.session.RowBounds; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; + +import java.io.Reader; +import java.util.List; +import java.util.function.Function; + +public class ResultSetTypeTest { + + private static SqlSessionFactory sqlSessionFactory; + + @BeforeClass + public static void setUp() throws Exception { + // create an SqlSessionFactory + try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/result_set_type/mybatis-config.xml")) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + } + + // populate in-memory database + ScriptRunner runner = new ScriptRunner(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource().getConnection()); + runner.setDelimiter("go"); + runner.setLogWriter(null); + runner.setErrorLogWriter(null); + BaseDataTest.runScript(runner, "org/apache/ibatis/submitted/result_set_type/CreateDB.sql"); + } + + @Test + public void testWithStatement() { + test(mapper -> mapper.getUserWithStatementAndUnset(new RowBounds(5, 3)), 0); + test(mapper -> mapper.getUserWithStatementAndDefault(new RowBounds(4, 3)), 1); + test(mapper -> mapper.getUserWithStatementAndForwardOnly(new RowBounds(3, 3)), 2); + test(mapper -> mapper.getUserWithStatementAndScrollInsensitive(new RowBounds(2, 2)), 2); + test(mapper -> mapper.getUserWithStatementAndScrollSensitive(new RowBounds(1, 1)), 1); + } + + @Test + public void testWithPrepared() { + test(mapper -> mapper.getUserWithPreparedAndUnset(new RowBounds(5, 3)), 0); + test(mapper -> mapper.getUserWithPreparedAndDefault(new RowBounds(4, 3)), 1); + test(mapper -> mapper.getUserWithPreparedAndForwardOnly(new RowBounds(3, 3)), 2); + test(mapper -> mapper.getUserWithPreparedAndScrollInsensitive(new RowBounds(2, 2)), 2); + test(mapper -> mapper.getUserWithPreparedAndScrollSensitive(new RowBounds(1, 1)), 1); + } + + @Test + public void testWithCallable() { + test(mapper -> mapper.getUserWithCallableAndUnset(new RowBounds(5, 3)), 0); + test(mapper -> mapper.getUserWithCallableAndDefault(new RowBounds(4, 3)), 1); + test(mapper -> mapper.getUserWithCallableAndForwardOnly(new RowBounds(3, 3)), 2); + test(mapper -> mapper.getUserWithCallableAndScrollInsensitive(new RowBounds(2, 2)), 2); + test(mapper -> mapper.getUserWithCallableAndScrollSensitive(new RowBounds(1, 1)), 1); + } + + private void test(Function> usersSupplier, int expectedSize) { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + List users = usersSupplier.apply(mapper); + Assert.assertEquals(expectedSize, users.size()); + } + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_set_type/User.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_set_type/User.java new file mode 100644 index 0000000..dfcc052 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_set_type/User.java @@ -0,0 +1,38 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.result_set_type; + +public class User { + + private Integer id; + private String name; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_set_type/mybatis-config.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_set_type/mybatis-config.xml new file mode 100644 index 0000000..b1570f1 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/result_set_type/mybatis-config.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/resultmapwithassociationstest/Address.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/resultmapwithassociationstest/Address.java new file mode 100644 index 0000000..40e254f --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/resultmapwithassociationstest/Address.java @@ -0,0 +1,32 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.resultmapwithassociationstest; + +/** + * @author Herman Bovens + * + */ +public class Address { + private int id; + + public int getId() { + return id; + } + + public void setId(final int id) { + this.id = id; + } +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/resultmapwithassociationstest/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/resultmapwithassociationstest/CreateDB.sql new file mode 100644 index 0000000..cad5ae2 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/resultmapwithassociationstest/CreateDB.sql @@ -0,0 +1,42 @@ +-- +-- Copyright 2009-2016 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +drop table person if exists; +drop table address if exists; + +CREATE TABLE address +( + id int NOT NULL, + CONSTRAINT pk_address PRIMARY KEY (id), +) +; + + +CREATE TABLE person +( + id int NOT NULL, + id_address integer NOT NULL, + CONSTRAINT pk_person PRIMARY KEY (id), + CONSTRAINT fk_person_id_address FOREIGN KEY (id_address) REFERENCES address (id) ON UPDATE RESTRICT ON DELETE RESTRICT +) +; + +INSERT INTO address (id) VALUES (1); +INSERT INTO address (id) VALUES (2); +INSERT INTO address (id) VALUES (3); +INSERT INTO person (id, id_address) VALUES (1, 1); +INSERT INTO person (id, id_address) VALUES (2, 2); +INSERT INTO person (id, id_address) VALUES (3, 3); diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/resultmapwithassociationstest/Mapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/resultmapwithassociationstest/Mapper.java new file mode 100644 index 0000000..99f89c3 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/resultmapwithassociationstest/Mapper.java @@ -0,0 +1,22 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.resultmapwithassociationstest; + +import java.util.List; + +public interface Mapper { + List findAll(); +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/resultmapwithassociationstest/Mapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/resultmapwithassociationstest/Mapper.xml new file mode 100644 index 0000000..f33ff3e --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/resultmapwithassociationstest/Mapper.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/resultmapwithassociationstest/Person.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/resultmapwithassociationstest/Person.java new file mode 100644 index 0000000..62d44e8 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/resultmapwithassociationstest/Person.java @@ -0,0 +1,39 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.resultmapwithassociationstest; + +import java.util.List; + +public class Person { + private int id; + private List

addresses; + + public int getId() { + return id; + } + + public void setId(final int id) { + this.id = id; + } + + public List
getAddresses() { + return addresses; + } + + public void setAddresses(final List
addresses) { + this.addresses = addresses; + } +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/resultmapwithassociationstest/ResultMapWithAssociationsTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/resultmapwithassociationstest/ResultMapWithAssociationsTest.java new file mode 100644 index 0000000..41acc4f --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/resultmapwithassociationstest/ResultMapWithAssociationsTest.java @@ -0,0 +1,55 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.resultmapwithassociationstest; + +import java.io.Reader; +import java.util.List; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; + +public class ResultMapWithAssociationsTest { + + private static SqlSessionFactory sqlSessionFactory; + + @BeforeClass + public static void setUp() throws Exception { + // create a SqlSessionFactory + try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/resultmapwithassociationstest/mybatis-config.xml")) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + } + + // populate in-memory database + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/resultmapwithassociationstest/CreateDB.sql"); + } + + @Test + public void shouldFindAllPersonRecordsWithAssociatedAddressRecord() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + List resultList = mapper.findAll(); + Assert.assertEquals(3, resultList.size()); + } + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/resultmapwithassociationstest/mybatis-config.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/resultmapwithassociationstest/mybatis-config.xml new file mode 100644 index 0000000..4699834 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/resultmapwithassociationstest/mybatis-config.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/results_id/AnotherMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/results_id/AnotherMapper.java new file mode 100644 index 0000000..bde4b62 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/results_id/AnotherMapper.java @@ -0,0 +1,32 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ibatis.submitted.results_id; + +import java.util.List; + +import org.apache.ibatis.annotations.ResultMap; +import org.apache.ibatis.annotations.Select; + +public interface AnotherMapper { + + @ResultMap("org.apache.ibatis.submitted.results_id.Mapper.userResult") + @Select("select * from users order by uid") + List getUsers(); + + User getUser(Integer id); + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/results_id/AnotherMapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/results_id/AnotherMapper.xml new file mode 100644 index 0000000..977dbcf --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/results_id/AnotherMapper.xml @@ -0,0 +1,27 @@ + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/results_id/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/results_id/CreateDB.sql new file mode 100644 index 0000000..468b8a7 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/results_id/CreateDB.sql @@ -0,0 +1,25 @@ +-- +-- Copyright 2009-2015 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +drop table users if exists; + +create table users ( + uid int, + name varchar(20) +); + +insert into users (uid, name) values(1, 'User1'); +insert into users (uid, name) values(2, 'User2'); diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/results_id/IdConflictMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/results_id/IdConflictMapper.java new file mode 100644 index 0000000..3ebb579 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/results_id/IdConflictMapper.java @@ -0,0 +1,27 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.results_id; + +import org.apache.ibatis.annotations.Result; +import org.apache.ibatis.annotations.Results; +import org.apache.ibatis.annotations.Select; + +public interface IdConflictMapper { + + @Results(id = "userResult", value = { @Result(id = true, column = "uid", property = "id") }) + @Select("select * from users where uid = #{id}") + User getUserById(Integer id); +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/results_id/IdConflictMapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/results_id/IdConflictMapper.xml new file mode 100644 index 0000000..16cefec --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/results_id/IdConflictMapper.xml @@ -0,0 +1,28 @@ + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/results_id/IdConflictTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/results_id/IdConflictTest.java new file mode 100644 index 0000000..edf112d --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/results_id/IdConflictTest.java @@ -0,0 +1,34 @@ +/** + * Copyright 2009-2017 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.results_id; + +import org.apache.ibatis.session.Configuration; +import org.junit.Test; + +import static com.googlecode.catchexception.apis.BDDCatchException.*; +import static org.assertj.core.api.BDDAssertions.then; + +public class IdConflictTest { + + @Test + public void shouldFailOnDuplicatedId() throws Exception { + Configuration configuration = new Configuration(); + when(configuration).addMapper(IdConflictMapper.class); + then(caughtException()).isInstanceOf(RuntimeException.class) + .hasMessage("Result Maps collection already contains value for org.apache.ibatis.submitted.results_id.IdConflictMapper.userResult"); + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/results_id/Mapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/results_id/Mapper.java new file mode 100644 index 0000000..1c59334 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/results_id/Mapper.java @@ -0,0 +1,49 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.results_id; + +import org.apache.ibatis.annotations.Arg; +import org.apache.ibatis.annotations.ConstructorArgs; +import org.apache.ibatis.annotations.Result; +import org.apache.ibatis.annotations.ResultMap; +import org.apache.ibatis.annotations.Results; +import org.apache.ibatis.annotations.Select; + +public interface Mapper { + + @Results(id = "userResult", value = { + @Result(id = true, column = "uid", property = "id"), + @Result(column = "name", property = "name") + }) + @Select("select * from users where uid = #{id}") + User getUserById(Integer id); + + @ResultMap("userResult") + @Select("select * from users where name = #{name}") + User getUserByName(String name); + + @Results(id = "userResultConstructor") + @ConstructorArgs({ + @Arg(id = true, column = "uid", javaType = Integer.class), + @Arg(column = "name", javaType = String.class) + }) + @Select("select * from users where uid = #{id}") + User getUserByIdConstructor(Integer id); + + @ResultMap("userResultConstructor") + @Select("select * from users where name = #{name}") + User getUserByNameConstructor(String name); +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/results_id/ResultsIdTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/results_id/ResultsIdTest.java new file mode 100644 index 0000000..b7431a0 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/results_id/ResultsIdTest.java @@ -0,0 +1,89 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.results_id; + +import static org.junit.Assert.*; + +import java.io.Reader; +import java.util.List; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.BeforeClass; +import org.junit.Test; + +public class ResultsIdTest { + + private static SqlSessionFactory sqlSessionFactory; + + @BeforeClass + public static void setUp() throws Exception { + // create an SqlSessionFactory + try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/results_id/mybatis-config.xml")) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + } + + // populate in-memory database + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/results_id/CreateDB.sql"); + } + + @Test + public void testNamingResults() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + User user = mapper.getUserByName("User2"); + assertEquals(Integer.valueOf(2), user.getId()); + assertEquals("User2", user.getName()); + } + } + + @Test + public void testResultsOnlyForNaming() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + User user = mapper.getUserByNameConstructor("User2"); + assertEquals(Integer.valueOf(2), user.getId()); + assertEquals("User2", user.getName()); + } + } + + @Test + public void testReuseNamedResultsFromAnotherMapper() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + AnotherMapper mapper = sqlSession.getMapper(AnotherMapper.class); + List users = mapper.getUsers(); + assertEquals(2, users.size()); + assertEquals(Integer.valueOf(1), users.get(0).getId()); + assertEquals("User1", users.get(0).getName()); + assertEquals(Integer.valueOf(2), users.get(1).getId()); + assertEquals("User2", users.get(1).getName()); + } + } + + @Test + public void testReuseNamedResultsFromXmlMapper() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + AnotherMapper mapper = sqlSession.getMapper(AnotherMapper.class); + User user = mapper.getUser(1); + assertEquals(Integer.valueOf(1), user.getId()); + assertEquals("User1", user.getName()); + } + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/results_id/User.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/results_id/User.java new file mode 100644 index 0000000..0fbbaa3 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/results_id/User.java @@ -0,0 +1,48 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.results_id; + +public class User { + + private Integer id; + private String name; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public User() { + super(); + } + + public User(Integer id, String name) { + super(); + this.id = id; + this.name = name; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/results_id/mybatis-config.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/results_id/mybatis-config.xml new file mode 100644 index 0000000..cdde49a --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/results_id/mybatis-config.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/rounding/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/rounding/CreateDB.sql new file mode 100644 index 0000000..91082b8 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/rounding/CreateDB.sql @@ -0,0 +1,40 @@ +-- +-- Copyright 2009-2016 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +drop table users if exists; +drop table users2 if exists; + +create table users ( + id int, + name varchar(20), + funkyNumber decimal(38), + roundingMode int +); + +insert into users (id, name, funkyNumber, roundingMode) +values(1, 'User1', 123456789.9876543212345678987654321, 0); + + +create table users2 ( + id int, + name varchar(20), + funkyNumber decimal(38), + roundingMode varchar(12) +); + +insert into users2 (id, name, funkyNumber, roundingMode) +values(1, 'User1', 123456789.9876543212345678987654321, 'UP'); + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/rounding/Mapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/rounding/Mapper.java new file mode 100644 index 0000000..bf46626 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/rounding/Mapper.java @@ -0,0 +1,25 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.rounding; + +public interface Mapper { + + User getUser(Integer id); + void insert(User user); + User getUser2(Integer id); + void insert2(User user); + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/rounding/Mapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/rounding/Mapper.xml new file mode 100644 index 0000000..9f62f92 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/rounding/Mapper.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + insert into users (id, name, funkyNumber, roundingMode) values ( + #{id}, #{name}, #{funkyNumber}, #{roundingMode} + ) + + + + + + + + + + + insert into users2 (id, name, funkyNumber, roundingMode) values ( + #{id}, #{name}, #{funkyNumber}, #{roundingMode, typeHandler=org.apache.ibatis.type.EnumTypeHandler} + ) + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/rounding/RoundingHandlersTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/rounding/RoundingHandlersTest.java new file mode 100644 index 0000000..d1ff405 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/rounding/RoundingHandlersTest.java @@ -0,0 +1,75 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.rounding; + +import java.io.Reader; +import java.math.BigDecimal; +import java.math.RoundingMode; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; + +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; + +public class RoundingHandlersTest { + + private static SqlSessionFactory sqlSessionFactory; + + @BeforeClass + public static void setUp() throws Exception { + // create a SqlSessionFactory + try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/rounding/mybatis-config.xml")) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + } + + // populate in-memory database + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/rounding/CreateDB.sql"); + } + + @Test + public void shouldGetAUser() { + try (SqlSession session = sqlSessionFactory.openSession()) { + Mapper mapper = session.getMapper(Mapper.class); + User user = mapper.getUser(1); + Assert.assertEquals("User1", user.getName()); + Assert.assertEquals(RoundingMode.UP, user.getRoundingMode()); + user = mapper.getUser2(1); + Assert.assertEquals("User1", user.getName()); + Assert.assertEquals(RoundingMode.UP, user.getRoundingMode()); + } + } + + @Test + public void shouldInsertUser2() { + try (SqlSession session = sqlSessionFactory.openSession()) { + Mapper mapper = session.getMapper(Mapper.class); + User user = new User(); + user.setId(2); + user.setName("User2"); + user.setFunkyNumber(BigDecimal.ZERO); + user.setRoundingMode(RoundingMode.UNNECESSARY); + mapper.insert(user); + mapper.insert2(user); + } + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/rounding/User.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/rounding/User.java new file mode 100644 index 0000000..03d2a1f --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/rounding/User.java @@ -0,0 +1,60 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.rounding; + +import java.math.BigDecimal; +import java.math.RoundingMode; + +public class User { + + private Integer id; + private String name; + private BigDecimal funkyNumber; + private RoundingMode roundingMode; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public BigDecimal getFunkyNumber() { + return funkyNumber; + } + + public void setFunkyNumber(BigDecimal big) { + funkyNumber = big; + } + + public RoundingMode getRoundingMode() { + return roundingMode; + } + + public void setRoundingMode(RoundingMode mode) { + roundingMode = mode; + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/rounding/mybatis-config.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/rounding/mybatis-config.xml new file mode 100644 index 0000000..afb8702 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/rounding/mybatis-config.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/selectkey/AnnotatedMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/selectkey/AnnotatedMapper.java new file mode 100644 index 0000000..cc3b7e3 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/selectkey/AnnotatedMapper.java @@ -0,0 +1,75 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.selectkey; + +import java.util.Map; + +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.InsertProvider; +import org.apache.ibatis.annotations.Options; +import org.apache.ibatis.annotations.SelectKey; +import org.apache.ibatis.annotations.Update; + +public interface AnnotatedMapper { + + @Insert("insert into table2 (name) values(#{name})") + @SelectKey(statement="call identity()", keyProperty="nameId", before=false, resultType=int.class) + int insertTable2(Name name); + + @Insert("insert into table2 (name) values(#{name})") + @Options(useGeneratedKeys=true, keyProperty="nameId,generatedName", keyColumn="ID,NAME_FRED") + int insertTable2WithGeneratedKey(Name name); + + int insertTable2WithGeneratedKeyXml(Name name); + + @Insert("insert into table2 (name) values(#{name})") + @SelectKey(statement="select id, name_fred from table2 where id = identity()", keyProperty="nameId,generatedName", keyColumn="ID,NAME_FRED", before=false, resultType=Map.class) + int insertTable2WithSelectKeyWithKeyMap(Name name); + + int insertTable2WithSelectKeyWithKeyMapXml(Name name); + + @Insert("insert into table2 (name) values(#{name})") + @SelectKey(statement="select id as nameId, name_fred as generatedName from table2 where id = identity()", keyProperty="nameId,generatedName", before=false, resultType=Name.class) + int insertTable2WithSelectKeyWithKeyObject(Name name); + + int insertTable2WithSelectKeyWithKeyObjectXml(Name name); + + @Insert("insert into table3 (id, name) values(#{nameId}, #{name})") + @SelectKey(statement="call next value for TestSequence", keyProperty="nameId", before=true, resultType=int.class) + int insertTable3(Name name); + + @InsertProvider(type=SqlProvider.class,method="insertTable3_2") + @SelectKey(statement="call next value for TestSequence", keyProperty="nameId", before=true, resultType=int.class) + int insertTable3_2(Name name); + + @Update("update table2 set name = #{name} where id = #{nameId}") + @Options(useGeneratedKeys=true, keyProperty="generatedName") + int updateTable2WithGeneratedKey(Name name); + + int updateTable2WithGeneratedKeyXml(Name name); + + @Update("update table2 set name = #{name} where id = #{nameId}") + @SelectKey(statement="select name_fred from table2 where id = #{nameId}", keyProperty="generatedName", keyColumn="NAME_FRED", before=false, resultType=String.class) + int updateTable2WithSelectKeyWithKeyMap(Name name); + + int updateTable2WithSelectKeyWithKeyMapXml(Name name); + + @Update("update table2 set name = #{name} where id = #{nameId}") + @SelectKey(statement="select name_fred as generatedName from table2 where id = #{nameId}", keyProperty="generatedName", before=false, resultType=Name.class) + int updateTable2WithSelectKeyWithKeyObject(Name name); + + int updateTable2WithSelectKeyWithKeyObjectXml(Name name); +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/selectkey/AnnotatedMapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/selectkey/AnnotatedMapper.xml new file mode 100644 index 0000000..64ae148 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/selectkey/AnnotatedMapper.xml @@ -0,0 +1,56 @@ + + + + + + + select id, name_fred from table2 where id = identity() + + insert into table2 (name) values(#{name}) + + + + + select id as nameId, name_fred as generatedName from table2 where id = identity() + + insert into table2 (name) values(#{name}) + + + + insert into table2 (name) values(#{name}) + + + + + select name_fred from table2 where id = #{nameId} + + update table2 set name = #{name} where id = #{nameId} + + + + + select name_fred as generatedName from table2 where id = #{nameId} + + update table2 set name = #{name} where id = #{nameId} + + + + update table2 set name = #{name} where id = #{nameId} + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/selectkey/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/selectkey/CreateDB.sql new file mode 100644 index 0000000..2360d1e --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/selectkey/CreateDB.sql @@ -0,0 +1,38 @@ +-- +-- Copyright 2009-2016 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +drop sequence if exists TestSequence; +drop table if exists table1; +drop table if exists table2; +drop table if exists table3; + +create table table1 ( +id int generated by default as identity (start with 11) not null, +name varchar(20) +); + +create table table2 ( +id int generated by default as identity (start with 22) not null, +name varchar(20), +name_fred varchar(25) generated always as (name || '_fred') +); + +create sequence TestSequence as integer start with 33; + +create table table3 ( +id int not null, +name varchar(20) +); diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/selectkey/MapperConfig.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/selectkey/MapperConfig.xml new file mode 100644 index 0000000..92ec5f1 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/selectkey/MapperConfig.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/selectkey/Name.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/selectkey/Name.java new file mode 100644 index 0000000..adf9eb0 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/selectkey/Name.java @@ -0,0 +1,40 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.selectkey; + +public class Name { + private int nameId; + private String name; + private String generatedName; + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public int getNameId() { + return nameId; + } + public void setNameId(int nameId) { + this.nameId = nameId; + } + public String getGeneratedName() { + return generatedName; + } + public void setGeneratedName(String generatedName) { + this.generatedName = generatedName; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/selectkey/SelectKeyTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/selectkey/SelectKeyTest.java new file mode 100644 index 0000000..79ca005 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/selectkey/SelectKeyTest.java @@ -0,0 +1,342 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.selectkey; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.exceptions.PersistenceException; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Test; + +import java.io.Reader; +import java.util.HashMap; +import java.util.Map; + +public class SelectKeyTest { + + protected static SqlSessionFactory sqlSessionFactory; + + @Before + public void setUp() throws Exception { + try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/selectkey/MapperConfig.xml")) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + sqlSessionFactory.getConfiguration().addMapper(AnnotatedMapper.class); + } + + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/selectkey/CreateDB.sql"); + } + + @Test + public void testSelectKey() throws Exception { + // this test checks to make sure that we can have select keys with the same + // insert id in different namespaces + String resource = "org/apache/ibatis/submitted/selectkey/MapperConfig.xml"; + Reader reader = Resources.getResourceAsReader(resource); + SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); + SqlSessionFactory sqlMapper = builder.build(reader); + assertNotNull(sqlMapper); + } + + @Test + public void testInsertTable1() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Map parms = new HashMap(); + parms.put("name", "Fred"); + int rows = sqlSession.insert("org.apache.ibatis.submitted.selectkey.Table1.insert", parms); + assertEquals(1, rows); + assertEquals(11, parms.get("id")); + } + } + + @Test + public void testInsertTable2() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Map parms = new HashMap(); + parms.put("name", "Fred"); + int rows = sqlSession.insert("org.apache.ibatis.submitted.selectkey.Table2.insert", parms); + assertEquals(1, rows); + assertEquals(22, parms.get("id")); + } + } + + @Test(expected=PersistenceException.class) + public void testSeleckKeyReturnsNoData() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Map parms = new HashMap(); + parms.put("name", "Fred"); + int rows = sqlSession.insert("org.apache.ibatis.submitted.selectkey.Table2.insertNoValuesInSelectKey", parms); + assertEquals(1, rows); + assertNull(parms.get("id")); + } + } + + @Test(expected=PersistenceException.class) + public void testSeleckKeyReturnsTooManyData() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Map parms = new HashMap(); + parms.put("name", "Fred"); + sqlSession.insert("org.apache.ibatis.submitted.selectkey.Table2.insertTooManyValuesInSelectKey", parms); + sqlSession.insert("org.apache.ibatis.submitted.selectkey.Table2.insertTooManyValuesInSelectKey", parms); + } + } + + @Test + public void testAnnotatedInsertTable2() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Name name = new Name(); + name.setName("barney"); + AnnotatedMapper mapper = sqlSession.getMapper(AnnotatedMapper.class); + int rows = mapper.insertTable2(name); + assertEquals(1, rows); + assertEquals(22, name.getNameId()); + } + } + + @Test + public void testAnnotatedInsertTable2WithGeneratedKey() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Name name = new Name(); + name.setName("barney"); + AnnotatedMapper mapper = sqlSession.getMapper(AnnotatedMapper.class); + int rows = mapper.insertTable2WithGeneratedKey(name); + assertEquals(1, rows); + assertEquals(22, name.getNameId()); + assertEquals("barney_fred", name.getGeneratedName()); + } + } + + @Test + @Ignore("HSQLDB is not returning the generated column after the update") + public void testAnnotatedUpdateTable2WithGeneratedKey() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Name name = new Name(); + name.setName("barney"); + AnnotatedMapper mapper = sqlSession.getMapper(AnnotatedMapper.class); + int rows = mapper.insertTable2WithGeneratedKey(name); + assertEquals(1, rows); + assertEquals(22, name.getNameId()); + assertEquals("barney_fred", name.getGeneratedName()); + + name.setName("Wilma"); + rows = mapper.updateTable2WithGeneratedKey(name); + assertEquals(1, rows); + assertEquals(22, name.getNameId()); + assertEquals("Wilma_fred", name.getGeneratedName()); + } + } + + @Test + @Ignore("HSQLDB is not returning the generated column after the update") + public void testAnnotatedUpdateTable2WithGeneratedKeyXml() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Name name = new Name(); + name.setName("barney"); + AnnotatedMapper mapper = sqlSession.getMapper(AnnotatedMapper.class); + int rows = mapper.insertTable2WithGeneratedKeyXml(name); + assertEquals(1, rows); + assertEquals(22, name.getNameId()); + assertEquals("barney_fred", name.getGeneratedName()); + + name.setName("Wilma"); + rows = mapper.updateTable2WithGeneratedKeyXml(name); + assertEquals(1, rows); + assertEquals(22, name.getNameId()); + assertEquals("Wilma_fred", name.getGeneratedName()); + } + } + + @Test + public void testAnnotatedInsertTable2WithGeneratedKeyXml() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Name name = new Name(); + name.setName("barney"); + AnnotatedMapper mapper = sqlSession.getMapper(AnnotatedMapper.class); + int rows = mapper.insertTable2WithGeneratedKeyXml(name); + assertEquals(1, rows); + assertEquals(22, name.getNameId()); + assertEquals("barney_fred", name.getGeneratedName()); + } + } + + @Test + public void testAnnotatedInsertTable2WithSelectKeyWithKeyMap() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Name name = new Name(); + name.setName("barney"); + AnnotatedMapper mapper = sqlSession.getMapper(AnnotatedMapper.class); + int rows = mapper.insertTable2WithSelectKeyWithKeyMap(name); + assertEquals(1, rows); + assertEquals(22, name.getNameId()); + assertEquals("barney_fred", name.getGeneratedName()); + } + } + + @Test + public void testAnnotatedUpdateTable2WithSelectKeyWithKeyMap() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Name name = new Name(); + name.setName("barney"); + AnnotatedMapper mapper = sqlSession.getMapper(AnnotatedMapper.class); + int rows = mapper.insertTable2WithSelectKeyWithKeyMap(name); + assertEquals(1, rows); + assertEquals(22, name.getNameId()); + assertEquals("barney_fred", name.getGeneratedName()); + + name.setName("Wilma"); + rows = mapper.updateTable2WithSelectKeyWithKeyMap(name); + assertEquals(1, rows); + assertEquals(22, name.getNameId()); + assertEquals("Wilma_fred", name.getGeneratedName()); + } + } + + @Test + public void testAnnotatedInsertTable2WithSelectKeyWithKeyMapXml() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Name name = new Name(); + name.setName("barney"); + AnnotatedMapper mapper = sqlSession.getMapper(AnnotatedMapper.class); + int rows = mapper.insertTable2WithSelectKeyWithKeyMapXml(name); + assertEquals(1, rows); + assertEquals(22, name.getNameId()); + assertEquals("barney_fred", name.getGeneratedName()); + } + } + + @Test + public void testAnnotatedUpdateTable2WithSelectKeyWithKeyMapXml() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Name name = new Name(); + name.setName("barney"); + AnnotatedMapper mapper = sqlSession.getMapper(AnnotatedMapper.class); + int rows = mapper.insertTable2WithSelectKeyWithKeyMapXml(name); + assertEquals(1, rows); + assertEquals(22, name.getNameId()); + assertEquals("barney_fred", name.getGeneratedName()); + + name.setName("Wilma"); + rows = mapper.updateTable2WithSelectKeyWithKeyMapXml(name); + assertEquals(1, rows); + assertEquals(22, name.getNameId()); + assertEquals("Wilma_fred", name.getGeneratedName()); + } + } + + @Test + public void testAnnotatedInsertTable2WithSelectKeyWithKeyObject() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Name name = new Name(); + name.setName("barney"); + AnnotatedMapper mapper = sqlSession.getMapper(AnnotatedMapper.class); + int rows = mapper.insertTable2WithSelectKeyWithKeyObject(name); + assertEquals(1, rows); + assertEquals(22, name.getNameId()); + assertEquals("barney_fred", name.getGeneratedName()); + } + } + + @Test + public void testAnnotatedUpdateTable2WithSelectKeyWithKeyObject() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Name name = new Name(); + name.setName("barney"); + AnnotatedMapper mapper = sqlSession.getMapper(AnnotatedMapper.class); + int rows = mapper.insertTable2WithSelectKeyWithKeyObject(name); + assertEquals(1, rows); + assertEquals(22, name.getNameId()); + assertEquals("barney_fred", name.getGeneratedName()); + + name.setName("Wilma"); + rows = mapper.updateTable2WithSelectKeyWithKeyObject(name); + assertEquals(1, rows); + assertEquals(22, name.getNameId()); + assertEquals("Wilma_fred", name.getGeneratedName()); + } + } + + @Test + public void testAnnotatedUpdateTable2WithSelectKeyWithKeyObjectXml() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Name name = new Name(); + name.setName("barney"); + AnnotatedMapper mapper = sqlSession.getMapper(AnnotatedMapper.class); + int rows = mapper.insertTable2WithSelectKeyWithKeyObjectXml(name); + assertEquals(1, rows); + assertEquals(22, name.getNameId()); + assertEquals("barney_fred", name.getGeneratedName()); + + name.setName("Wilma"); + rows = mapper.updateTable2WithSelectKeyWithKeyObjectXml(name); + assertEquals(1, rows); + assertEquals(22, name.getNameId()); + assertEquals("Wilma_fred", name.getGeneratedName()); + } + } + + @Test + public void testAnnotatedInsertTable2WithSelectKeyWithKeyObjectXml() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Name name = new Name(); + name.setName("barney"); + AnnotatedMapper mapper = sqlSession.getMapper(AnnotatedMapper.class); + int rows = mapper.insertTable2WithSelectKeyWithKeyObjectXml(name); + assertEquals(1, rows); + assertEquals(22, name.getNameId()); + assertEquals("barney_fred", name.getGeneratedName()); + } + } + + @Test + public void testAnnotatedInsertTable3() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Name name = new Name(); + name.setName("barney"); + AnnotatedMapper mapper = sqlSession.getMapper(AnnotatedMapper.class); + int rows = mapper.insertTable3(name); + assertEquals(1, rows); + assertEquals(33, name.getNameId()); + } + } + + @Test + public void testAnnotatedInsertTable3_2() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Name name = new Name(); + name.setName("barney"); + AnnotatedMapper mapper = sqlSession.getMapper(AnnotatedMapper.class); + int rows = mapper.insertTable3_2(name); + assertEquals(1, rows); + assertEquals(33, name.getNameId()); + } + } + + @Test(expected = PersistenceException.class) + public void testSeleckKeyWithWrongKeyProperty() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Name name = new Name(); + name.setName("Kyoto"); + sqlSession.insert("org.apache.ibatis.submitted.selectkey.Table2.insertWrongKeyProperty", name); + } + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/selectkey/SqlProvider.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/selectkey/SqlProvider.java new file mode 100644 index 0000000..733d445 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/selectkey/SqlProvider.java @@ -0,0 +1,23 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.selectkey; + +public class SqlProvider { + + public String insertTable3_2(Name name) { + return "insert into table3 (id, name) values(#{nameId}, #{name})"; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/selectkey/Table1.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/selectkey/Table1.xml new file mode 100644 index 0000000..333cb54 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/selectkey/Table1.xml @@ -0,0 +1,27 @@ + + + + + + insert into table1 (name) values (#{name}) + + CALL IDENTITY() + + + \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/selectkey/Table2.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/selectkey/Table2.xml new file mode 100644 index 0000000..1c8117f --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/selectkey/Table2.xml @@ -0,0 +1,49 @@ + + + + + + insert into table2 (name) values (#{name}) + + CALL IDENTITY() + + + + + insert into table2 (name) values (#{name}) + + select * from table2 where name = 'xxx' + + + + + insert into table2 (name) values (#{name}) + + select id from table2 + + + + + insert into table2 (name) values (#{name}) + + select id from table2 + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/Attribute.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/Attribute.java new file mode 100644 index 0000000..6b2fde6 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/Attribute.java @@ -0,0 +1,33 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.serializecircular; + +import java.io.Serializable; + +public class Attribute implements Serializable { + private static final long serialVersionUID = 1L; + + private Integer id; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/AttributeMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/AttributeMapper.java new file mode 100644 index 0000000..2b9fc54 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/AttributeMapper.java @@ -0,0 +1,21 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.serializecircular; + +public interface AttributeMapper { + public Attribute getById(Integer anId); +} + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/AttributeMapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/AttributeMapper.xml new file mode 100644 index 0000000..f4802c7 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/AttributeMapper.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/CreateDB.sql new file mode 100644 index 0000000..b963dea --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/CreateDB.sql @@ -0,0 +1,34 @@ +-- +-- Copyright 2009-2016 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +drop table if exists person; +create table person (id int, nr_department int); + +insert into person (id, nr_department) +values (1, 1); + +drop table if exists productattribute; +create table productattribute (nr_id int); + +insert into productattribute(nr_id) +values (1); + +drop table if exists department; +create table department (nr_id int,nr_attribute int,person int); + +insert into department(nr_id,nr_attribute,person) +values (1,1,1); + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/Department.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/Department.java new file mode 100644 index 0000000..a56bea1 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/Department.java @@ -0,0 +1,52 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.serializecircular; + +import java.io.Serializable; + +public class Department implements Serializable{ + + private static final long serialVersionUID = 1L; + + private Integer id; + private Attribute attribute; + private Person person; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public void setAttribute(Attribute attribute) { + this.attribute = attribute; + } + + public Attribute getAttribute() { + return attribute; + } + + public void setPerson(Person person) { + this.person = person; + } + + public Person getPerson() { + return person; + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/DepartmentMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/DepartmentMapper.java new file mode 100644 index 0000000..1133480 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/DepartmentMapper.java @@ -0,0 +1,20 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.serializecircular; + +public interface DepartmentMapper { + public Department getById(Integer anId); +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/DepartmentMapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/DepartmentMapper.xml new file mode 100644 index 0000000..906abb2 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/DepartmentMapper.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/MapperConfigWithAggressiveLazyLoading.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/MapperConfigWithAggressiveLazyLoading.xml new file mode 100644 index 0000000..259e63e --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/MapperConfigWithAggressiveLazyLoading.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/MapperConfigWithoutAggressiveLazyLoading.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/MapperConfigWithoutAggressiveLazyLoading.xml new file mode 100644 index 0000000..c3aea8b --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/MapperConfigWithoutAggressiveLazyLoading.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/Person.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/Person.java new file mode 100644 index 0000000..28d35ea --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/Person.java @@ -0,0 +1,44 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.serializecircular; + +import java.io.Serializable; + +public class Person implements Serializable { + private static final long serialVersionUID = 1L; + + private Integer id; + private Department department; + + public Department getDepartment() { + return department; + } + + public void setDepartment(Department department) { + this.department = department; + } + + public Integer getId() + { + return id; + } + + public void setId(Integer id) + { + this.id = id; + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/PersonMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/PersonMapper.java new file mode 100644 index 0000000..e557edb --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/PersonMapper.java @@ -0,0 +1,23 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.serializecircular; + +import java.util.List; + +public interface PersonMapper { + public Person getById(Integer anId); + public List getByDepartment(Integer anDepartmentId); +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/PersonMapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/PersonMapper.xml new file mode 100644 index 0000000..497b022 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/PersonMapper.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + person.id, + person.nr_department + + + person + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/SerializeCircularTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/SerializeCircularTest.java new file mode 100644 index 0000000..90e9593 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/SerializeCircularTest.java @@ -0,0 +1,118 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.serializecircular; + +import java.io.Reader; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.Test; + +//@Ignore("see issue #614") +public class SerializeCircularTest { + + @Test + public void serializeAndDeserializeObjectsWithAggressiveLazyLoadingWithoutPreloadingAttribute() + throws Exception { + try (SqlSession sqlSession = createSessionWithAggressiveLazyLoading()) { + testSerializeWithoutPreloadingAttribute(sqlSession); + } + } + + @Test + public void serializeAndDeserializeObjectsWithAggressiveLazyLoadingWithPreloadingAttribute() + throws Exception { + try (SqlSession sqlSession = createSessionWithAggressiveLazyLoading()) { + testSerializeWithPreloadingAttribute(sqlSession); + } + } + +// @Ignore("See http://code.google.com/p/mybatis/issues/detail?id=614") + @Test + public void serializeAndDeserializeObjectsWithoutAggressiveLazyLoadingWithoutPreloadingAttribute() + throws Exception { + try (SqlSession sqlSession = createSessionWithoutAggressiveLazyLoading()) { + //expected problem with deserializing + testSerializeWithoutPreloadingAttribute(sqlSession); + } + } + + @Test + public void serializeAndDeserializeObjectsWithoutAggressiveLazyLoadingWithPreloadingAttribute() + throws Exception { + try (SqlSession sqlSession = createSessionWithoutAggressiveLazyLoading()) { + testSerializeWithPreloadingAttribute(sqlSession); + } + } + + private SqlSession createSessionWithoutAggressiveLazyLoading() throws Exception { + return createSession(false); + } + + private SqlSession createSessionWithAggressiveLazyLoading() throws Exception { + return createSession(true); + } + + private SqlSession createSession(boolean anAggressiveLazyLoading) throws Exception { + String xmlConfig = anAggressiveLazyLoading ? + "org/apache/ibatis/submitted/serializecircular/MapperConfigWithAggressiveLazyLoading.xml": + "org/apache/ibatis/submitted/serializecircular/MapperConfigWithoutAggressiveLazyLoading.xml"; + SqlSessionFactory sqlSessionFactory = getSqlSessionFactoryXmlConfig(xmlConfig); + SqlSession sqlSession = sqlSessionFactory.openSession(); + return sqlSession; + } + + private void testSerializeWithPreloadingAttribute(SqlSession sqlSession) { + testSerialize(sqlSession, true); + } + + private void testSerializeWithoutPreloadingAttribute(SqlSession sqlSession) { + testSerialize(sqlSession, false); + } + + private void testSerialize(SqlSession sqlSession, boolean aPreloadAttribute) { + DepartmentMapper departmentMapper = sqlSession.getMapper(DepartmentMapper.class); + Department department = departmentMapper.getById(1); + if (aPreloadAttribute) { + department.getAttribute(); + } + + serializeAndDeserializeObject(department); + + // This call results in problems when deserializing department + department.getPerson(); + serializeAndDeserializeObject(department); + } + + protected void serializeAndDeserializeObject(Object anObject) { + UtilityTester.serializeAndDeserializeObject(anObject); + } + + private SqlSessionFactory getSqlSessionFactoryXmlConfig(String resource) throws Exception { + try (Reader configReader = Resources.getResourceAsReader(resource)) { + SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configReader); + + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/serializecircular/CreateDB.sql"); + + return sqlSessionFactory; + } + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/UtilityTester.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/UtilityTester.java new file mode 100644 index 0000000..17cb634 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/serializecircular/UtilityTester.java @@ -0,0 +1,62 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.serializecircular; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; + +public class UtilityTester { + + public static void serializeAndDeserializeObject(Object myObject){ + + try { + deserialzeObject(serializeObject(myObject)); + } catch (IOException e) { + System.out.println("Exception: " + e.toString()); + } + } + + private static byte[] serializeObject(Object myObject) throws IOException { + try { + ByteArrayOutputStream myByteArrayOutputStream = new ByteArrayOutputStream(); + + // Serialize to a byte array + try (ObjectOutputStream myObjectOutputStream = new ObjectOutputStream(myByteArrayOutputStream)) { + myObjectOutputStream.writeObject(myObject); + } + + // Get the bytes of the serialized object + byte[] myResult = myByteArrayOutputStream.toByteArray(); + return myResult; + } catch (Exception anException) { + throw new RuntimeException("Problem serializing: " + anException.toString(), anException); + } + } + + private static Object deserialzeObject(byte[] aSerializedObject) { + // Deserialize from a byte array + try (ObjectInputStream myObjectInputStream = new ObjectInputStream(new ByteArrayInputStream(aSerializedObject))) { + return myObjectInputStream.readObject(); + } + catch (Exception anException) { + throw new RuntimeException("Problem deserializing", anException); + } + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/simplelistparameter/Car.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/simplelistparameter/Car.java new file mode 100644 index 0000000..8bdaffa --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/simplelistparameter/Car.java @@ -0,0 +1,39 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.simplelistparameter; + +import java.util.List; + +public class Car { + private String name; + private List doors; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getDoors() { + return doors; + } + + public void setDoors(List doors) { + this.doors = doors; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/simplelistparameter/CarMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/simplelistparameter/CarMapper.java new file mode 100644 index 0000000..9a402ac --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/simplelistparameter/CarMapper.java @@ -0,0 +1,32 @@ +/** + * Copyright 2009-2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.simplelistparameter; + +import java.util.List; + +import org.apache.ibatis.annotations.Select; + +public interface CarMapper { + + @Select({ "select name from car where doors = #{doors[1]}" }) + List getCar(Car car); + + @Select({ "select name from car where doors = #{doors1[1]}" }) + List getRv1(Rv rv); + + @Select({ "select name from car where doors = #{doors2[1]}" }) + List getRv2(Rv rv); +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/simplelistparameter/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/simplelistparameter/CreateDB.sql new file mode 100644 index 0000000..5c7e69c --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/simplelistparameter/CreateDB.sql @@ -0,0 +1,26 @@ +-- +-- Copyright 2009-2016 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +drop table car if exists; + +create table car ( + name varchar(20), + doors int +); + +insert into car (name, doors) values('Audi', 4); +insert into car (name, doors) values('Ford', 4); +insert into car (name, doors) values('Fiat', 4); diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/simplelistparameter/Rv.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/simplelistparameter/Rv.java new file mode 100644 index 0000000..2a0cf1f --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/simplelistparameter/Rv.java @@ -0,0 +1,19 @@ +/** + * Copyright 2009-2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.simplelistparameter; + +public class Rv extends Vehicle { +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/simplelistparameter/SimpleListParameterTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/simplelistparameter/SimpleListParameterTest.java new file mode 100644 index 0000000..b9ddc99 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/simplelistparameter/SimpleListParameterTest.java @@ -0,0 +1,79 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.simplelistparameter; + +import java.io.Reader; +import java.util.Arrays; +import java.util.List; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; + +public class SimpleListParameterTest { + + private static SqlSessionFactory sqlSessionFactory; + + @BeforeClass + public static void setUp() throws Exception { + // create a SqlSessionFactory + try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/simplelistparameter/mybatis-config.xml")) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + } + + // populate in-memory database + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/simplelistparameter/CreateDB.sql"); + } + + @Test + public void shouldGetACar() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + CarMapper carMapper = sqlSession.getMapper(CarMapper.class); + Car car = new Car(); + car.setDoors(Arrays.asList(new String[] {"2", "4"})); + List cars = carMapper.getCar(car); + Assert.assertNotNull(cars); + } + } + + @Test + public void shouldResolveGenericFieldGetterType() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + CarMapper carMapper = sqlSession.getMapper(CarMapper.class); + Rv rv = new Rv(); + rv.doors1 = Arrays.asList(new String[] {"2", "4"}); + List rvs = carMapper.getRv1(rv); + Assert.assertNotNull(rvs); + } + } + + @Test + public void shouldResolveGenericMethodGetterType() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + CarMapper carMapper = sqlSession.getMapper(CarMapper.class); + Rv rv = new Rv(); + rv.setDoors2(Arrays.asList(new String[] {"2", "4"})); + List rvs = carMapper.getRv2(rv); + Assert.assertNotNull(rvs); + } + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/simplelistparameter/Vehicle.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/simplelistparameter/Vehicle.java new file mode 100644 index 0000000..fd2bf67 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/simplelistparameter/Vehicle.java @@ -0,0 +1,34 @@ +/** + * Copyright 2009-2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.simplelistparameter; + +import java.util.List; + +public class Vehicle { + public T name; + + public List doors1; + + private List doors2; + + public List getDoors2() { + return doors2; + } + + public void setDoors2(List doors2) { + this.doors2 = doors2; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/simplelistparameter/mybatis-config.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/simplelistparameter/mybatis-config.xml new file mode 100644 index 0000000..41212c5 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/simplelistparameter/mybatis-config.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sptests/Book.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sptests/Book.java new file mode 100644 index 0000000..90e5086 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sptests/Book.java @@ -0,0 +1,47 @@ +/** + * Copyright 2009-2017 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ibatis.submitted.sptests; + +public class Book { + private Integer id; + private String name; + private Genre genre; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Genre getGenre() { + return genre; + } + + public void setGenre(Genre genre) { + this.genre = genre; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sptests/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sptests/CreateDB.sql new file mode 100644 index 0000000..8feb14b --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sptests/CreateDB.sql @@ -0,0 +1,189 @@ +-- +-- Copyright 2009-2017 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +drop procedure sptest.getnames if exists +go + +drop procedure sptest.getname if exists +go + +drop procedure sptest.adder if exists +go + +drop procedure sptest.arraytest if exists +go + +drop table sptest.names if exists +go + +drop table sptest.items if exists +go + +drop schema sptest if exists +go + +create schema sptest +go + +create procedure sptest.adder(in addend1 integer, in addend2 integer, out theSum integer) +begin atomic + set theSum = addend1 + addend2; +end +go + +create table sptest.names ( + id integer, + first_name varchar(20), + last_name varchar(20), + primary key(id) +) +go + +insert into sptest.names (id, first_name, last_name) values(0, 'Fred', 'Flintstone') +go + +insert into sptest.names (id, first_name, last_name) values(1, 'Wilma', 'Flintstone') +go + +insert into sptest.names (id, first_name, last_name) values(2, 'Barney', 'Rubble') +go + +insert into sptest.names (id, first_name, last_name) values(3, 'Betty', 'Rubble') +go + +create table sptest.items ( + id integer generated by default as identity not null, + item varchar(20), + name_id integer, + primary key(id) +) +go + +insert into sptest.items (item, name_id) values('Brontosaurus Burger', 0) +go + +insert into sptest.items (item, name_id) values('Lunch Box', 0) +go + +insert into sptest.items (item, name_id) values('Helmet', 1) +go + +-- note that these create procedure statements will fail until hsqldb 2.0.1 +create procedure sptest.getname(in nameId integer) +modifies sql data +dynamic result sets 1 +BEGIN ATOMIC + declare cur cursor for select * from sptest.names where id = nameId; + open cur; +END +go + +create procedure sptest.getnamesanditems() +modifies sql data +dynamic result sets 2 +BEGIN ATOMIC + declare cur1 cursor for select * from sptest.names; + declare cur2 cursor for select * from sptest.items; + open cur1; + open cur2; +END +go + +create procedure sptest.getnamesanditemsbyid(in nameId integer) +modifies sql data +dynamic result sets 2 +BEGIN ATOMIC + declare cur1 cursor for select * from sptest.names where id = nameId; + declare cur2 cursor for select * from sptest.items where name_id in (select id from sptest.names where id = nameId); + open cur1; + open cur2; +END +go + +create procedure sptest.getnames(in lowestId int, out totalrows integer) +modifies sql data +dynamic result sets 1 +BEGIN ATOMIC + declare cur cursor for select * from sptest.names where id >= lowestId; + select count(*) into totalrows from sptest.names where id >= lowestId; + open cur; +END +go + +create procedure sptest.getnamesLowHigh(in lowestId int, in highestId int) +modifies sql data +dynamic result sets 1 +BEGIN ATOMIC + declare cur cursor for select * from sptest.names where id >= lowestId and id <= highestId; + open cur; +END +go + +create procedure sptest.arraytest(in ids int array, out rowsrequested integer, out returnedids int array) +modifies sql data +dynamic result sets 1 +begin atomic + declare cur cursor for select * from sptest.names where id in (unnest(ids)); + set rowsrequested = cardinality(ids); + set returnedids = array [7, 8, 9, 10]; + open cur; +end +go + +create procedure sptest.echoDate(in inputDate date, out outputDate date) +begin atomic + set outputDate = inputDate; +end +go + +create table sptest.books ( + id integer not null, + name varchar(20), + genre1 integer, + genre2 integer, + primary key(id) +) +go + +insert into sptest.books (id, name, genre1, genre2) values +(1, 'Book1', 10, 11), +(2, 'Book2', 10, 12), +(3, 'Book3', 10, 11) +go + +create table sptest.genres ( + id1 integer, + id2 integer, + name varchar(20) +) +go + +insert into sptest.genres (id1, id2, name) values +(10, 11, 'Genre1'), +(10, 12, 'Genre2'), +(10, 13, 'Genre3') +go + +create procedure sptest.getbookandgenre() +modifies sql data +dynamic result sets 2 +BEGIN ATOMIC + declare cur1 cursor for select * from sptest.books order by id; + declare cur2 cursor for select * from sptest.genres; + open cur1; + open cur2; +END +go diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sptests/Genre.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sptests/Genre.java new file mode 100644 index 0000000..eff486e --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sptests/Genre.java @@ -0,0 +1,29 @@ +/** + * Copyright 2009-2017 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ibatis.submitted.sptests; + +public class Genre { + private String name; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sptests/Item.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sptests/Item.java new file mode 100644 index 0000000..7e841a5 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sptests/Item.java @@ -0,0 +1,37 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.sptests; + +public class Item { + private Integer id; + private String item; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getItem() { + return item; + } + + public void setItem(String item) { + this.item = item; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sptests/MapperConfig.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sptests/MapperConfig.xml new file mode 100644 index 0000000..c40ce6f --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sptests/MapperConfig.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sptests/Name.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sptests/Name.java new file mode 100644 index 0000000..6732616 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sptests/Name.java @@ -0,0 +1,57 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.sptests; + +import java.util.List; + +public class Name { + private Integer id; + private String firstName; + private String lastName; + private List items; + + public List getItems() { + return items; + } + + public void setItems(List items) { + this.items = items; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sptests/Parameter.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sptests/Parameter.java new file mode 100644 index 0000000..7e2f0f2 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sptests/Parameter.java @@ -0,0 +1,46 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.sptests; + +public class Parameter { + private Integer addend1; + private Integer addend2; + private Integer sum; + + public Integer getAddend1() { + return addend1; + } + + public void setAddend1(Integer addend1) { + this.addend1 = addend1; + } + + public Integer getAddend2() { + return addend2; + } + + public void setAddend2(Integer addend2) { + this.addend2 = addend2; + } + + public Integer getSum() { + return sum; + } + + public void setSum(Integer sum) { + this.sum = sum; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sptests/SPMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sptests/SPMapper.java new file mode 100644 index 0000000..8add252 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sptests/SPMapper.java @@ -0,0 +1,107 @@ +/** + * Copyright 2009-2017 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.sptests; + +import java.util.List; +import java.util.Map; + +import org.apache.ibatis.annotations.Options; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Result; +import org.apache.ibatis.annotations.ResultMap; +import org.apache.ibatis.annotations.Results; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; +import org.apache.ibatis.mapping.StatementType; + +public interface SPMapper { + // XML based + Object adderAsSelect(Parameter parameter); + + void adderAsUpdate(Parameter parameter); + + void adderWithParameterMap(Map parameter); + + Name getName(Integer id); + + List getNames(Map parms); + + List getNamesWithArray(Map parms); + + List> getNamesAndItems(); + + List getNamesAndItemsLinked(); + + List getNamesAndItemsLinkedById(int id); + + Object echoDate(Map parameter); // issue #145 + + // annotated + @Select({ "{call sptest.adder(", "#{addend1,jdbcType=INTEGER,mode=IN},", "#{addend2,jdbcType=INTEGER,mode=IN},", "#{sum,jdbcType=INTEGER,mode=OUT})}" }) + @Options(statementType = StatementType.CALLABLE) + Object adderAsSelectAnnotated(Parameter parameter); + + @Update({ "{call sptest.adder(", "#{addend1,jdbcType=INTEGER,mode=IN},", "#{addend2,jdbcType=INTEGER,mode=IN},", "#{sum,jdbcType=INTEGER,mode=OUT})}" }) + @Options(statementType = StatementType.CALLABLE) + void adderAsUpdateAnnotated(Parameter parameter); + + @Select("{call sptest.getname(#{id,jdbcType=INTEGER,mode=IN})}") + @Results({ @Result(column = "ID", property = "id"), @Result(column = "FIRST_NAME", property = "firstName"), @Result(column = "LAST_NAME", property = "lastName") }) + @Options(statementType = StatementType.CALLABLE) + Name getNameAnnotated(Integer id); + + @Select("{call sptest.getname(#{id,jdbcType=INTEGER,mode=IN})}") + @ResultMap("nameResult") + @Options(statementType = StatementType.CALLABLE) + Name getNameAnnotatedWithXMLResultMap(Integer id); + + @Select({ "{call sptest.getnames(", "#{lowestId,jdbcType=INTEGER,mode=IN},", "#{totalRows,jdbcType=INTEGER,mode=OUT})}" }) + @Results({ @Result(column = "ID", property = "id"), @Result(column = "FIRST_NAME", property = "firstName"), @Result(column = "LAST_NAME", property = "lastName") }) + @Options(statementType = StatementType.CALLABLE) + List getNamesAnnotated(Map parms); + + @Select({ "{call sptest.getnames(", "#{lowestId,jdbcType=INTEGER,mode=IN},", "#{totalRows,jdbcType=INTEGER,mode=OUT})}" }) + @ResultMap("nameResult") + @Options(statementType = StatementType.CALLABLE) + List getNamesAnnotatedWithXMLResultMap(Map parms); + + @Select({ "{call sptest.getnamesLowHigh(", "#{lowestId,jdbcType=INTEGER,mode=IN},", "#{highestId,jdbcType=INTEGER,mode=IN})}" }) + @ResultMap("nameResult") + @Options(statementType = StatementType.CALLABLE) + List getNamesAnnotatedLowHighWithXMLResultMap(@Param("lowestId") int lowestId, @Param("highestId") int highestId); + + @Select({ "{call sptest.arraytest(", "#{ids,mode=IN,jdbcType=ARRAY},", "#{requestedRows,jdbcType=INTEGER,mode=OUT},", "#{returnedIds,mode=OUT,jdbcType=ARRAY})}" }) + @Results({ @Result(column = "ID", property = "id"), @Result(column = "FIRST_NAME", property = "firstName"), @Result(column = "LAST_NAME", property = "lastName") }) + @Options(statementType = StatementType.CALLABLE) + List getNamesWithArrayAnnotated(Map parms); + + @Select({ "{call sptest.arraytest(", "#{ids,mode=IN,jdbcType=ARRAY},", "#{requestedRows,jdbcType=INTEGER,mode=OUT},", "#{returnedIds,mode=OUT,jdbcType=ARRAY})}" }) + @ResultMap("nameResult") + @Options(statementType = StatementType.CALLABLE) + List getNamesWithArrayAnnotatedWithXMLResultMap(Map parms); + + @Select("{call sptest.getnamesanditems()}") + @ResultMap("nameResult,itemResult") + @Options(statementType = StatementType.CALLABLE) + List> getNamesAndItemsAnnotatedWithXMLResultMap(); + + @Select("{call sptest.getnamesanditems()}") + @ResultMap({"nameResult","itemResult"}) + @Options(statementType = StatementType.CALLABLE) + List> getNamesAndItemsAnnotatedWithXMLResultMapArray(); + + List getBookAndGenre(); +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sptests/SPMapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sptests/SPMapper.xml new file mode 100644 index 0000000..b913f6b --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sptests/SPMapper.xml @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {call sptest.adder( + #{addend1,jdbcType=INTEGER,mode=IN}, + #{addend2,jdbcType=INTEGER,mode=IN}, + #{sum,jdbcType=INTEGER,mode=OUT} + )} + + + + {call sptest.adder(?, ?, ?)} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sptests/SPTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sptests/SPTest.java new file mode 100644 index 0000000..f56bf28 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sptests/SPTest.java @@ -0,0 +1,758 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.sptests; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + +import java.io.Reader; +import java.sql.Array; +import java.sql.SQLException; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.jdbc.ScriptRunner; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.BeforeClass; +import org.junit.Test; + +public class SPTest { + private static SqlSessionFactory sqlSessionFactory; + + @BeforeClass + public static void initDatabase() throws Exception { + try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/sptests/MapperConfig.xml")) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + } + + ScriptRunner runner = new ScriptRunner(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource().getConnection()); + runner.setDelimiter("go"); + runner.setLogWriter(null); + runner.setErrorLogWriter(null); + BaseDataTest.runScript(runner, "org/apache/ibatis/submitted/sptests/CreateDB.sql"); + } + + /* + * This test shows how to use input and output parameters in a stored + * procedure. This procedure does not return a result set. + * + * This test shows using a multi-property parameter. + */ + @Test + public void testAdderAsSelect() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Parameter parameter = new Parameter(); + parameter.setAddend1(2); + parameter.setAddend2(3); + + SPMapper spMapper = sqlSession.getMapper(SPMapper.class); + spMapper.adderAsSelect(parameter); + + assertEquals((Integer) 5, parameter.getSum()); + } + } + + /* + * This test shows how to use input and output parameters in a stored + * procedure. This procedure does not return a result set. + * + * This test shows using a multi-property parameter. + */ + @Test + public void testAdderAsSelectDoubleCall1() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Parameter parameter = new Parameter(); + parameter.setAddend1(2); + parameter.setAddend2(3); + + SPMapper spMapper = sqlSession.getMapper(SPMapper.class); + + spMapper.adderAsSelect(parameter); + assertEquals((Integer) 5, parameter.getSum()); + + parameter = new Parameter(); + parameter.setAddend1(2); + parameter.setAddend2(3); + spMapper.adderAsSelect(parameter); + assertEquals((Integer) 5, parameter.getSum()); + } + } + + /* + * This test shows how to use input and output parameters in a stored + * procedure. This procedure does not return a result set. + * + * This test also demonstrates session level cache for output parameters. + * + * This test shows using a multi-property parameter. + */ + @Test + public void testAdderAsSelectDoubleCall2() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Parameter parameter = new Parameter(); + parameter.setAddend1(2); + parameter.setAddend2(3); + + SPMapper spMapper = sqlSession.getMapper(SPMapper.class); + + spMapper.adderAsSelect(parameter); + assertEquals((Integer) 5, parameter.getSum()); + + parameter = new Parameter(); + parameter.setAddend1(4); + parameter.setAddend2(5); + spMapper.adderAsSelect(parameter); + assertEquals((Integer) 9, parameter.getSum()); + } + } + + /* + * This test shows how to call a stored procedure defined as rather + * then . Of course, this only works if you are not returning a result + * set. + * + * This test shows using a multi-property parameter. + * + * This test shows using annotations for stored procedures + */ + @Test + public void testAdderAsUpdateAnnotated() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Parameter parameter = new Parameter(); + parameter.setAddend1(2); + parameter.setAddend2(3); + + SPMapper spMapper = sqlSession.getMapper(SPMapper.class); + + spMapper.adderAsUpdateAnnotated(parameter); + assertEquals((Integer) 5, parameter.getSum()); + + parameter = new Parameter(); + parameter.setAddend1(2); + parameter.setAddend2(3); + spMapper.adderAsUpdateAnnotated(parameter); + assertEquals((Integer) 5, parameter.getSum()); + } + } + + /* + * This test shows how to use an input parameter and return a result set from + * a stored procedure. + * + * This test shows using a single value parameter. + * + * This test shows using annotations for stored procedures + */ + @Test + public void testCallWithResultSet1Annotated() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + SPMapper spMapper = sqlSession.getMapper(SPMapper.class); + + Name name = spMapper.getNameAnnotated(1); + assertNotNull(name); + assertEquals("Wilma", name.getFirstName()); + } + } + + /* + * This test shows how to use an input parameter and return a result set from + * a stored procedure. + * + * This test shows using a single value parameter. + * + * This test shows using annotations for stored procedures and using a + * resultMap in XML + */ + @Test + public void testCallWithResultSet1_a2() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + SPMapper spMapper = sqlSession.getMapper(SPMapper.class); + + Name name = spMapper.getNameAnnotatedWithXMLResultMap(1); + assertNotNull(name); + assertEquals("Wilma", name.getFirstName()); + } + } + + /* + * This test shows how to use a input and output parameters and return a + * result set from a stored procedure. + * + * This test shows using a single value parameter. + * + * This test shows using annotations for stored procedures + */ + @Test + public void testCallWithResultSet2_a1() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + SPMapper spMapper = sqlSession.getMapper(SPMapper.class); + + Map parms = new HashMap(); + parms.put("lowestId", 1); + List names = spMapper.getNamesAnnotated(parms); + assertEquals(3, names.size()); + assertEquals(3, parms.get("totalRows")); + } + } + + /* + * This test shows how to use a input and output parameters and return a + * result set from a stored procedure. + * + * This test shows using a single value parameter. + * + * This test shows using annotations for stored procedures and using a + * resultMap in XML + */ + @Test + public void testCallWithResultSet2_a2() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + SPMapper spMapper = sqlSession.getMapper(SPMapper.class); + + Map parms = new HashMap(); + parms.put("lowestId", 1); + List names = spMapper.getNamesAnnotatedWithXMLResultMap(parms); + assertEquals(3, names.size()); + assertEquals(3, parms.get("totalRows")); + } + } + + /* + * This test shows how to use a input and output parameters and return a + * result set from a stored procedure. + * + * This test shows using a Map parameter. + * + * This test shows using annotations for stored procedures + */ + @Test + public void testCallWithResultSet3_a1() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + SPMapper spMapper = sqlSession.getMapper(SPMapper.class); + + Map parms = new HashMap(); + parms.put("lowestId", 2); + List names = spMapper.getNamesAnnotated(parms); + assertEquals(2, parms.get("totalRows")); + assertEquals(2, names.size()); + + parms = new HashMap(); + parms.put("lowestId", 3); + names = spMapper.getNamesAnnotated(parms); + assertEquals(1, names.size()); + assertEquals(1, parms.get("totalRows")); + } + } + + /* + * This test shows how to use a input and output parameters and return a + * result set from a stored procedure. + * + * This test shows using a Map parameter. + * + * This test shows using annotations for stored procedures and using a + * resultMap in XML + */ + @Test + public void testCallWithResultSet3_a2() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + SPMapper spMapper = sqlSession.getMapper(SPMapper.class); + + Map parms = new HashMap(); + parms.put("lowestId", 2); + List names = spMapper.getNamesAnnotatedWithXMLResultMap(parms); + assertEquals(2, parms.get("totalRows")); + assertEquals(2, names.size()); + + parms = new HashMap(); + parms.put("lowestId", 3); + names = spMapper.getNamesAnnotatedWithXMLResultMap(parms); + assertEquals(1, names.size()); + assertEquals(1, parms.get("totalRows")); + } + } + + /* + * This test shows how to use a input and output parameters and return a + * result set from a stored procedure. + * + * This test shows using a Map parameter. + * + * This test shows using annotations for stored procedures + */ + @Test + public void testCallWithResultSet4_a1() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + SPMapper spMapper = sqlSession.getMapper(SPMapper.class); + + Map parms = new HashMap(); + parms.put("lowestId", 2); + List names = spMapper.getNamesAnnotated(parms); + assertEquals(2, parms.get("totalRows")); + assertEquals(2, names.size()); + + parms = new HashMap(); + parms.put("lowestId", 2); + names = spMapper.getNamesAnnotated(parms); + assertEquals(2, names.size()); + assertEquals(2, parms.get("totalRows")); + } + } + + /* + * This test shows how to use a input and output parameters and return a + * result set from a stored procedure. + * + * This test shows using a Map parameter. + * + * This test shows using annotations for stored procedures and using a + * resultMap in XML + */ + @Test + public void testCallWithResultSet4_a2() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + SPMapper spMapper = sqlSession.getMapper(SPMapper.class); + + Map parms = new HashMap(); + parms.put("lowestId", 2); + List names = spMapper.getNamesAnnotatedWithXMLResultMap(parms); + assertEquals(2, parms.get("totalRows")); + assertEquals(2, names.size()); + + parms = new HashMap(); + parms.put("lowestId", 2); + names = spMapper.getNamesAnnotatedWithXMLResultMap(parms); + assertEquals(2, names.size()); + assertEquals(2, parms.get("totalRows")); + } + } + + /* + * + * This test shows using a two named parameters. + * + * This test shows using annotations for stored procedures and using a + * resultMap in XML + */ + @Test + public void testCallLowHighWithResultSet() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + SPMapper spMapper = sqlSession.getMapper(SPMapper.class); + List names = spMapper.getNamesAnnotatedLowHighWithXMLResultMap(1, 1); + assertEquals(1, names.size()); + } + } + + /* + * This test shows how to use the ARRAY JDBC type with MyBatis. + * + * This test shows using annotations for stored procedures + * + * @throws SQLException + */ + @Test + public void testGetNamesWithArray_a1() throws SQLException { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + SPMapper spMapper = sqlSession.getMapper(SPMapper.class); + + Array array = sqlSession.getConnection().createArrayOf("int", new Integer[] { 1, 2, 5 }); + + Map parms = new HashMap(); + parms.put("ids", array); + List names = spMapper.getNamesWithArrayAnnotated(parms); + Object[] returnedIds = (Object[]) parms.get("returnedIds"); + assertEquals(4, returnedIds.length); + assertEquals(3, parms.get("requestedRows")); + assertEquals(2, names.size()); + } + } + + /* + * This test shows how to use the ARRAY JDBC type with MyBatis. + * + * This test shows using annotations for stored procedures and using a + * resultMap in XML + * + * @throws SQLException + */ + @Test + public void testGetNamesWithArray_a2() throws SQLException { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + SPMapper spMapper = sqlSession.getMapper(SPMapper.class); + + Array array = sqlSession.getConnection().createArrayOf("int", new Integer[] { 1, 2, 5 }); + + Map parms = new HashMap(); + parms.put("ids", array); + List names = spMapper.getNamesWithArrayAnnotatedWithXMLResultMap(parms); + Object[] returnedIds = (Object[]) parms.get("returnedIds"); + assertEquals(4, returnedIds.length); + assertEquals(3, parms.get("requestedRows")); + assertEquals(2, names.size()); + } + } + + /* + * This test shows how to call procedures that return multiple result sets + * + * This test shows using annotations for stored procedures and referring to + * multiple resultMaps in XML + * + * @throws SQLException + */ + @Test + public void testGetNamesAndItems_a2() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + SPMapper spMapper = sqlSession.getMapper(SPMapper.class); + + List> results = spMapper.getNamesAndItemsAnnotatedWithXMLResultMap(); + assertEquals(2, results.size()); + assertEquals(4, results.get(0).size()); + assertEquals(3, results.get(1).size()); + } + } + + @Test + public void testGetNamesAndItems_a3() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + SPMapper spMapper = sqlSession.getMapper(SPMapper.class); + + List> results = spMapper.getNamesAndItemsAnnotatedWithXMLResultMapArray(); + assertEquals(2, results.size()); + assertEquals(4, results.get(0).size()); + assertEquals(3, results.get(1).size()); + } + } + + @Test + public void testGetNamesAndItemsLinked() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + SPMapper spMapper = sqlSession.getMapper(SPMapper.class); + + List names = spMapper.getNamesAndItemsLinked(); + assertEquals(4, names.size()); + assertEquals(2, names.get(0).getItems().size()); + assertEquals(1, names.get(1).getItems().size()); + assertNull(names.get(2).getItems()); + assertNull(names.get(3).getItems()); + } + } + + @Test + public void testGetNamesAndItemsLinkedWithNoMatchingInfo() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + SPMapper spMapper = sqlSession.getMapper(SPMapper.class); + + List names = spMapper.getNamesAndItemsLinkedById(0); + assertEquals(1, names.size()); + assertEquals(2, names.get(0).getItems().size()); + } + } + + @Test + public void testMultipleForeignKeys() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + SPMapper spMapper = sqlSession.getMapper(SPMapper.class); + List books = spMapper.getBookAndGenre(); + assertEquals("Book1", books.get(0).getName()); + assertEquals("Genre1", books.get(0).getGenre().getName()); + assertEquals("Book2", books.get(1).getName()); + assertEquals("Genre2", books.get(1).getGenre().getName()); + assertEquals("Book3", books.get(2).getName()); + assertEquals("Genre1", books.get(2).getGenre().getName()); + } + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sqlprovider/BaseMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sqlprovider/BaseMapper.java new file mode 100644 index 0000000..babebb4 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sqlprovider/BaseMapper.java @@ -0,0 +1,69 @@ +/** + * Copyright 2009-2017 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.sqlprovider; + +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.SelectProvider; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.util.List; + +public interface BaseMapper { + + @SelectProvider(type= OurSqlBuilder.class, method= "buildSelectByIdProviderContextOnly") + @ContainsLogicalDelete + T selectById(Integer id); + + @SelectProvider(type= OurSqlBuilder.class, method= "buildSelectByIdProviderContextOnly") + T selectActiveById(Integer id); + + @SelectProvider(type= OurSqlBuilder.class, method= "buildSelectByNameOneParamAndProviderContext") + @ContainsLogicalDelete + List selectByName(String name); + + @SelectProvider(type= OurSqlBuilder.class, method= "buildSelectByNameOneParamAndProviderContext") + List selectActiveByName(String name); + + @SelectProvider(type= OurSqlBuilder.class, method= "buildSelectByIdAndNameMultipleParamAndProviderContextWithAtParam") + @ContainsLogicalDelete + List selectByIdAndNameWithAtParam(@Param("id") Integer id, @Param("name") String name); + + @SelectProvider(type= OurSqlBuilder.class, method= "buildSelectByIdAndNameMultipleParamAndProviderContextWithAtParam") + List selectActiveByIdAndNameWithAtParam(@Param("id") Integer id, @Param("name") String name); + + @SelectProvider(type= OurSqlBuilder.class, method= "buildSelectByIdAndNameMultipleParamAndProviderContext") + @ContainsLogicalDelete + List selectByIdAndName(Integer id, String name); + + @SelectProvider(type= OurSqlBuilder.class, method= "buildSelectByIdAndNameMultipleParamAndProviderContext") + List selectActiveByIdAndName(Integer id, String name); + + @Retention(RetentionPolicy.RUNTIME) + @Target(ElementType.METHOD) + @interface ContainsLogicalDelete { + boolean value() default false; + } + + @Retention(RetentionPolicy.RUNTIME) + @Target(ElementType.TYPE) + @interface Meta { + String tableName(); + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sqlprovider/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sqlprovider/CreateDB.sql new file mode 100644 index 0000000..5b9447b --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sqlprovider/CreateDB.sql @@ -0,0 +1,29 @@ +-- +-- Copyright 2009-2017 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +drop table users if exists; + +create table users ( + id int, + name varchar(20), + logical_delete boolean default false +); + +insert into users (id, name) values(1, 'User1'); +insert into users (id, name) values(2, 'User2'); +insert into users (id, name) values(3, 'User3'); +insert into users (id, name, logical_delete) values(4, 'User4', true); + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sqlprovider/Mapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sqlprovider/Mapper.java new file mode 100644 index 0000000..6eb54b5 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sqlprovider/Mapper.java @@ -0,0 +1,65 @@ +/** + * Copyright 2009-2017 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.sqlprovider; + +import java.util.List; +import java.util.Map; + +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.DeleteProvider; +import org.apache.ibatis.annotations.InsertProvider; +import org.apache.ibatis.annotations.SelectProvider; +import org.apache.ibatis.annotations.UpdateProvider; + +@BaseMapper.Meta(tableName = "users") +public interface Mapper extends BaseMapper { + @SelectProvider(type = OurSqlBuilder.class, method = "buildGetUsersQuery") + List getUsers(List allFilterIds); + + @SelectProvider(type = OurSqlBuilder.class, method = "buildGetUserQuery") + User getUser(Integer userId); + + @SelectProvider(type = OurSqlBuilder.class, method = "buildGetAllUsersQuery") + List getAllUsers(); + + @SelectProvider(type = OurSqlBuilder.class, method = "buildGetUsersByCriteriaQuery") + List getUsersByCriteria(User criteria); + + @SelectProvider(type = OurSqlBuilder.class, method = "buildGetUsersByCriteriaMapQuery") + List getUsersByCriteriaMap(Map criteria); + + @SelectProvider(type = OurSqlBuilder.class, method = "buildGetUsersByNameQuery") + List getUsersByName(String name, String orderByColumn); + + @SelectProvider(type = OurSqlBuilder.class, method = "buildGetUsersByNameUsingMap") + List getUsersByNameUsingMap(String name, String orderByColumn); + + @SelectProvider(type = OurSqlBuilder.class, method = "buildGetUsersByNameWithParamNameAndOrderByQuery") + List getUsersByNameWithParamNameAndOrderBy(@Param("name") String name, @Param("orderByColumn") String orderByColumn); + + @SelectProvider(type = OurSqlBuilder.class, method = "buildGetUsersByNameWithParamNameQuery") + List getUsersByNameWithParamName(@Param("name") String name); + + @InsertProvider(type = OurSqlBuilder.class, method = "buildInsert") + void insert(User user); + + @UpdateProvider(type= OurSqlBuilder.class, method= "buildUpdate") + void update(User user); + + @DeleteProvider(type= OurSqlBuilder.class, method= "buildDelete") + void delete(Integer id); + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sqlprovider/OurSqlBuilder.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sqlprovider/OurSqlBuilder.java new file mode 100644 index 0000000..359badc --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sqlprovider/OurSqlBuilder.java @@ -0,0 +1,216 @@ +/** + * Copyright 2009-2017 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.sqlprovider; + +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.builder.annotation.ProviderContext; +import org.apache.ibatis.jdbc.SQL; + +import java.util.List; +import java.util.Map; + +public class OurSqlBuilder { + + public String buildGetUsersQuery(Map parameter) { + // MyBatis wraps a single List parameter in a Map with the key="list", + // so need to pull it out + @SuppressWarnings("unchecked") + List ids = (List) parameter.get("list"); + StringBuilder sb = new StringBuilder(); + sb.append("select * from users where id in ("); + for (int i = 0; i < ids.size(); i++) { + if (i > 0) { + sb.append(","); + } + sb.append("#{list["); + sb.append(i); + sb.append("]}"); + } + sb.append(") order by id"); + return sb.toString(); + } + + public String buildGetUserQuery(Number parameter) { + // parameter is not a single List or Array, + // so it is passed as is from the mapper + return "select * from users where id = #{value}"; + } + public String buildGetAllUsersQuery() { + return "select * from users order by id"; + } + + public String buildGetUsersByCriteriaQuery(final User criteria) { + return new SQL(){{ + SELECT("*"); + FROM("users"); + if (criteria.getId() != null) { + WHERE("id = #{id}"); + } + if (criteria.getName() != null) { + WHERE("name like #{name} || '%'"); + } + }}.toString(); + } + + public String buildGetUsersByCriteriaMapQuery(final Map criteria) { + return new SQL(){{ + SELECT("*"); + FROM("users"); + if (criteria.get("id") != null) { + WHERE("id = #{id}"); + } + if (criteria.get("name") != null) { + WHERE("name like #{name} || '%'"); + } + }}.toString(); + } + + public String buildGetUsersByNameQuery(final String name, final String orderByColumn) { + return new SQL(){{ + SELECT("*"); + FROM("users"); + if (name != null) { + WHERE("name like #{param1} || '%'"); + } + ORDER_BY(orderByColumn); + }}.toString(); + } + + public String buildGetUsersByNameUsingMap(Map params) { + final String name = String.class.cast(params.get("param1")); + final String orderByColumn = String.class.cast(params.get("param2")); + return new SQL(){{ + SELECT("*"); + FROM("users"); + if (name != null) { + WHERE("name like #{param1} || '%'"); + } + ORDER_BY(orderByColumn); + }}.toString(); + } + + public String buildGetUsersByNameWithParamNameAndOrderByQuery(@Param("orderByColumn") final String orderByColumn, @Param("name") final String name) { + return new SQL(){{ + SELECT("*"); + FROM("users"); + if (name != null) { + WHERE("name like #{name} || '%'"); + } + ORDER_BY(orderByColumn); + }}.toString(); + } + + public String buildGetUsersByNameWithParamNameQuery(@Param("name") final String name) { + return new SQL(){{ + SELECT("*"); + FROM("users"); + if (name != null) { + WHERE("name like #{name} || '%'"); + } + ORDER_BY("id DESC"); + }}.toString(); + } + + public String buildGetUsersByNameWithParamNameQueryUsingMap(Map params) { + final String name = String.class.cast(params.get("name")); + final String orderByColumn = String.class.cast(params.get("orderByColumn")); + return new SQL(){{ + SELECT("*"); + FROM("users"); + if (name != null) { + WHERE("name like #{param1} || '%'"); + } + ORDER_BY(orderByColumn); + }}.toString(); + } + + public String buildInsert() { + return "insert into users (id, name) values (#{id}, #{name})"; + } + + public String buildUpdate() { + return "update users set name = #{name} where id = #{id}"; + } + + public String buildDelete() { + return "delete from users where id = #{id}"; + } + + public String buildSelectByIdProviderContextOnly(ProviderContext context) { + final boolean containsLogicalDelete = context.getMapperMethod().getAnnotation(BaseMapper.ContainsLogicalDelete.class) != null; + final String tableName = context.getMapperType().getAnnotation(BaseMapper.Meta.class).tableName(); + return new SQL(){{ + SELECT("*"); + FROM(tableName); + WHERE("id = #{id}"); + if (!containsLogicalDelete){ + WHERE("logical_delete = ${Constants.LOGICAL_DELETE_OFF}"); + } + }}.toString(); + } + + public String buildSelectByNameOneParamAndProviderContext(ProviderContext context, final String name) { + final boolean containsLogicalDelete = context.getMapperMethod().getAnnotation(BaseMapper.ContainsLogicalDelete.class) != null; + final String tableName = context.getMapperType().getAnnotation(BaseMapper.Meta.class).tableName(); + return new SQL(){{ + SELECT("*"); + FROM(tableName); + if (name != null) { + WHERE("name like #{name} || '%'"); + } + if (!containsLogicalDelete){ + WHERE("logical_delete = ${LOGICAL_DELETE_OFF:0}"); + } + }}.toString(); + } + + public String buildSelectByIdAndNameMultipleParamAndProviderContextWithAtParam(@Param("id") final Integer id, ProviderContext context, @Param("name") final String name) { + final boolean containsLogicalDelete = context.getMapperMethod().getAnnotation(BaseMapper.ContainsLogicalDelete.class) != null; + final String tableName = context.getMapperType().getAnnotation(BaseMapper.Meta.class).tableName(); + return new SQL(){{ + SELECT("*"); + FROM(tableName); + if (id != null) { + WHERE("id = #{id}"); + } + if (name != null) { + WHERE("name like #{name} || '%'"); + } + if (!containsLogicalDelete){ + WHERE("logical_delete = false"); + } + }}.toString(); + } + + public String buildSelectByIdAndNameMultipleParamAndProviderContext(final Integer id, final String name, ProviderContext context) { + final boolean containsLogicalDelete = context.getMapperMethod().getAnnotation(BaseMapper.ContainsLogicalDelete.class) != null; + final String tableName = context.getMapperType().getAnnotation(BaseMapper.Meta.class).tableName(); + return new SQL(){{ + SELECT("*"); + FROM(tableName); + if (id != null) { + WHERE("id = #{param1}"); + } + if (name != null) { + WHERE("name like #{param2} || '%'"); + } + if (!containsLogicalDelete){ + WHERE("logical_delete = false"); + } + }}.toString(); + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sqlprovider/SqlProviderTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sqlprovider/SqlProviderTest.java new file mode 100644 index 0000000..a85962f --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sqlprovider/SqlProviderTest.java @@ -0,0 +1,541 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.sqlprovider; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.io.Reader; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.SelectProvider; +import org.apache.ibatis.builder.BuilderException; +import org.apache.ibatis.builder.annotation.ProviderContext; +import org.apache.ibatis.builder.annotation.ProviderSqlSource; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.Configuration; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.BeforeClass; +import org.junit.Test; + +public class SqlProviderTest { + + private static SqlSessionFactory sqlSessionFactory; + + @BeforeClass + public static void setUp() throws Exception { + // create a SqlSessionFactory + try (Reader reader = Resources + .getResourceAsReader("org/apache/ibatis/submitted/sqlprovider/mybatis-config.xml")) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + sqlSessionFactory.getConfiguration().addMapper(StaticMethodSqlProviderMapper.class); + } + + // populate in-memory database + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/sqlprovider/CreateDB.sql"); + } + + // Test for list + @Test + public void shouldGetTwoUsers() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + List list = new ArrayList(); + list.add(1); + list.add(3); + List users = mapper.getUsers(list); + assertEquals(2, users.size()); + assertEquals("User1", users.get(0).getName()); + assertEquals("User3", users.get(1).getName()); + } + } + + // Test for simple value without @Param + @Test + public void shouldGetOneUser() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + { + User user = mapper.getUser(4); + assertNotNull(user); + assertEquals("User4", user.getName()); + } + { + User user = mapper.getUser(null); + assertNull(user); + } + } + } + + // Test for empty + @Test + public void shouldGetAllUsers() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + List users = mapper.getAllUsers(); + assertEquals(4, users.size()); + assertEquals("User1", users.get(0).getName()); + assertEquals("User2", users.get(1).getName()); + assertEquals("User3", users.get(2).getName()); + assertEquals("User4", users.get(3).getName()); + } + } + + // Test for single JavaBean + @Test + public void shouldGetUsersByCriteria() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + { + User criteria = new User(); + criteria.setId(1); + List users = mapper.getUsersByCriteria(criteria); + assertEquals(1, users.size()); + assertEquals("User1", users.get(0).getName()); + } + { + User criteria = new User(); + criteria.setName("User"); + List users = mapper.getUsersByCriteria(criteria); + assertEquals(4, users.size()); + assertEquals("User1", users.get(0).getName()); + assertEquals("User2", users.get(1).getName()); + assertEquals("User3", users.get(2).getName()); + assertEquals("User4", users.get(3).getName()); + } + } + } + + // Test for single map + @Test + public void shouldGetUsersByCriteriaMap() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + { + Map criteria = new HashMap(); + criteria.put("id", 1); + List users = mapper.getUsersByCriteriaMap(criteria); + assertEquals(1, users.size()); + assertEquals("User1", users.get(0).getName()); + } + { + Map criteria = new HashMap(); + criteria.put("name", "User"); + List users = mapper.getUsersByCriteriaMap(criteria); + assertEquals(4, users.size()); + assertEquals("User1", users.get(0).getName()); + assertEquals("User2", users.get(1).getName()); + assertEquals("User3", users.get(2).getName()); + assertEquals("User4", users.get(3).getName()); + } + } + } + + // Test for multiple parameter without @Param + @Test + public void shouldGetUsersByName() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + List users = mapper.getUsersByName("User", "id DESC"); + assertEquals(4, users.size()); + assertEquals("User4", users.get(0).getName()); + assertEquals("User3", users.get(1).getName()); + assertEquals("User2", users.get(2).getName()); + assertEquals("User1", users.get(3).getName()); + } + } + + // Test for map without @Param + @Test + public void shouldGetUsersByNameUsingMap() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + List users = mapper.getUsersByNameUsingMap("User", "id DESC"); + assertEquals(4, users.size()); + assertEquals("User4", users.get(0).getName()); + assertEquals("User3", users.get(1).getName()); + assertEquals("User2", users.get(2).getName()); + assertEquals("User1", users.get(3).getName()); + } + } + + // Test for multiple parameter with @Param + @Test + public void shouldGetUsersByNameWithParamNameAndOrderBy() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + List users = mapper.getUsersByNameWithParamNameAndOrderBy("User", "id DESC"); + assertEquals(4, users.size()); + assertEquals("User4", users.get(0).getName()); + assertEquals("User3", users.get(1).getName()); + assertEquals("User2", users.get(2).getName()); + assertEquals("User1", users.get(3).getName()); + } + } + + // Test for map with @Param + @Test + public void shouldGetUsersByNameWithParamNameUsingMap() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + List users = mapper.getUsersByNameWithParamNameAndOrderBy("User", "id DESC"); + assertEquals(4, users.size()); + assertEquals("User4", users.get(0).getName()); + assertEquals("User3", users.get(1).getName()); + assertEquals("User2", users.get(2).getName()); + assertEquals("User1", users.get(3).getName()); + } + } + + // Test for simple value with @Param + @Test + public void shouldGetUsersByNameWithParamName() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + { + List users = mapper.getUsersByNameWithParamName("User"); + assertEquals(4, users.size()); + assertEquals("User4", users.get(0).getName()); + assertEquals("User3", users.get(1).getName()); + assertEquals("User2", users.get(2).getName()); + assertEquals("User1", users.get(3).getName()); + } + { + List users = mapper.getUsersByNameWithParamName(null); + assertEquals(4, users.size()); + assertEquals("User4", users.get(0).getName()); + assertEquals("User3", users.get(1).getName()); + assertEquals("User2", users.get(2).getName()); + assertEquals("User1", users.get(3).getName()); + } + } + } + + @Test + public void methodNotFound() throws NoSuchMethodException { + try { + Class mapperType = ErrorMapper.class; + Method mapperMethod = mapperType.getMethod("methodNotFound"); + new ProviderSqlSource(new Configuration(), + mapperMethod.getAnnotation(SelectProvider.class), mapperType, mapperMethod); + fail(); + } catch (BuilderException e) { + assertTrue(e.getMessage().contains("Error creating SqlSource for SqlProvider. Method 'methodNotFound' not found in SqlProvider 'org.apache.ibatis.submitted.sqlprovider.SqlProviderTest$ErrorSqlBuilder'.")); + } + } + + @Test + public void methodOverload() throws NoSuchMethodException { + try { + Class mapperType = ErrorMapper.class; + Method mapperMethod = mapperType.getMethod("methodOverload", String.class); + new ProviderSqlSource(new Configuration(), + mapperMethod.getAnnotation(SelectProvider.class), mapperType, mapperMethod); + fail(); + } catch (BuilderException e) { + assertTrue(e.getMessage().contains("Error creating SqlSource for SqlProvider. Method 'overload' is found multiple in SqlProvider 'org.apache.ibatis.submitted.sqlprovider.SqlProviderTest$ErrorSqlBuilder'. Sql provider method can not overload.")); + } + } + + @Test + public void notSqlProvider() throws NoSuchMethodException { + try { + new ProviderSqlSource(new Configuration(), new Object(), null, null); + fail(); + } catch (BuilderException e) { + assertTrue(e.getMessage().contains("Error creating SqlSource for SqlProvider. Cause: java.lang.NoSuchMethodException: java.lang.Object.type()")); + } + } + + @Test + public void multipleProviderContext() throws NoSuchMethodException { + try { + Class mapperType = ErrorMapper.class; + Method mapperMethod = mapperType.getMethod("multipleProviderContext"); + new ProviderSqlSource(new Configuration(), + mapperMethod.getAnnotation(SelectProvider.class), mapperType, mapperMethod); + fail(); + } catch (BuilderException e) { + assertTrue(e.getMessage().contains("Error creating SqlSource for SqlProvider. ProviderContext found multiple in SqlProvider method (org.apache.ibatis.submitted.sqlprovider.SqlProviderTest$ErrorSqlBuilder.multipleProviderContext). ProviderContext can not define multiple in SqlProvider method argument.")); + } + } + + @Test + public void notSupportParameterObjectOnMultipleArguments() throws NoSuchMethodException { + try { + Class mapperType = Mapper.class; + Method mapperMethod = mapperType.getMethod("getUsersByName", String.class, String.class); + new ProviderSqlSource(new Configuration(), + mapperMethod.getAnnotation(SelectProvider.class), mapperType, mapperMethod) + .getBoundSql(new Object()); + fail(); + } catch (BuilderException e) { + assertTrue(e.getMessage().contains("Error invoking SqlProvider method (org.apache.ibatis.submitted.sqlprovider.OurSqlBuilder.buildGetUsersByNameQuery). Cannot invoke a method that holds multiple arguments using a specifying parameterObject. In this case, please specify a 'java.util.Map' object.")); + } + } + + @Test + public void notSupportParameterObjectOnNamedArgument() throws NoSuchMethodException { + try { + Class mapperType = Mapper.class; + Method mapperMethod = mapperType.getMethod("getUsersByNameWithParamName", String.class); + new ProviderSqlSource(new Configuration(), + mapperMethod.getAnnotation(SelectProvider.class), mapperType, mapperMethod) + .getBoundSql(new Object()); + fail(); + } catch (BuilderException e) { + assertTrue(e.getMessage().contains("Error invoking SqlProvider method (org.apache.ibatis.submitted.sqlprovider.OurSqlBuilder.buildGetUsersByNameWithParamNameQuery). Cannot invoke a method that holds named argument(@Param) using a specifying parameterObject. In this case, please specify a 'java.util.Map' object.")); + } + } + + @Test + public void invokeError() throws NoSuchMethodException { + try { + Class mapperType = ErrorMapper.class; + Method mapperMethod = mapperType.getMethod("invokeError"); + new ProviderSqlSource(new Configuration(), + mapperMethod.getAnnotation(SelectProvider.class), mapperType, mapperMethod) + .getBoundSql(new Object()); + fail(); + } catch (BuilderException e) { + assertTrue(e.getMessage().contains("Error invoking SqlProvider method (org.apache.ibatis.submitted.sqlprovider.SqlProviderTest$ErrorSqlBuilder.invokeError). Cause: java.lang.reflect.InvocationTargetException")); + } + } + + @Test + public void shouldInsertUser() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + User user = new User(); + user.setId(999); + user.setName("MyBatis"); + mapper.insert(user); + + User loadedUser = mapper.getUser(999); + assertEquals("MyBatis", loadedUser.getName()); + } + } + + @Test + public void shouldUpdateUser() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + User user = new User(); + user.setId(999); + user.setName("MyBatis"); + mapper.insert(user); + + user.setName("MyBatis3"); + mapper.update(user); + + User loadedUser = mapper.getUser(999); + assertEquals("MyBatis3", loadedUser.getName()); + } + } + + @Test + public void shouldDeleteUser() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + User user = new User(); + user.setId(999); + user.setName("MyBatis"); + mapper.insert(user); + + user.setName("MyBatis3"); + mapper.delete(999); + + User loadedUser = mapper.getUser(999); + assertNull(loadedUser); + } + } + + @Test + public void mapperProviderContextOnly() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + assertEquals("User4", mapper.selectById(4).getName()); + assertNull(mapper.selectActiveById(4)); + } + } + + @Test + public void mapperOneParamAndProviderContext() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + assertEquals(1, mapper.selectByName("User4").size()); + assertEquals(0, mapper.selectActiveByName("User4").size()); + } + } + + @Test + public void mapperMultipleParamAndProviderContextWithAtParam() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + assertEquals(1, mapper.selectByIdAndNameWithAtParam(4,"User4").size()); + assertEquals(0, mapper.selectActiveByIdAndNameWithAtParam(4,"User4").size()); + } + } + + @Test + public void mapperMultipleParamAndProviderContext() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + assertEquals(1, mapper.selectByIdAndName(4,"User4").size()); + assertEquals(0, mapper.selectActiveByIdAndName(4,"User4").size()); + } + } + + @Test + public void staticMethodNoArgument() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + StaticMethodSqlProviderMapper mapper = + sqlSession.getMapper(StaticMethodSqlProviderMapper.class); + assertEquals(1, mapper.noArgument()); + } + } + + @Test + public void staticMethodOneArgument() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + StaticMethodSqlProviderMapper mapper = + sqlSession.getMapper(StaticMethodSqlProviderMapper.class); + assertEquals(10, mapper.oneArgument(10)); + } + } + + @Test + public void staticMethodMultipleArgument() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + StaticMethodSqlProviderMapper mapper = + sqlSession.getMapper(StaticMethodSqlProviderMapper.class); + assertEquals(2, mapper.multipleArgument(1, 1)); + } + } + + @Test + public void staticMethodOnlyProviderContext() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + StaticMethodSqlProviderMapper mapper = + sqlSession.getMapper(StaticMethodSqlProviderMapper.class); + assertEquals("onlyProviderContext", mapper.onlyProviderContext()); + } + } + + @Test + public void staticMethodOneArgumentAndProviderContext() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + StaticMethodSqlProviderMapper mapper = + sqlSession.getMapper(StaticMethodSqlProviderMapper.class); + assertEquals("oneArgumentAndProviderContext 100", mapper.oneArgumentAndProviderContext(100)); + } + } + + public interface ErrorMapper { + @SelectProvider(type = ErrorSqlBuilder.class, method = "methodNotFound") + void methodNotFound(); + + @SelectProvider(type = ErrorSqlBuilder.class, method = "overload") + void methodOverload(String value); + + @SelectProvider(type = ErrorSqlBuilder.class, method = "invokeError") + void invokeError(); + + @SelectProvider(type = ErrorSqlBuilder.class, method = "multipleProviderContext") + void multipleProviderContext(); + } + + public static class ErrorSqlBuilder { + public void methodNotFound() { + throw new UnsupportedOperationException("methodNotFound"); + } + + public String overload() { + throw new UnsupportedOperationException("overload"); + } + + public String overload(String value) { + throw new UnsupportedOperationException("overload"); + } + + public String invokeError() { + throw new UnsupportedOperationException("invokeError"); + } + + public String multipleProviderContext(ProviderContext providerContext1, ProviderContext providerContext2) { + throw new UnsupportedOperationException("multipleProviderContext"); + } + } + + public interface StaticMethodSqlProviderMapper { + @SelectProvider(type = SqlProvider.class, method = "noArgument") + int noArgument(); + + @SelectProvider(type = SqlProvider.class, method = "oneArgument") + int oneArgument(Integer value); + + @SelectProvider(type = SqlProvider.class, method = "multipleArgument") + int multipleArgument(@Param("value1") Integer value1, @Param("value2") Integer value2); + + @SelectProvider(type = SqlProvider.class, method = "onlyProviderContext") + String onlyProviderContext(); + + @SelectProvider(type = SqlProvider.class, method = "oneArgumentAndProviderContext") + String oneArgumentAndProviderContext(Integer value); + + class SqlProvider { + + public static String noArgument() { + return "SELECT 1 FROM INFORMATION_SCHEMA.SYSTEM_USERS"; + } + + public static StringBuilder oneArgument(Integer value) { + return new StringBuilder().append("SELECT ").append(value) + .append(" FROM INFORMATION_SCHEMA.SYSTEM_USERS"); + } + + public static CharSequence multipleArgument(@Param("value1") Integer value1, + @Param("value2") Integer value2) { + return "SELECT " + (value1 + value2) + " FROM INFORMATION_SCHEMA.SYSTEM_USERS"; + } + + public static CharSequence onlyProviderContext(ProviderContext context) { + return new StringBuilder().append("SELECT '").append(context.getMapperMethod().getName()) + .append("' FROM INFORMATION_SCHEMA.SYSTEM_USERS"); + } + + public static String oneArgumentAndProviderContext(Integer value, ProviderContext context) { + return "SELECT '" + context.getMapperMethod().getName() + " " + value + + "' FROM INFORMATION_SCHEMA.SYSTEM_USERS"; + } + + } + + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sqlprovider/User.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sqlprovider/User.java new file mode 100644 index 0000000..3b17cb3 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sqlprovider/User.java @@ -0,0 +1,38 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.sqlprovider; + +public class User { + + private Integer id; + private String name; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sqlprovider/mybatis-config.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sqlprovider/mybatis-config.xml new file mode 100644 index 0000000..99a665a --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/sqlprovider/mybatis-config.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/stringlist/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/stringlist/CreateDB.sql new file mode 100644 index 0000000..f89e2ad --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/stringlist/CreateDB.sql @@ -0,0 +1,29 @@ +-- +-- Copyright 2009-2016 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +drop table users if exists; + +create table users ( + id int, + name varchar(20), + group_id int, + rol_id int +); + +insert into users values(1, 'User1', 1, 1); +insert into users values(1, 'User1', 1, 2); +insert into users values(1, 'User1', 2, 1); +insert into users values(1, 'User1', 2, 2); diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/stringlist/Mapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/stringlist/Mapper.java new file mode 100644 index 0000000..7457c3b --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/stringlist/Mapper.java @@ -0,0 +1,24 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.stringlist; + +import java.util.List; + +public interface Mapper { + + List getUsersAndGroups(Integer id); + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/stringlist/Mapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/stringlist/Mapper.xml new file mode 100644 index 0000000..709cf64 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/stringlist/Mapper.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/stringlist/StringListTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/stringlist/StringListTest.java new file mode 100644 index 0000000..12835d5 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/stringlist/StringListTest.java @@ -0,0 +1,57 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.stringlist; + +import java.io.Reader; +import java.util.List; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; + +public class StringListTest { + + private static SqlSessionFactory sqlSessionFactory; + + @BeforeClass + public static void setUp() throws Exception { + // create a SqlSessionFactory + try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/stringlist/mybatis-config.xml")) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + } + + // populate in-memory database + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/stringlist/CreateDB.sql"); + } + + @Test + public void shouldGetAUser() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + List users = mapper.getUsersAndGroups(1); + Assert.assertEquals(1, users.size()); + Assert.assertEquals(2, users.get(0).getGroups().size()); + Assert.assertEquals(2, users.get(0).getRoles().size()); + } + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/stringlist/User.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/stringlist/User.java new file mode 100644 index 0000000..96ff0df --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/stringlist/User.java @@ -0,0 +1,58 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.stringlist; + +import java.util.List; + +public class User { + + private Integer id; + private String name; + private List groups; + private List roles; + + public List getRoles() { + return roles; + } + + public void setRoles(List roles) { + this.roles = roles; + } + + public List getGroups() { + return groups; + } + + public void setGroups(List groups) { + this.groups = groups; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/stringlist/mybatis-config.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/stringlist/mybatis-config.xml new file mode 100644 index 0000000..30ba8f7 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/stringlist/mybatis-config.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/substitution_in_annots/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/substitution_in_annots/CreateDB.sql new file mode 100644 index 0000000..335df67 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/substitution_in_annots/CreateDB.sql @@ -0,0 +1,30 @@ +-- +-- Copyright 2009-2016 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +create schema ibtest authorization dba; + +create table ibtest.names ( +id int, +firstName varchar(20), +lastName varchar(20) +); + +insert into ibtest.names (id, firstName, lastName) values(1, 'Fred', 'Flintstone'); +insert into ibtest.names (id, firstName, lastName) values(2, 'Wilma', 'Flintstone'); +insert into ibtest.names (id, firstName, lastName) values(3, 'Pebbles', 'Flintstone'); +insert into ibtest.names (id, firstName, lastName) values(4, 'Barney', 'Rubble'); +insert into ibtest.names (id, firstName, lastName) values(5, 'Betty', 'Rubble'); +insert into ibtest.names (id, firstName, lastName) values(6, 'Bamm Bamm', 'Rubble'); diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/substitution_in_annots/SubstitutionInAnnotsMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/substitution_in_annots/SubstitutionInAnnotsMapper.java new file mode 100644 index 0000000..87a81f8 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/substitution_in_annots/SubstitutionInAnnotsMapper.java @@ -0,0 +1,34 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.substitution_in_annots; + +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +public interface SubstitutionInAnnotsMapper { + + public String getPersonNameByIdWithXml(int id); + + @Select("select firstName from ibtest.names where id=${value}") + public String getPersonNameByIdWithAnnotsValue(int id); + + @Select("select firstName from ibtest.names where id=${_parameter}") + public String getPersonNameByIdWithAnnotsParameter(int id); + + @Select("select firstName from ibtest.names where id=${named}") + public String getPersonNameByIdWithAnnotsParamAnnot(@Param("named") int id); + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/substitution_in_annots/SubstitutionInAnnotsMapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/substitution_in_annots/SubstitutionInAnnotsMapper.xml new file mode 100644 index 0000000..bf4af06 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/substitution_in_annots/SubstitutionInAnnotsMapper.xml @@ -0,0 +1,28 @@ + + + + + + + + \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/substitution_in_annots/SubstitutionInAnnotsTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/substitution_in_annots/SubstitutionInAnnotsTest.java new file mode 100644 index 0000000..b6131d0 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/substitution_in_annots/SubstitutionInAnnotsTest.java @@ -0,0 +1,80 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.substitution_in_annots; + +import static org.junit.Assert.assertEquals; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.datasource.unpooled.UnpooledDataSource; +import org.apache.ibatis.mapping.Environment; +import org.apache.ibatis.session.Configuration; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; +import org.junit.BeforeClass; +import org.junit.Test; + + +public class SubstitutionInAnnotsTest { + + protected static SqlSessionFactory sqlSessionFactory; + + @BeforeClass + public static void setUp() throws Exception { + Configuration configuration = new Configuration(); + Environment environment = new Environment("test", new JdbcTransactionFactory(), new UnpooledDataSource("org.hsqldb.jdbcDriver", "jdbc:hsqldb:mem:annots", null)); + configuration.setEnvironment(environment); + configuration.addMapper(SubstitutionInAnnotsMapper.class); + sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration); + + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/substitution_in_annots/CreateDB.sql"); + } + + @Test + public void testSubstitutionWithXml() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + SubstitutionInAnnotsMapper mapper = sqlSession.getMapper(SubstitutionInAnnotsMapper.class); + assertEquals("Barney", mapper.getPersonNameByIdWithXml(4)); + } + } + + @Test + public void testSubstitutionWithAnnotsValue() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + SubstitutionInAnnotsMapper mapper = sqlSession.getMapper(SubstitutionInAnnotsMapper.class); + assertEquals("Barney", mapper.getPersonNameByIdWithAnnotsValue(4)); + } + } + + @Test + public void testSubstitutionWithAnnotsParameter() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + SubstitutionInAnnotsMapper mapper = sqlSession.getMapper(SubstitutionInAnnotsMapper.class); + assertEquals("Barney", mapper.getPersonNameByIdWithAnnotsParameter(4)); + } + } + + @Test + public void testSubstitutionWithAnnotsParamAnnot() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + SubstitutionInAnnotsMapper mapper = sqlSession.getMapper(SubstitutionInAnnotsMapper.class); + assertEquals("Barney", mapper.getPersonNameByIdWithAnnotsParamAnnot(4)); + } + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandler/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandler/CreateDB.sql new file mode 100644 index 0000000..a29b4b8 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandler/CreateDB.sql @@ -0,0 +1,36 @@ +-- +-- Copyright 2009-2016 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +drop table users if exists; +drop table product if exists; + +create table users ( + id int, + name varchar(20), + city varchar(20), + state char(20) +); + +create table product ( + id int identity, + name varchar(20) +); + +insert into users (id, name, city, state) values(1, ' User1', ' Carmel ', ' IN '); + +insert into product (id, name) values +(1, 'iPod'), +(2, 'iPad'); diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandler/Mapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandler/Mapper.java new file mode 100644 index 0000000..e7d5e68 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandler/Mapper.java @@ -0,0 +1,59 @@ +/** + * Copyright 2009-2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.typehandler; + +import org.apache.ibatis.annotations.Arg; +import org.apache.ibatis.annotations.ConstructorArgs; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Options; +import org.apache.ibatis.annotations.Result; +import org.apache.ibatis.annotations.Results; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.submitted.typehandler.Product.ProductId; +import org.apache.ibatis.type.JdbcType; + +public interface Mapper { + + @Select("select * from users where id = #{value}") + @Results({ + @Result(column="id", property="id"), + @Result(column="name", property="name"), + @Result(column="city", property="city", jdbcType=JdbcType.CHAR), + @Result(column="state", property="state", jdbcType=JdbcType.VARCHAR) + }) + User getUser(Integer id); + + @Insert({ + "insert into product (name) values (#{name})" + }) + @Options(useGeneratedKeys = true, keyProperty = "id") + int insertProduct(Product product); + + @Select("select id, name from product where name = #{value}") + Product getProductByName(String name); + + Product getProductByNameXml(String name); + + @Select("select id, name from product where name = #{value}") + @ConstructorArgs({ + @Arg(id = true, column="id", javaType = ProductId.class, jdbcType=JdbcType.INTEGER), + @Arg(column="name") + }) + Product getProductByNameUsingConstructor(String name); + + @Select("select id from product where name = #{value}") + ProductId getProductIdByName(String name); +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandler/Mapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandler/Mapper.xml new file mode 100644 index 0000000..9a7a8c4 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandler/Mapper.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandler/Product.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandler/Product.java new file mode 100644 index 0000000..229ce9b --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandler/Product.java @@ -0,0 +1,124 @@ +/** + * Copyright 2009-2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.typehandler; + +import java.sql.CallableStatement; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +import org.apache.ibatis.type.BaseTypeHandler; +import org.apache.ibatis.type.JdbcType; + +public class Product { + + private ProductId id; + + private String name; + + public Product() { + super(); + } + + public Product(ProductId id, String name) { + super(); + this.id = id; + this.name = name; + } + + public ProductId getId() { + return id; + } + + public void setId(ProductId id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public static class ProductId { + private Integer value; + + public Integer getValue() { + return value; + } + + public void setValue(Integer value) { + this.value = value; + } + } + + public static class ProductIdTypeHandler extends BaseTypeHandler { + @Override + public void setNonNullParameter(PreparedStatement ps, int i, ProductId parameter, JdbcType jdbcType) throws SQLException { + ps.setInt(i, parameter.getValue()); + } + + @Override + public ProductId getNullableResult(ResultSet rs, String columnName) throws SQLException { + ProductId id = new ProductId(); + id.setValue(rs.getInt(columnName)); + return id; + } + + @Override + public ProductId getNullableResult(ResultSet rs, int columnIndex) throws SQLException { + ProductId id = new ProductId(); + id.setValue(rs.getInt(columnIndex)); + return id; + } + + @Override + public ProductId getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { + ProductId id = new ProductId(); + id.setValue(cs.getInt(columnIndex)); + return id; + } + } + + public static class ConstantProductIdTypeHandler extends BaseTypeHandler { + @Override + public void setNonNullParameter(PreparedStatement ps, int i, ProductId parameter, JdbcType jdbcType) throws SQLException { + } + + @Override + public ProductId getNullableResult(ResultSet rs, String columnName) throws SQLException { + return getConstantId(); + } + + @Override + public ProductId getNullableResult(ResultSet rs, int columnIndex) throws SQLException { + return getConstantId(); + } + + @Override + public ProductId getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { + return getConstantId(); + } + + private ProductId getConstantId() { + ProductId id = new ProductId(); + id.setValue(999); + return id; + } + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandler/StringTrimmingTypeHandler.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandler/StringTrimmingTypeHandler.java new file mode 100644 index 0000000..c8af327 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandler/StringTrimmingTypeHandler.java @@ -0,0 +1,62 @@ +/** + * Copyright 2009-2015 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.typehandler; + +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.MappedJdbcTypes; +import org.apache.ibatis.type.MappedTypes; +import org.apache.ibatis.type.TypeHandler; + +import java.sql.CallableStatement; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +@MappedTypes(String.class) +@MappedJdbcTypes(value = {JdbcType.CHAR, JdbcType.VARCHAR}, includeNullJdbcType = true) +public class StringTrimmingTypeHandler implements TypeHandler { + + @Override + public void setParameter(PreparedStatement ps, int i, String parameter, + JdbcType jdbcType) throws SQLException { + ps.setString(i, trim(parameter)); + } + + @Override + public String getResult(ResultSet rs, String columnName) throws SQLException { + return trim(rs.getString(columnName)); + } + + @Override + public String getResult(ResultSet rs, int columnIndex) throws SQLException { + return trim(rs.getString(columnIndex)); + } + + @Override + public String getResult(CallableStatement cs, int columnIndex) + throws SQLException { + return trim(cs.getString(columnIndex)); + } + + private String trim(String s) { + if (s == null) { + return null; + } else { + return s.trim(); + } + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandler/TypeHandlerTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandler/TypeHandlerTest.java new file mode 100644 index 0000000..60b317d --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandler/TypeHandlerTest.java @@ -0,0 +1,154 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.typehandler; + +import static org.junit.Assert.*; + +import java.io.Reader; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.builder.BuilderException; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.apache.ibatis.submitted.typehandler.Product.ConstantProductIdTypeHandler; +import org.apache.ibatis.submitted.typehandler.Product.ProductId; +import org.apache.ibatis.submitted.typehandler.Product.ProductIdTypeHandler; +import org.apache.ibatis.type.JdbcType; +import org.junit.Before; +import org.junit.Test; + +public class TypeHandlerTest { + + private SqlSessionFactory sqlSessionFactory; + + @Before + public void setUp() throws Exception { + // create a SqlSessionFactory + try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/typehandler/mybatis-config.xml")) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + sqlSessionFactory.getConfiguration().getTypeHandlerRegistry().register(StringTrimmingTypeHandler.class); + } + + // populate in-memory database + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/typehandler/CreateDB.sql"); + } + + // Some tests need to register additional type handler + // before adding mapper. + private void addMapper() { + sqlSessionFactory.getConfiguration().addMapper(Mapper.class); + } + + @Test + public void shouldGetAUser() { + addMapper(); + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + User user = mapper.getUser(1); + assertEquals("User1", user.getName()); + assertEquals("Carmel", user.getCity()); + assertEquals("IN", user.getState()); + } + } + + @Test + public void shouldApplyTypeHandlerOnGeneratedKey() { + addMapper(); + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + Product product = new Product(); + product.setName("new product"); + mapper.insertProduct(product); + assertNotNull(product.getId()); + assertNotNull(product.getId().getValue()); + } + } + + @Test + public void shouldApplyTypeHandlerWithJdbcTypeSpecified() { + addMapper(); + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + Product product = mapper.getProductByName("iPad"); + assertEquals(Integer.valueOf(2), product.getId().getValue()); + } + } + + @Test + public void shouldApplyTypeHandlerUsingConstructor() { + addMapper(); + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + Product product = mapper.getProductByName("iPad"); + assertEquals(Integer.valueOf(2), product.getId().getValue()); + } + } + + @Test + public void shouldApplyTypeHandlerOnReturnTypeWithJdbcTypeSpecified() { + addMapper(); + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + ProductId productId = mapper.getProductIdByName("iPad"); + assertEquals(Integer.valueOf(2), productId.getValue()); + } + } + + @Test + public void shouldPickSoleTypeHandlerOnXmlResultMap() { + addMapper(); + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + Product product = mapper.getProductByNameXml("iPad"); + assertEquals(Integer.valueOf(2), product.getId().getValue()); + } + } + + @Test + public void shouldPickSameTypeHandlerMappedToDifferentJdbcTypes() { + sqlSessionFactory.getConfiguration().getTypeHandlerRegistry().register(ProductId.class, JdbcType.BIGINT, ProductIdTypeHandler.class); + addMapper(); + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + Product product = mapper.getProductByNameXml("iPad"); + assertEquals(Integer.valueOf(2), product.getId().getValue()); + } + } + + @Test(expected = BuilderException.class) + public void shouldFailIfMultipleHandlerMappedToAType() { + sqlSessionFactory.getConfiguration().getTypeHandlerRegistry().register(ProductId.class, JdbcType.BIGINT, ConstantProductIdTypeHandler.class); + // multiple type handlers are mapped to ProductId and + // none of them are mapped to null jdbcType. + addMapper(); + } + + @Test + public void shouldPickHandlerForNull() { + sqlSessionFactory.getConfiguration().getTypeHandlerRegistry().register(ProductId.class, null, ConstantProductIdTypeHandler.class); + // multiple type handlers are mapped to ProductId and + // one of them are mapped to null jdbcType. + addMapper(); + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + Product product = mapper.getProductByNameXml("iPad"); + assertEquals(Integer.valueOf(999), product.getId().getValue()); + } + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandler/User.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandler/User.java new file mode 100644 index 0000000..5b3ba60 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandler/User.java @@ -0,0 +1,56 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.typehandler; + +public class User { + + private Integer id; + private String name; + private String city; + private String state; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandler/mybatis-config.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandler/mybatis-config.xml new file mode 100644 index 0000000..afb3605 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandler/mybatis-config.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandlerinjection/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandlerinjection/CreateDB.sql new file mode 100644 index 0000000..ff482be --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandlerinjection/CreateDB.sql @@ -0,0 +1,25 @@ +-- +-- Copyright 2009-2016 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +drop table users if exists; + +create table users ( + id int, + name varchar(20), + state int +); + +insert into users (id, name, state) values(1, 'Inactive', 0); diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandlerinjection/Mapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandlerinjection/Mapper.java new file mode 100644 index 0000000..142b125 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandlerinjection/Mapper.java @@ -0,0 +1,24 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.typehandlerinjection; + +import java.util.List; + +public interface Mapper { + + List getUsers(); + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandlerinjection/Mapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandlerinjection/Mapper.xml new file mode 100644 index 0000000..8e2543e --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandlerinjection/Mapper.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandlerinjection/TypeHandlerInjectionTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandlerinjection/TypeHandlerInjectionTest.java new file mode 100644 index 0000000..e077afe --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandlerinjection/TypeHandlerInjectionTest.java @@ -0,0 +1,60 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.typehandlerinjection; + +import java.io.Reader; +import java.util.List; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; + +public class TypeHandlerInjectionTest { + + private static SqlSessionFactory sqlSessionFactory; + + private static UserStateTypeHandler handler = new UserStateTypeHandler(); + + @BeforeClass + public static void setUp() throws Exception { + // create a SqlSessionFactory + try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/typehandlerinjection/mybatis-config.xml")) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + } + + sqlSessionFactory.getConfiguration().getTypeHandlerRegistry().register(handler); + sqlSessionFactory.getConfiguration().addMapper(Mapper.class); + + // populate in-memory database + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/typehandlerinjection/CreateDB.sql"); + } + + @Test + public void shouldGetAUser() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + List users = mapper.getUsers(); + Assert.assertEquals("Inactive", users.get(0).getName()); + } + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandlerinjection/User.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandlerinjection/User.java new file mode 100644 index 0000000..fbf6159 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandlerinjection/User.java @@ -0,0 +1,47 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.typehandlerinjection; + +public class User { + + private Integer id; + private String name; + private String state; + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandlerinjection/UserStateTypeHandler.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandlerinjection/UserStateTypeHandler.java new file mode 100644 index 0000000..151b0e1 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandlerinjection/UserStateTypeHandler.java @@ -0,0 +1,73 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.typehandlerinjection; + +import java.sql.CallableStatement; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; + +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.TypeHandler; + +public class UserStateTypeHandler implements TypeHandler { + + private static Map lookup; + + static { + lookup = new HashMap(); + lookup.put("0", "INACTIVE"); + lookup.put("1", "ACTIVE"); + } + + UserStateTypeHandler() { + // can only be constructed from this package + } + + @Override + public Object getResult(ResultSet rs, String arg) throws SQLException { + return lookupValue(rs.getInt(arg)); + } + + @Override + public Object getResult(ResultSet rs, int arg) throws SQLException { + return lookupValue(rs.getInt(arg)); + } + + @Override + public Object getResult(CallableStatement cs, int arg) throws SQLException { + return lookupValue(cs.getInt(arg)); + } + + @Override + public void setParameter(PreparedStatement ps, int i, Object value, JdbcType jdbcType) throws SQLException { + + String key = ""; + for (Entry entry : lookup.entrySet()) { + if (value.equals(entry.getValue())) { + key = entry.getKey(); + } + } + ps.setInt(i, Integer.valueOf(key)); + } + + private String lookupValue(int val) { + return lookup.get(String.valueOf(val)); + } +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandlerinjection/mybatis-config.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandlerinjection/mybatis-config.xml new file mode 100644 index 0000000..2758f85 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/typehandlerinjection/mybatis-config.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/unknownobject/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/unknownobject/CreateDB.sql new file mode 100644 index 0000000..eb43554 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/unknownobject/CreateDB.sql @@ -0,0 +1,25 @@ +-- +-- Copyright 2009-2016 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +drop table users if exists; + +create table users ( + id int, + name varchar(20), + unknownObject varchar(20) +); + +insert into users (id, name, unknownObject) values(1, 'User1', 'unknownObject'); diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/unknownobject/Mapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/unknownobject/Mapper.java new file mode 100644 index 0000000..973c378 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/unknownobject/Mapper.java @@ -0,0 +1,22 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.unknownobject; + +public interface Mapper { + + User getUser(Integer id); + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/unknownobject/Mapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/unknownobject/Mapper.xml new file mode 100644 index 0000000..1d9646f --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/unknownobject/Mapper.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/unknownobject/UnknownObject.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/unknownobject/UnknownObject.java new file mode 100644 index 0000000..5003d09 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/unknownobject/UnknownObject.java @@ -0,0 +1,20 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.unknownobject; + +public class UnknownObject { + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/unknownobject/UnknownObjectTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/unknownobject/UnknownObjectTest.java new file mode 100644 index 0000000..3fa8457 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/unknownobject/UnknownObjectTest.java @@ -0,0 +1,43 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.unknownobject; + +import java.io.Reader; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.exceptions.PersistenceException; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.Test; + +public class UnknownObjectTest { + + private static SqlSessionFactory sqlSessionFactory; + + @Test(expected=PersistenceException.class) + public void shouldFailBecauseThereIsAPropertyWithoutTypeHandler() throws Exception { + // create a SqlSessionFactory + try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/unknownobject/mybatis-config.xml")) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + } + + // populate in-memory database + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/unknownobject/CreateDB.sql"); + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/unknownobject/User.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/unknownobject/User.java new file mode 100644 index 0000000..4592c9f --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/unknownobject/User.java @@ -0,0 +1,47 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.unknownobject; + +public class User { + + private Integer id; + private String name; + private UnknownObject unknownObject; + + public UnknownObject getUnknownObject() { + return unknownObject; + } + + public void setUnknownObject(UnknownObject unknownObject) { + this.unknownObject = unknownObject; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/unknownobject/mybatis-config.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/unknownobject/mybatis-config.xml new file mode 100644 index 0000000..0f03cfe --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/unknownobject/mybatis-config.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/use_actual_param_name/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/use_actual_param_name/CreateDB.sql new file mode 100644 index 0000000..04f8536 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/use_actual_param_name/CreateDB.sql @@ -0,0 +1,25 @@ +-- +-- Copyright 2009-2018 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +drop table users if exists; + +create table users ( + id int, + name varchar(20) +); + +insert into users (id, name) values +(1, 'User1'), (2, 'User2'), (3, 'User3'); diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/use_actual_param_name/Mapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/use_actual_param_name/Mapper.java new file mode 100644 index 0000000..5ec5212 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/use_actual_param_name/Mapper.java @@ -0,0 +1,34 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.use_actual_param_name; + +import java.util.List; + +import org.apache.ibatis.annotations.Select; + +public interface Mapper { + + @Select("select * from users where id = #{foo}") + User getUserById(Integer id); + + @Select("select * from users where id = #{id} and name = #{name}") + User getUserByIdAndName(Integer id, String name); + + List getUsersByIdList(List ids); + + List getUsersByIdListAndName(List ids, String name); + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/use_actual_param_name/Mapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/use_actual_param_name/Mapper.xml new file mode 100644 index 0000000..2308cde --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/use_actual_param_name/Mapper.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/use_actual_param_name/UseActualParamNameTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/use_actual_param_name/UseActualParamNameTest.java new file mode 100644 index 0000000..eefe173 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/use_actual_param_name/UseActualParamNameTest.java @@ -0,0 +1,85 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.use_actual_param_name; + +import static org.junit.Assert.*; + +import java.io.Reader; +import java.util.Arrays; +import java.util.List; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.BeforeClass; +import org.junit.Test; + +public class UseActualParamNameTest { + + private static SqlSessionFactory sqlSessionFactory; + + @BeforeClass + public static void setUp() throws Exception { + // create an SqlSessionFactory + try (Reader reader = Resources.getResourceAsReader( + "org/apache/ibatis/submitted/use_actual_param_name/mybatis-config.xml")) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + } + + // populate in-memory database + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/use_actual_param_name/CreateDB.sql"); + } + + @Test + public void shouldSingleParamBeReferencedByAnyName() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + User user = mapper.getUserById(1); + assertNotNull(user); + } + } + + @Test + public void shouldMultipleParamsBeReferencedByActualNames() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + User user = mapper.getUserByIdAndName(1, "User1"); + assertNotNull(user); + } + } + + @Test + public void shouldSoleListParamBeReferencedByImplicitName() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + List users = mapper.getUsersByIdList(Arrays.asList(1, 2)); + assertEquals(2, users.size()); + } + } + + @Test + public void shouldListParamBeReferencedByActualNameIfAnotherParamExists() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + List users = mapper.getUsersByIdListAndName(Arrays.asList(1, 2), null); + assertEquals(2, users.size()); + } + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/use_actual_param_name/User.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/use_actual_param_name/User.java new file mode 100644 index 0000000..6ea8169 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/use_actual_param_name/User.java @@ -0,0 +1,38 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.use_actual_param_name; + +public class User { + + private Integer id; + private String name; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/use_actual_param_name/mybatis-config.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/use_actual_param_name/mybatis-config.xml new file mode 100644 index 0000000..9155c41 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/use_actual_param_name/mybatis-config.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/uuid_test/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/uuid_test/CreateDB.sql new file mode 100644 index 0000000..a2331a6 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/uuid_test/CreateDB.sql @@ -0,0 +1,24 @@ +-- +-- Copyright 2009-2016 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +drop table users if exists; + +create table users ( + id varchar(36), + name varchar(20) +); + +insert into users (id, name) values('38400000-8cf0-11bd-b23e-10b96e4ef00d', 'User1'); diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/uuid_test/Mapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/uuid_test/Mapper.java new file mode 100644 index 0000000..7ccbf20 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/uuid_test/Mapper.java @@ -0,0 +1,25 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.uuid_test; + +import java.util.UUID; + +public interface Mapper { + + User getUser(UUID id); + void insertUser(User user); + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/uuid_test/Mapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/uuid_test/Mapper.xml new file mode 100644 index 0000000..211181f --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/uuid_test/Mapper.xml @@ -0,0 +1,33 @@ + + + + + + + + + + insert into users values(#{id, typeHandler=org.apache.ibatis.submitted.uuid_test.UUIDTypeHandler}, #{name}) + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/uuid_test/UUIDTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/uuid_test/UUIDTest.java new file mode 100644 index 0000000..b2cd39c --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/uuid_test/UUIDTest.java @@ -0,0 +1,67 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.uuid_test; + +import java.io.Reader; +import java.util.UUID; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.exceptions.PersistenceException; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; + +public class UUIDTest { + + private static SqlSessionFactory sqlSessionFactory; + + @BeforeClass + public static void setUp() throws Exception { + // create an SqlSessionFactory + try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/uuid_test/mybatis-config.xml")) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + } + + // populate in-memory database + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/uuid_test/CreateDB.sql"); + } + + @Test(expected=PersistenceException.class) + public void shouldGetAUser() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + User user = mapper.getUser(UUID.fromString("38400000-8cf0-11bd-b23e-10b96e4ef00d")); + Assert.assertEquals("User1", user.getName()); + } + } + + @Test + public void shouldInsertAUser() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Mapper mapper = sqlSession.getMapper(Mapper.class); + User user = new User(); + user.setId(UUID.randomUUID()); + user.setName("User2"); + mapper.insertUser(user); + } + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/uuid_test/UUIDTypeHandler.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/uuid_test/UUIDTypeHandler.java new file mode 100644 index 0000000..2a14f9c --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/uuid_test/UUIDTypeHandler.java @@ -0,0 +1,55 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.uuid_test; + +import java.sql.CallableStatement; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.UUID; + +import org.apache.ibatis.type.BaseTypeHandler; +import org.apache.ibatis.type.JdbcType; + +public class UUIDTypeHandler extends BaseTypeHandler { + + @Override + public void setNonNullParameter(PreparedStatement ps, int i, UUID parameter, JdbcType jdbcType) throws SQLException { + ps.setString(i, parameter.toString()); + } + + @Override + public UUID getNullableResult(ResultSet rs, String columnName) throws SQLException { + String value = rs.getString(columnName); + if (value != null) return UUID.fromString(value); + return null; + } + + @Override + public UUID getNullableResult(ResultSet rs, int columnIndex) throws SQLException { + String value = rs.getString(columnIndex); + if (value != null) return UUID.fromString(value); + return null; + } + + @Override + public UUID getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { + String value = cs.getString(columnIndex); + if (value != null) return UUID.fromString(value); + return null; + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/uuid_test/User.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/uuid_test/User.java new file mode 100644 index 0000000..e8ed999 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/uuid_test/User.java @@ -0,0 +1,40 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.uuid_test; + +import java.util.UUID; + +public class User { + + private UUID id; + private String name; + + public UUID getId() { + return id; + } + + public void setId(UUID id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/uuid_test/mybatis-config.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/uuid_test/mybatis-config.xml new file mode 100644 index 0000000..7660f2a --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/uuid_test/mybatis-config.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/valueinmap/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/valueinmap/CreateDB.sql new file mode 100644 index 0000000..2354824 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/valueinmap/CreateDB.sql @@ -0,0 +1,24 @@ +-- +-- Copyright 2009-2016 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +drop table users if exists; + +create table users ( + id int, + name varchar(20) +); + +insert into users (id, name) values(1, 'User1'); diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/valueinmap/Mapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/valueinmap/Mapper.xml new file mode 100644 index 0000000..572e09d --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/valueinmap/Mapper.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/valueinmap/ValueInMapTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/valueinmap/ValueInMapTest.java new file mode 100644 index 0000000..d712975 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/valueinmap/ValueInMapTest.java @@ -0,0 +1,72 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.valueinmap; + +import java.io.Reader; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.exceptions.PersistenceException; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; + +public class ValueInMapTest { + + private static SqlSessionFactory sqlSessionFactory; + + @BeforeClass + public static void setUp() throws Exception { + // create a SqlSessionFactory + try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/valueinmap/mybatis-config.xml")) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + } + + // populate in-memory database + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/valueinmap/CreateDB.sql"); + } + + @Test // issue #165 + public void shouldWorkWithAPropertyNamedValue() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Map map = new HashMap(); + map.put("table", "users"); + map.put("column", "name"); + map.put("value", "User1"); + Integer count = sqlSession.selectOne("count", map); + Assert.assertEquals(new Integer(1), count); + } + } + + @Test(expected=PersistenceException.class) + public void shouldWorkWithAList() { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + List list = new ArrayList(); + list.add("users"); + Integer count = sqlSession.selectOne("count2",list); + Assert.assertEquals(new Integer(1), count); + } + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/valueinmap/mybatis-config.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/valueinmap/mybatis-config.xml new file mode 100644 index 0000000..bec3801 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/valueinmap/mybatis-config.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/CreateDB.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/CreateDB.sql new file mode 100644 index 0000000..8d9c10e --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/CreateDB.sql @@ -0,0 +1,28 @@ +-- +-- Copyright 2009-2016 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +drop table if exists person; +create table person (person_id int, person_name varchar(32)); + +drop table if exists pet; +create table pet (pet_id int, owner_id int, pet_name varchar(32)); + +insert into person (person_id, person_name) values (1, 'John'); +insert into person (person_id, person_name) values (2, 'Rebecca'); + +insert into pet (pet_id, owner_id, pet_name) values (1, 1, 'Kotetsu'); +insert into pet (pet_id, owner_id, pet_name) values (2, 1, 'Chien'); +insert into pet (pet_id, owner_id, pet_name) values (3, 2, 'Ren'); diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/Dog.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/Dog.java new file mode 100644 index 0000000..e61c694 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/Dog.java @@ -0,0 +1,20 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.xml_external_ref; + +public class Dog extends Pet { + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/InvalidMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/InvalidMapper.java new file mode 100644 index 0000000..f55cd1e --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/InvalidMapper.java @@ -0,0 +1,22 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.xml_external_ref; + +import java.util.Map; + +public interface InvalidMapper { + Map selectAll(); +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/InvalidMapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/InvalidMapper.xml new file mode 100644 index 0000000..c86204f --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/InvalidMapper.xml @@ -0,0 +1,30 @@ + + + + + + person_id, person_name + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/InvalidWithInsertMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/InvalidWithInsertMapper.java new file mode 100644 index 0000000..7c7f4b8 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/InvalidWithInsertMapper.java @@ -0,0 +1,23 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.xml_external_ref; + +import java.util.Map; + +public interface InvalidWithInsertMapper { + Map selectAll(); + void insert(Person person); +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/InvalidWithInsertMapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/InvalidWithInsertMapper.xml new file mode 100644 index 0000000..7421614 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/InvalidWithInsertMapper.xml @@ -0,0 +1,38 @@ + + + + + + person_id, person_name + + + + + INSERT INTO Person (person_name) + VALUES (#{name}) + + SELECT IDENTITY() + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MapperConfig.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MapperConfig.xml new file mode 100644 index 0000000..07e086d --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MapperConfig.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleCrossIncludeMapperConfig.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleCrossIncludeMapperConfig.xml new file mode 100644 index 0000000..e0b6c61 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleCrossIncludeMapperConfig.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleCrossIncludePersonMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleCrossIncludePersonMapper.java new file mode 100644 index 0000000..9f5525d --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleCrossIncludePersonMapper.java @@ -0,0 +1,22 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.xml_external_ref; + +public interface MultipleCrossIncludePersonMapper { + Person select(Integer id); + + Pet selectPet(Integer id); +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleCrossIncludePersonMapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleCrossIncludePersonMapper.xml new file mode 100644 index 0000000..c627a21 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleCrossIncludePersonMapper.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + pet_id + + + , + person_name + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleCrossIncludePetMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleCrossIncludePetMapper.java new file mode 100644 index 0000000..70b2022 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleCrossIncludePetMapper.java @@ -0,0 +1,20 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.xml_external_ref; + +public interface MultipleCrossIncludePetMapper { + Pet select(Integer id); +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleCrossIncludePetMapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleCrossIncludePetMapper.xml new file mode 100644 index 0000000..8dd98c8 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleCrossIncludePetMapper.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + person_id + + + , + owner_id, pet_name + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleCrossIncludeTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleCrossIncludeTest.java new file mode 100644 index 0000000..a3e53f6 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleCrossIncludeTest.java @@ -0,0 +1,113 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.xml_external_ref; + +import static org.junit.Assert.*; + +import java.io.IOException; +import java.io.Reader; +import java.sql.SQLException; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.cache.Cache; +import org.apache.ibatis.datasource.unpooled.UnpooledDataSource; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.mapping.Environment; +import org.apache.ibatis.mapping.MappedStatement; +import org.apache.ibatis.session.Configuration; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; +import org.junit.Test; + +public class MultipleCrossIncludeTest { + + @Test + public void testMultipleCrossIncludeXmlConfig() throws Exception { + testCrossReference(getSqlSessionFactoryXmlConfig()); + } + + @Test + public void testMultipleCrossIncludeJavaConfig() throws Exception { + testCrossReference(getSqlSessionFactoryJavaConfig()); + } + + @Test + public void testMappedStatementCache() throws Exception { + try (Reader configReader = Resources.getResourceAsReader("org/apache/ibatis/submitted/xml_external_ref/MultipleCrossIncludeMapperConfig.xml")) { + SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configReader); + + Configuration configuration = sqlSessionFactory.getConfiguration(); + configuration.getMappedStatementNames(); + + MappedStatement selectPetStatement = configuration.getMappedStatement("org.apache.ibatis.submitted.xml_external_ref.MultipleCrossIncludePetMapper.select"); + MappedStatement selectPersonStatement = configuration.getMappedStatement("org.apache.ibatis.submitted.xml_external_ref.MultipleCrossIncludePersonMapper.select"); + Cache cache = selectPetStatement.getCache(); + assertEquals("org.apache.ibatis.submitted.xml_external_ref.MultipleCrossIncludePetMapper", cache.getId()); + assertSame(cache, selectPersonStatement.getCache()); + } + } + + private void testCrossReference(SqlSessionFactory sqlSessionFactory) throws Exception { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + MultipleCrossIncludePersonMapper personMapper = sqlSession.getMapper(MultipleCrossIncludePersonMapper.class); + Person person = personMapper.select(1); + assertEquals((Integer)1, person.getId()); + assertEquals(2, person.getPets().size()); + assertEquals((Integer)2, person.getPets().get(1).getId()); + + Pet pet = personMapper.selectPet(1); + assertEquals(Integer.valueOf(1), pet.getId()); + + MultipleCrossIncludePetMapper petMapper = sqlSession.getMapper(MultipleCrossIncludePetMapper.class); + Pet pet2 = petMapper.select(3); + assertEquals((Integer)3, pet2.getId()); + assertEquals((Integer)2, pet2.getOwner().getId()); + } + } + + private SqlSessionFactory getSqlSessionFactoryXmlConfig() throws Exception { + try (Reader configReader = Resources + .getResourceAsReader("org/apache/ibatis/submitted/xml_external_ref/MultipleCrossIncludeMapperConfig.xml")) { + SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configReader); + + initDb(sqlSessionFactory); + + return sqlSessionFactory; + } + } + + private SqlSessionFactory getSqlSessionFactoryJavaConfig() throws Exception { + Configuration configuration = new Configuration(); + Environment environment = new Environment("development", new JdbcTransactionFactory(), new UnpooledDataSource( + "org.hsqldb.jdbcDriver", "jdbc:hsqldb:mem:xmlextref", null)); + configuration.setEnvironment(environment); + configuration.addMapper(MultipleCrossIncludePersonMapper.class); + configuration.addMapper(MultipleCrossIncludePetMapper.class); + SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration); + + initDb(sqlSessionFactory); + + return sqlSessionFactory; + } + + private static void initDb(SqlSessionFactory sqlSessionFactory) throws IOException, SQLException { + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/xml_external_ref/CreateDB.sql"); + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleIncludeMapperConfig.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleIncludeMapperConfig.xml new file mode 100644 index 0000000..ea36b23 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleIncludeMapperConfig.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleIncludePersonMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleIncludePersonMapper.java new file mode 100644 index 0000000..badc8b5 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleIncludePersonMapper.java @@ -0,0 +1,22 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.xml_external_ref; + +public interface MultipleIncludePersonMapper { + Person select(Integer id); + + Pet selectPet(Integer id); +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleIncludePersonMapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleIncludePersonMapper.xml new file mode 100644 index 0000000..8630578 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleIncludePersonMapper.xml @@ -0,0 +1,42 @@ + + + + + + + + + + person_id + + + + , + person_name + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleIncludeTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleIncludeTest.java new file mode 100644 index 0000000..c975e11 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleIncludeTest.java @@ -0,0 +1,87 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.xml_external_ref; + +import static org.junit.Assert.*; + +import java.io.IOException; +import java.io.Reader; +import java.sql.Connection; +import java.sql.SQLException; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.datasource.unpooled.UnpooledDataSource; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.mapping.Environment; +import org.apache.ibatis.session.Configuration; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; +import org.junit.Test; + +public class MultipleIncludeTest { + + @Test + public void testMultipleIncludeXmlConfig() throws Exception { + testMultipleIncludes(getSqlSessionFactoryXmlConfig()); + } + + @Test + public void testMultipleIncludeJavaConfig() throws Exception { + testMultipleIncludes(getSqlSessionFactoryJavaConfig()); + } + + private void testMultipleIncludes(SqlSessionFactory sqlSessionFactory) { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + MultipleIncludePersonMapper personMapper = sqlSession.getMapper(MultipleIncludePersonMapper.class); + Person person = personMapper.select(1); + assertEquals((Integer)1, person.getId()); + assertEquals("John", person.getName()); + } + } + + private SqlSessionFactory getSqlSessionFactoryXmlConfig() throws Exception { + try (Reader configReader = Resources + .getResourceAsReader("org/apache/ibatis/submitted/xml_external_ref/MultipleIncludeMapperConfig.xml");) { + SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configReader); + + initDb(sqlSessionFactory); + + return sqlSessionFactory; + } + } + + private SqlSessionFactory getSqlSessionFactoryJavaConfig() throws Exception { + + Configuration configuration = new Configuration(); + Environment environment = new Environment("development", new JdbcTransactionFactory(), new UnpooledDataSource( + "org.hsqldb.jdbcDriver", "jdbc:hsqldb:mem:xmlextref", null)); + configuration.setEnvironment(environment); + configuration.addMapper(MultipleIncludePersonMapper.class); + SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration); + + initDb(sqlSessionFactory); + + return sqlSessionFactory; + } + + private static void initDb(SqlSessionFactory sqlSessionFactory) throws IOException, SQLException { + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/xml_external_ref/CreateDB.sql"); + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleReverseIncludeMapperConfig.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleReverseIncludeMapperConfig.xml new file mode 100644 index 0000000..dcc7802 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleReverseIncludeMapperConfig.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleReverseIncludePersonMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleReverseIncludePersonMapper.java new file mode 100644 index 0000000..f749cb3 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleReverseIncludePersonMapper.java @@ -0,0 +1,22 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.xml_external_ref; + +public interface MultipleReverseIncludePersonMapper { + Person select(Integer id); + + Pet selectPet(Integer id); +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleReverseIncludePersonMapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleReverseIncludePersonMapper.xml new file mode 100644 index 0000000..8c94194 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleReverseIncludePersonMapper.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + , + person_name + + + + + person_id + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleReverseIncludeTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleReverseIncludeTest.java new file mode 100644 index 0000000..1e76875 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/MultipleReverseIncludeTest.java @@ -0,0 +1,86 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.xml_external_ref; + +import static org.junit.Assert.*; + +import java.io.IOException; +import java.io.Reader; +import java.sql.SQLException; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.datasource.unpooled.UnpooledDataSource; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.mapping.Environment; +import org.apache.ibatis.session.Configuration; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; +import org.junit.Test; + +public class MultipleReverseIncludeTest { + + @Test + public void testMultipleReverseIncludeXmlConfig() throws Exception { + testMultipleReverseIncludes(getSqlSessionFactoryXmlConfig()); + } + + @Test + public void testMultipleReverseIncludeJavaConfig() throws Exception { + testMultipleReverseIncludes(getSqlSessionFactoryJavaConfig()); + } + + private void testMultipleReverseIncludes(SqlSessionFactory sqlSessionFactory) { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + MultipleReverseIncludePersonMapper personMapper = sqlSession.getMapper(MultipleReverseIncludePersonMapper.class); + Person person = personMapper.select(1); + assertEquals((Integer)1, person.getId()); + assertEquals("John", person.getName()); + } + } + + private SqlSessionFactory getSqlSessionFactoryXmlConfig() throws Exception { + try (Reader configReader = Resources + .getResourceAsReader("org/apache/ibatis/submitted/xml_external_ref/MultipleReverseIncludeMapperConfig.xml")) { + SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configReader); + + initDb(sqlSessionFactory); + + return sqlSessionFactory; + } + } + + private SqlSessionFactory getSqlSessionFactoryJavaConfig() throws Exception { + Configuration configuration = new Configuration(); + Environment environment = new Environment("development", new JdbcTransactionFactory(), new UnpooledDataSource( + "org.hsqldb.jdbcDriver", "jdbc:hsqldb:mem:xmlextref", null)); + configuration.setEnvironment(environment); + configuration.addMapper(MultipleReverseIncludePersonMapper.class); + + SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration); + + initDb(sqlSessionFactory); + + return sqlSessionFactory; + } + + private static void initDb(SqlSessionFactory sqlSessionFactory) throws IOException, SQLException { + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/xml_external_ref/CreateDB.sql"); + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/NonFullyQualifiedNamespaceConfig.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/NonFullyQualifiedNamespaceConfig.xml new file mode 100644 index 0000000..0dd9bf4 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/NonFullyQualifiedNamespaceConfig.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/NonFullyQualifiedNamespacePersonMapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/NonFullyQualifiedNamespacePersonMapper.xml new file mode 100644 index 0000000..08a3095 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/NonFullyQualifiedNamespacePersonMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + person_id, person_name + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/NonFullyQualifiedNamespacePetMapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/NonFullyQualifiedNamespacePetMapper.xml new file mode 100644 index 0000000..4a070e2 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/NonFullyQualifiedNamespacePetMapper.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + pet_id, owner_id, pet_name + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/NonFullyQualifiedNamespaceTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/NonFullyQualifiedNamespaceTest.java new file mode 100644 index 0000000..12db2e6 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/NonFullyQualifiedNamespaceTest.java @@ -0,0 +1,70 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.xml_external_ref; + +import static org.junit.Assert.*; + +import java.io.IOException; +import java.io.Reader; +import java.sql.SQLException; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.mapping.MappedStatement; +import org.apache.ibatis.session.Configuration; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.Test; + +public class NonFullyQualifiedNamespaceTest { + @Test + public void testCrossReferenceXmlConfig() throws Exception { + try (Reader configReader = Resources + .getResourceAsReader("org/apache/ibatis/submitted/xml_external_ref/NonFullyQualifiedNamespaceConfig.xml")) { + SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configReader); + + Configuration configuration = sqlSessionFactory.getConfiguration(); + + MappedStatement selectPerson = configuration.getMappedStatement("person namespace.select"); + assertEquals( + "org/apache/ibatis/submitted/xml_external_ref/NonFullyQualifiedNamespacePersonMapper.xml", + selectPerson.getResource()); + + initDb(sqlSessionFactory); + + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + Person person = (Person) sqlSession.selectOne("person namespace.select", 1); + assertEquals((Integer) 1, person.getId()); + assertEquals(2, person.getPets().size()); + assertEquals((Integer) 2, person.getPets().get(1).getId()); + + Pet pet = (Pet) sqlSession.selectOne("person namespace.selectPet", 1); + assertEquals(Integer.valueOf(1), pet.getId()); + + Pet pet2 = (Pet) sqlSession.selectOne("pet namespace.select", 3); + assertEquals((Integer) 3, pet2.getId()); + assertEquals((Integer) 2, pet2.getOwner().getId()); + } + } + } + + private static void initDb(SqlSessionFactory sqlSessionFactory) throws IOException, SQLException { + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/xml_external_ref/CreateDB.sql"); + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ParameterMapReferenceMapperConfig.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ParameterMapReferenceMapperConfig.xml new file mode 100644 index 0000000..2ee8e35 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ParameterMapReferenceMapperConfig.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ParameterMapReferencePersonMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ParameterMapReferencePersonMapper.java new file mode 100644 index 0000000..0c28f70 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ParameterMapReferencePersonMapper.java @@ -0,0 +1,20 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.xml_external_ref; + +public interface ParameterMapReferencePersonMapper { + Person select(Person person); +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ParameterMapReferencePersonMapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ParameterMapReferencePersonMapper.xml new file mode 100644 index 0000000..a91ec22 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ParameterMapReferencePersonMapper.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ParameterMapReferencePetMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ParameterMapReferencePetMapper.java new file mode 100644 index 0000000..48b58bc --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ParameterMapReferencePetMapper.java @@ -0,0 +1,19 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.xml_external_ref; + +public interface ParameterMapReferencePetMapper { +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ParameterMapReferencePetMapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ParameterMapReferencePetMapper.xml new file mode 100644 index 0000000..766f110 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ParameterMapReferencePetMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ParameterMapReferenceTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ParameterMapReferenceTest.java new file mode 100644 index 0000000..df22d3f --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ParameterMapReferenceTest.java @@ -0,0 +1,89 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.xml_external_ref; + +import static org.junit.Assert.*; + +import java.io.IOException; +import java.io.Reader; +import java.sql.SQLException; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.datasource.unpooled.UnpooledDataSource; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.mapping.Environment; +import org.apache.ibatis.session.Configuration; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; +import org.junit.Test; + +public class ParameterMapReferenceTest { + + @Test + public void testCrossReferenceXmlConfig() throws Exception { + testCrossReference(getSqlSessionFactoryXmlConfig()); + } + + @Test + public void testCrossReferenceJavaConfig() throws Exception { + testCrossReference(getSqlSessionFactoryJavaConfig()); + } + + private void testCrossReference(SqlSessionFactory sqlSessionFactory) { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + ParameterMapReferencePersonMapper personMapper = sqlSession.getMapper(ParameterMapReferencePersonMapper.class); + Person parameter = new Person(); + parameter.setId(1); + Person person = personMapper.select(parameter); + assertEquals((Integer)1, person.getId()); + } + } + + private SqlSessionFactory getSqlSessionFactoryXmlConfig() throws Exception { + try (Reader configReader = Resources + .getResourceAsReader("org/apache/ibatis/submitted/xml_external_ref/ParameterMapReferenceMapperConfig.xml")) { + SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configReader); + + initDb(sqlSessionFactory); + + return sqlSessionFactory; + } + } + + private SqlSessionFactory getSqlSessionFactoryJavaConfig() throws Exception { + Configuration configuration = new Configuration(); + Environment environment = new Environment("development", new JdbcTransactionFactory(), new UnpooledDataSource( + "org.hsqldb.jdbcDriver", "jdbc:hsqldb:mem:xmlextref", null)); + configuration.setEnvironment(environment); + configuration.addMapper(ParameterMapReferencePersonMapper.class); + configuration.addMapper(ParameterMapReferencePetMapper.class); + + SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration); + + initDb(sqlSessionFactory); + + return sqlSessionFactory; + } + + + private static void initDb(SqlSessionFactory sqlSessionFactory) throws IOException, SQLException { + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/xml_external_ref/CreateDB.sql"); + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/Person.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/Person.java new file mode 100644 index 0000000..4d25fdd --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/Person.java @@ -0,0 +1,53 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.xml_external_ref; + +import java.io.Serializable; +import java.util.List; + +public class Person implements Serializable { + private static final long serialVersionUID = 1L; + + private Integer id; + + private String name; + + private List pets; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getPets() { + return pets; + } + + public void setPets(List pets) { + this.pets = pets; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/PersonMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/PersonMapper.java new file mode 100644 index 0000000..42ad90e --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/PersonMapper.java @@ -0,0 +1,22 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.xml_external_ref; + +public interface PersonMapper { + Person select(Integer id); + + Pet selectPet(Integer id); +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/PersonMapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/PersonMapper.xml new file mode 100644 index 0000000..849f8c0 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/PersonMapper.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + person_id, person_name + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/Pet.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/Pet.java new file mode 100644 index 0000000..c29c288 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/Pet.java @@ -0,0 +1,62 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.xml_external_ref; + +import java.io.Serializable; + +public class Pet implements Serializable { + private static final long serialVersionUID = 1L; + + private Integer id; + + private Integer ownerId; + + private String name; + + private Person owner; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Integer getOwnerId() { + return ownerId; + } + + public void setOwnerId(Integer ownerId) { + this.ownerId = ownerId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Person getOwner() { + return owner; + } + + public void setOwner(Person owner) { + this.owner = owner; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/PetMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/PetMapper.java new file mode 100644 index 0000000..e99319a --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/PetMapper.java @@ -0,0 +1,20 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.xml_external_ref; + +public interface PetMapper { + Pet select(Integer id); +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/PetMapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/PetMapper.xml new file mode 100644 index 0000000..95af8b3 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/PetMapper.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + pet_id, owner_id, pet_name + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ResultMapExtendsMapperConfig.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ResultMapExtendsMapperConfig.xml new file mode 100644 index 0000000..50451a0 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ResultMapExtendsMapperConfig.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ResultMapExtendsPersonMapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ResultMapExtendsPersonMapper.xml new file mode 100644 index 0000000..4443684 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ResultMapExtendsPersonMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ResultMapExtendsPetMapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ResultMapExtendsPetMapper.xml new file mode 100644 index 0000000..c95f5a0 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ResultMapExtendsPetMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ResultMapExtendsTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ResultMapExtendsTest.java new file mode 100644 index 0000000..9cb3f43 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ResultMapExtendsTest.java @@ -0,0 +1,87 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.xml_external_ref; + +import static org.junit.Assert.*; + +import java.io.IOException; +import java.io.Reader; +import java.sql.SQLException; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.datasource.unpooled.UnpooledDataSource; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.mapping.Environment; +import org.apache.ibatis.session.Configuration; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; +import org.junit.Test; + +public class ResultMapExtendsTest { + + @Test + public void testExternalExtendsXmlConfig() throws Exception { + testCrossReference(getSqlSessionFactoryXmlConfig()); + } + + @Test + public void testExternalExtendsJavaConfig() throws Exception { + testCrossReference(getSqlSessionFactoryJavaConfig()); + } + + private void testCrossReference(SqlSessionFactory sqlSessionFactory) { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + ResultMapReferencePersonMapper personMapper = sqlSession.getMapper(ResultMapReferencePersonMapper.class); + + Pet pet = personMapper.selectPet(1); + assertEquals(Integer.valueOf(1), pet.getId()); + } + } + + private SqlSessionFactory getSqlSessionFactoryXmlConfig() throws Exception { + try (Reader configReader = Resources + .getResourceAsReader("org/apache/ibatis/submitted/xml_external_ref/ResultMapExtendsMapperConfig.xml")) { + SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configReader); + + initDb(sqlSessionFactory); + + return sqlSessionFactory; + } + } + + private SqlSessionFactory getSqlSessionFactoryJavaConfig() throws Exception { + Configuration configuration = new Configuration(); + Environment environment = new Environment("development", new JdbcTransactionFactory(), new UnpooledDataSource( + "org.hsqldb.jdbcDriver", "jdbc:hsqldb:mem:xmlextref", null)); + configuration.setEnvironment(environment); + configuration.addMapper(ResultMapReferencePersonMapper.class); + configuration.addMapper(ResultMapReferencePetMapper.class); + + SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration); + + initDb(sqlSessionFactory); + + return sqlSessionFactory; + } + + private static void initDb(SqlSessionFactory sqlSessionFactory) throws IOException, SQLException { + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/xml_external_ref/CreateDB.sql"); + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ResultMapReferenceMapperConfig.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ResultMapReferenceMapperConfig.xml new file mode 100644 index 0000000..2b8502d --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ResultMapReferenceMapperConfig.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ResultMapReferencePersonMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ResultMapReferencePersonMapper.java new file mode 100644 index 0000000..befb90f --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ResultMapReferencePersonMapper.java @@ -0,0 +1,20 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.xml_external_ref; + +public interface ResultMapReferencePersonMapper { + Pet selectPet(Integer id); +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ResultMapReferencePersonMapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ResultMapReferencePersonMapper.xml new file mode 100644 index 0000000..1ac5ce4 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ResultMapReferencePersonMapper.xml @@ -0,0 +1,29 @@ + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ResultMapReferencePetMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ResultMapReferencePetMapper.java new file mode 100644 index 0000000..82c4eba --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ResultMapReferencePetMapper.java @@ -0,0 +1,19 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.xml_external_ref; + +public interface ResultMapReferencePetMapper { +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ResultMapReferencePetMapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ResultMapReferencePetMapper.xml new file mode 100644 index 0000000..c95f5a0 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ResultMapReferencePetMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ResultMapReferenceTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ResultMapReferenceTest.java new file mode 100644 index 0000000..7fab261 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ResultMapReferenceTest.java @@ -0,0 +1,87 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.xml_external_ref; + +import static org.junit.Assert.*; + +import java.io.IOException; +import java.io.Reader; +import java.sql.SQLException; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.datasource.unpooled.UnpooledDataSource; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.mapping.Environment; +import org.apache.ibatis.session.Configuration; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; +import org.junit.Test; + +public class ResultMapReferenceTest { + + @Test + public void testCrossReferenceXmlConfig() throws Exception { + testCrossReference(getSqlSessionFactoryXmlConfig()); + } + + @Test + public void testCrossReferenceJavaConfig() throws Exception { + testCrossReference(getSqlSessionFactoryJavaConfig()); + } + + private void testCrossReference(SqlSessionFactory sqlSessionFactory) { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + ResultMapReferencePersonMapper personMapper = sqlSession.getMapper(ResultMapReferencePersonMapper.class); + + Pet pet = personMapper.selectPet(1); + assertEquals(Integer.valueOf(1), pet.getId()); + } + } + + private SqlSessionFactory getSqlSessionFactoryXmlConfig() throws Exception { + try (Reader configReader = Resources + .getResourceAsReader("org/apache/ibatis/submitted/xml_external_ref/ResultMapReferenceMapperConfig.xml")) { + SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configReader); + + initDb(sqlSessionFactory); + + return sqlSessionFactory; + } + } + + private SqlSessionFactory getSqlSessionFactoryJavaConfig() throws Exception { + Configuration configuration = new Configuration(); + Environment environment = new Environment("development", new JdbcTransactionFactory(), new UnpooledDataSource( + "org.hsqldb.jdbcDriver", "jdbc:hsqldb:mem:xmlextref", null)); + configuration.setEnvironment(environment); + configuration.addMapper(ResultMapReferencePersonMapper.class); + configuration.addMapper(ResultMapReferencePetMapper.class); + + SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration); + + initDb(sqlSessionFactory); + + return sqlSessionFactory; + } + + private static void initDb(SqlSessionFactory sqlSessionFactory) throws IOException, SQLException { + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/xml_external_ref/CreateDB.sql"); + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ReverseIncludeMapperConfig.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ReverseIncludeMapperConfig.xml new file mode 100644 index 0000000..12fe69b --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ReverseIncludeMapperConfig.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ReverseIncludePersonMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ReverseIncludePersonMapper.java new file mode 100644 index 0000000..d3b2332 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ReverseIncludePersonMapper.java @@ -0,0 +1,22 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.xml_external_ref; + +public interface ReverseIncludePersonMapper { + Person select(Integer id); + + Pet selectPet(Integer id); +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ReverseIncludePersonMapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ReverseIncludePersonMapper.xml new file mode 100644 index 0000000..9cdd835 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ReverseIncludePersonMapper.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + person_id, person_name + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ReverseIncludeTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ReverseIncludeTest.java new file mode 100644 index 0000000..484f979 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ReverseIncludeTest.java @@ -0,0 +1,86 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.xml_external_ref; + +import static org.junit.Assert.*; + +import java.io.IOException; +import java.io.Reader; +import java.sql.SQLException; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.datasource.unpooled.UnpooledDataSource; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.mapping.Environment; +import org.apache.ibatis.session.Configuration; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; +import org.junit.Test; + +public class ReverseIncludeTest { + + @Test + public void testReverseIncludeXmlConfig() throws Exception { + testReverseIncludes(getSqlSessionFactoryXmlConfig()); + } + + @Test + public void testReverseIncludeJavaConfig() throws Exception { + testReverseIncludes(getSqlSessionFactoryJavaConfig()); + } + + private void testReverseIncludes(SqlSessionFactory sqlSessionFactory) { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + ReverseIncludePersonMapper personMapper = sqlSession.getMapper(ReverseIncludePersonMapper.class); + Person person = personMapper.select(1); + assertEquals((Integer)1, person.getId()); + assertEquals("John", person.getName()); + } + } + + private SqlSessionFactory getSqlSessionFactoryXmlConfig() throws Exception { + try (Reader configReader = Resources + .getResourceAsReader("org/apache/ibatis/submitted/xml_external_ref/ReverseIncludeMapperConfig.xml")) { + SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configReader); + + initDb(sqlSessionFactory); + + return sqlSessionFactory; + } + } + + private SqlSessionFactory getSqlSessionFactoryJavaConfig() throws Exception { + Configuration configuration = new Configuration(); + Environment environment = new Environment("development", new JdbcTransactionFactory(), new UnpooledDataSource( + "org.hsqldb.jdbcDriver", "jdbc:hsqldb:mem:xmlextref", null)); + configuration.setEnvironment(environment); + configuration.addMapper(ReverseIncludePersonMapper.class); + + SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration); + + initDb(sqlSessionFactory); + + return sqlSessionFactory; + } + + private static void initDb(SqlSessionFactory sqlSessionFactory) throws IOException, SQLException { + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/xml_external_ref/CreateDB.sql"); + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/SameIdMapperConfig.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/SameIdMapperConfig.xml new file mode 100644 index 0000000..deb9e1c --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/SameIdMapperConfig.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/SameIdPersonMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/SameIdPersonMapper.java new file mode 100644 index 0000000..722a508 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/SameIdPersonMapper.java @@ -0,0 +1,22 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.xml_external_ref; + +public interface SameIdPersonMapper { + Person select(Integer id); + + Pet selectPet(Integer id); +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/SameIdPersonMapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/SameIdPersonMapper.xml new file mode 100644 index 0000000..076de85 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/SameIdPersonMapper.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + person_id, person_name + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/SameIdPetMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/SameIdPetMapper.java new file mode 100644 index 0000000..1715d0e --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/SameIdPetMapper.java @@ -0,0 +1,20 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.xml_external_ref; + +public interface SameIdPetMapper { + Pet select(Integer id); +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/SameIdPetMapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/SameIdPetMapper.xml new file mode 100644 index 0000000..fb3b3b0 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/SameIdPetMapper.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + pet_id, owner_id, pet_name + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/SameIdTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/SameIdTest.java new file mode 100644 index 0000000..cc7a152 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/SameIdTest.java @@ -0,0 +1,96 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.xml_external_ref; + +import static org.junit.Assert.*; + +import java.io.IOException; +import java.io.Reader; +import java.sql.SQLException; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.datasource.unpooled.UnpooledDataSource; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.mapping.Environment; +import org.apache.ibatis.session.Configuration; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; +import org.junit.Test; + +public class SameIdTest { + + @Test + public void testCrossReferenceXmlConfig() throws Exception { + testCrossReference(getSqlSessionFactoryXmlConfig()); + } + + @Test + public void testCrossReferenceJavaConfig() throws Exception { + testCrossReference(getSqlSessionFactoryJavaConfig()); + } + + private void testCrossReference(SqlSessionFactory sqlSessionFactory) { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + SameIdPersonMapper personMapper = sqlSession.getMapper(SameIdPersonMapper.class); + Person person = personMapper.select(1); + assertEquals((Integer)1, person.getId()); + assertEquals(2, person.getPets().size()); + assertEquals((Integer)2, person.getPets().get(1).getId()); + + Pet pet = personMapper.selectPet(1); + assertEquals(Integer.valueOf(1), pet.getId()); + + SameIdPetMapper petMapper = sqlSession.getMapper(SameIdPetMapper.class); + Pet pet2 = petMapper.select(3); + assertEquals((Integer)3, pet2.getId()); + assertEquals((Integer)2, pet2.getOwner().getId()); + } + } + + private SqlSessionFactory getSqlSessionFactoryXmlConfig() throws Exception { + try (Reader configReader = Resources + .getResourceAsReader("org/apache/ibatis/submitted/xml_external_ref/SameIdMapperConfig.xml")) { + SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configReader); + + initDb(sqlSessionFactory); + + return sqlSessionFactory; + } + } + + private SqlSessionFactory getSqlSessionFactoryJavaConfig() throws Exception { + Configuration configuration = new Configuration(); + Environment environment = new Environment("development", new JdbcTransactionFactory(), new UnpooledDataSource( + "org.hsqldb.jdbcDriver", "jdbc:hsqldb:mem:xmlextref", null)); + configuration.setEnvironment(environment); + configuration.addMapper(SameIdPersonMapper.class); + configuration.addMapper(SameIdPetMapper.class); + + SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration); + + initDb(sqlSessionFactory); + + return sqlSessionFactory; + } + + private static void initDb(SqlSessionFactory sqlSessionFactory) throws IOException, SQLException { + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/xml_external_ref/CreateDB.sql"); + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ShortNameTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ShortNameTest.java new file mode 100644 index 0000000..86cfacc --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/ShortNameTest.java @@ -0,0 +1,54 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.xml_external_ref; + +import static org.junit.Assert.*; + +import java.io.IOException; +import java.io.Reader; + +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.mapping.MappedStatement; +import org.apache.ibatis.session.Configuration; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.Test; + +public class ShortNameTest { + @Test + public void getStatementByShortName() throws Exception { + Configuration configuration = getConfiguration(); + // statement can be referenced by its short name. + MappedStatement selectPet = configuration.getMappedStatement("selectPet"); + assertNotNull(selectPet); + } + + @Test(expected = IllegalArgumentException.class) + public void ambiguousShortNameShouldFail() throws Exception { + Configuration configuration = getConfiguration(); + // ambiguous short name should throw an exception. + MappedStatement ambiguousStatement = configuration.getMappedStatement("select"); + fail("If there are multiple statements with the same name, an exception should be thrown."); + } + + private Configuration getConfiguration() throws IOException { + try (Reader configReader = Resources + .getResourceAsReader("org/apache/ibatis/submitted/xml_external_ref/MapperConfig.xml")) { + SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configReader); + return sqlSessionFactory.getConfiguration(); + } + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/XmlExternalRefTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/XmlExternalRefTest.java new file mode 100644 index 0000000..8203d0f --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_external_ref/XmlExternalRefTest.java @@ -0,0 +1,138 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.xml_external_ref; + +import static org.junit.Assert.*; + +import java.io.IOException; +import java.io.Reader; +import java.sql.SQLException; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.builder.BuilderException; +import org.apache.ibatis.cache.Cache; +import org.apache.ibatis.datasource.unpooled.UnpooledDataSource; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.mapping.Environment; +import org.apache.ibatis.mapping.MappedStatement; +import org.apache.ibatis.session.Configuration; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; +import org.junit.Test; + +public class XmlExternalRefTest { + + @Test + public void testCrossReferenceXmlConfig() throws Exception { + testCrossReference(getSqlSessionFactoryXmlConfig()); + } + + @Test + public void testCrossReferenceJavaConfig() throws Exception { + testCrossReference(getSqlSessionFactoryJavaConfig()); + } + + @Test(expected = BuilderException.class) + public void testFailFastOnBuildAll() throws Exception { + Configuration configuration = new Configuration(); + try { + configuration.addMapper(InvalidMapper.class); + } catch (Exception e) { + fail("No exception should be thrown before parsing statement nodes."); + } + configuration.getMappedStatementNames(); + } + + @Test(expected = BuilderException.class) + public void testFailFastOnBuildAllWithInsert() throws Exception { + Configuration configuration = new Configuration(); + try { + configuration.addMapper(InvalidWithInsertMapper.class); + configuration.addMapper(InvalidMapper.class); + } catch (Exception e) { + fail("No exception should be thrown before parsing statement nodes."); + } + configuration.getMappedStatementNames(); + } + + @Test + public void testMappedStatementCache() throws Exception { + try (Reader configReader = Resources.getResourceAsReader("org/apache/ibatis/submitted/xml_external_ref/MapperConfig.xml")) { + SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configReader); + + Configuration configuration = sqlSessionFactory.getConfiguration(); + configuration.getMappedStatementNames(); + + MappedStatement selectPetStatement = configuration.getMappedStatement("org.apache.ibatis.submitted.xml_external_ref.PetMapper.select"); + MappedStatement selectPersonStatement = configuration.getMappedStatement("org.apache.ibatis.submitted.xml_external_ref.PersonMapper.select"); + Cache cache = selectPetStatement.getCache(); + assertEquals("org.apache.ibatis.submitted.xml_external_ref.PetMapper", cache.getId()); + assertSame(cache, selectPersonStatement.getCache()); + } + } + + private void testCrossReference(SqlSessionFactory sqlSessionFactory) { + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + PersonMapper personMapper = sqlSession.getMapper(PersonMapper.class); + Person person = personMapper.select(1); + assertEquals((Integer)1, person.getId()); + assertEquals(2, person.getPets().size()); + assertEquals((Integer)2, person.getPets().get(1).getId()); + + Pet pet = personMapper.selectPet(1); + assertEquals(Integer.valueOf(1), pet.getId()); + + PetMapper petMapper = sqlSession.getMapper(PetMapper.class); + Pet pet2 = petMapper.select(3); + assertEquals((Integer)3, pet2.getId()); + assertEquals((Integer)2, pet2.getOwner().getId()); + } + } + + private SqlSessionFactory getSqlSessionFactoryXmlConfig() throws Exception { + try (Reader configReader = Resources + .getResourceAsReader("org/apache/ibatis/submitted/xml_external_ref/MapperConfig.xml")) { + SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configReader); + + initDb(sqlSessionFactory); + + return sqlSessionFactory; + } + } + + private SqlSessionFactory getSqlSessionFactoryJavaConfig() throws Exception { + Configuration configuration = new Configuration(); + Environment environment = new Environment("development", new JdbcTransactionFactory(), new UnpooledDataSource( + "org.hsqldb.jdbcDriver", "jdbc:hsqldb:mem:xmlextref", null)); + configuration.setEnvironment(environment); + configuration.addMapper(PersonMapper.class); + configuration.addMapper(PetMapper.class); + + SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration); + + initDb(sqlSessionFactory); + + return sqlSessionFactory; + } + + private static void initDb(SqlSessionFactory sqlSessionFactory) throws IOException, SQLException { + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/submitted/xml_external_ref/CreateDB.sql"); + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_references/EnumWithOgnlTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_references/EnumWithOgnlTest.java new file mode 100644 index 0000000..8bdec4c --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_references/EnumWithOgnlTest.java @@ -0,0 +1,56 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.xml_references; + +import java.io.Reader; +import java.util.Properties; + +import org.apache.ibatis.datasource.unpooled.UnpooledDataSourceFactory; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.mapping.Environment; +import org.apache.ibatis.session.Configuration; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.apache.ibatis.session.defaults.DefaultSqlSessionFactory; +import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; +import org.junit.Test; + +public class EnumWithOgnlTest { + + @Test + public void testConfiguration() { + UnpooledDataSourceFactory dataSourceFactory = new UnpooledDataSourceFactory(); + Properties dataSourceProperties = new Properties(); + dataSourceProperties.put("driver", "org.hsqldb.jdbcDriver"); + dataSourceProperties.put("url", "jdbc:hsqldb:mem:xml_references"); + dataSourceProperties.put("username", "sa"); + dataSourceFactory.setProperties(dataSourceProperties); + Environment environment = new Environment("test", new JdbcTransactionFactory(), dataSourceFactory.getDataSource()); + Configuration configuration = new Configuration(); + configuration.setEnvironment(environment); + configuration.getTypeAliasRegistry().registerAlias(Person.class); + configuration.addMapper(PersonMapper.class); + configuration.addMapper(PersonMapper2.class); + new DefaultSqlSessionFactory(configuration); + } + @Test + public void testMixedConfiguration() throws Exception { + try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/xml_references/ibatisConfig.xml")) { + SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + sqlSessionFactory.getConfiguration().addMapper(PersonMapper2.class); + } + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_references/Person.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_references/Person.java new file mode 100644 index 0000000..d1e376a --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_references/Person.java @@ -0,0 +1,45 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.xml_references; + +public class Person { + public enum Type { + EMPLOYEE, + DIRECTOR + } + + private Long id; + private String firstName; + private String lastName; + public String getFirstName() { + return firstName; + } + public void setFirstName(String firstName) { + this.firstName = firstName; + } + public String getLastName() { + return lastName; + } + public void setLastName(String lastName) { + this.lastName = lastName; + } + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_references/PersonMapper.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_references/PersonMapper.java new file mode 100644 index 0000000..e1f09c7 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_references/PersonMapper.java @@ -0,0 +1,30 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.xml_references; + +import java.util.List; + +public interface PersonMapper { + + public interface PersonType { + public Person.Type getType(); + } + + public List selectAllByType(Person.Type type); + public List selectAllByTypeNameAttribute(Person.Type type); + public List selectAllByTypeWithInterface(PersonType personType); + public List selectAllByTypeNameAttributeWithInterface(PersonType personType); +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_references/PersonMapper.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_references/PersonMapper.xml new file mode 100644 index 0000000..3fb4b04 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_references/PersonMapper.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + SELECT id, firstName, lastName, personType + FROM person + WHERE id = #{id} + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_references/PersonMapper2.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_references/PersonMapper2.java new file mode 100644 index 0000000..782b1e8 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_references/PersonMapper2.java @@ -0,0 +1,30 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.submitted.xml_references; + +import java.util.List; + +public interface PersonMapper2 { + + public interface PersonType { + public Person.Type getType(); + } + + public List selectAllByType(Person.Type type); + public List selectAllByTypeNameAttribute(Person.Type type); + public List selectAllByTypeWithInterface(PersonType personType); + public List selectAllByTypeNameAttributeWithInterface(PersonType personType); +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_references/PersonMapper2.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_references/PersonMapper2.xml new file mode 100644 index 0000000..2e50cfa --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_references/PersonMapper2.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_references/ibatisConfig.xml b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_references/ibatisConfig.xml new file mode 100644 index 0000000..2fc5cd2 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/submitted/xml_references/ibatisConfig.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/test/EmbeddedPostgresqlTests.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/test/EmbeddedPostgresqlTests.java new file mode 100644 index 0000000..fee66a2 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/test/EmbeddedPostgresqlTests.java @@ -0,0 +1,20 @@ +/** + * Copyright 2009-2017 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ibatis.test; + +public interface EmbeddedPostgresqlTests extends SlowTests { +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/test/SlowTests.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/test/SlowTests.java new file mode 100644 index 0000000..f1253b5 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/test/SlowTests.java @@ -0,0 +1,20 @@ +/** + * Copyright 2009-2017 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ibatis.test; + +public interface SlowTests { +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/transaction/managed/ManagedTransactionFactoryTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/transaction/managed/ManagedTransactionFactoryTest.java new file mode 100644 index 0000000..9038fc2 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/transaction/managed/ManagedTransactionFactoryTest.java @@ -0,0 +1,65 @@ +/** + * Copyright 2009-2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.transaction.managed; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; + +import java.sql.Connection; +import java.util.Properties; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.transaction.Transaction; +import org.apache.ibatis.transaction.TransactionFactory; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class ManagedTransactionFactoryTest extends BaseDataTest { + + @Mock + private Connection conn; + + @Test + public void shouldEnsureThatCallsToManagedTransactionAPIDoNotForwardToManagedConnections() throws Exception { + TransactionFactory tf = new ManagedTransactionFactory(); + tf.setProperties(new Properties()); + Transaction tx = tf.newTransaction(conn); + assertEquals(conn, tx.getConnection()); + tx.commit(); + tx.rollback(); + tx.close(); + verify(conn).close(); + } + + @Test + public void shouldEnsureThatCallsToManagedTransactionAPIDoNotForwardToManagedConnectionsAndDoesNotCloseConnection() throws Exception { + TransactionFactory tf = new ManagedTransactionFactory(); + Properties props = new Properties(); + props.setProperty("closeConnection", "false"); + tf.setProperties(props); + Transaction tx = tf.newTransaction(conn); + assertEquals(conn, tx.getConnection()); + tx.commit(); + tx.rollback(); + tx.close(); + verifyNoMoreInteractions(conn); + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/ArrayTypeHandlerTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/ArrayTypeHandlerTest.java new file mode 100644 index 0000000..1dc1c56 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/ArrayTypeHandlerTest.java @@ -0,0 +1,90 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.type; + +import org.junit.Test; +import org.mockito.Mock; + +import java.sql.Array; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +public class ArrayTypeHandlerTest extends BaseTypeHandlerTest { + + private static final TypeHandler TYPE_HANDLER = new ArrayTypeHandler(); + + @Mock + Array mockArray; + + @Override + @Test + public void shouldSetParameter() throws Exception { + TYPE_HANDLER.setParameter(ps, 1, mockArray, null); + verify(ps).setArray(1, mockArray); + } + + @Override + @Test + public void shouldGetResultFromResultSetByName() throws Exception { + when(rs.getArray("column")).thenReturn(mockArray); + String[] stringArray = new String[]{"a", "b"}; + when(mockArray.getArray()).thenReturn(stringArray); + assertEquals(stringArray, TYPE_HANDLER.getResult(rs, "column")); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByName() throws Exception { + when(rs.getArray("column")).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(rs, "column")); + } + + @Override + @Test + public void shouldGetResultFromResultSetByPosition() throws Exception { + when(rs.getArray(1)).thenReturn(mockArray); + String[] stringArray = new String[]{"a", "b"}; + when(mockArray.getArray()).thenReturn(stringArray); + assertEquals(stringArray, TYPE_HANDLER.getResult(rs, 1)); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByPosition() throws Exception { + when(rs.getArray(1)).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(rs, 1)); + } + + @Override + @Test + public void shouldGetResultFromCallableStatement() throws Exception { + when(cs.getArray(1)).thenReturn(mockArray); + String[] stringArray = new String[]{"a", "b"}; + when(mockArray.getArray()).thenReturn(stringArray); + assertEquals(stringArray, TYPE_HANDLER.getResult(cs, 1)); + } + + @Override + @Test + public void shouldGetResultNullFromCallableStatement() throws Exception { + when(cs.getArray(1)).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(cs, 1)); + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/BaseTypeHandlerTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/BaseTypeHandlerTest.java new file mode 100644 index 0000000..b0d11b8 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/BaseTypeHandlerTest.java @@ -0,0 +1,52 @@ +/** + * Copyright 2009-2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.type; + +import java.sql.CallableStatement; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.ResultSetMetaData; + +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public abstract class BaseTypeHandlerTest { + + @Mock + protected ResultSet rs; + @Mock + protected PreparedStatement ps; + @Mock + protected CallableStatement cs; + @Mock + protected ResultSetMetaData rsmd; + + public abstract void shouldSetParameter() throws Exception; + + public abstract void shouldGetResultFromResultSetByName() throws Exception; + + public abstract void shouldGetResultNullFromResultSetByName() throws Exception; + + public abstract void shouldGetResultFromResultSetByPosition() throws Exception; + + public abstract void shouldGetResultNullFromResultSetByPosition() throws Exception; + + public abstract void shouldGetResultFromCallableStatement() throws Exception; + + public abstract void shouldGetResultNullFromCallableStatement() throws Exception; +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/BigDecimalTypeHandlerTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/BigDecimalTypeHandlerTest.java new file mode 100644 index 0000000..a1ff525 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/BigDecimalTypeHandlerTest.java @@ -0,0 +1,79 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.type; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.math.BigDecimal; + +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.Mockito; + +public class BigDecimalTypeHandlerTest extends BaseTypeHandlerTest { + + private static final TypeHandler TYPE_HANDLER = new BigDecimalTypeHandler(); + + @Override + @Test + public void shouldSetParameter() throws Exception { + TYPE_HANDLER.setParameter(ps, 1, new BigDecimal(1), null); + verify(ps).setBigDecimal(1, new BigDecimal(1)); + } + + @Override + @Test + public void shouldGetResultFromResultSetByName() throws Exception { + when(rs.getBigDecimal("column")).thenReturn(new BigDecimal(1)); + assertEquals(new BigDecimal(1), TYPE_HANDLER.getResult(rs, "column")); + verify(rs, never()).wasNull(); + } + + @Override + public void shouldGetResultNullFromResultSetByName() throws Exception { + // Unnecessary + } + + @Override + @Test + public void shouldGetResultFromResultSetByPosition() throws Exception { + when(rs.getBigDecimal(1)).thenReturn(new BigDecimal(1)); + assertEquals(new BigDecimal(1), TYPE_HANDLER.getResult(rs, 1)); + verify(rs, never()).wasNull(); + } + + @Override + public void shouldGetResultNullFromResultSetByPosition() throws Exception { + // Unnecessary + } + + @Override + @Test + public void shouldGetResultFromCallableStatement() throws Exception { + when(cs.getBigDecimal(1)).thenReturn(new BigDecimal(1)); + assertEquals(new BigDecimal(1), TYPE_HANDLER.getResult(cs, 1)); + verify(cs, never()).wasNull(); + } + + @Override + public void shouldGetResultNullFromCallableStatement() throws Exception { + // Unnecessary + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/BigIntegerTypeHandlerTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/BigIntegerTypeHandlerTest.java new file mode 100644 index 0000000..07916ca --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/BigIntegerTypeHandlerTest.java @@ -0,0 +1,88 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.type; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.math.BigDecimal; +import java.math.BigInteger; + +import org.junit.Test; + +public class BigIntegerTypeHandlerTest extends BaseTypeHandlerTest { + + private static final TypeHandler TYPE_HANDLER = new BigIntegerTypeHandler(); + + @Override + @Test + public void shouldSetParameter() throws Exception { + TYPE_HANDLER.setParameter(ps, 1, new BigInteger("707070656505050302797979792923232303"), null); + verify(ps).setBigDecimal(1, new BigDecimal("707070656505050302797979792923232303")); + } + + @Override + @Test + public void shouldGetResultFromResultSetByName() throws Exception { + when(rs.getBigDecimal("column")).thenReturn(new BigDecimal("707070656505050302797979792923232303")); + assertEquals(new BigInteger("707070656505050302797979792923232303"), TYPE_HANDLER.getResult(rs, "column")); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByName() throws Exception { + when(rs.getBigDecimal("column")).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(rs, "column")); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultFromResultSetByPosition() throws Exception { + when(rs.getBigDecimal(1)).thenReturn(new BigDecimal("707070656505050302797979792923232303")); + assertEquals(new BigInteger("707070656505050302797979792923232303"), TYPE_HANDLER.getResult(rs,1 )); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByPosition() throws Exception { + when(rs.getBigDecimal(1)).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(rs,1 )); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultFromCallableStatement() throws Exception { + when(cs.getBigDecimal(1)).thenReturn(new BigDecimal("707070656505050302797979792923232303")); + assertEquals(new BigInteger("707070656505050302797979792923232303"), TYPE_HANDLER.getResult(cs, 1)); + verify(cs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultNullFromCallableStatement() throws Exception { + when(cs.getBigDecimal(1)).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(cs, 1)); + verify(cs, never()).wasNull(); + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/BlobByteObjectArrayTypeHandlerTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/BlobByteObjectArrayTypeHandlerTest.java new file mode 100644 index 0000000..75225a5 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/BlobByteObjectArrayTypeHandlerTest.java @@ -0,0 +1,104 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.type; + +import org.junit.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Mock; + +import java.io.*; +import java.sql.Blob; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.when; + +public class BlobByteObjectArrayTypeHandlerTest extends BaseTypeHandlerTest { + + private static final TypeHandler TYPE_HANDLER = new BlobByteObjectArrayTypeHandler(); + + @Mock + protected Blob blob; + + @Override + @Test + public void shouldSetParameter() throws Exception { + final ArgumentCaptor positionCaptor = ArgumentCaptor.forClass(Integer.class); + final ArgumentCaptor byteArrayCaptor = ArgumentCaptor.forClass(ByteArrayInputStream.class); + final ArgumentCaptor lengthCaptor = ArgumentCaptor.forClass(Integer.class); + doNothing().when(ps).setBinaryStream(positionCaptor.capture(), byteArrayCaptor.capture(), lengthCaptor.capture()); + TYPE_HANDLER.setParameter(ps, 1, new Byte[]{1, 2}, null); + ByteArrayInputStream actualIn = byteArrayCaptor.getValue(); + assertThat(positionCaptor.getValue()).isEqualTo(1); + assertThat(actualIn.read()).isEqualTo(1); + assertThat(actualIn.read()).isEqualTo(2); + assertThat(actualIn.read()).isEqualTo(-1); + assertThat(lengthCaptor.getValue()).isEqualTo(2); + } + + @Override + @Test + public void shouldGetResultFromResultSetByName() throws Exception { + byte[] byteArray = new byte[]{1, 2}; + when(rs.getBlob("column")).thenReturn(blob); + when(blob.length()).thenReturn((long)byteArray.length); + when(blob.getBytes(1, 2)).thenReturn(byteArray); + assertThat(TYPE_HANDLER.getResult(rs, "column")).isEqualTo(new Byte[]{1, 2}); + + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByName() throws Exception { + when(rs.getBlob("column")).thenReturn(null); + assertThat(TYPE_HANDLER.getResult(rs, "column")).isNull(); + } + + @Override + @Test + public void shouldGetResultFromResultSetByPosition() throws Exception { + byte[] byteArray = new byte[]{1, 2}; + when(rs.getBlob(1)).thenReturn(blob); + when(blob.length()).thenReturn((long)byteArray.length); + when(blob.getBytes(1, 2)).thenReturn(byteArray); + assertThat(TYPE_HANDLER.getResult(rs, 1)).isEqualTo(new Byte[]{1, 2}); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByPosition() throws Exception { + when(rs.getBlob(1)).thenReturn(null); + assertThat(TYPE_HANDLER.getResult(rs, 1)).isNull(); + } + + @Override + @Test + public void shouldGetResultFromCallableStatement() throws Exception { + byte[] byteArray = new byte[]{1, 2}; + when(cs.getBlob(1)).thenReturn(blob); + when(blob.length()).thenReturn((long)byteArray.length); + when(blob.getBytes(1, 2)).thenReturn(byteArray); + assertThat(TYPE_HANDLER.getResult(cs, 1)).isEqualTo(new Byte[]{1, 2}); + } + + @Override + @Test + public void shouldGetResultNullFromCallableStatement() throws Exception { + when(cs.getBlob(1)).thenReturn(null); + assertThat(TYPE_HANDLER.getResult(cs, 1)).isNull(); + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/BlobInputStreamTypeHandlerTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/BlobInputStreamTypeHandlerTest.java new file mode 100644 index 0000000..a3bdf1c --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/BlobInputStreamTypeHandlerTest.java @@ -0,0 +1,175 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.type; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.mapping.Environment; +import org.apache.ibatis.session.Configuration; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.apache.ibatis.transaction.TransactionFactory; +import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; +import org.junit.BeforeClass; +import org.junit.Test; +import org.mockito.Mock; + +import javax.sql.DataSource; +import java.io.*; +import java.sql.Blob; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +/** + * Tests for {@link BlobInputStreamTypeHandler}. + * + * @since 3.4.0 + * @author Kazuki Shimizu + */ +public class BlobInputStreamTypeHandlerTest extends BaseTypeHandlerTest { + + private static final TypeHandler TYPE_HANDLER = new BlobInputStreamTypeHandler(); + + private static SqlSessionFactory sqlSessionFactory; + + @Mock + protected Blob blob; + + @BeforeClass + public static void setupSqlSessionFactory() throws Exception { + DataSource dataSource = BaseDataTest.createUnpooledDataSource("org/apache/ibatis/type/jdbc.properties"); + TransactionFactory transactionFactory = new JdbcTransactionFactory(); + Environment environment = new Environment("Production", transactionFactory, dataSource); + Configuration configuration = new Configuration(environment); + configuration.addMapper(Mapper.class); + sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration); + + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/type/BlobInputStreamTypeHandlerTest.sql"); + } + + @Override + @Test + public void shouldSetParameter() throws Exception { + InputStream in = new ByteArrayInputStream("Hello".getBytes()); + TYPE_HANDLER.setParameter(ps, 1, in, null); + verify(ps).setBlob(1, in); + } + + @Override + @Test + public void shouldGetResultFromResultSetByName() throws Exception { + InputStream in = new ByteArrayInputStream("Hello".getBytes()); + when(rs.getBlob("column")).thenReturn(blob); + when(blob.getBinaryStream()).thenReturn(in); + assertThat(TYPE_HANDLER.getResult(rs, "column")).isEqualTo(in); + + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByName() throws Exception { + when(rs.getBlob("column")).thenReturn(null); + assertThat(TYPE_HANDLER.getResult(rs, "column")).isNull(); + } + + @Override + @Test + public void shouldGetResultFromResultSetByPosition() throws Exception { + InputStream in = new ByteArrayInputStream("Hello".getBytes()); + when(rs.getBlob(1)).thenReturn(blob); + when(blob.getBinaryStream()).thenReturn(in); + assertThat(TYPE_HANDLER.getResult(rs, 1)).isEqualTo(in); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByPosition() throws Exception { + when(rs.getBlob(1)).thenReturn(null); + assertThat(TYPE_HANDLER.getResult(rs, 1)).isNull(); + } + + @Override + @Test + public void shouldGetResultFromCallableStatement() throws Exception { + InputStream in = new ByteArrayInputStream("Hello".getBytes()); + when(cs.getBlob(1)).thenReturn(blob); + when(blob.getBinaryStream()).thenReturn(in); + assertThat(TYPE_HANDLER.getResult(cs, 1)).isEqualTo(in); + } + + @Override + @Test + public void shouldGetResultNullFromCallableStatement() throws Exception { + when(cs.getBlob(1)).thenReturn(null); + assertThat(TYPE_HANDLER.getResult(cs, 1)).isNull(); + } + + @Test + public void integrationTest() throws IOException { + try (SqlSession session = sqlSessionFactory.openSession()) { + Mapper mapper = session.getMapper(Mapper.class); + // insert (InputStream -> Blob) + { + BlobContent blobContent = new BlobContent(); + blobContent.setId(1); + blobContent.setContent(new ByteArrayInputStream("Hello".getBytes())); + mapper.insert(blobContent); + session.commit(); + } + // select (Blob -> InputStream) + { + BlobContent blobContent = mapper.findOne(1); + assertThat(new BufferedReader(new InputStreamReader(blobContent.getContent())).readLine()).isEqualTo("Hello"); + } + } + + } + + interface Mapper { + @Select("SELECT ID, CONTENT FROM TEST_BLOB WHERE ID = #{id}") + BlobContent findOne(int id); + + @Insert("INSERT INTO TEST_BLOB (ID, CONTENT) VALUES(#{id}, #{content})") + void insert(BlobContent blobContent); + } + + static class BlobContent { + private int id; + private InputStream content; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public InputStream getContent() { + return content; + } + + public void setContent(InputStream content) { + this.content = content; + } + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/BlobInputStreamTypeHandlerTest.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/BlobInputStreamTypeHandlerTest.sql new file mode 100644 index 0000000..10a062b --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/BlobInputStreamTypeHandlerTest.sql @@ -0,0 +1,22 @@ +-- +-- Copyright 2009-2016 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +DROP TABLE test_blob; + +CREATE TABLE test_blob ( + id INT PRIMARY KEY, + content BLOB +); diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/BlobTypeHandlerTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/BlobTypeHandlerTest.java new file mode 100644 index 0000000..a317f81 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/BlobTypeHandlerTest.java @@ -0,0 +1,92 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.type; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertNull; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.io.InputStream; +import java.sql.Blob; + +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.Mockito; + +public class BlobTypeHandlerTest extends BaseTypeHandlerTest { + + private static final TypeHandler TYPE_HANDLER = new BlobTypeHandler(); + + @Mock + protected Blob blob; + + @Override + @Test + public void shouldSetParameter() throws Exception { + TYPE_HANDLER.setParameter(ps, 1, new byte[] { 1, 2, 3 }, null); + verify(ps).setBinaryStream(Mockito.eq(1), Mockito.any(InputStream.class), Mockito.eq(3)); + } + + @Override + @Test + public void shouldGetResultFromResultSetByName() throws Exception { + when(rs.getBlob("column")).thenReturn(blob); + when(blob.length()).thenReturn(3l); + when(blob.getBytes(1, 3)).thenReturn(new byte[] { 1, 2, 3 }); + assertArrayEquals(new byte[] { 1, 2, 3 }, TYPE_HANDLER.getResult(rs, "column")); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByName() throws Exception { + when(rs.getBlob("column")).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(rs, "column")); + } + + @Override + @Test + public void shouldGetResultFromResultSetByPosition() throws Exception { + when(rs.getBlob(1)).thenReturn(blob); + when(blob.length()).thenReturn(3l); + when(blob.getBytes(1, 3)).thenReturn(new byte[] { 1, 2, 3 }); + assertArrayEquals(new byte[] { 1, 2, 3 }, TYPE_HANDLER.getResult(rs, 1)); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByPosition() throws Exception { + when(rs.getBlob(1)).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(rs, 1)); + } + + @Override + @Test + public void shouldGetResultFromCallableStatement() throws Exception { + when(cs.getBlob(1)).thenReturn(blob); + when(blob.length()).thenReturn(3l); + when(blob.getBytes(1, 3)).thenReturn(new byte[] { 1, 2, 3 }); + assertArrayEquals(new byte[] { 1, 2, 3 }, TYPE_HANDLER.getResult(cs, 1)); + } + + @Override + @Test + public void shouldGetResultNullFromCallableStatement() throws Exception { + when(cs.getBlob(1)).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(cs, 1)); + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/BooleanTypeHandlerTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/BooleanTypeHandlerTest.java new file mode 100644 index 0000000..fec509a --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/BooleanTypeHandlerTest.java @@ -0,0 +1,89 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.type; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import org.junit.Test; + +public class BooleanTypeHandlerTest extends BaseTypeHandlerTest { + + private static final TypeHandler TYPE_HANDLER = new BooleanTypeHandler(); + + @Override + @Test + public void shouldSetParameter() throws Exception { + TYPE_HANDLER.setParameter(ps, 1, true, null); + verify(ps).setBoolean(1, true); + } + + @Override + @Test + public void shouldGetResultFromResultSetByName() throws Exception { + when(rs.getBoolean("column")).thenReturn(true); + assertEquals(true, TYPE_HANDLER.getResult(rs, "column")); + + when(rs.getBoolean("column")).thenReturn(false); + assertEquals(false, TYPE_HANDLER.getResult(rs, "column")); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByName() throws Exception { + when(rs.getBoolean("column")).thenReturn(false); + when(rs.wasNull()).thenReturn(true); + assertNull(TYPE_HANDLER.getResult(rs, "column")); + } + + @Override + @Test + public void shouldGetResultFromResultSetByPosition() throws Exception { + when(rs.getBoolean(1)).thenReturn(true); + assertEquals(true, TYPE_HANDLER.getResult(rs, 1)); + + when(rs.getBoolean(1)).thenReturn(false); + assertEquals(false, TYPE_HANDLER.getResult(rs, 1)); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByPosition() throws Exception { + when(rs.getBoolean(1)).thenReturn(false); + when(rs.wasNull()).thenReturn(true); + assertNull(TYPE_HANDLER.getResult(rs, 1)); + } + + @Override + @Test + public void shouldGetResultFromCallableStatement() throws Exception { + when(cs.getBoolean(1)).thenReturn(true); + assertEquals(true, TYPE_HANDLER.getResult(cs, 1)); + + when(cs.getBoolean(1)).thenReturn(false); + assertEquals(false, TYPE_HANDLER.getResult(cs, 1)); + } + + @Override + public void shouldGetResultNullFromCallableStatement() throws Exception { + when(cs.getBoolean(1)).thenReturn(false); + when(cs.wasNull()).thenReturn(true); + assertNull(TYPE_HANDLER.getResult(cs, 1)); + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/ByteArrayTypeHandlerTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/ByteArrayTypeHandlerTest.java new file mode 100644 index 0000000..769755a --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/ByteArrayTypeHandlerTest.java @@ -0,0 +1,75 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.type; + +import static org.junit.Assert.assertArrayEquals; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import org.junit.Test; + +public class ByteArrayTypeHandlerTest extends BaseTypeHandlerTest { + + private static final TypeHandler TYPE_HANDLER = new ByteArrayTypeHandler(); + + @Override + @Test + public void shouldSetParameter() throws Exception { + TYPE_HANDLER.setParameter(ps, 1, new byte[] { 1, 2, 3 }, null); + verify(ps).setBytes(1, new byte[] { 1, 2, 3 }); + } + + @Override + @Test + public void shouldGetResultFromResultSetByName() throws Exception { + when(rs.getBytes("column")).thenReturn(new byte[] { 1, 2, 3 }); + assertArrayEquals(new byte[] { 1, 2, 3 }, TYPE_HANDLER.getResult(rs, "column")); + verify(rs, never()).wasNull(); + } + + @Override + public void shouldGetResultNullFromResultSetByName() throws Exception { + // Unnecessary + } + + @Override + @Test + public void shouldGetResultFromResultSetByPosition() throws Exception { + when(rs.getBytes(1)).thenReturn(new byte[] { 1, 2, 3 }); + assertArrayEquals(new byte[] { 1, 2, 3 }, TYPE_HANDLER.getResult(rs, 1)); + verify(rs, never()).wasNull(); + } + + @Override + public void shouldGetResultNullFromResultSetByPosition() throws Exception { + // Unnecessary + } + + @Override + @Test + public void shouldGetResultFromCallableStatement() throws Exception { + when(cs.getBytes(1)).thenReturn(new byte[] { 1, 2, 3 }); + assertArrayEquals(new byte[] { 1, 2, 3 }, TYPE_HANDLER.getResult(cs, 1)); + verify(cs, never()).wasNull(); + } + + @Override + public void shouldGetResultNullFromCallableStatement() throws Exception { + // Unnecessary + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/ByteObjectArrayTypeHandlerTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/ByteObjectArrayTypeHandlerTest.java new file mode 100644 index 0000000..e222059 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/ByteObjectArrayTypeHandlerTest.java @@ -0,0 +1,87 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.type; + +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +public class ByteObjectArrayTypeHandlerTest extends BaseTypeHandlerTest { + + private static final TypeHandler TYPE_HANDLER = new ByteObjectArrayTypeHandler(); + + @Override + @Test + public void shouldSetParameter() throws Exception { + TYPE_HANDLER.setParameter(ps, 1, new Byte[] { 1, 2, 3 }, null); + verify(ps).setBytes(1, new byte[] { 1, 2, 3 }); + } + + @Override + @Test + public void shouldGetResultFromResultSetByName() throws Exception { + byte[] byteArray = new byte[]{1, 2}; + when(rs.getBytes("column")).thenReturn(byteArray); + assertThat(TYPE_HANDLER.getResult(rs, "column")).isEqualTo(new Byte[]{1, 2}); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByName() throws Exception { + when(rs.getBytes("column")).thenReturn(null); + assertThat(TYPE_HANDLER.getResult(rs, "column")).isNull(); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultFromResultSetByPosition() throws Exception { + byte[] byteArray = new byte[]{1, 2}; + when(rs.getBytes(1)).thenReturn(byteArray); + assertThat(TYPE_HANDLER.getResult(rs, 1)).isEqualTo(new Byte[]{1, 2}); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByPosition() throws Exception { + when(rs.getBytes(1)).thenReturn(null); + assertThat(TYPE_HANDLER.getResult(rs, 1)).isNull(); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultFromCallableStatement() throws Exception { + byte[] byteArray = new byte[]{1, 2}; + when(cs.getBytes(1)).thenReturn(byteArray); + assertThat(TYPE_HANDLER.getResult(cs, 1)).isEqualTo(new Byte[]{1, 2}); + verify(cs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultNullFromCallableStatement() throws Exception { + when(cs.getBytes(1)).thenReturn(null); + assertThat(TYPE_HANDLER.getResult(cs, 1)).isNull(); + verify(cs, never()).wasNull(); + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/ByteTypeHandlerTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/ByteTypeHandlerTest.java new file mode 100644 index 0000000..b56cf15 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/ByteTypeHandlerTest.java @@ -0,0 +1,90 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.type; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import org.junit.Test; + +public class ByteTypeHandlerTest extends BaseTypeHandlerTest { + + private static final TypeHandler TYPE_HANDLER = new ByteTypeHandler(); + + @Override + @Test + public void shouldSetParameter() throws Exception { + TYPE_HANDLER.setParameter(ps, 1, (byte) 100, null); + verify(ps).setByte(1, (byte) 100); + } + + @Override + @Test + public void shouldGetResultFromResultSetByName() throws Exception { + when(rs.getByte("column")).thenReturn((byte) 100); + assertEquals(new Byte((byte) 100), TYPE_HANDLER.getResult(rs, "column")); + + when(rs.getByte("column")).thenReturn((byte) 0); + assertEquals(new Byte((byte) 0), TYPE_HANDLER.getResult(rs, "column")); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByName() throws Exception { + when(rs.getByte("column")).thenReturn((byte) 0); + when(rs.wasNull()).thenReturn(true); + assertNull(TYPE_HANDLER.getResult(rs, "column")); + } + + @Override + @Test + public void shouldGetResultFromResultSetByPosition() throws Exception { + when(rs.getByte(1)).thenReturn((byte) 100); + assertEquals(new Byte((byte) 100), TYPE_HANDLER.getResult(rs, 1)); + + when(rs.getByte(1)).thenReturn((byte) 0); + assertEquals(new Byte((byte) 0), TYPE_HANDLER.getResult(rs, 1)); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByPosition() throws Exception { + when(rs.getByte(1)).thenReturn((byte) 0); + when(rs.wasNull()).thenReturn(true); + assertNull(TYPE_HANDLER.getResult(rs, 1)); + } + + @Override + @Test + public void shouldGetResultFromCallableStatement() throws Exception { + when(cs.getByte(1)).thenReturn((byte) 100); + assertEquals(new Byte((byte) 100), TYPE_HANDLER.getResult(cs, 1)); + + when(cs.getByte(1)).thenReturn((byte) 0); + assertEquals(new Byte((byte) 0), TYPE_HANDLER.getResult(cs, 1)); + } + + @Override + @Test + public void shouldGetResultNullFromCallableStatement() throws Exception { + when(cs.getByte(1)).thenReturn((byte) 0); + when(cs.wasNull()).thenReturn(true); + assertNull(TYPE_HANDLER.getResult(cs, 1)); + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/CharacterTypeHandlerTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/CharacterTypeHandlerTest.java new file mode 100644 index 0000000..97899d7 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/CharacterTypeHandlerTest.java @@ -0,0 +1,91 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.type; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import org.junit.Test; + +public class CharacterTypeHandlerTest extends BaseTypeHandlerTest { + + private static final TypeHandler TYPE_HANDLER = new CharacterTypeHandler(); + + @Override + @Test + public void shouldSetParameter() throws Exception { + TYPE_HANDLER.setParameter(ps, 1, 'a', null); + verify(ps).setString(1, "a"); + } + + @Test + public void shouldSetNullParameter() throws Exception { + TYPE_HANDLER.setParameter(ps, 1, null, JdbcType.VARCHAR); + verify(ps).setNull(1, JdbcType.VARCHAR.TYPE_CODE); + } + + @Override + @Test + public void shouldGetResultFromResultSetByName() throws Exception { + when(rs.getString("column")).thenReturn("a"); + assertEquals(new Character('a'), TYPE_HANDLER.getResult(rs, "column")); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByName() throws Exception { + when(rs.getString("column")).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(rs, "column")); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultFromResultSetByPosition() throws Exception { + when(rs.getString(1)).thenReturn("a"); + assertEquals(new Character('a'), TYPE_HANDLER.getResult(rs, 1)); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByPosition() throws Exception { + when(rs.getString(1)).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(rs, 1)); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultFromCallableStatement() throws Exception { + when(cs.getString(1)).thenReturn("a"); + assertEquals(new Character('a'), TYPE_HANDLER.getResult(cs, 1)); + verify(cs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultNullFromCallableStatement() throws Exception { + when(cs.getString(1)).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(cs, 1)); + verify(cs, never()).wasNull(); + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/ClobReaderTypeHandlerTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/ClobReaderTypeHandlerTest.java new file mode 100644 index 0000000..561c016 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/ClobReaderTypeHandlerTest.java @@ -0,0 +1,175 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.type; + +import org.apache.ibatis.BaseDataTest; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.mapping.Environment; +import org.apache.ibatis.session.Configuration; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.apache.ibatis.transaction.TransactionFactory; +import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; +import org.junit.BeforeClass; +import org.junit.Test; +import org.mockito.Mock; + +import javax.sql.DataSource; +import java.io.*; +import java.sql.Clob; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +/** + * Tests for {@link ClobReaderTypeHandler}. + * + * @since 3.4.0 + * @author Kazuki Shimizu + */ +public class ClobReaderTypeHandlerTest extends BaseTypeHandlerTest { + + private static final TypeHandler TYPE_HANDLER = new ClobReaderTypeHandler(); + + private static SqlSessionFactory sqlSessionFactory; + + @Mock + protected Clob clob; + + @BeforeClass + public static void setupSqlSessionFactory() throws Exception { + DataSource dataSource = BaseDataTest.createUnpooledDataSource("org/apache/ibatis/type/jdbc.properties"); + TransactionFactory transactionFactory = new JdbcTransactionFactory(); + Environment environment = new Environment("Production", transactionFactory, dataSource); + Configuration configuration = new Configuration(environment); + configuration.addMapper(Mapper.class); + sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration); + + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), + "org/apache/ibatis/type/ClobReaderTypeHandlerTest.sql"); + } + + @Override + @Test + public void shouldSetParameter() throws Exception { + Reader reader = new StringReader("Hello"); + TYPE_HANDLER.setParameter(ps, 1, reader, null); + verify(ps).setClob(1, reader); + } + + @Override + @Test + public void shouldGetResultFromResultSetByName() throws Exception { + Reader reader = new StringReader("Hello"); + when(rs.getClob("column")).thenReturn(clob); + when(clob.getCharacterStream()).thenReturn(reader); + assertEquals(reader, TYPE_HANDLER.getResult(rs, "column")); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByName() throws Exception { + when(rs.getClob("column")).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(rs, "column")); + } + + @Override + @Test + public void shouldGetResultFromResultSetByPosition() throws Exception { + when(rs.getClob(1)).thenReturn(clob); + assertNull(TYPE_HANDLER.getResult(rs, 1)); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByPosition() throws Exception { + when(rs.getClob(1)).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(rs, 1)); + } + + @Override + @Test + public void shouldGetResultFromCallableStatement() throws Exception { + Reader reader = new StringReader("Hello"); + when(cs.getClob(1)).thenReturn(clob); + when(clob.getCharacterStream()).thenReturn(reader); + assertEquals(reader, TYPE_HANDLER.getResult(cs, 1)); + } + + @Override + @Test + public void shouldGetResultNullFromCallableStatement() throws Exception { + when(cs.getClob(1)).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(cs, 1)); + } + + + @Test + public void integrationTest() throws IOException { + try (SqlSession session = sqlSessionFactory.openSession()) { + Mapper mapper = session.getMapper(Mapper.class); + // insert (Reader -> Clob) + { + ClobContent clobContent = new ClobContent(); + clobContent.setId(1); + clobContent.setContent(new StringReader("Hello")); + mapper.insert(clobContent); + session.commit(); + } + // select (Clob -> Reader) + { + ClobContent clobContent = mapper.findOne(1); + assertThat(new BufferedReader(clobContent.getContent()).readLine()).isEqualTo("Hello"); + } + } + + } + + interface Mapper { + @Select("SELECT ID, CONTENT FROM TEST_CLOB WHERE ID = #{id}") + ClobContent findOne(int id); + + @Insert("INSERT INTO TEST_CLOB (ID, CONTENT) VALUES(#{id}, #{content})") + void insert(ClobContent blobContent); + } + + static class ClobContent { + private int id; + private Reader content; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public Reader getContent() { + return content; + } + + public void setContent(Reader content) { + this.content = content; + } + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/ClobReaderTypeHandlerTest.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/ClobReaderTypeHandlerTest.sql new file mode 100644 index 0000000..25d7484 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/ClobReaderTypeHandlerTest.sql @@ -0,0 +1,22 @@ +-- +-- Copyright 2009-2016 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +DROP TABLE test_clob; + +CREATE TABLE test_clob ( + id INT PRIMARY KEY, + content CLOB +); diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/ClobTypeHandlerTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/ClobTypeHandlerTest.java new file mode 100644 index 0000000..fec14f4 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/ClobTypeHandlerTest.java @@ -0,0 +1,92 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.type; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.io.Reader; +import java.sql.Clob; + +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.Mockito; + +public class ClobTypeHandlerTest extends BaseTypeHandlerTest { + + private static final TypeHandler TYPE_HANDLER = new ClobTypeHandler(); + + @Mock + protected Clob clob; + + @Override + @Test + public void shouldSetParameter() throws Exception { + TYPE_HANDLER.setParameter(ps, 1, "Hello", null); + verify(ps).setCharacterStream(Mockito.eq(1), Mockito.any(Reader.class), Mockito.eq(5)); + } + + @Override + @Test + public void shouldGetResultFromResultSetByName() throws Exception { + when(rs.getClob("column")).thenReturn(clob); + when(clob.length()).thenReturn(3l); + when(clob.getSubString(1, 3)).thenReturn("Hello"); + assertEquals("Hello", TYPE_HANDLER.getResult(rs, "column")); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByName() throws Exception { + when(rs.getClob("column")).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(rs, "column")); + } + + @Override + @Test + public void shouldGetResultFromResultSetByPosition() throws Exception { + when(rs.getClob(1)).thenReturn(clob); + when(clob.length()).thenReturn(3l); + when(clob.getSubString(1, 3)).thenReturn("Hello"); + assertEquals("Hello", TYPE_HANDLER.getResult(rs, 1)); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByPosition() throws Exception { + when(rs.getClob(1)).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(rs, 1)); + } + + @Override + @Test + public void shouldGetResultFromCallableStatement() throws Exception { + when(cs.getClob(1)).thenReturn(clob); + when(clob.length()).thenReturn(3l); + when(clob.getSubString(1, 3)).thenReturn("Hello"); + assertEquals("Hello", TYPE_HANDLER.getResult(cs, 1)); + } + + @Override + @Test + public void shouldGetResultNullFromCallableStatement() throws Exception { + when(cs.getClob(1)).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(cs, 1)); + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/DateOnlyTypeHandlerTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/DateOnlyTypeHandlerTest.java new file mode 100644 index 0000000..2c4c3d1 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/DateOnlyTypeHandlerTest.java @@ -0,0 +1,89 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.type; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.util.Date; + +import org.junit.Test; + +public class DateOnlyTypeHandlerTest extends BaseTypeHandlerTest { + + private static final TypeHandler TYPE_HANDLER = new DateOnlyTypeHandler(); + private static final Date DATE = new Date(); + private static final java.sql.Date SQL_DATE = new java.sql.Date(DATE.getTime()); + + @Override + @Test + public void shouldSetParameter() throws Exception { + TYPE_HANDLER.setParameter(ps, 1, DATE, null); + verify(ps).setDate(1, new java.sql.Date(DATE.getTime())); + } + + @Override + @Test + public void shouldGetResultFromResultSetByName() throws Exception { + when(rs.getDate("column")).thenReturn(SQL_DATE); + assertEquals(DATE, TYPE_HANDLER.getResult(rs, "column")); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByName() throws Exception { + when(rs.getDate("column")).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(rs, "column")); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultFromResultSetByPosition() throws Exception { + when(rs.getDate(1)).thenReturn(SQL_DATE); + assertEquals(DATE, TYPE_HANDLER.getResult(rs, 1)); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByPosition() throws Exception { + when(rs.getDate(1)).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(rs, 1)); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultFromCallableStatement() throws Exception { + when(cs.getDate(1)).thenReturn(SQL_DATE); + assertEquals(DATE, TYPE_HANDLER.getResult(cs, 1)); + verify(cs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultNullFromCallableStatement() throws Exception { + when(cs.getDate(1)).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(cs, 1)); + verify(cs, never()).wasNull(); + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/DateTypeHandlerTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/DateTypeHandlerTest.java new file mode 100644 index 0000000..5f065e7 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/DateTypeHandlerTest.java @@ -0,0 +1,90 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.type; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.sql.Timestamp; +import java.util.Date; + +import org.junit.Test; + +public class DateTypeHandlerTest extends BaseTypeHandlerTest { + + private static final TypeHandler TYPE_HANDLER = new DateTypeHandler(); + private static final Date DATE = new Date(); + private static final Timestamp TIMESTAMP = new Timestamp(DATE.getTime()); + + @Override + @Test + public void shouldSetParameter() throws Exception { + TYPE_HANDLER.setParameter(ps, 1, DATE, null); + verify(ps).setTimestamp(1, new java.sql.Timestamp(DATE.getTime())); + } + + @Override + @Test + public void shouldGetResultFromResultSetByName() throws Exception { + when(rs.getTimestamp("column")).thenReturn(TIMESTAMP); + assertEquals(DATE, TYPE_HANDLER.getResult(rs, "column")); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByName() throws Exception { + when(rs.getTimestamp("column")).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(rs, "column")); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultFromResultSetByPosition() throws Exception { + when(rs.getTimestamp(1)).thenReturn(TIMESTAMP); + assertEquals(DATE, TYPE_HANDLER.getResult(rs, 1)); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByPosition() throws Exception { + when(rs.getTimestamp(1)).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(rs, 1)); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultFromCallableStatement() throws Exception { + when(cs.getTimestamp(1)).thenReturn(TIMESTAMP); + assertEquals(DATE, TYPE_HANDLER.getResult(cs, 1)); + verify(cs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultNullFromCallableStatement() throws Exception { + when(cs.getTimestamp(1)).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(cs, 1)); + verify(cs, never()).wasNull(); + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/DoubleTypeHandlerTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/DoubleTypeHandlerTest.java new file mode 100644 index 0000000..7205e40 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/DoubleTypeHandlerTest.java @@ -0,0 +1,90 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.type; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import org.junit.Test; + +public class DoubleTypeHandlerTest extends BaseTypeHandlerTest { + + private static final TypeHandler TYPE_HANDLER = new DoubleTypeHandler(); + + @Override + @Test + public void shouldSetParameter() throws Exception { + TYPE_HANDLER.setParameter(ps, 1, 100d, null); + verify(ps).setDouble(1, 100d); + } + + @Override + @Test + public void shouldGetResultFromResultSetByName() throws Exception { + when(rs.getDouble("column")).thenReturn(100d); + assertEquals(new Double(100d), TYPE_HANDLER.getResult(rs, "column")); + + when(rs.getDouble("column")).thenReturn(0d); + assertEquals(new Double(0d), TYPE_HANDLER.getResult(rs, "column")); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByName() throws Exception { + when(rs.getDouble("column")).thenReturn(0d); + when(rs.wasNull()).thenReturn(true); + assertNull(TYPE_HANDLER.getResult(rs, "column")); + } + + @Override + @Test + public void shouldGetResultFromResultSetByPosition() throws Exception { + when(rs.getDouble(1)).thenReturn(100d); + assertEquals(new Double(100d), TYPE_HANDLER.getResult(rs, 1)); + + when(rs.getDouble(1)).thenReturn(0d); + assertEquals(new Double(0d), TYPE_HANDLER.getResult(rs, 1)); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByPosition() throws Exception { + when(rs.getDouble(1)).thenReturn(0d); + when(rs.wasNull()).thenReturn(true); + assertNull(TYPE_HANDLER.getResult(rs, 1)); + } + + @Override + @Test + public void shouldGetResultFromCallableStatement() throws Exception { + when(cs.getDouble(1)).thenReturn(100d); + assertEquals(new Double(100d), TYPE_HANDLER.getResult(cs, 1)); + + when(cs.getDouble(1)).thenReturn(0d); + assertEquals(new Double(0d), TYPE_HANDLER.getResult(cs, 1)); + } + + @Override + @Test + public void shouldGetResultNullFromCallableStatement() throws Exception { + when(cs.getDouble(1)).thenReturn(0d); + when(cs.wasNull()).thenReturn(true); + assertNull(TYPE_HANDLER.getResult(cs, 1)); + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/EnumOrdinalTypeHandlerTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/EnumOrdinalTypeHandlerTest.java new file mode 100644 index 0000000..412f7de --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/EnumOrdinalTypeHandlerTest.java @@ -0,0 +1,94 @@ +/** + * Copyright 2009-2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.type; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import org.junit.Test; + +public class EnumOrdinalTypeHandlerTest extends BaseTypeHandlerTest { + + enum MyEnum { + ONE, TWO + } + + private static final TypeHandler TYPE_HANDLER = new EnumOrdinalTypeHandler(MyEnum.class); + + @Override + @Test + public void shouldSetParameter() throws Exception { + TYPE_HANDLER.setParameter(ps, 1, MyEnum.ONE, null); + verify(ps).setInt(1, 0); + } + + @Test + public void shouldSetNullParameter() throws Exception { + TYPE_HANDLER.setParameter(ps, 1, null, JdbcType.VARCHAR); + verify(ps).setNull(1, JdbcType.VARCHAR.TYPE_CODE); + } + + @Override + @Test + public void shouldGetResultFromResultSetByName() throws Exception { + when(rs.getInt("column")).thenReturn(0); + when(rs.wasNull()).thenReturn(false); + assertEquals(MyEnum.ONE, TYPE_HANDLER.getResult(rs, "column")); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByName() throws Exception { + when(rs.getInt("column")).thenReturn(0); + when(rs.wasNull()).thenReturn(true); + assertNull(TYPE_HANDLER.getResult(rs, "column")); + } + + @Override + @Test + public void shouldGetResultFromResultSetByPosition() throws Exception { + when(rs.getInt(1)).thenReturn(0); + when(rs.wasNull()).thenReturn(false); + assertEquals(MyEnum.ONE, TYPE_HANDLER.getResult(rs, 1)); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByPosition() throws Exception { + when(rs.getInt(1)).thenReturn(0); + when(rs.wasNull()).thenReturn(true); + assertNull(TYPE_HANDLER.getResult(rs, 1)); + } + + @Override + @Test + public void shouldGetResultFromCallableStatement() throws Exception { + when(cs.getInt(1)).thenReturn(0); + when(cs.wasNull()).thenReturn(false); + assertEquals(MyEnum.ONE, TYPE_HANDLER.getResult(cs, 1)); + } + + @Override + @Test + public void shouldGetResultNullFromCallableStatement() throws Exception { + when(cs.getInt(1)).thenReturn(0); + when(cs.wasNull()).thenReturn(true); + assertNull(TYPE_HANDLER.getResult(cs, 1)); + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/EnumTypeHandlerTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/EnumTypeHandlerTest.java new file mode 100644 index 0000000..a312e85 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/EnumTypeHandlerTest.java @@ -0,0 +1,95 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.type; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import org.junit.Test; + +public class EnumTypeHandlerTest extends BaseTypeHandlerTest { + + enum MyEnum { + ONE, TWO + } + + private static final TypeHandler TYPE_HANDLER = new EnumTypeHandler(MyEnum.class); + + @Override + @Test + public void shouldSetParameter() throws Exception { + TYPE_HANDLER.setParameter(ps, 1, MyEnum.ONE, null); + verify(ps).setString(1, "ONE"); + } + + @Test + public void shouldSetNullParameter() throws Exception { + TYPE_HANDLER.setParameter(ps, 1, null, JdbcType.VARCHAR); + verify(ps).setNull(1, JdbcType.VARCHAR.TYPE_CODE); + } + + @Override + @Test + public void shouldGetResultFromResultSetByName() throws Exception { + when(rs.getString("column")).thenReturn("ONE"); + assertEquals(MyEnum.ONE, TYPE_HANDLER.getResult(rs, "column")); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByName() throws Exception { + when(rs.getString("column")).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(rs, "column")); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultFromResultSetByPosition() throws Exception { + when(rs.getString(1)).thenReturn("ONE"); + assertEquals(MyEnum.ONE, TYPE_HANDLER.getResult(rs, 1)); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByPosition() throws Exception { + when(rs.getString(1)).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(rs, 1)); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultFromCallableStatement() throws Exception { + when(cs.getString(1)).thenReturn("ONE"); + assertEquals(MyEnum.ONE, TYPE_HANDLER.getResult(cs, 1)); + verify(cs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultNullFromCallableStatement() throws Exception { + when(cs.getString(1)).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(cs, 1)); + verify(cs, never()).wasNull(); + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/FloatTypeHandlerTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/FloatTypeHandlerTest.java new file mode 100644 index 0000000..0a6fbd0 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/FloatTypeHandlerTest.java @@ -0,0 +1,90 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.type; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import org.junit.Test; + +public class FloatTypeHandlerTest extends BaseTypeHandlerTest { + + private static final TypeHandler TYPE_HANDLER = new FloatTypeHandler(); + + @Override + @Test + public void shouldSetParameter() throws Exception { + TYPE_HANDLER.setParameter(ps, 1, 100f, null); + verify(ps).setFloat(1, 100f); + } + + @Override + @Test + public void shouldGetResultFromResultSetByName() throws Exception { + when(rs.getFloat("column")).thenReturn(100f); + assertEquals(new Float(100f), TYPE_HANDLER.getResult(rs, "column")); + + when(rs.getFloat("column")).thenReturn(0f); + assertEquals(new Float(0f), TYPE_HANDLER.getResult(rs, "column")); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByName() throws Exception { + when(rs.getFloat("column")).thenReturn(0f); + when(rs.wasNull()).thenReturn(true); + assertNull(TYPE_HANDLER.getResult(rs, "column")); + } + + @Override + @Test + public void shouldGetResultFromResultSetByPosition() throws Exception { + when(rs.getFloat(1)).thenReturn(100f); + assertEquals(new Float(100f), TYPE_HANDLER.getResult(rs, 1)); + + when(rs.getFloat(1)).thenReturn(0f); + assertEquals(new Float(0f), TYPE_HANDLER.getResult(rs, 1)); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByPosition() throws Exception { + when(rs.getFloat(1)).thenReturn(0f); + when(rs.wasNull()).thenReturn(true); + assertNull(TYPE_HANDLER.getResult(rs, 1)); + } + + @Override + @Test + public void shouldGetResultFromCallableStatement() throws Exception { + when(cs.getFloat(1)).thenReturn(100f); + assertEquals(new Float(100f), TYPE_HANDLER.getResult(cs, 1)); + + when(cs.getFloat(1)).thenReturn(0f); + assertEquals(new Float(0f), TYPE_HANDLER.getResult(cs, 1)); + } + + @Override + @Test + public void shouldGetResultNullFromCallableStatement() throws Exception { + when(cs.getFloat(1)).thenReturn(0f); + when(cs.wasNull()).thenReturn(true); + assertNull(TYPE_HANDLER.getResult(cs, 1)); + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/GenericTypeSupportedInHierarchiesTestCase.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/GenericTypeSupportedInHierarchiesTestCase.java new file mode 100644 index 0000000..106b04b --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/GenericTypeSupportedInHierarchiesTestCase.java @@ -0,0 +1,48 @@ +/** + * Copyright 2009-2015 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.type; + +import org.junit.Test; + +import java.sql.PreparedStatement; +import java.sql.SQLException; + +import static org.junit.Assert.assertEquals; + +public class GenericTypeSupportedInHierarchiesTestCase { + + @Test + public void detectsTheGenericTypeTraversingTheHierarchy() { + assertEquals(String.class, new CustomStringTypeHandler().getRawType()); + } + + /** + * + */ + public static final class CustomStringTypeHandler extends StringTypeHandler { + + /** + * Defined as reported in #581 + */ + @Override + public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException { + // do something + super.setNonNullParameter(ps, i, parameter, jdbcType); + } + + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/InstantTypeHandlerTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/InstantTypeHandlerTest.java new file mode 100644 index 0000000..c8661f7 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/InstantTypeHandlerTest.java @@ -0,0 +1,86 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.type; + +import static org.junit.Assert.*; +import static org.mockito.Mockito.*; + +import java.sql.Timestamp; +import java.time.Instant; + +import org.junit.Test; + +public class InstantTypeHandlerTest extends BaseTypeHandlerTest { + + private static final TypeHandler TYPE_HANDLER = new InstantTypeHandler(); + private static final Instant INSTANT = Instant.now(); + private static final Timestamp TIMESTAMP = Timestamp.from(INSTANT); + + @Override + @Test + public void shouldSetParameter() throws Exception { + TYPE_HANDLER.setParameter(ps, 1, INSTANT, null); + verify(ps).setTimestamp(1, TIMESTAMP); + } + + @Override + @Test + public void shouldGetResultFromResultSetByName() throws Exception { + when(rs.getTimestamp("column")).thenReturn(TIMESTAMP); + assertEquals(INSTANT, TYPE_HANDLER.getResult(rs, "column")); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByName() throws Exception { + when(rs.getTimestamp("column")).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(rs, "column")); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultFromResultSetByPosition() throws Exception { + when(rs.getTimestamp(1)).thenReturn(TIMESTAMP); + assertEquals(INSTANT, TYPE_HANDLER.getResult(rs, 1)); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByPosition() throws Exception { + when(rs.getTimestamp(1)).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(rs, 1)); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultFromCallableStatement() throws Exception { + when(cs.getTimestamp(1)).thenReturn(TIMESTAMP); + assertEquals(INSTANT, TYPE_HANDLER.getResult(cs, 1)); + verify(cs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultNullFromCallableStatement() throws Exception { + when(cs.getTimestamp(1)).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(cs, 1)); + verify(cs, never()).wasNull(); + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/IntegerTypeHandlerTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/IntegerTypeHandlerTest.java new file mode 100644 index 0000000..1e88cc0 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/IntegerTypeHandlerTest.java @@ -0,0 +1,90 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.type; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import org.junit.Test; + +public class IntegerTypeHandlerTest extends BaseTypeHandlerTest { + + private static final TypeHandler TYPE_HANDLER = new IntegerTypeHandler(); + + @Override + @Test + public void shouldSetParameter() throws Exception { + TYPE_HANDLER.setParameter(ps, 1, 100, null); + verify(ps).setInt(1, 100); + } + + @Override + @Test + public void shouldGetResultFromResultSetByName() throws Exception { + when(rs.getInt("column")).thenReturn(100); + assertEquals(new Integer(100), TYPE_HANDLER.getResult(rs, "column")); + + when(rs.getInt("column")).thenReturn(0); + assertEquals(new Integer(0), TYPE_HANDLER.getResult(rs, "column")); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByName() throws Exception { + when(rs.getInt("column")).thenReturn(0); + when(rs.wasNull()).thenReturn(true); + assertNull(TYPE_HANDLER.getResult(rs, "column")); + } + + @Override + @Test + public void shouldGetResultFromResultSetByPosition() throws Exception { + when(rs.getInt(1)).thenReturn(100); + assertEquals(new Integer(100), TYPE_HANDLER.getResult(rs, 1)); + + when(rs.getInt(1)).thenReturn(0); + assertEquals(new Integer(0), TYPE_HANDLER.getResult(rs, 1)); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByPosition() throws Exception { + when(rs.getInt(1)).thenReturn(0); + when(rs.wasNull()).thenReturn(true); + assertNull(TYPE_HANDLER.getResult(rs, 1)); + } + + @Override + @Test + public void shouldGetResultFromCallableStatement() throws Exception { + when(cs.getInt(1)).thenReturn(100); + assertEquals(new Integer(100), TYPE_HANDLER.getResult(cs, 1)); + + when(cs.getInt(1)).thenReturn(0); + assertEquals(new Integer(0), TYPE_HANDLER.getResult(cs, 1)); + } + + @Override + @Test + public void shouldGetResultNullFromCallableStatement() throws Exception { + when(cs.getInt(1)).thenReturn(0); + when(cs.wasNull()).thenReturn(true); + assertNull(TYPE_HANDLER.getResult(cs, 1)); + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/JapaneseDateTypeHandlerTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/JapaneseDateTypeHandlerTest.java new file mode 100644 index 0000000..65e0f07 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/JapaneseDateTypeHandlerTest.java @@ -0,0 +1,88 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.type; + +import static org.junit.Assert.*; +import static org.mockito.Mockito.*; + +import java.sql.Date; +import java.time.LocalDate; +import java.time.chrono.JapaneseDate; + +import org.junit.Test; + +public class JapaneseDateTypeHandlerTest extends BaseTypeHandlerTest { + + private static final TypeHandler TYPE_HANDLER = new JapaneseDateTypeHandler(); + private static final JapaneseDate JAPANESE_DATE = JapaneseDate.now(); + private static final Date DATE = Date.valueOf(LocalDate.ofEpochDay(JAPANESE_DATE.toEpochDay())); + + @Override + @Test + public void shouldSetParameter() throws Exception { + TYPE_HANDLER.setParameter(ps, 1, JAPANESE_DATE, null); + verify(ps).setDate(1, DATE); + } + + @Override + @Test + public void shouldGetResultFromResultSetByName() throws Exception { + when(rs.getDate("column")).thenReturn(DATE); + assertEquals(JAPANESE_DATE, TYPE_HANDLER.getResult(rs, "column")); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByName() throws Exception { + when(rs.getDate("column")).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(rs, "column")); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultFromResultSetByPosition() throws Exception { + when(rs.getDate(1)).thenReturn(DATE); + assertEquals(JAPANESE_DATE, TYPE_HANDLER.getResult(rs, 1)); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByPosition() throws Exception { + when(rs.getDate(1)).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(rs, 1)); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultFromCallableStatement() throws Exception { + when(cs.getDate(1)).thenReturn(DATE); + assertEquals(JAPANESE_DATE, TYPE_HANDLER.getResult(cs, 1)); + verify(cs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultNullFromCallableStatement() throws Exception { + when(cs.getDate(1)).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(cs, 1)); + verify(cs, never()).wasNull(); + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/JdbcTypeTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/JdbcTypeTest.java new file mode 100644 index 0000000..939afa0 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/JdbcTypeTest.java @@ -0,0 +1,48 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.type; + +import static org.junit.Assert.assertEquals; + +import java.sql.Types; + +import org.junit.Test; + +public class JdbcTypeTest { + private static final String[] requiredStandardTypeNames = { + "ARRAY", "BIGINT", "BINARY", "BIT", "BLOB", "BOOLEAN", "CHAR", "CLOB", + "DATALINK", "DATE", "DECIMAL", "DISTINCT", "DOUBLE", "FLOAT", "INTEGER", + "JAVA_OBJECT", "LONGNVARCHAR", "LONGVARBINARY", "LONGVARCHAR", "NCHAR", + "NCLOB", "NULL", "NUMERIC","NVARCHAR", "OTHER", "REAL", "REF", "ROWID", + "SMALLINT", "SQLXML", "STRUCT", "TIME", "TIMESTAMP", "TINYINT", + "VARBINARY", "VARCHAR" + }; + + @Test + public void shouldHaveRequiredStandardConstants() throws Exception { + for (String typeName : requiredStandardTypeNames) { + int typeCode = Types.class.getField(typeName).getInt(null); + JdbcType jdbcType = JdbcType.valueOf(typeName); + assertEquals(typeCode, jdbcType.TYPE_CODE); + } + } + + @Test + public void shouldHaveDateTimeOffsetConstant() throws Exception { + JdbcType jdbcType = JdbcType.valueOf("DATETIMEOFFSET"); + assertEquals(-155, jdbcType.TYPE_CODE); + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/Jsr310TypeHandlerRegistryTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/Jsr310TypeHandlerRegistryTest.java new file mode 100644 index 0000000..06768e3 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/Jsr310TypeHandlerRegistryTest.java @@ -0,0 +1,72 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.type; + +import static org.assertj.core.api.Assertions.*; + +import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.Month; +import java.time.OffsetDateTime; +import java.time.OffsetTime; +import java.time.Year; +import java.time.YearMonth; +import java.time.ZonedDateTime; +import java.time.chrono.JapaneseDate; + +import org.junit.Before; +import org.junit.Test; + +/** + * @author Kazuki Shimizu + */ +public class Jsr310TypeHandlerRegistryTest { + + private TypeHandlerRegistry typeHandlerRegistry; + + @Before + public void setup() { + typeHandlerRegistry = new TypeHandlerRegistry(); + } + + @Test + public void shouldRegisterJsr310TypeHandlers() throws ClassNotFoundException { + assertThat(typeHandlerRegistry.getTypeHandler(Instant.class)) + .isInstanceOf(InstantTypeHandler.class); + assertThat(typeHandlerRegistry.getTypeHandler(LocalDateTime.class)) + .isInstanceOf(LocalDateTimeTypeHandler.class); + assertThat(typeHandlerRegistry.getTypeHandler(LocalDate.class)) + .isInstanceOf(LocalDateTypeHandler.class); + assertThat(typeHandlerRegistry.getTypeHandler(LocalTime.class)) + .isInstanceOf(LocalTimeTypeHandler.class); + assertThat(typeHandlerRegistry.getTypeHandler(OffsetDateTime.class)) + .isInstanceOf(OffsetDateTimeTypeHandler.class); + assertThat(typeHandlerRegistry.getTypeHandler(OffsetTime.class)) + .isInstanceOf(OffsetTimeTypeHandler.class); + assertThat(typeHandlerRegistry.getTypeHandler(ZonedDateTime.class)) + .isInstanceOf(ZonedDateTimeTypeHandler.class); + assertThat(typeHandlerRegistry.getTypeHandler(Month.class)) + .isInstanceOf(MonthTypeHandler.class); + assertThat(typeHandlerRegistry.getTypeHandler(Year.class)) + .isInstanceOf(YearTypeHandler.class); + assertThat(typeHandlerRegistry.getTypeHandler(YearMonth.class)) + .isInstanceOf(YearMonthTypeHandler.class); + assertThat(typeHandlerRegistry.getTypeHandler(JapaneseDate.class)) + .isInstanceOf(JapaneseDateTypeHandler.class); + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/LocalDateTimeTypeHandlerTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/LocalDateTimeTypeHandlerTest.java new file mode 100644 index 0000000..3db5b4b --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/LocalDateTimeTypeHandlerTest.java @@ -0,0 +1,86 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.type; + +import static org.junit.Assert.*; +import static org.mockito.Mockito.*; + +import java.sql.Timestamp; +import java.time.LocalDateTime; + +import org.junit.Test; + +public class LocalDateTimeTypeHandlerTest extends BaseTypeHandlerTest { + + private static final TypeHandler TYPE_HANDLER = new LocalDateTimeTypeHandler(); + private static final LocalDateTime LOCAL_DATE_TIME = LocalDateTime.now(); + private static final Timestamp TIMESTAMP = Timestamp.valueOf(LOCAL_DATE_TIME); + + @Override + @Test + public void shouldSetParameter() throws Exception { + TYPE_HANDLER.setParameter(ps, 1, LOCAL_DATE_TIME, null); + verify(ps).setTimestamp(1, TIMESTAMP); + } + + @Override + @Test + public void shouldGetResultFromResultSetByName() throws Exception { + when(rs.getTimestamp("column")).thenReturn(TIMESTAMP); + assertEquals(LOCAL_DATE_TIME, TYPE_HANDLER.getResult(rs, "column")); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByName() throws Exception { + when(rs.getTimestamp("column")).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(rs, "column")); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultFromResultSetByPosition() throws Exception { + when(rs.getTimestamp(1)).thenReturn(TIMESTAMP); + assertEquals(LOCAL_DATE_TIME, TYPE_HANDLER.getResult(rs, 1)); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByPosition() throws Exception { + when(rs.getTimestamp(1)).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(rs, 1)); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultFromCallableStatement() throws Exception { + when(cs.getTimestamp(1)).thenReturn(TIMESTAMP); + assertEquals(LOCAL_DATE_TIME, TYPE_HANDLER.getResult(cs, 1)); + verify(cs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultNullFromCallableStatement() throws Exception { + when(cs.getTimestamp(1)).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(cs, 1)); + verify(cs, never()).wasNull(); + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/LocalDateTypeHandlerTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/LocalDateTypeHandlerTest.java new file mode 100644 index 0000000..30440a8 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/LocalDateTypeHandlerTest.java @@ -0,0 +1,86 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.type; + +import static org.junit.Assert.*; +import static org.mockito.Mockito.*; + +import java.sql.Date; +import java.time.LocalDate; + +import org.junit.Test; + +public class LocalDateTypeHandlerTest extends BaseTypeHandlerTest { + + private static final TypeHandler TYPE_HANDLER = new LocalDateTypeHandler(); + private static final LocalDate LOCAL_DATE = LocalDate.now(); + private static final Date DATE = Date.valueOf(LOCAL_DATE); + + @Override + @Test + public void shouldSetParameter() throws Exception { + TYPE_HANDLER.setParameter(ps, 1, LOCAL_DATE, null); + verify(ps).setDate(1, DATE); + } + + @Override + @Test + public void shouldGetResultFromResultSetByName() throws Exception { + when(rs.getDate("column")).thenReturn(DATE); + assertEquals(LOCAL_DATE, TYPE_HANDLER.getResult(rs, "column")); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByName() throws Exception { + when(rs.getDate("column")).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(rs, "column")); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultFromResultSetByPosition() throws Exception { + when(rs.getDate(1)).thenReturn(DATE); + assertEquals(LOCAL_DATE, TYPE_HANDLER.getResult(rs, 1)); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByPosition() throws Exception { + when(rs.getDate(1)).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(rs, 1)); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultFromCallableStatement() throws Exception { + when(cs.getDate(1)).thenReturn(DATE); + assertEquals(LOCAL_DATE, TYPE_HANDLER.getResult(cs, 1)); + verify(cs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultNullFromCallableStatement() throws Exception { + when(cs.getDate(1)).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(cs, 1)); + verify(cs, never()).wasNull(); + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/LocalTimeTypeHandlerTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/LocalTimeTypeHandlerTest.java new file mode 100644 index 0000000..96845bc --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/LocalTimeTypeHandlerTest.java @@ -0,0 +1,87 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.type; + +import static org.junit.Assert.*; +import static org.mockito.Mockito.*; + +import java.sql.Time; +import java.time.LocalTime; + +import org.junit.Test; + +public class LocalTimeTypeHandlerTest extends BaseTypeHandlerTest { + + private static final TypeHandler TYPE_HANDLER = new LocalTimeTypeHandler(); + // java.sql.Time doesn't contain millis, so set nano to 0 + private static final LocalTime LOCAL_TIME = LocalTime.now().withNano(0); + private static final Time TIME = Time.valueOf(LOCAL_TIME); + + @Override + @Test + public void shouldSetParameter() throws Exception { + TYPE_HANDLER.setParameter(ps, 1, LOCAL_TIME, null); + verify(ps).setTime(1, TIME); + } + + @Override + @Test + public void shouldGetResultFromResultSetByName() throws Exception { + when(rs.getTime("column")).thenReturn(TIME); + assertEquals(LOCAL_TIME, TYPE_HANDLER.getResult(rs, "column")); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByName() throws Exception { + when(rs.getTime("column")).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(rs, "column")); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultFromResultSetByPosition() throws Exception { + when(rs.getTime(1)).thenReturn(TIME); + assertEquals(LOCAL_TIME, TYPE_HANDLER.getResult(rs, 1)); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByPosition() throws Exception { + when(rs.getTime(1)).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(rs, 1)); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultFromCallableStatement() throws Exception { + when(cs.getTime(1)).thenReturn(TIME); + assertEquals(LOCAL_TIME, TYPE_HANDLER.getResult(cs, 1)); + verify(cs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultNullFromCallableStatement() throws Exception { + when(cs.getTime(1)).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(cs, 1)); + verify(cs, never()).wasNull(); + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/LongTypeHandlerTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/LongTypeHandlerTest.java new file mode 100644 index 0000000..ea8ea37 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/LongTypeHandlerTest.java @@ -0,0 +1,90 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.type; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import org.junit.Test; + +public class LongTypeHandlerTest extends BaseTypeHandlerTest { + + private static final TypeHandler TYPE_HANDLER = new LongTypeHandler(); + + @Override + @Test + public void shouldSetParameter() throws Exception { + TYPE_HANDLER.setParameter(ps, 1, 100L, null); + verify(ps).setLong(1, 100L); + } + + @Override + @Test + public void shouldGetResultFromResultSetByName() throws Exception { + when(rs.getLong("column")).thenReturn(100L); + assertEquals(new Long(100L), TYPE_HANDLER.getResult(rs, "column")); + + when(rs.getLong("column")).thenReturn(0L); + assertEquals(new Long(0L), TYPE_HANDLER.getResult(rs, "column")); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByName() throws Exception { + when(rs.getLong("column")).thenReturn(0L); + when(rs.wasNull()).thenReturn(true); + assertNull(TYPE_HANDLER.getResult(rs, "column")); + } + + @Override + @Test + public void shouldGetResultFromResultSetByPosition() throws Exception { + when(rs.getLong(1)).thenReturn(100L); + assertEquals(new Long(100L), TYPE_HANDLER.getResult(rs, 1)); + + when(rs.getLong(1)).thenReturn(0L); + assertEquals(new Long(0L), TYPE_HANDLER.getResult(rs, 1)); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByPosition() throws Exception { + when(rs.getLong(1)).thenReturn(0L); + when(rs.wasNull()).thenReturn(true); + assertNull(TYPE_HANDLER.getResult(rs, 1)); + } + + @Override + @Test + public void shouldGetResultFromCallableStatement() throws Exception { + when(cs.getLong(1)).thenReturn(100L); + assertEquals(new Long(100L), TYPE_HANDLER.getResult(cs, 1)); + + when(cs.getLong(1)).thenReturn(0L); + assertEquals(new Long(0L), TYPE_HANDLER.getResult(cs, 1)); + } + + @Override + @Test + public void shouldGetResultNullFromCallableStatement() throws Exception { + when(cs.getLong(1)).thenReturn(0L); + when(cs.wasNull()).thenReturn(true); + assertNull(TYPE_HANDLER.getResult(cs, 1)); + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/MonthTypeHandlerTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/MonthTypeHandlerTest.java new file mode 100644 index 0000000..1ff6750 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/MonthTypeHandlerTest.java @@ -0,0 +1,111 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.type; + +import static org.junit.Assert.*; +import static org.mockito.Mockito.*; + +import java.time.Month; + +import org.apache.ibatis.executor.result.ResultMapException; +import org.junit.Test; + +/** + * + * @author Eduardo Macarron + */ +public class MonthTypeHandlerTest extends BaseTypeHandlerTest { + + private static final TypeHandler TYPE_HANDLER = new MonthTypeHandler(); + private static final Month INSTANT = Month.JANUARY; + + @Override + @Test + public void shouldSetParameter() throws Exception { + TYPE_HANDLER.setParameter(ps, 1, INSTANT, null); + verify(ps).setInt(1, INSTANT.getValue()); + } + + @Override + @Test + public void shouldGetResultFromResultSetByName() throws Exception { + when(rs.getInt("column")).thenReturn(INSTANT.getValue()); + assertEquals(INSTANT, TYPE_HANDLER.getResult(rs, "column")); + + when(rs.getInt("column")).thenReturn(0); + try { + TYPE_HANDLER.getResult(rs, "column"); + fail(); + } catch (ResultMapException e) { + assertEquals("Error attempting to get column 'column' from result set. Cause: java.time.DateTimeException: Invalid value for MonthOfYear: 0", e.getMessage()); + } + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByName() throws Exception { + when(rs.getInt("column")).thenReturn(0); + when(rs.wasNull()).thenReturn(true); + assertNull(TYPE_HANDLER.getResult(rs, "column")); + } + + @Override + @Test + public void shouldGetResultFromResultSetByPosition() throws Exception { + when(rs.getInt(1)).thenReturn(INSTANT.getValue()); + assertEquals(INSTANT, TYPE_HANDLER.getResult(rs, 1)); + + when(rs.getInt(1)).thenReturn(0); + try { + TYPE_HANDLER.getResult(rs, 1); + fail(); + } catch (ResultMapException e) { + assertEquals("Error attempting to get column #1 from result set. Cause: java.time.DateTimeException: Invalid value for MonthOfYear: 0", e.getMessage()); + } + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByPosition() throws Exception { + when(rs.getInt(1)).thenReturn(0); + when(rs.wasNull()).thenReturn(true); + assertNull(TYPE_HANDLER.getResult(rs, 1)); + } + + @Override + @Test + public void shouldGetResultFromCallableStatement() throws Exception { + when(cs.getInt(1)).thenReturn(INSTANT.getValue()); + assertEquals(INSTANT, TYPE_HANDLER.getResult(cs, 1)); + + when(cs.getInt(1)).thenReturn(0); + try { + TYPE_HANDLER.getResult(cs, 1); + fail(); + } catch (ResultMapException e) { + assertEquals("Error attempting to get column #1 from callable statement. Cause: java.time.DateTimeException: Invalid value for MonthOfYear: 0", e.getMessage()); + } + } + + @Override + @Test + public void shouldGetResultNullFromCallableStatement() throws Exception { + when(cs.getInt(1)).thenReturn(0); + when(cs.wasNull()).thenReturn(true); + assertNull(TYPE_HANDLER.getResult(cs, 1)); + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/NClobTypeHandlerTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/NClobTypeHandlerTest.java new file mode 100644 index 0000000..5e28a93 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/NClobTypeHandlerTest.java @@ -0,0 +1,92 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.type; + +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.Mockito; + +import java.io.Reader; +import java.sql.Clob; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +public class NClobTypeHandlerTest extends BaseTypeHandlerTest { + + private static final TypeHandler TYPE_HANDLER = new NClobTypeHandler(); + + @Mock + protected Clob clob; + + @Override + @Test + public void shouldSetParameter() throws Exception { + TYPE_HANDLER.setParameter(ps, 1, "Hello", null); + verify(ps).setCharacterStream(Mockito.eq(1), Mockito.any(Reader.class), Mockito.eq(5)); + } + + @Override + @Test + public void shouldGetResultFromResultSetByName() throws Exception { + when(rs.getClob("column")).thenReturn(clob); + when(clob.length()).thenReturn(3l); + when(clob.getSubString(1, 3)).thenReturn("Hello"); + assertEquals("Hello", TYPE_HANDLER.getResult(rs, "column")); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByName() throws Exception { + when(rs.getClob("column")).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(rs, "column")); + } + + @Override + @Test + public void shouldGetResultFromResultSetByPosition() throws Exception { + when(rs.getClob(1)).thenReturn(clob); + when(clob.length()).thenReturn(3l); + when(clob.getSubString(1, 3)).thenReturn("Hello"); + assertEquals("Hello", TYPE_HANDLER.getResult(rs, 1)); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByPosition() throws Exception { + when(rs.getClob(1)).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(rs, 1)); + } + + @Override + @Test + public void shouldGetResultFromCallableStatement() throws Exception { + when(cs.getClob(1)).thenReturn(clob); + when(clob.length()).thenReturn(3l); + when(clob.getSubString(1, 3)).thenReturn("Hello"); + assertEquals("Hello", TYPE_HANDLER.getResult(cs, 1)); + } + + @Override + @Test + public void shouldGetResultNullFromCallableStatement() throws Exception { + when(cs.getClob(1)).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(cs, 1)); + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/NStringTypeHandlerTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/NStringTypeHandlerTest.java new file mode 100644 index 0000000..04b19ed --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/NStringTypeHandlerTest.java @@ -0,0 +1,75 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.type; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +public class NStringTypeHandlerTest extends BaseTypeHandlerTest { + + private static final TypeHandler TYPE_HANDLER = new NStringTypeHandler(); + + @Override + @Test + public void shouldSetParameter() throws Exception { + TYPE_HANDLER.setParameter(ps, 1, "Hello", null); + verify(ps).setNString(1, "Hello"); + } + + @Override + @Test + public void shouldGetResultFromResultSetByName() throws Exception { + when(rs.getNString("column")).thenReturn("Hello"); + assertEquals("Hello", TYPE_HANDLER.getResult(rs, "column")); + verify(rs, never()).wasNull(); + } + + @Override + public void shouldGetResultNullFromResultSetByName() throws Exception { + // Unnecessary + } + + @Override + @Test + public void shouldGetResultFromResultSetByPosition() throws Exception { + when(rs.getNString(1)).thenReturn("Hello"); + assertEquals("Hello", TYPE_HANDLER.getResult(rs, 1)); + verify(rs, never()).wasNull(); + } + + @Override + public void shouldGetResultNullFromResultSetByPosition() throws Exception { + // Unnecessary + } + + @Override + @Test + public void shouldGetResultFromCallableStatement() throws Exception { + when(cs.getNString(1)).thenReturn("Hello"); + assertEquals("Hello", TYPE_HANDLER.getResult(cs, 1)); + verify(rs, never()).wasNull(); + } + + @Override + public void shouldGetResultNullFromCallableStatement() throws Exception { + // Unnecessary + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/ObjectTypeHandlerTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/ObjectTypeHandlerTest.java new file mode 100644 index 0000000..ceeb346 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/ObjectTypeHandlerTest.java @@ -0,0 +1,81 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.type; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import org.junit.Test; + +import java.sql.Clob; + +public class ObjectTypeHandlerTest extends BaseTypeHandlerTest { + + private static final TypeHandler TYPE_HANDLER = new ObjectTypeHandler(); + + @Override + @Test + public void shouldSetParameter() throws Exception { + TYPE_HANDLER.setParameter(ps, 1, "Hello", null); + verify(ps).setObject(1, "Hello"); + } + + @Override + @Test + public void shouldGetResultFromResultSetByName() throws Exception { + when(rs.getObject("column")).thenReturn("Hello"); + assertEquals("Hello", TYPE_HANDLER.getResult(rs, "column")); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByName() throws Exception { + when(rs.getObject("column")).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(rs, "column")); + } + + @Override + @Test + public void shouldGetResultFromResultSetByPosition() throws Exception { + when(rs.getObject(1)).thenReturn("Hello"); + assertEquals("Hello", TYPE_HANDLER.getResult(rs, 1)); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByPosition() throws Exception { + when(rs.getObject(1)).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(rs, 1)); + } + + @Override + @Test + public void shouldGetResultFromCallableStatement() throws Exception { + when(cs.getObject(1)).thenReturn("Hello"); + assertEquals("Hello", TYPE_HANDLER.getResult(cs, 1)); + } + + @Override + @Test + public void shouldGetResultNullFromCallableStatement() throws Exception { + when(cs.getObject(1)).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(cs, 1)); + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/OffsetDateTimeTypeHandlerTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/OffsetDateTimeTypeHandlerTest.java new file mode 100644 index 0000000..9f22545 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/OffsetDateTimeTypeHandlerTest.java @@ -0,0 +1,86 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.type; + +import static org.junit.Assert.*; +import static org.mockito.Mockito.*; + +import java.sql.Timestamp; +import java.time.OffsetDateTime; + +import org.junit.Test; + +public class OffsetDateTimeTypeHandlerTest extends BaseTypeHandlerTest { + + private static final TypeHandler TYPE_HANDLER = new OffsetDateTimeTypeHandler(); + private static final OffsetDateTime OFFSET_DATE_TIME = OffsetDateTime.now(); + private static final Timestamp TIMESTAMP = Timestamp.from(OFFSET_DATE_TIME.toInstant()); + + @Override + @Test + public void shouldSetParameter() throws Exception { + TYPE_HANDLER.setParameter(ps, 1, OFFSET_DATE_TIME, null); + verify(ps).setTimestamp(1, TIMESTAMP); + } + + @Override + @Test + public void shouldGetResultFromResultSetByName() throws Exception { + when(rs.getTimestamp("column")).thenReturn(TIMESTAMP); + assertEquals(OFFSET_DATE_TIME, TYPE_HANDLER.getResult(rs, "column")); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByName() throws Exception { + when(rs.getTimestamp("column")).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(rs, "column")); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultFromResultSetByPosition() throws Exception { + when(rs.getTimestamp(1)).thenReturn(TIMESTAMP); + assertEquals(OFFSET_DATE_TIME, TYPE_HANDLER.getResult(rs, 1)); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByPosition() throws Exception { + when(rs.getTimestamp(1)).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(rs, 1)); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultFromCallableStatement() throws Exception { + when(cs.getTimestamp(1)).thenReturn(TIMESTAMP); + assertEquals(OFFSET_DATE_TIME, TYPE_HANDLER.getResult(cs, 1)); + verify(cs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultNullFromCallableStatement() throws Exception { + when(cs.getTimestamp(1)).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(cs, 1)); + verify(cs, never()).wasNull(); + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/OffsetTimeTypeHandlerTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/OffsetTimeTypeHandlerTest.java new file mode 100644 index 0000000..e1a4334 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/OffsetTimeTypeHandlerTest.java @@ -0,0 +1,87 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.type; + +import static org.junit.Assert.*; +import static org.mockito.Mockito.*; + +import java.sql.Time; +import java.time.OffsetTime; + +import org.junit.Test; + +public class OffsetTimeTypeHandlerTest extends BaseTypeHandlerTest { + + private static final TypeHandler TYPE_HANDLER = new OffsetTimeTypeHandler(); + // java.sql.Time doesn't contain millis, so set nano to 0 + private static final OffsetTime OFFSET_TIME = OffsetTime.now().withNano(0); + private static final Time TIME = Time.valueOf(OFFSET_TIME.toLocalTime()); + + @Override + @Test + public void shouldSetParameter() throws Exception { + TYPE_HANDLER.setParameter(ps, 1, OFFSET_TIME, null); + verify(ps).setTime(1, TIME); + } + + @Override + @Test + public void shouldGetResultFromResultSetByName() throws Exception { + when(rs.getTime("column")).thenReturn(TIME); + assertEquals(OFFSET_TIME, TYPE_HANDLER.getResult(rs, "column")); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByName() throws Exception { + when(rs.getTime("column")).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(rs, "column")); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultFromResultSetByPosition() throws Exception { + when(rs.getTime(1)).thenReturn(TIME); + assertEquals(OFFSET_TIME, TYPE_HANDLER.getResult(rs, 1)); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByPosition() throws Exception { + when(rs.getTime(1)).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(rs, 1)); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultFromCallableStatement() throws Exception { + when(cs.getTime(1)).thenReturn(TIME); + assertEquals(OFFSET_TIME, TYPE_HANDLER.getResult(cs, 1)); + verify(cs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultNullFromCallableStatement() throws Exception { + when(cs.getTime(1)).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(cs, 1)); + verify(cs, never()).wasNull(); + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/ShortTypeHandlerTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/ShortTypeHandlerTest.java new file mode 100644 index 0000000..74d65fe --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/ShortTypeHandlerTest.java @@ -0,0 +1,90 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.type; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import org.junit.Test; + +public class ShortTypeHandlerTest extends BaseTypeHandlerTest { + + private static final TypeHandler TYPE_HANDLER = new ShortTypeHandler(); + + @Override + @Test + public void shouldSetParameter() throws Exception { + TYPE_HANDLER.setParameter(ps, 1, (short) 100, null); + verify(ps).setShort(1, (short) 100); + } + + @Override + @Test + public void shouldGetResultFromResultSetByName() throws Exception { + when(rs.getShort("column")).thenReturn((short) 100); + assertEquals(new Short((short) 100), TYPE_HANDLER.getResult(rs, "column")); + + when(rs.getShort("column")).thenReturn((short) 0); + assertEquals(new Short((short) 0), TYPE_HANDLER.getResult(rs, "column")); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByName() throws Exception { + when(rs.getShort("column")).thenReturn((short) 0); + when(rs.wasNull()).thenReturn(true); + assertNull(TYPE_HANDLER.getResult(rs, "column")); + } + + @Override + @Test + public void shouldGetResultFromResultSetByPosition() throws Exception { + when(rs.getShort(1)).thenReturn((short) 100); + assertEquals(new Short((short) 100), TYPE_HANDLER.getResult(rs, 1)); + + when(rs.getShort(1)).thenReturn((short) 0); + assertEquals(new Short((short) 0), TYPE_HANDLER.getResult(rs, 1)); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByPosition() throws Exception { + when(rs.getShort(1)).thenReturn((short) 0); + when(rs.wasNull()).thenReturn(true); + assertNull(TYPE_HANDLER.getResult(rs, 1)); + } + + @Override + @Test + public void shouldGetResultFromCallableStatement() throws Exception { + when(cs.getShort(1)).thenReturn((short) 100); + assertEquals(new Short((short) 100), TYPE_HANDLER.getResult(cs, 1)); + + when(cs.getShort(1)).thenReturn((short) 0); + assertEquals(new Short((short) 0), TYPE_HANDLER.getResult(cs, 1)); + } + + @Override + @Test + public void shouldGetResultNullFromCallableStatement() throws Exception { + when(cs.getShort(1)).thenReturn((short) 0); + when(cs.wasNull()).thenReturn(true); + assertNull(TYPE_HANDLER.getResult(cs, 1)); + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/SimpleTypeRegistryTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/SimpleTypeRegistryTest.java new file mode 100644 index 0000000..9fcfba0 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/SimpleTypeRegistryTest.java @@ -0,0 +1,43 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.type; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import java.util.HashMap; + +import org.apache.ibatis.domain.misc.RichType; +import org.junit.Test; + +public class SimpleTypeRegistryTest { + + @Test + public void shouldTestIfClassIsSimpleTypeAndReturnTrue() { + assertTrue(SimpleTypeRegistry.isSimpleType(String.class)); + } + + @Test + public void shouldTestIfClassIsSimpleTypeAndReturnFalse() { + assertFalse(SimpleTypeRegistry.isSimpleType(RichType.class)); + } + + @Test + public void shouldTestIfMapIsSimpleTypeAndReturnFalse() { + assertFalse(SimpleTypeRegistry.isSimpleType(HashMap.class)); // see issue #165, a Map is not a simple type + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/SqlDateTypeHandlerTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/SqlDateTypeHandlerTest.java new file mode 100644 index 0000000..76052c3 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/SqlDateTypeHandlerTest.java @@ -0,0 +1,78 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.type; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.util.Date; + +import org.junit.Test; + +public class SqlDateTypeHandlerTest extends BaseTypeHandlerTest { + + private static final TypeHandler TYPE_HANDLER = new SqlDateTypeHandler(); + private static final java.sql.Date SQL_DATE = new java.sql.Date(new Date().getTime()); + + @Override + @Test + public void shouldSetParameter() throws Exception { + TYPE_HANDLER.setParameter(ps, 1, SQL_DATE, null); + verify(ps).setDate(1, SQL_DATE); + } + + @Override + @Test + public void shouldGetResultFromResultSetByName() throws Exception { + when(rs.getDate("column")).thenReturn(SQL_DATE); + assertEquals(SQL_DATE, TYPE_HANDLER.getResult(rs, "column")); + verify(rs, never()).wasNull(); + } + + @Override + public void shouldGetResultNullFromResultSetByName() throws Exception { + // Unnecessary + } + + @Override + @Test + public void shouldGetResultFromResultSetByPosition() throws Exception { + when(rs.getDate(1)).thenReturn(SQL_DATE); + assertEquals(SQL_DATE, TYPE_HANDLER.getResult(rs, 1)); + verify(rs, never()).wasNull(); + } + + @Override + public void shouldGetResultNullFromResultSetByPosition() throws Exception { + // Unnecessary + } + + @Override + @Test + public void shouldGetResultFromCallableStatement() throws Exception { + when(cs.getDate(1)).thenReturn(SQL_DATE); + assertEquals(SQL_DATE, TYPE_HANDLER.getResult(cs, 1)); + verify(cs, never()).wasNull(); + } + + @Override + public void shouldGetResultNullFromCallableStatement() throws Exception { + // Unnecessary + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/SqlTimeTypeHandlerTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/SqlTimeTypeHandlerTest.java new file mode 100644 index 0000000..2167c15 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/SqlTimeTypeHandlerTest.java @@ -0,0 +1,78 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.type; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.util.Date; + +import org.junit.Test; + +public class SqlTimeTypeHandlerTest extends BaseTypeHandlerTest { + + private static final TypeHandler TYPE_HANDLER = new SqlTimeTypeHandler(); + private static final java.sql.Time SQL_TIME = new java.sql.Time(new Date().getTime()); + + @Override + @Test + public void shouldSetParameter() throws Exception { + TYPE_HANDLER.setParameter(ps, 1, SQL_TIME, null); + verify(ps).setTime(1, SQL_TIME); + } + + @Override + @Test + public void shouldGetResultFromResultSetByName() throws Exception { + when(rs.getTime("column")).thenReturn(SQL_TIME); + assertEquals(SQL_TIME, TYPE_HANDLER.getResult(rs, "column")); + verify(rs, never()).wasNull(); + } + + @Override + public void shouldGetResultNullFromResultSetByName() throws Exception { + // Unnecessary + } + + @Override + @Test + public void shouldGetResultFromResultSetByPosition() throws Exception { + when(rs.getTime(1)).thenReturn(SQL_TIME); + assertEquals(SQL_TIME, TYPE_HANDLER.getResult(rs, 1)); + verify(rs, never()).wasNull(); + } + + @Override + public void shouldGetResultNullFromResultSetByPosition() throws Exception { + // Unnecessary + } + + @Override + @Test + public void shouldGetResultFromCallableStatement() throws Exception { + when(cs.getTime(1)).thenReturn(SQL_TIME); + assertEquals(SQL_TIME, TYPE_HANDLER.getResult(cs, 1)); + verify(cs, never()).wasNull(); + } + + @Override + public void shouldGetResultNullFromCallableStatement() throws Exception { + // Unnecessary + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/SqlTimetampTypeHandlerTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/SqlTimetampTypeHandlerTest.java new file mode 100644 index 0000000..facd0ad --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/SqlTimetampTypeHandlerTest.java @@ -0,0 +1,79 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.type; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.sql.Timestamp; +import java.util.Date; + +import org.junit.Test; + +public class SqlTimetampTypeHandlerTest extends BaseTypeHandlerTest { + + private static final TypeHandler TYPE_HANDLER = new SqlTimestampTypeHandler(); + private static final java.sql.Timestamp SQL_TIME = new java.sql.Timestamp(new Date().getTime()); + + @Override + @Test + public void shouldSetParameter() throws Exception { + TYPE_HANDLER.setParameter(ps, 1, SQL_TIME, null); + verify(ps).setTimestamp(1, SQL_TIME); + } + + @Override + @Test + public void shouldGetResultFromResultSetByName() throws Exception { + when(rs.getTimestamp("column")).thenReturn(SQL_TIME); + assertEquals(SQL_TIME, TYPE_HANDLER.getResult(rs, "column")); + verify(rs, never()).wasNull(); + } + + @Override + public void shouldGetResultNullFromResultSetByName() throws Exception { + // Unnecessary + } + + @Override + @Test + public void shouldGetResultFromResultSetByPosition() throws Exception { + when(rs.getTimestamp(1)).thenReturn(SQL_TIME); + assertEquals(SQL_TIME, TYPE_HANDLER.getResult(rs, 1)); + verify(rs, never()).wasNull(); + } + + @Override + public void shouldGetResultNullFromResultSetByPosition() throws Exception { + // Unnecessary + } + + @Override + @Test + public void shouldGetResultFromCallableStatement() throws Exception { + when(cs.getTimestamp(1)).thenReturn(SQL_TIME); + assertEquals(SQL_TIME, TYPE_HANDLER.getResult(cs, 1)); + verify(cs, never()).wasNull(); + } + + @Override + public void shouldGetResultNullFromCallableStatement() throws Exception { + // Unnecessary + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/SqlxmlTypeHandlerTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/SqlxmlTypeHandlerTest.java new file mode 100644 index 0000000..e69de29 diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/SqlxmlTypeHandlerTest.sql b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/SqlxmlTypeHandlerTest.sql new file mode 100644 index 0000000..aae1416 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/SqlxmlTypeHandlerTest.sql @@ -0,0 +1,28 @@ +-- +-- Copyright 2009-2018 the original author or authors. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +CREATE SCHEMA mbtest; + +CREATE TABLE mbtest.test_sqlxml ( + id serial PRIMARY KEY, + content XML +); + +INSERT INTO mbtest.test_sqlxml (id, content) +VALUES (1, 'XML data'); + +INSERT INTO mbtest.test_sqlxml (id, content) +VALUES (2, NULL); diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/StringTypeHandlerTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/StringTypeHandlerTest.java new file mode 100644 index 0000000..c9b4e8b --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/StringTypeHandlerTest.java @@ -0,0 +1,75 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.type; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import org.junit.Test; + +public class StringTypeHandlerTest extends BaseTypeHandlerTest { + + private static final TypeHandler TYPE_HANDLER = new StringTypeHandler(); + + @Override + @Test + public void shouldSetParameter() throws Exception { + TYPE_HANDLER.setParameter(ps, 1, "Hello", null); + verify(ps).setString(1, "Hello"); + } + + @Override + @Test + public void shouldGetResultFromResultSetByName() throws Exception { + when(rs.getString("column")).thenReturn("Hello"); + assertEquals("Hello", TYPE_HANDLER.getResult(rs, "column")); + verify(rs, never()).wasNull(); + } + + @Override + public void shouldGetResultNullFromResultSetByName() throws Exception { + // Unnecessary + } + + @Override + @Test + public void shouldGetResultFromResultSetByPosition() throws Exception { + when(rs.getString(1)).thenReturn("Hello"); + assertEquals("Hello", TYPE_HANDLER.getResult(rs, 1)); + verify(rs, never()).wasNull(); + } + + @Override + public void shouldGetResultNullFromResultSetByPosition() throws Exception { + // Unnecessary + } + + @Override + @Test + public void shouldGetResultFromCallableStatement() throws Exception { + when(cs.getString(1)).thenReturn("Hello"); + assertEquals("Hello", TYPE_HANDLER.getResult(cs, 1)); + verify(cs, never()).wasNull(); + } + + @Override + public void shouldGetResultNullFromCallableStatement() throws Exception { + // Unnecessary + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/TimeOnlyTypeHandlerTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/TimeOnlyTypeHandlerTest.java new file mode 100644 index 0000000..84ce03c --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/TimeOnlyTypeHandlerTest.java @@ -0,0 +1,89 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.type; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.util.Date; + +import org.junit.Test; + +public class TimeOnlyTypeHandlerTest extends BaseTypeHandlerTest { + + private static final TypeHandler TYPE_HANDLER = new TimeOnlyTypeHandler(); + private static final Date DATE = new Date(); + private static final java.sql.Time SQL_TIME = new java.sql.Time(DATE.getTime()); + + @Override + @Test + public void shouldSetParameter() throws Exception { + TYPE_HANDLER.setParameter(ps, 1, DATE, null); + verify(ps).setTime(1, SQL_TIME); + } + + @Override + @Test + public void shouldGetResultFromResultSetByName() throws Exception { + when(rs.getTime("column")).thenReturn(SQL_TIME); + assertEquals(DATE, TYPE_HANDLER.getResult(rs, "column")); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByName() throws Exception { + when(rs.getTime("column")).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(rs, "column")); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultFromResultSetByPosition() throws Exception { + when(rs.getTime(1)).thenReturn(SQL_TIME); + assertEquals(DATE, TYPE_HANDLER.getResult(rs, 1)); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByPosition() throws Exception { + when(rs.getTime(1)).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(rs, 1)); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultFromCallableStatement() throws Exception { + when(cs.getTime(1)).thenReturn(SQL_TIME); + assertEquals(DATE, TYPE_HANDLER.getResult(cs, 1)); + verify(cs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultNullFromCallableStatement() throws Exception { + when(cs.getTime(1)).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(cs, 1)); + verify(cs, never()).wasNull(); + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/TypeAliasRegistryTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/TypeAliasRegistryTest.java new file mode 100644 index 0000000..7fbeb6c --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/TypeAliasRegistryTest.java @@ -0,0 +1,69 @@ +/** + * Copyright 2009-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.type; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; + +import org.junit.Test; + +import java.math.BigDecimal; + +public class TypeAliasRegistryTest { + + @Test + public void shouldRegisterAndResolveTypeAlias() { + TypeAliasRegistry typeAliasRegistry = new TypeAliasRegistry(); + + typeAliasRegistry.registerAlias("rich", "org.apache.ibatis.domain.misc.RichType"); + + assertEquals("org.apache.ibatis.domain.misc.RichType", typeAliasRegistry.resolveAlias("rich").getName()); + } + + @Test + public void shouldFetchArrayType() { + TypeAliasRegistry typeAliasRegistry = new TypeAliasRegistry(); + assertEquals(Byte[].class, typeAliasRegistry.resolveAlias("byte[]")); + } + + @Test + public void shouldBeAbleToRegisterSameAliasWithSameTypeAgain() { + TypeAliasRegistry typeAliasRegistry = new TypeAliasRegistry(); + typeAliasRegistry.registerAlias("String", String.class); + typeAliasRegistry.registerAlias("string", String.class); + } + + @Test(expected = TypeException.class) + public void shouldNotBeAbleToRegisterSameAliasWithDifferentType() { + TypeAliasRegistry typeAliasRegistry = new TypeAliasRegistry(); + typeAliasRegistry.registerAlias("string", BigDecimal.class); + } + + @Test + public void shouldBeAbleToRegisterAliasWithNullType() { + TypeAliasRegistry typeAliasRegistry = new TypeAliasRegistry(); + typeAliasRegistry.registerAlias("foo", (Class) null); + assertNull(typeAliasRegistry.resolveAlias("foo")); + } + + @Test + public void shouldBeAbleToRegisterNewTypeIfRegisteredTypeIsNull() { + TypeAliasRegistry typeAliasRegistry = new TypeAliasRegistry(); + typeAliasRegistry.registerAlias("foo", (Class) null); + typeAliasRegistry.registerAlias("foo", String.class); + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/TypeHandlerRegistryTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/TypeHandlerRegistryTest.java new file mode 100644 index 0000000..69961ca --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/TypeHandlerRegistryTest.java @@ -0,0 +1,217 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.type; + +import static org.junit.Assert.*; + +import java.net.URI; +import java.sql.CallableStatement; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Date; +import java.util.List; + +import org.apache.ibatis.domain.misc.RichType; +import org.junit.Before; +import org.junit.Test; + +public class TypeHandlerRegistryTest { + + private TypeHandlerRegistry typeHandlerRegistry; + + @Before + public void setup() { + typeHandlerRegistry = new TypeHandlerRegistry(); + } + + @Test + public void shouldRegisterAndRetrieveTypeHandler() { + TypeHandler stringTypeHandler = typeHandlerRegistry.getTypeHandler(String.class); + typeHandlerRegistry.register(String.class, JdbcType.LONGVARCHAR, stringTypeHandler); + assertEquals(stringTypeHandler, typeHandlerRegistry.getTypeHandler(String.class, JdbcType.LONGVARCHAR)); + + assertTrue(typeHandlerRegistry.hasTypeHandler(String.class)); + assertFalse(typeHandlerRegistry.hasTypeHandler(RichType.class)); + assertTrue(typeHandlerRegistry.hasTypeHandler(String.class, JdbcType.LONGVARCHAR)); + assertTrue(typeHandlerRegistry.hasTypeHandler(String.class, JdbcType.INTEGER)); + assertTrue(typeHandlerRegistry.getUnknownTypeHandler() instanceof UnknownTypeHandler); + } + + @Test + public void shouldRegisterAndRetrieveComplexTypeHandler() { + TypeHandler> fakeHandler = new TypeHandler>() { + + @Override + public void setParameter( PreparedStatement ps, int i, List parameter, JdbcType jdbcType ) + throws SQLException { + // do nothing, fake method + } + + @Override + public List getResult( CallableStatement cs, int columnIndex ) + throws SQLException { + // do nothing, fake method + return null; + } + + @Override + public List getResult( ResultSet rs, int columnIndex ) + throws SQLException { + // do nothing, fake method + return null; + } + + @Override + public List getResult( ResultSet rs, String columnName ) + throws SQLException { + // do nothing, fake method + return null; + } + + }; + + TypeReference> type = new TypeReference>(){}; + + typeHandlerRegistry.register(type, fakeHandler); + assertSame(fakeHandler, typeHandlerRegistry.getTypeHandler(type)); + } + + @Test + public void shouldAutoRegisterAndRetrieveComplexTypeHandler() { + TypeHandler> fakeHandler = new BaseTypeHandler>() { + + @Override + public void setNonNullParameter( PreparedStatement ps, int i, List parameter, JdbcType jdbcType ) + throws SQLException { + // do nothing, fake method + } + + @Override + public List getNullableResult( ResultSet rs, String columnName ) + throws SQLException { + // do nothing, fake method + return null; + } + + @Override + public List getNullableResult( ResultSet rs, int columnIndex ) + throws SQLException { + // do nothing, fake method + return null; + } + + @Override + public List getNullableResult( CallableStatement cs, int columnIndex ) + throws SQLException { + // do nothing, fake method + return null; + } + + }; + + typeHandlerRegistry.register(fakeHandler); + + assertSame(fakeHandler, typeHandlerRegistry.getTypeHandler(new TypeReference>(){})); + } + + @Test + public void shouldBindHandlersToWrapersAndPrimitivesIndividually() { + typeHandlerRegistry.register(Integer.class, DateTypeHandler.class); + assertSame(IntegerTypeHandler.class, typeHandlerRegistry.getTypeHandler(int.class).getClass()); + typeHandlerRegistry.register(Integer.class, IntegerTypeHandler.class); + typeHandlerRegistry.register(int.class, DateTypeHandler.class); + assertSame(IntegerTypeHandler.class, typeHandlerRegistry.getTypeHandler(Integer.class).getClass()); + typeHandlerRegistry.register(Integer.class, IntegerTypeHandler.class); + } + + @Test + public void shouldReturnHandlerForSuperclassIfRegistered() { + class MyDate extends Date { + private static final long serialVersionUID = 1L; + } + assertEquals(DateTypeHandler.class, typeHandlerRegistry.getTypeHandler(MyDate.class).getClass()); + } + + @Test + public void shouldReturnHandlerForSuperSuperclassIfRegistered() { + class MyDate1 extends Date { + private static final long serialVersionUID = 1L; + } + class MyDate2 extends MyDate1 { + private static final long serialVersionUID = 1L; + } + assertEquals(DateTypeHandler.class, typeHandlerRegistry.getTypeHandler(MyDate2.class).getClass()); + } + + interface SomeInterface { + } + interface ExtendingSomeInterface extends SomeInterface { + } + interface NoTypeHandlerInterface { + } + + enum SomeEnum implements SomeInterface { + } + enum ExtendingSomeEnum implements ExtendingSomeInterface { + } + enum ImplementingMultiInterfaceSomeEnum implements NoTypeHandlerInterface, ExtendingSomeInterface { + } + enum NoTypeHandlerInterfaceEnum implements NoTypeHandlerInterface { + } + + class SomeClass implements SomeInterface { + } + + @MappedTypes(SomeInterface.class) + public static class SomeInterfaceTypeHandler & SomeInterface> extends BaseTypeHandler { + @Override + public void setNonNullParameter(PreparedStatement ps, int i, E parameter, JdbcType jdbcType) + throws SQLException { + } + @Override + public E getNullableResult(ResultSet rs, String columnName) throws SQLException { + return null; + } + @Override + public E getNullableResult(ResultSet rs, int columnIndex) throws SQLException { + return null; + } + @Override + public E getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { + return null; + } + } + + @Test + public void demoTypeHandlerForSuperInterface() { + typeHandlerRegistry.register(SomeInterfaceTypeHandler.class); + assertNull("Registering interface works only for enums.", typeHandlerRegistry.getTypeHandler(SomeClass.class)); + assertSame("When type handler for interface is not exist, apply default enum type handler.", + EnumTypeHandler.class, typeHandlerRegistry.getTypeHandler(NoTypeHandlerInterfaceEnum.class).getClass()); + assertSame(SomeInterfaceTypeHandler.class, typeHandlerRegistry.getTypeHandler(SomeEnum.class).getClass()); + assertSame(SomeInterfaceTypeHandler.class, typeHandlerRegistry.getTypeHandler(ExtendingSomeEnum.class).getClass()); + assertSame(SomeInterfaceTypeHandler.class, typeHandlerRegistry.getTypeHandler(ImplementingMultiInterfaceSomeEnum.class).getClass()); + } + + @Test + public void shouldRegisterReplaceNullMap() { + class Address {} + assertFalse(typeHandlerRegistry.hasTypeHandler(Address.class)); + typeHandlerRegistry.register(Address.class, StringTypeHandler.class); + assertTrue(typeHandlerRegistry.hasTypeHandler(Address.class)); + } +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/UnknownTypeHandlerTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/UnknownTypeHandlerTest.java new file mode 100644 index 0000000..f4b1485 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/UnknownTypeHandlerTest.java @@ -0,0 +1,152 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.type; + +import java.sql.Clob; +import java.sql.SQLException; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.mockito.Mockito.*; + +import org.apache.ibatis.executor.result.ResultMapException; +import org.junit.Assert; +import org.junit.Test; + +public class UnknownTypeHandlerTest extends BaseTypeHandlerTest { + + private static final TypeHandler TYPE_HANDLER = spy(new UnknownTypeHandler(new TypeHandlerRegistry())); + + @Override + @Test + public void shouldSetParameter() throws Exception { + TYPE_HANDLER.setParameter(ps, 1, "Hello", null); + verify(ps).setString(1, "Hello"); + } + + @Override + @Test + public void shouldGetResultFromResultSetByName() throws Exception { + when(rs.getMetaData()).thenReturn(rsmd); + when(rsmd.getColumnCount()).thenReturn(1); + when(rsmd.getColumnName(1)).thenReturn("column"); + when(rsmd.getColumnClassName(1)).thenReturn(String.class.getName()); + when(rsmd.getColumnType(1)).thenReturn(JdbcType.VARCHAR.TYPE_CODE); + when(rs.getString("column")).thenReturn("Hello"); + assertEquals("Hello", TYPE_HANDLER.getResult(rs, "column")); + } + + @Override + public void shouldGetResultNullFromResultSetByName() throws Exception { + // Unnecessary + } + + @Override + @Test + public void shouldGetResultFromResultSetByPosition() throws Exception { + when(rs.getMetaData()).thenReturn(rsmd); + when(rsmd.getColumnClassName(1)).thenReturn(String.class.getName()); + when(rsmd.getColumnType(1)).thenReturn(JdbcType.VARCHAR.TYPE_CODE); + when(rs.getString(1)).thenReturn("Hello"); + assertEquals("Hello", TYPE_HANDLER.getResult(rs, 1)); + } + + @Override + public void shouldGetResultNullFromResultSetByPosition() throws Exception { + // Unnecessary + } + + @Override + @Test + public void shouldGetResultFromCallableStatement() throws Exception { + when(cs.getObject(1)).thenReturn("Hello"); + assertEquals("Hello", TYPE_HANDLER.getResult(cs, 1)); + } + + @Override + @Test + public void shouldGetResultNullFromCallableStatement() throws Exception { + when(cs.getObject(1)).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(cs, 1)); + } + + @Test + public void setParameterWithNullParameter() throws Exception { + TYPE_HANDLER.setParameter(ps, 0, null, JdbcType.INTEGER); + verify(ps).setNull(0, JdbcType.INTEGER.TYPE_CODE); + } + + @Test + public void setParameterWithNullParameterThrowsException() throws SQLException { + doThrow(new SQLException("invalid column")).when(ps).setNull(1, JdbcType.INTEGER.TYPE_CODE); + try { + TYPE_HANDLER.setParameter(ps, 1, null, JdbcType.INTEGER); + Assert.fail("Should have thrown a TypeException"); + } catch (Exception e) { + Assert.assertTrue("Expected TypedException", e instanceof TypeException); + Assert.assertTrue("Parameter index is in exception", e.getMessage().contains("parameter #1")); + } + } + + @Test + public void setParameterWithNonNullParameterThrowsException() throws SQLException { + doThrow(new SQLException("invalid column")).when((UnknownTypeHandler)TYPE_HANDLER).setNonNullParameter(ps, 1, 99, JdbcType.INTEGER); + try { + TYPE_HANDLER.setParameter(ps, 1, 99, JdbcType.INTEGER); + Assert.fail("Should have thrown a TypeException"); + } catch (Exception e) { + Assert.assertTrue("Expected TypedException", e instanceof TypeException); + Assert.assertTrue("Parameter index is in exception", e.getMessage().contains("parameter #1")); + } + } + + @Test + public void getResultWithResultSetAndColumnNameThrowsException() throws SQLException { + doThrow(new SQLException("invalid column")).when((UnknownTypeHandler)TYPE_HANDLER).getNullableResult(rs, "foo"); + try { + TYPE_HANDLER.getResult(rs, "foo"); + Assert.fail("Should have thrown a ResultMapException"); + } catch (Exception e) { + Assert.assertTrue("Expected ResultMapException", e instanceof ResultMapException); + Assert.assertTrue("column name is not in exception", e.getMessage().contains("column 'foo'")); + } + } + + @Test + public void getResultWithResultSetAndColumnIndexThrowsException() throws SQLException { + doThrow(new SQLException("invalid column")).when((UnknownTypeHandler)TYPE_HANDLER).getNullableResult(rs, 1); + try { + TYPE_HANDLER.getResult(rs, 1); + Assert.fail("Should have thrown a ResultMapException"); + } catch (Exception e) { + Assert.assertTrue("Expected ResultMapException", e instanceof ResultMapException); + Assert.assertTrue("column index is not in exception", e.getMessage().contains("column #1")); + } + } + + @Test + public void getResultWithCallableStatementAndColumnIndexThrowsException() throws SQLException { + doThrow(new SQLException("invalid column")).when((UnknownTypeHandler)TYPE_HANDLER).getNullableResult(cs, 1); + try { + TYPE_HANDLER.getResult(cs, 1); + Assert.fail("Should have thrown a ResultMapException"); + } catch (Exception e) { + Assert.assertTrue("Expected ResultMapException", e instanceof ResultMapException); + Assert.assertTrue("column index is not in exception", e.getMessage().contains("column #1")); + } + } + +} \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/YearMonthTypeHandlerTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/YearMonthTypeHandlerTest.java new file mode 100644 index 0000000..32b42fd --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/YearMonthTypeHandlerTest.java @@ -0,0 +1,85 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.type; + +import static org.junit.Assert.*; +import static org.mockito.Mockito.*; + +import java.time.YearMonth; + +import org.junit.Test; + +/** + * @author Björn Raupach + */ +public class YearMonthTypeHandlerTest extends BaseTypeHandlerTest { + + private static final TypeHandler TYPE_HANDLER = new YearMonthTypeHandler(); + private static final YearMonth INSTANT = YearMonth.now(); + + @Override + @Test + public void shouldSetParameter() throws Exception { + TYPE_HANDLER.setParameter(ps, 1, INSTANT, null); + verify(ps).setString(1, INSTANT.toString()); + } + + @Override + @Test + public void shouldGetResultFromResultSetByName() throws Exception { + when(rs.getString("column")).thenReturn(INSTANT.toString()); + assertEquals(INSTANT, TYPE_HANDLER.getResult(rs, "column")); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByName() throws Exception { + assertNull(TYPE_HANDLER.getResult(rs, "column")); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultFromResultSetByPosition() throws Exception { + when(rs.getString(1)).thenReturn(INSTANT.toString()); + assertEquals(INSTANT, TYPE_HANDLER.getResult(rs, 1)); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByPosition() throws Exception { + assertNull(TYPE_HANDLER.getResult(rs, 1)); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultFromCallableStatement() throws Exception { + when(cs.getString(1)).thenReturn(INSTANT.toString()); + assertEquals(INSTANT, TYPE_HANDLER.getResult(cs, 1)); + verify(cs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultNullFromCallableStatement() throws Exception { + assertNull(TYPE_HANDLER.getResult(cs, 1)); + verify(cs, never()).wasNull(); + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/YearTypeHandlerTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/YearTypeHandlerTest.java new file mode 100644 index 0000000..326080d --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/YearTypeHandlerTest.java @@ -0,0 +1,95 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.type; + +import static org.junit.Assert.*; +import static org.mockito.Mockito.*; + +import java.time.Year; + +import org.junit.Test; + +/** + * + * @author Eduardo Macarron + */ +public class YearTypeHandlerTest extends BaseTypeHandlerTest { + + private static final TypeHandler TYPE_HANDLER = new YearTypeHandler(); + private static final Year INSTANT = Year.now(); + + @Override + @Test + public void shouldSetParameter() throws Exception { + TYPE_HANDLER.setParameter(ps, 1, INSTANT, null); + verify(ps).setInt(1, INSTANT.getValue()); + } + + @Override + @Test + public void shouldGetResultFromResultSetByName() throws Exception { + when(rs.getInt("column")).thenReturn(INSTANT.getValue()); + assertEquals(INSTANT, TYPE_HANDLER.getResult(rs, "column")); + + when(rs.getInt("column")).thenReturn(0); + assertEquals(Year.of(0), TYPE_HANDLER.getResult(rs, "column")); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByName() throws Exception { + when(rs.getInt("column")).thenReturn(0); + when(rs.wasNull()).thenReturn(true); + assertNull(TYPE_HANDLER.getResult(rs, "column")); + } + + @Override + @Test + public void shouldGetResultFromResultSetByPosition() throws Exception { + when(rs.getInt(1)).thenReturn(INSTANT.getValue()); + assertEquals(INSTANT, TYPE_HANDLER.getResult(rs, 1)); + + when(rs.getInt(1)).thenReturn(0); + assertEquals(Year.of(0), TYPE_HANDLER.getResult(rs, 1)); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByPosition() throws Exception { + when(rs.getInt(1)).thenReturn(0); + when(rs.wasNull()).thenReturn(true); + assertNull(TYPE_HANDLER.getResult(rs, 1)); + } + + @Override + @Test + public void shouldGetResultFromCallableStatement() throws Exception { + when(cs.getInt(1)).thenReturn(INSTANT.getValue()); + assertEquals(INSTANT, TYPE_HANDLER.getResult(cs, 1)); + + when(cs.getInt(1)).thenReturn(0); + assertEquals(Year.of(0), TYPE_HANDLER.getResult(cs, 1)); + } + + @Override + @Test + public void shouldGetResultNullFromCallableStatement() throws Exception { + when(cs.getInt(1)).thenReturn(0); + when(cs.wasNull()).thenReturn(true); + assertNull(TYPE_HANDLER.getResult(cs, 1)); + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/ZonedDateTimeTypeHandlerTest.java b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/ZonedDateTimeTypeHandlerTest.java new file mode 100644 index 0000000..5c57d2a --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/ZonedDateTimeTypeHandlerTest.java @@ -0,0 +1,87 @@ +/** + * Copyright 2009-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.type; + +import static org.junit.Assert.*; +import static org.mockito.Mockito.*; + +import java.sql.Timestamp; +import java.time.ZonedDateTime; + +import org.junit.Test; + +public class ZonedDateTimeTypeHandlerTest extends BaseTypeHandlerTest { + + private static final TypeHandler TYPE_HANDLER = new ZonedDateTimeTypeHandler(); + private static final ZonedDateTime ZONED_DATE_TIME = ZonedDateTime.now(); + private static final Timestamp TIMESTAMP = Timestamp.from(ZONED_DATE_TIME.toInstant()); + + @Override + @Test + public void shouldSetParameter() throws Exception { + TYPE_HANDLER.setParameter(ps, 1, ZONED_DATE_TIME, null); + verify(ps).setTimestamp(1, TIMESTAMP); + } + + @Override + @Test + public void shouldGetResultFromResultSetByName() throws Exception { + when(rs.getTimestamp("column")).thenReturn(TIMESTAMP); + assertEquals(ZONED_DATE_TIME, TYPE_HANDLER.getResult(rs, "column")); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByName() throws Exception { + when(rs.getTimestamp("column")).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(rs, "column")); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultFromResultSetByPosition() throws Exception { + when(rs.getTimestamp(1)).thenReturn(TIMESTAMP); + assertEquals(ZONED_DATE_TIME, TYPE_HANDLER.getResult(rs, 1)); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultNullFromResultSetByPosition() throws Exception { + when(rs.getTimestamp(1)).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(rs, 1)); + verify(rs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultFromCallableStatement() throws Exception { + when(cs.getTimestamp(1)).thenReturn(TIMESTAMP); + assertEquals(ZONED_DATE_TIME, TYPE_HANDLER.getResult(cs, 1)); + verify(cs, never()).wasNull(); + } + + @Override + @Test + public void shouldGetResultNullFromCallableStatement() throws Exception { + when(cs.getTimestamp(1)).thenReturn(null); + assertNull(TYPE_HANDLER.getResult(cs, 1)); + verify(cs, never()).wasNull(); + } + +} diff --git a/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/jdbc.properties b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/jdbc.properties new file mode 100644 index 0000000..96c2344 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/org/apache/ibatis/type/jdbc.properties @@ -0,0 +1,20 @@ +# +# Copyright 2009-2016 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +driver=org.apache.derby.jdbc.EmbeddedDriver +url=jdbc:derby:ibderby;create=true +username= +password= \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/java/resources/nodelet_test.xml b/Module1/code/mybatis-3-master/src/test/java/resources/nodelet_test.xml new file mode 100644 index 0000000..5a1a727 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/java/resources/nodelet_test.xml @@ -0,0 +1,30 @@ + + + + Jim + Smith + + 1970 + 6 + 15 + + 5.8 + 200 + true + \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/resources/com/lagou/mapper/IOrderMapper.xml b/Module1/code/mybatis-3-master/src/test/resources/com/lagou/mapper/IOrderMapper.xml new file mode 100644 index 0000000..c2b23ca --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/resources/com/lagou/mapper/IOrderMapper.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/resources/com/lagou/mapper/IUserMapper.xml b/Module1/code/mybatis-3-master/src/test/resources/com/lagou/mapper/IUserMapper.xml new file mode 100644 index 0000000..9f2544c --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/resources/com/lagou/mapper/IUserMapper.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + update user set username = #{username} where id = #{id} + + + \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/resources/jdbc.properties b/Module1/code/mybatis-3-master/src/test/resources/jdbc.properties new file mode 100644 index 0000000..61fa777 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/resources/jdbc.properties @@ -0,0 +1,4 @@ +jdbc.driver=com.mysql.jdbc.Driver +jdbc.url=jdbc:mysql:///zdy_mybatis +jdbc.username=root +jdbc.password=root \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/src/test/resources/log4j.properties b/Module1/code/mybatis-3-master/src/test/resources/log4j.properties new file mode 100644 index 0000000..620049f --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/resources/log4j.properties @@ -0,0 +1,6 @@ +log4j.rootLogger=DEBUG,A1 + +log4j.appender.A1=org.apache.log4j.ConsoleAppender +log4j.appender.A1.layout=org.apache.log4j.PatternLayout +log4j.appender.A1.layout.ConversionPattern=[%t] [%c]-[%p] %m%n +log4j.logger.com.lagou.mapper=TRACE diff --git a/Module1/code/mybatis-3-master/src/test/resources/sqlMapConfig.xml b/Module1/code/mybatis-3-master/src/test/resources/sqlMapConfig.xml new file mode 100644 index 0000000..17523c2 --- /dev/null +++ b/Module1/code/mybatis-3-master/src/test/resources/sqlMapConfig.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Module1/code/mybatis-3-master/travis/after_success.sh b/Module1/code/mybatis-3-master/travis/after_success.sh new file mode 100644 index 0000000..21b33ab --- /dev/null +++ b/Module1/code/mybatis-3-master/travis/after_success.sh @@ -0,0 +1,60 @@ +#!/bin/bash +# +# Copyright 2009-2017 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + + +# Get Commit Message +commit_message=$(git log --format=%B -n 1) +echo "Current commit detected: ${commit_message}" + +# We build for several JDKs on Travis. +# Some actions, like analyzing the code (Coveralls) and uploading +# artifacts on a Maven repository, should only be made for one version. + +# If the version is 1.8, then perform the following actions. +# 1. Upload artifacts to Sonatype. +# 2. Use -q option to only display Maven errors and warnings. +# 3. Use --settings to force the usage of our "settings.xml" file. +# 4. Notify Coveralls. +# 5. Deploy site + +if [ $TRAVIS_REPO_SLUG == "mybatis/mybatis-3" ] && [ "$TRAVIS_PULL_REQUEST" == "false" ] && [ "$TRAVIS_BRANCH" == "master" ] && [[ "$commit_message" != *"[maven-release-plugin]"* ]]; then + + if [ $TRAVIS_JDK_VERSION == "oraclejdk8" ]; then + + # Deploy to sonatype + ./mvnw clean deploy -Dmaven.test.skip=true -q --settings ./travis/settings.xml + echo -e "Successfully deployed SNAPSHOT artifacts to Sonatype under Travis job ${TRAVIS_JOB_NUMBER}" + + ./mvnw clean test jacoco:report coveralls:report -q --settings ./travis/settings.xml + echo -e "Successfully ran coveralls under Travis job ${TRAVIS_JOB_NUMBER}" + + # Deploy to site + # Cannot currently run site this way + # ./mvnw site site:deploy -q --settings ./travis/settings.xml + # echo -e "Successfully deploy site under Travis job ${TRAVIS_JOB_NUMBER}" + + # Deploy to sonar + ./mvnw clean org.jacoco:jacoco-maven-plugin:prepare-agent package sonar:sonar -Dsonar.host.url=https://sonarqube.com -Dsonar.login=ccf0be39fd0ca5ea5aa712247c79da7233cd3caa -q --settings ./travis/settings.xml + echo -e "Successfully ran Sonar integration under Travis job ${TRAVIS_JOB_NUMBER}" + else + echo "Java Version does not support additonal activity for travis CI" + fi +else + echo "Travis Pull Request: $TRAVIS_PULL_REQUEST" + echo "Travis Branch: $TRAVIS_BRANCH" + echo "Travis build skipped" +fi diff --git a/Module1/code/mybatis-3-master/travis/install.sh b/Module1/code/mybatis-3-master/travis/install.sh new file mode 100644 index 0000000..8a2a02e --- /dev/null +++ b/Module1/code/mybatis-3-master/travis/install.sh @@ -0,0 +1,18 @@ +#!/bin/bash +# +# Copyright 2009-2018 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +./mvnw install -DskipTests=true -Dmaven.javadoc.skip=true -B -V --settings ./travis/settings.xml diff --git a/Module1/code/mybatis-3-master/travis/settings.xml b/Module1/code/mybatis-3-master/travis/settings.xml new file mode 100644 index 0000000..a753845 --- /dev/null +++ b/Module1/code/mybatis-3-master/travis/settings.xml @@ -0,0 +1,33 @@ + + + + + + ossrh + ${env.CI_DEPLOY_USERNAME} + ${env.CI_DEPLOY_PASSWORD} + + + gh-pages + git + ${env.CI_SITE_PASSWORD} + + + diff --git a/Module1/code/mybatis_multitable/pom.xml b/Module1/code/mybatis_multitable/pom.xml new file mode 100644 index 0000000..b0bee22 --- /dev/null +++ b/Module1/code/mybatis_multitable/pom.xml @@ -0,0 +1,64 @@ + + + 4.0.0 + + com.yang + mybatis_multitable + 1.0-SNAPSHOT + + UTF-8 + 1.8 + UTF-8 + 1.8 + 1.8 + + + + + + org.mybatis + mybatis + 3.4.5 + + + + mysql + mysql-connector-java + 8.0.11 + + + + junit + junit + 4.12 + + + + log4j + log4j + 1.2.12 + + + + org.mybatis.caches + mybatis-redis + 1.0.0-beta2 + + + + com.github.pagehelper + pagehelper + 3.7.5 + + + com.github.jsqlparser + jsqlparser + 0.9.1 + + + + + + diff --git a/Module1/code/mybatis_multitable/src/main/java/com/yang/mapper/IOrderMapper.java b/Module1/code/mybatis_multitable/src/main/java/com/yang/mapper/IOrderMapper.java new file mode 100644 index 0000000..f627075 --- /dev/null +++ b/Module1/code/mybatis_multitable/src/main/java/com/yang/mapper/IOrderMapper.java @@ -0,0 +1,33 @@ +package com.yang.mapper; + +import com.yang.pojo.Order; +import com.yang.pojo.User; +import org.apache.ibatis.annotations.One; +import org.apache.ibatis.annotations.Result; +import org.apache.ibatis.annotations.Results; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +public interface IOrderMapper { + // 查询 订单的同时查询该订单的用户信息 + public List findOrderAndUser(); + + @Results({ + @Result(property = "id",column = "id"), + @Result(property = "orderTime",column = "order_time"), + @Result(property = "total",column = "total"), + @Result(property = "user",column = "uid",javaType = User.class,one = @One(select = "com.yang.mapper.IUserMapper.findById")) + }) + @Select(" select * from orders") + List findOrderAndUserByAnnotation(); + + + /** + * 注解一对多使用 + * @param userId + * @return + */ + @Select("select * from orders where uid = #{userId}") + List findOrderByUserId(Integer userId); +} diff --git a/Module1/code/mybatis_multitable/src/main/java/com/yang/mapper/IRoleMapper.java b/Module1/code/mybatis_multitable/src/main/java/com/yang/mapper/IRoleMapper.java new file mode 100644 index 0000000..ad880d1 --- /dev/null +++ b/Module1/code/mybatis_multitable/src/main/java/com/yang/mapper/IRoleMapper.java @@ -0,0 +1,12 @@ +package com.yang.mapper; + +import com.yang.pojo.Role; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +public interface IRoleMapper { + + @Select("Select * from sys_role r,sys_user_role ur where r.id = ur.roleid and ur.userid = #{uid} ") + List findRoleByUid(Integer uid); +} diff --git a/Module1/code/mybatis_multitable/src/main/java/com/yang/mapper/IUserMapper.java b/Module1/code/mybatis_multitable/src/main/java/com/yang/mapper/IUserMapper.java new file mode 100644 index 0000000..221d45a --- /dev/null +++ b/Module1/code/mybatis_multitable/src/main/java/com/yang/mapper/IUserMapper.java @@ -0,0 +1,88 @@ +package com.yang.mapper; + + +import com.yang.pojo.User; +import org.apache.ibatis.annotations.*; +import org.mybatis.caches.redis.RedisCache; + +import java.util.List; + +//开启二级缓存 +@CacheNamespace(implementation = RedisCache.class) +public interface IUserMapper { + /** + * 查询所有用户及用户订单信息 + * @return + */ + public List findUserAndOrderList(); + + + /** + * 查询所有用户及用户订单信息 + * @return + */ + public List findAllUserAndRole(); + + + /** + * 测试注解添加用户 + * @param user + */ + @Insert("insert into user (id,username)values(#{id},#{username})") + void addUser(User user); + + /** + * 测试注解更新用户 + * @param user + */ + @Update("update user set username = #{username} where id = #{id}") + void updateUser(User user); + + /** + * 测试注解查询所有 + * @return + */ + @Select("select * from user") + public List selectUser(); + + /** + * 测试注解删除 + * @param id + */ + @Delete("delete from user where id = #{id}") + void deleteUserById(Integer id); + + /** + * 测试注解一对多使用 + * @param id + * @return + */ + @Select("select * from user where id = #{id}") + User findById(Integer id); + + /** + * 测试注解 1对多 + */ + @Select("Select * from user") + @Results({ + @Result(property = "id",column = "id"), + @Result(property = "username",column = "username"), + @Result(property = "orderList",column = "id",javaType = List.class, + many = @Many(select = "com.yang.mapper.IOrderMapper.findOrderByUserId")) + }) + List selectAllUserAndOrder(); + + + /** + * 注解查询用户及角色多对多 + * @return + */ + @Select("select * from user") + @Results({ + @Result(property = "id",column = "id"), + @Result(property = "username",column = "username"), + @Result(property = "roleList",column = "id",javaType = List.class, + many = @Many(select = "com.yang.mapper.IRoleMapper.findRoleByUid")) + }) + List selectAllUserAndUserRole(); +} diff --git a/Module1/code/mybatis_multitable/src/main/java/com/yang/plugin/MyPlugin.java b/Module1/code/mybatis_multitable/src/main/java/com/yang/plugin/MyPlugin.java new file mode 100644 index 0000000..ae86001 --- /dev/null +++ b/Module1/code/mybatis_multitable/src/main/java/com/yang/plugin/MyPlugin.java @@ -0,0 +1,41 @@ +package com.yang.plugin; + + +import org.apache.ibatis.executor.statement.StatementHandler; +import org.apache.ibatis.plugin.*; + +import java.sql.Connection; +import java.sql.Statement; +import java.util.Properties; + +@Intercepts({@Signature(type = StatementHandler.class,method = "prepare",args = {Connection.class,Integer.class})}) +public class MyPlugin implements Interceptor { + + /** + * 拦截方法:只要被拦截的目标对象的目标方法被执行时,都会执行该方法 + * @param invocation + * @return + * @throws Throwable + */ + public Object intercept(Invocation invocation) throws Throwable { + System.out.println("对方法进行了增强"); + return invocation.proceed();// 原方法执行 + } + + /** + * 为了把当前的拦截器生成的代理存到拦截器链中 + * @param o + * @return + */ + public Object plugin(Object o) { + return Plugin.wrap(o,this); + } + + /** + * 获取配置的参数 + * @param properties + */ + public void setProperties(Properties properties) { + System.out.println("获取到的参数是:"+ properties); + } +} diff --git a/Module1/code/mybatis_multitable/src/main/java/com/yang/pojo/Order.java b/Module1/code/mybatis_multitable/src/main/java/com/yang/pojo/Order.java new file mode 100644 index 0000000..465f100 --- /dev/null +++ b/Module1/code/mybatis_multitable/src/main/java/com/yang/pojo/Order.java @@ -0,0 +1,54 @@ +package com.yang.pojo; + +public class Order { + private Integer id; + + private String orderTime; + + private Double total; + + private User user; + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getOrderTime() { + return orderTime; + } + + public void setOrderTime(String orderTime) { + this.orderTime = orderTime; + } + + public Double getTotal() { + return total; + } + + public void setTotal(Double total) { + this.total = total; + } + + + @Override + public String toString() { + return "Order{" + + "id=" + id + + ", orderTime='" + orderTime + '\'' + + ", total=" + total + + ", user=" + user + + '}'; + } +} diff --git a/Module1/code/mybatis_multitable/src/main/java/com/yang/pojo/Role.java b/Module1/code/mybatis_multitable/src/main/java/com/yang/pojo/Role.java new file mode 100644 index 0000000..7ff134f --- /dev/null +++ b/Module1/code/mybatis_multitable/src/main/java/com/yang/pojo/Role.java @@ -0,0 +1,46 @@ +package com.yang.pojo; + +/** + * 角色 + */ +public class Role { + + private Integer id; + + private String roleName; + + private String roleDesc; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getRoleName() { + return roleName; + } + + public void setRoleName(String roleName) { + this.roleName = roleName; + } + + public String getRoleDesc() { + return roleDesc; + } + + public void setRoleDesc(String roleDesc) { + this.roleDesc = roleDesc; + } + + @Override + public String toString() { + return "Role{" + + "id=" + id + + ", roleName='" + roleName + '\'' + + ", roleDesc='" + roleDesc + '\'' + + '}'; + } +} diff --git a/Module1/code/mybatis_multitable/src/main/java/com/yang/pojo/User.java b/Module1/code/mybatis_multitable/src/main/java/com/yang/pojo/User.java new file mode 100644 index 0000000..8982f23 --- /dev/null +++ b/Module1/code/mybatis_multitable/src/main/java/com/yang/pojo/User.java @@ -0,0 +1,67 @@ +package com.yang.pojo; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +public class User implements Serializable { + + private static final long serialVersionUID = -1596833422960718280L; + private Integer id; + + private String username; + + private List orderList = new ArrayList(); + + private List roleList = new ArrayList(); + + public User() { + } + + public User(Integer id, String username) { + this.id = id; + this.username = username; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public List getOrderList() { + return orderList; + } + + public void setOrderList(List orderList) { + this.orderList = orderList; + } + + public List getRoleList() { + return roleList; + } + + public void setRoleList(List roleList) { + this.roleList = roleList; + } + + @Override + public String toString() { + return "User{" + + "id=" + id + + ", username='" + username + '\'' + + ", orderList=" + orderList + + ", roleList=" + roleList + + '}'; + } +} diff --git a/Module1/code/mybatis_multitable/src/main/java/com/yang/test/CacheTest.java b/Module1/code/mybatis_multitable/src/main/java/com/yang/test/CacheTest.java new file mode 100644 index 0000000..2a9219a --- /dev/null +++ b/Module1/code/mybatis_multitable/src/main/java/com/yang/test/CacheTest.java @@ -0,0 +1,71 @@ +package com.yang.test; + +import com.yang.mapper.IOrderMapper; +import com.yang.mapper.IUserMapper; +import com.yang.pojo.User; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; +import java.io.InputStream; + +public class CacheTest { + + private SqlSessionFactory sqlSessionFactory; + + private IUserMapper userMapper; + + private IOrderMapper orderMapper; + + private SqlSession sqlSession; + + /** + * 代理方式测试mybatis 一对一,或一对多 + * @throws IOException + */ + @Before + public void beforeTest() throws IOException { + // Resource工具类 将配置文件加载 成字节输入流 + InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); + // 解析配置文件 并创建了sqlSessionFactory工厂 + sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); + // 生产sql session + sqlSession = sqlSessionFactory.openSession(true); + orderMapper = sqlSession.getMapper(IOrderMapper.class); + userMapper = sqlSession.getMapper(IUserMapper.class); + // 自动提交事务 + } + + @Test + public void firstLevelCache(){ + + // 第一次查询 + User user1 = userMapper.findById(1); + // 第二次查询 + User user2 = userMapper.findById(1); + System.out.println(user1 == user2); + } + + /** + * 测试二级缓存 + */ + @Test + public void secondLevelCache(){ + SqlSession sqlSession1 = sqlSessionFactory.openSession(); + SqlSession sqlSession2 = sqlSessionFactory.openSession(); + SqlSession sqlSession3 = sqlSessionFactory.openSession(); + IUserMapper userMapper1 = sqlSession1.getMapper(IUserMapper.class); + IUserMapper userMapper2 = sqlSession2.getMapper(IUserMapper.class); + IUserMapper userMapper3 = sqlSession3.getMapper(IUserMapper.class); + User user1 = userMapper1.findById(1); + sqlSession1.close();//清空1级缓存 + User user2 = userMapper2.findById(1); + System.out.println(user1 == user2); + + + } +} diff --git a/Module1/code/mybatis_multitable/src/main/java/com/yang/test/MybatisTest.java b/Module1/code/mybatis_multitable/src/main/java/com/yang/test/MybatisTest.java new file mode 100644 index 0000000..4b80f9c --- /dev/null +++ b/Module1/code/mybatis_multitable/src/main/java/com/yang/test/MybatisTest.java @@ -0,0 +1,156 @@ +package com.yang.test; + +import com.github.pagehelper.PageHelper; +import com.yang.mapper.IOrderMapper; +import com.yang.mapper.IUserMapper; +import com.yang.pojo.Order; +import com.yang.pojo.User; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; +import java.io.InputStream; +import java.util.List; + +public class MybatisTest { + + private IOrderMapper orderMapper; + + private IUserMapper userMapper; + + /** + * 代理方式测试mybatis 一对一,或一对多 + * @throws IOException + */ + @Before + public void beforeTest() throws IOException { + // Resource工具类 将配置文件加载 成字节输入流 + InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); + // 解析配置文件 并创建了sqlSessionFactory工厂 + SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); + // 生产sql session + SqlSession sqlSession = sqlSessionFactory.openSession(true); + orderMapper = sqlSession.getMapper(IOrderMapper.class); + userMapper = sqlSession.getMapper(IUserMapper.class); + // 自动提交事务 + } + + /** + * 测试Mybatis 复杂映射:一对一 + * 查询一个订单,同事查询订单所属用户 + */ + @Test + public void testOneToOne(){ + List orderAndUser = orderMapper.findOrderAndUser(); + for (Order order : orderAndUser) { + System.out.println(order); + } + } + + /** + * 测试Mybatis 复杂映射:一对多 + * 查询全部用户,与此同时,查询每个用户所有的订单信息 + */ + @Test + public void testOneToMultiple(){ + List userList = userMapper.findUserAndOrderList(); + for (User user : userList) { + System.out.println(user); + } + } + + /** + * 测试Mybatis 复杂映射:多对多 + * 查询全部用户,与此同时,查询每个用户角色 + */ + @Test + public void testMultipleToMultiple(){ + List userList = userMapper.findAllUserAndRole(); + for (User user : userList) { + System.out.println(user); + } + } + + /** + * 测试注解新增 + */ + @Test + public void testAnnotationInsert(){ + User user = new User(6,"李四"); + userMapper.addUser(user); + } + + /** + * 测试注解更新 + */ + @Test + public void testAnnotationUpdate(){ + User user = new User(6,"李四2"); + userMapper.updateUser(user); + } + + /** + * 测试注解查询 + */ + @Test + public void testAnnotationSelect(){ + List userList = userMapper.selectUser(); + System.out.println(userList); + } + + /** + * 测试注解删除 + */ + @Test + public void testAnnotationDelete(){ + userMapper.deleteUserById(6); + } + + /** + * 注解 一对一 + */ + @Test + public void selectAnnotationOneToOne(){ + List orderList = orderMapper.findOrderAndUserByAnnotation(); + for (Order order : orderList) { + System.out.println(order); + } + } + + /** + * 注解 一(多)对多 + */ + @Test + public void selectAnnotationOneToMultiple(){ + List userList = userMapper.selectAllUserAndOrder(); + for (User user : userList) { + System.out.println(user); + } + } + + /** + * 注解多对多 + */ + @Test + public void selectAnnotationMultipleToMultiple(){ + List userList = userMapper.selectAllUserAndUserRole(); + for (User user : userList) { + System.out.println(user); + } + } + + @Test + public void testPageHelper() { +//设置分页参数 + PageHelper.startPage(1, 1); + List select = userMapper.selectUser(); + for (User user : select) { + System.out.println(user); + } + } +} + diff --git a/Module1/code/mybatis_multitable/src/main/resources/com/yang/mapper/IOrderMapper.xml b/Module1/code/mybatis_multitable/src/main/resources/com/yang/mapper/IOrderMapper.xml new file mode 100644 index 0000000..5385bd6 --- /dev/null +++ b/Module1/code/mybatis_multitable/src/main/resources/com/yang/mapper/IOrderMapper.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis_multitable/src/main/resources/com/yang/mapper/IUserMapper.xml b/Module1/code/mybatis_multitable/src/main/resources/com/yang/mapper/IUserMapper.xml new file mode 100644 index 0000000..e76f81b --- /dev/null +++ b/Module1/code/mybatis_multitable/src/main/resources/com/yang/mapper/IUserMapper.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis_multitable/src/main/resources/jdbc.properties b/Module1/code/mybatis_multitable/src/main/resources/jdbc.properties new file mode 100644 index 0000000..0c86ccb --- /dev/null +++ b/Module1/code/mybatis_multitable/src/main/resources/jdbc.properties @@ -0,0 +1,4 @@ +jdbc.driver = com.mysql.cj.jdbc.Driver +jdbc.url = jdbc:mysql://117.50.15.23:3306/study?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT +jdbc.username = yang +jdbc.password = yang_stuty diff --git a/Module1/code/mybatis_multitable/src/main/resources/log4j.properties b/Module1/code/mybatis_multitable/src/main/resources/log4j.properties new file mode 100644 index 0000000..a28c68b --- /dev/null +++ b/Module1/code/mybatis_multitable/src/main/resources/log4j.properties @@ -0,0 +1,15 @@ +### direct log messages to stdout ### +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.Target=System.out +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n + +### direct messages to file mylog.log ### +log4j.appender.file=org.apache.log4j.FileAppender +log4j.appender.file.File=D:/mylog.log +log4j.appender.file.layout=org.apache.log4j.PatternLayout +log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n + +### set log levels - for more verbose logging change 'info' to 'debug' ### + +log4j.rootLogger=debug, stdout diff --git a/Module1/code/mybatis_multitable/src/main/resources/redis.properties b/Module1/code/mybatis_multitable/src/main/resources/redis.properties new file mode 100644 index 0000000..fea216b --- /dev/null +++ b/Module1/code/mybatis_multitable/src/main/resources/redis.properties @@ -0,0 +1,5 @@ +redis.host = localhost +redis.port = 6379 +redis.connectionTimeout = 5000 +redis.password= +redis.database = 0 diff --git a/Module1/code/mybatis_multitable/src/main/resources/sqlMapConfig.xml b/Module1/code/mybatis_multitable/src/main/resources/sqlMapConfig.xml new file mode 100644 index 0000000..d48c19f --- /dev/null +++ b/Module1/code/mybatis_multitable/src/main/resources/sqlMapConfig.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis_multitable/target/classes/com/yang/mapper/IOrderMapper.class b/Module1/code/mybatis_multitable/target/classes/com/yang/mapper/IOrderMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..abc93a89da36dbabb3763d5b276ddb4654f66997 GIT binary patch literal 972 zcma)5T~E|N6uq-s_5&4JL=;7>E+Fu*jnANgeK2XVW)l{D@xgT4VVO-k({!eo#`wp4 z@CW##jAvRc1~Kr`^z`0)?z!jQ{`mRrI}yF2%{IMgQ=ifDsgTh)i+FYeGXJnRl2Vz# z2qhVR>PoSr(tQ99v#Ava6|77K%g@NXnk&~AmHFI0mu{NC)DdMY_ z9I#fRQBz3-``73iOOD)@<}nWqqfMAOux1XDAcf3-p + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis_multitable/target/classes/com/yang/mapper/IRoleMapper.class b/Module1/code/mybatis_multitable/target/classes/com/yang/mapper/IRoleMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..d9f372f8999c4cf74803d76e826624cda3f2ca21 GIT binary patch literal 453 zcma)3O-lnY5S`S1*lMd+@e&Y4MH)P>3VILco5h372^=1$Gd|}`ab2*1_M#9r zIay)BOT|*@d_tf-l7;3zSV189Pt8S|nUXDH+se!gi!+le?6fxw+RIWrN+-ukTx)GS z_tI!b;3ze=V7%hlR4_S4*fG8qu#r$Ai*_1wt^!(lS|Rk5POK@ZTeugCgQz`=VQ|8( z@?h!fR9GbXGN+d`*nZSu%yk~KC|xoKZ$akolt5=>g3ZLOR5)jM5dGirsuH#z7e-+J z_kHCOW`87Du-@wZc!s8%1PIjdGXO}Pzy{PYYhYG`CbaPGA-{>I{S3rG2cxYeyZr;6 C@P&Q= literal 0 HcmV?d00001 diff --git a/Module1/code/mybatis_multitable/target/classes/com/yang/mapper/IUserMapper.class b/Module1/code/mybatis_multitable/target/classes/com/yang/mapper/IUserMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..416817e6b6224c494329f41cc142679f5c6aa449 GIT binary patch literal 1718 zcmb7E+fLg+5S@jP1lp#QJEa#xxHy!?rLDvRZ3VQd6e$!b6khsd>?JI+*Ou3&iV#26 zhkigms_M*cbAd!k`w+*oGjq<&>>U64{o^M9Y{T0Eye_~S1~cbE`X`Df`_ey3e4f;W zN*PSqmHMT7BBhK(x zIc_(=sY#@#qQ|b>AVb0(p-(I!)5yxuY1zWxq8I6gyrQF&UA`9n%~tukeSTA6Fp-z;yxFvjjjO56tc)-2%-}sJoEKS*DS)0~* z5`~(LLCHtADgB^T^BK(9=2`=~rkYH76EBHoJ#3zzG!XJE8^|upfDVdu1b4^QLzORn%IQv{nt>7^|t)^b`(_ zLF3o>hLoNFrH&D3OTgL&>Dd}+J!rI5ysI!f&LQy-^1ViZ@?5hz}V6) z-@}e?5`B*lXQYkW$)D=POk>Op%%a`Kp6mGL(YFALJ-%+|i-A;ISmjH72UR@} MnzMtyR~~Ht0Rd#ovj6}9 literal 0 HcmV?d00001 diff --git a/Module1/code/mybatis_multitable/target/classes/com/yang/mapper/IUserMapper.xml b/Module1/code/mybatis_multitable/target/classes/com/yang/mapper/IUserMapper.xml new file mode 100644 index 0000000..e76f81b --- /dev/null +++ b/Module1/code/mybatis_multitable/target/classes/com/yang/mapper/IUserMapper.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis_multitable/target/classes/com/yang/plugin/MyPlugin.class b/Module1/code/mybatis_multitable/target/classes/com/yang/plugin/MyPlugin.class new file mode 100644 index 0000000000000000000000000000000000000000..d13b95ba850c2129e03694a86aa1976dec1748f5 GIT binary patch literal 1812 zcma)+U2oh(6o%i~Y}T8_fs!<#T|NS|X*UV2Y56E^O20x%1KT!aLnPEI#~E#=@_LLt zPMceV5EqDEwL(Qgfe~>x50jg=g&XInO!so-_08pY=Zg zoWNWO&*Nkd-od*?yjQ~eI90+2I9S4s zLY-sis*KDrzthFMS`;Bex$4MKKh6X;O-6r`l9I5;_M#r#B>b-Z!r#IwkI*>jO zl;9-7!IT&&;acq<<66~{pD`RvXglr5swN{6>ax&!_qHTFu45B^Ci0YM@Hr6*D!@h0 zlPXq=Lhq?YDt<^3b}!j(MC`-6t5*|s&sI^u$vm%?eX>5)!J6OZPNZaDg_Hzua8Fsa z*4q`^TX17uQl)7Yks@(*Zr@XcfQ)VyRz}agTJ5LH}M%}^iVS~ zi_gh&w-#sE*TyH^N(%4M=4nABh3{{B&MpS>R&vxbyxMX|^3vgy5gngYH6f|L=v2{O zxZTjI#hC5OvFK#vdgPaF_C$fWEf4LHW$Q4;9O-aQW!zusctnPF#Uz&iRsB|A`wZ1= z9_hjE&|K*qqU#^u8#3s8BNS}k=N{#CEX!@}FVjieicWfMvrqHL?rf)hQORU!rvzy% zyn$Z2hw0j+OF2(7H7t#N^kvb^Xzm_e1N)U;a_FbA5HFh8Pw!@8fB_8B7j-KRkd=0x zq&Y`(?{CQUb*&;lwuJ~S(MKq>sYz->8De3JSilfoCx1peelz9FpeyE-Daqeqe6faNU(YH^lDvCd0s0>gNA|F5!KbEbTC1WL}Gcm^hNfR82 zCjJ5bQO0}Q!q%qya_{TA=bd}rdAEQ6{rUr71@BahVs!`^JmK(^!!r)g(|DmGg;fPF zIj?b8S5W1=q2QH**Svg_#%3Bd0m*6zjP0EmpAEfbw43^F+cle}vnDWPI}Ou0v`$Td zY#-vlb*y%i0J3YlMk`$0vOC8ulZwgCx#nc*)Yc#xrnc)w>&S2{{th;i?kDS9AQz$DXSu|kZkjH)5y%%y z5lqlNeSQU*D8?aJlT0+bWKNDq;_Q)$gX{TXOqmHZBJec%7LJE_u1(a4rVo|tXA3|~ zrV!boZ+DpJ+Hi%40z`-;0C*&>?NbV<2X@D)n>!Y}ta<{L`IZ`{a9hJIOlrttOv5;G z8uFMBnCQ9Svut*(7FkY{;+_9$HL4o6u+3pdV7OASuO_Ivz?*OB9+iSOHC1}2N`YsD z&a9wJLl_X+!SRo52#tBJ8g-nu=sR2URXckgJIYvk_Dr6>B$Ra9nLXuG-vm|70fDnFZ z7P5rp7$I_0$b7629S`G#$Wb9B5>g%@gh!2q&_5J#+4OuoVB5cu`gne1Sw4 sYW9Y|PEyJ&bfIO3{SBFmH~qCl>&!PQb}2NN5QhJg)kzEqS%C)H(n6LlrtA=!ixweOii$*0B`%%BN*yI}wm_!QRX?dpPaSlWlYymmG_xiknMO}LRr{Ji+U0O&nfjnJ zyMLpNS^|;R`arkp0>N_STp)C8v?(gt&p~w1 zWE(A`uY6{Pq0u#z_f(y#ggcsbLX5d`#RajT43C`qeA(xkVG@*pb2*)4m(t98Nl=!B zQ_h`h>f=u3G(C%PPLgFfo&xbRV{Epxw>q~R%Wu$OJMj9CzS!4tXi_tsr zM`OL$)=Zi|M}E=Uhccey1&fyg^6rK?ZRW7VwpVi-bFl3JHfdv5hbfR+)Oy$KYAuU4 zrw)hOfabgB*RyM+OK`N8C4VPd&AlP7f3bYL`Wl<`aFg_;g9z||=qtc8vNer~v;=ws z$dfG4Ng*vrhpU$m-)*;>BqO#lf?M=0I}W&wH983tafjq`@DBvOd4iL^!FRDf4XzVe zfJ;?(ej>0a9k;C+`nR%nhP>l7EzfA&7gKLgw^u=eUXX$>$USWNfdsuEYXnkU0m6f2 zkZoU(kQZd#7v#P_NXQGaMIhTNKzOqZLNAsiujYcL#(S;*M)>0;BI)P^QkB*;K`b42 kzJsJvr3n&g*)fD>hSXQGPH@fJLD|(oef}Uy_U6m~0bkeaA^-pY literal 0 HcmV?d00001 diff --git a/Module1/code/mybatis_multitable/target/classes/com/yang/pojo/User.class b/Module1/code/mybatis_multitable/target/classes/com/yang/pojo/User.class new file mode 100644 index 0000000000000000000000000000000000000000..5a04a0f1c27501da5ca29c3ca9e6c09d80f1cfc0 GIT binary patch literal 2352 zcmah~?Q+{x5IypD9JO)n#OX8zoQBjNN$ZvZ4derwG=&tmY2zl)pGu-}m2squESCuk zufVgw3`u9`3=hBq@C@+3zZuTz%C>Cm$q(PVx_9^N*`r9#D#-rahrL3^y>(uQNVJj3?(jAq-6|MS=1uXo=4yrdyw9cswcj*QnvwQ1Om>Xz-9 z4bxrLkZKdlHjYgV*^oosb1l2U`!UBoG~Jrj@|adRv^}d?l@qzHTMgUr+AiaZ1J^6H z1LwGUD)~;FBd5A8NXu)I)ODJs!n}Dw&<;KQn8b=@Ti%+6XsNuXA-3ThGUr6ivdyRM z<9*Y8VeB{kDx3pKV^API2Zu55mDSQPIlyR_wUbV%6so)u|iyQLiw61C9@r@@cSwM?{M^6(U~=b zmkZMN;Dmp^)+g`jNk`(!p!=vq9TnuwD(0mNNp`zHl<5VQFUlFjNy?PxDD5<)>rUG} zFdtdcFJmI~Z5a(6A7Y+!;*W`6^#j*6PKBe6_wj*_8?s!(jE?JgPs4O?pcM3a+iJ4M znM^=`v<_Ewyuhw3WS}n=+QFM&Ey~%q{#kdxR@ohk1vij|pd zIglmd6mSZ8+SB|%MsSrsO6uEG)!!*L?+d;?%X{kHeV)TOZN4e4H|g;lQCh%Eque@GyyIE5As^2)1ADG^Z8aEJe63M)(`IY?w~ zD3OnFZy1q~R*FcGL`oxwh$5oE$M}RKrKm8G*dURGAw&ucir`a%+{aP?@{D^|nV2XO z^>tN*sw8x01R>R+pD{vpPJ-WuSz@a!pVL|%N;N)6_1;LTD+E~`PStPdFxC5{x-^2S znw>D!8<^`-U8BX%3|CRrp&Zg@n{Scg7>#Aq=NOlsJBOaVr0gWOOz|9-vlHqdCYKpy b$7yGN;^jH643@eQDs{8lr(ZH%1P}fLGZ4&( literal 0 HcmV?d00001 diff --git a/Module1/code/mybatis_multitable/target/classes/com/yang/test/CacheTest.class b/Module1/code/mybatis_multitable/target/classes/com/yang/test/CacheTest.class new file mode 100644 index 0000000000000000000000000000000000000000..da1f790b2abb670e48a20ca8511658fa1f36ec3e GIT binary patch literal 2411 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis_quickStarter/pom.xml b/Module1/code/mybatis_quickStarter/pom.xml new file mode 100644 index 0000000..aff0cba --- /dev/null +++ b/Module1/code/mybatis_quickStarter/pom.xml @@ -0,0 +1,47 @@ + + + 4.0.0 + + com.yang + mybatis_quickStarter + 1.0-SNAPSHOT + + + UTF-8 + 1.8 + UTF-8 + 1.8 + 1.8 + + + + + + org.mybatis + mybatis + 3.4.5 + + + + mysql + mysql-connector-java + 8.0.11 + + + + junit + junit + 4.12 + + + + log4j + log4j + 1.2.12 + + + + + diff --git a/Module1/code/mybatis_quickStarter/src/main/java/com/yang/mapper/UserMapper.java b/Module1/code/mybatis_quickStarter/src/main/java/com/yang/mapper/UserMapper.java new file mode 100644 index 0000000..fae7d61 --- /dev/null +++ b/Module1/code/mybatis_quickStarter/src/main/java/com/yang/mapper/UserMapper.java @@ -0,0 +1,11 @@ +package com.yang.mapper; + +import com.yang.pojo.User; + +import java.io.IOException; +import java.util.List; + +public interface UserMapper { + + public List findAllUser() throws IOException; +} diff --git a/Module1/code/mybatis_quickStarter/src/main/java/com/yang/mapper/UserMapperImpl.java b/Module1/code/mybatis_quickStarter/src/main/java/com/yang/mapper/UserMapperImpl.java new file mode 100644 index 0000000..9e818d4 --- /dev/null +++ b/Module1/code/mybatis_quickStarter/src/main/java/com/yang/mapper/UserMapperImpl.java @@ -0,0 +1,26 @@ +package com.yang.mapper; + +import com.yang.pojo.User; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; + +import java.io.IOException; +import java.io.InputStream; +import java.util.List; + +public class UserMapperImpl implements UserMapper{ + + + public List findAllUser() throws IOException { + + // Resource工具类 将配置文件加载 成字节输入流 + InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); + // 解析配置文件 并创建了sqlSessionFactory工厂 + SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream); + // 生产sql session + SqlSession sqlSession = build.openSession(); + return sqlSession.selectList("User.findAll"); + } +} diff --git a/Module1/code/mybatis_quickStarter/src/main/java/com/yang/pojo/User.java b/Module1/code/mybatis_quickStarter/src/main/java/com/yang/pojo/User.java new file mode 100644 index 0000000..d859618 --- /dev/null +++ b/Module1/code/mybatis_quickStarter/src/main/java/com/yang/pojo/User.java @@ -0,0 +1,56 @@ +package com.yang.pojo; + +import java.util.Date; + +public class User { + + private Integer id; + + private String username; + + private String password; + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public Date getBirthday() { + return birthday; + } + + public void setBirthday(Date birthday) { + this.birthday = birthday; + } + + private Date birthday; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + @Override + public String toString() { + return "User{" + + "id=" + id + + ", username='" + username + '\'' + + ", password='" + password + '\'' + + ", birthday=" + birthday + + '}'; + } +} diff --git a/Module1/code/mybatis_quickStarter/src/main/java/com/yang/test/MybatisTest.java b/Module1/code/mybatis_quickStarter/src/main/java/com/yang/test/MybatisTest.java new file mode 100644 index 0000000..fe1868e --- /dev/null +++ b/Module1/code/mybatis_quickStarter/src/main/java/com/yang/test/MybatisTest.java @@ -0,0 +1,86 @@ +package com.yang.test; + + +import com.yang.mapper.UserMapperImpl; +import com.yang.pojo.User; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; +import java.io.InputStream; +import java.util.List; + +public class MybatisTest { + + + private SqlSession sqlSession; + // api 演示 + // @Before + public void beforeTest() throws IOException { + // Resource工具类 将配置文件加载 成字节输入流 + InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); + // 解析配置文件 并创建了sqlSessionFactory工厂 + SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream); + // 生产sql session(自动提交事务) + sqlSession = build.openSession(true); + } + + @Test + public void testSelect(){ + List list = sqlSession.selectList("User.findAll"); + for (User user : list) { + System.out.println("@@@@@@@@@@@@@"); + System.out.println(user); + } + } + + @Test + public void testInsert() { + User user = new User(); + user.setUsername("王五"); + user.setId(3); + sqlSession.insert("User.saveUser",user); + sqlSession.commit(); + } + + @Test + public void testUpdate() { + User user = new User(); + user.setUsername("王五2"); + user.setId(3); + sqlSession.update("User.updateUser",user); + sqlSession.commit(); + } + + + @Test + public void testDelete() { + User user = new User(); + user.setUsername("王五2"); + user.setId(3); + sqlSession.delete("User.deleteUser",user); + sqlSession.commit(); + } + + @Test + public void testAutoCommit() { + User user = new User(); + user.setUsername("赵六"); + user.setId(4); + sqlSession.insert("User.saveUser",user); + } + + + @Test + public void testMapper() throws IOException { + UserMapperImpl userMapper = new UserMapperImpl(); + List allUser = userMapper.findAllUser(); + for (User user : allUser) { + System.out.println(user ); + } + } +} diff --git a/Module1/code/mybatis_quickStarter/src/main/resources/UserMapper.xml b/Module1/code/mybatis_quickStarter/src/main/resources/UserMapper.xml new file mode 100644 index 0000000..494013f --- /dev/null +++ b/Module1/code/mybatis_quickStarter/src/main/resources/UserMapper.xml @@ -0,0 +1,22 @@ + + + + + + + + + insert into user (id,username) values (#{id},#{username}) + + + + + update user set username = #{username} where id = #{id} + + + + delete from user where id = #{id} and username = #{username} + + diff --git a/Module1/code/mybatis_quickStarter/src/main/resources/jdbc.properties b/Module1/code/mybatis_quickStarter/src/main/resources/jdbc.properties new file mode 100644 index 0000000..0c86ccb --- /dev/null +++ b/Module1/code/mybatis_quickStarter/src/main/resources/jdbc.properties @@ -0,0 +1,4 @@ +jdbc.driver = com.mysql.cj.jdbc.Driver +jdbc.url = jdbc:mysql://117.50.15.23:3306/study?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT +jdbc.username = yang +jdbc.password = yang_stuty diff --git a/Module1/code/mybatis_quickStarter/src/main/resources/sqlMapConfig.xml b/Module1/code/mybatis_quickStarter/src/main/resources/sqlMapConfig.xml new file mode 100644 index 0000000..8b6a87c --- /dev/null +++ b/Module1/code/mybatis_quickStarter/src/main/resources/sqlMapConfig.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Module1/code/mybatis_quickStarter/target/classes/UserMapper.xml b/Module1/code/mybatis_quickStarter/target/classes/UserMapper.xml new file mode 100644 index 0000000..494013f --- /dev/null +++ b/Module1/code/mybatis_quickStarter/target/classes/UserMapper.xml @@ -0,0 +1,22 @@ + + + + + + + + + insert into user (id,username) values (#{id},#{username}) + + + + + update user set username = #{username} where id = #{id} + + + + delete from user where id = #{id} and username = #{username} + + diff --git a/Module1/code/mybatis_quickStarter/target/classes/com/yang/mapper/UserMapper.class b/Module1/code/mybatis_quickStarter/target/classes/com/yang/mapper/UserMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..fb924a2424cd16e7e31e38d61112de6efdb97edf GIT binary patch literal 271 zcmZXPO>V+45QX1BAOz@-%8nDHn_8?vNGw_jDODCx58wt9IWlpSI0&xBq6g@q5Vk9^ z>F&*^d2inQUN1iY7I+LX2{9#1_OjY-l=^B#LwJc_lae1f>x@(^k*!%0#_y+G)JE#6 z4e>yTGFepIbd4ay{|u`n*9UgyRl#aqYUYBMYZsI0uF1uRRMz+8@F%Zp(Y(2Xg!$ce z@YoywHVDtYlyafzcPVm1n0X{M+otz^Ljs{^9|R~M^by!;V5h+HAwsKq7+D>8HNF8O Cltu;s literal 0 HcmV?d00001 diff --git a/Module1/code/mybatis_quickStarter/target/classes/com/yang/mapper/UserMapperImpl.class b/Module1/code/mybatis_quickStarter/target/classes/com/yang/mapper/UserMapperImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..ffbb1d7322f63414a83c05c45fbd4b65a4c98063 GIT binary patch literal 1278 zcmb7ET~8B16g^YgF0_kaD~gB+h}cr-3VvHcf+z{e0*O@;AE(PurrGYUyITVPN?$}Y z@dx;$jCXcd8f|Lo!_M5fbMCz}=boJ(Kfitlu!>p^dCU*vZVn5$r(rRNH0ITCKaUd1 z!&u6rf@KXW8mbx$hU~g@WVpdFR4N}Zq_^Bd!7ye@N9=Xl4dK7#4Vyd#)3vyLze z2meDiI!5&P1d_) zcy7y$sHknIH1+6q+fvb4{F9-oVnfF$t`HA&NaAkGb&h1SdfK)%tm;_9Lx#2gxb90u zk??g);*o~OI-cMugRbgUlV)gmrsFwYFwFeBfpn;-UAAiRexoIukEDVBEx)nBYu6`7X>CZ;@cfuUhTR;t`hap8XNsGoYS{XDmnlnr1 zV4tGxaT>Fca}-y})?)w)DAJ1I8YVCl1)or|H2LNWsV^8Zzajnp9GS{zWOtV@pfT*N z6oxM_lEOzqrJynwqKG0@m>~NGZjvNbm8CdSQYDLNT&G=n9Vlv&P$~LGFoj!Gdz$cR Q+PjUJDDNGzXCrIw7rdxhHvj+t literal 0 HcmV?d00001 diff --git a/Module1/code/mybatis_quickStarter/target/classes/com/yang/pojo/User.class b/Module1/code/mybatis_quickStarter/target/classes/com/yang/pojo/User.class new file mode 100644 index 0000000000000000000000000000000000000000..c569589fc998f1498d89cbda5114127fa5efc41c GIT binary patch literal 1642 zcmaKre^1k35XZkyw{B%r7=;Z5)S=+U7|i)wVW5B}5TYh1iGOxmGfGCgbe)D6-;*Xd z5>0#oz9{3}+Ob(W|G9gfd+xdWJa_l}{`2D(fD&FNFoDttlDNm>K8pt|9>(z~ffz~( z9yzzJ0HtC&?omxY6-aunZP#oRcXZbv$Jn}QneK)_B)4=Z5Z$(G z6mxvvw2as7lZxTI(<_Z`7Q3o94t2-my>E=VM`lZ4YQJiq6i=D3X&>9g_ryk_N9%_B z_5x!nw-g3C+8T69E5AVEz-~KL3);FAX{y-Q8OHBA7B4$*2*egV2j1JfLh43eT;IJZ983Cuj%D1m8_8IHJ+}nVxA`D za+_!-`kCKUj*Y5IGod$|hDCK)8LWdpTbH}&qf*EJ@%N&w{m*|cw>|tA^YmvX=u1T* zaiwS_ak09ZYS`6OM$!ogE-lGf+7(F)(sKSB;#=2kj%3U;;ySHWe|-ZtX(y1OWWmd4 zkiG^kkA+^oh1>q+4I-2{Ret$9q<-o|*Q!CLS8)2Y=LIi4qw#x~dI5_eAdw(QIuzs% zvSA>RAjk}X%nkwJf-*=BOCcc9AV?+@B#-4VkZ2HOfj}0AfN;kdq!8K~IS7&q1z8Di zjT{6i5Xj095FR-Op)W*|2h64R@qq39MC`*k;+oRINd64b4ieg^x0XpIvmL0~70)1D f7{)w9guIhq$fJYt;A=_)ui5j*M9^UK7r6TukPjSH literal 0 HcmV?d00001 diff --git a/Module1/code/mybatis_quickStarter/target/classes/com/yang/test/MybatisTest.class b/Module1/code/mybatis_quickStarter/target/classes/com/yang/test/MybatisTest.class new file mode 100644 index 0000000000000000000000000000000000000000..be7826a5a6e08322f3a2149fdb4ee28ce6fd80e7 GIT binary patch literal 3237 zcmb7GS$ES`5dP#ima&x(41|WIKnWqcTgnzf16iOLoCLB_=&Cr1qg0lRC8tUEjc!o7 zLD$olzVxXN?J0r4IX!*ukLVLU?XPJ2UCEYB5;%z;?lSk@nQvyk8TpTYZ~q41F?<)n zZk!6^bOcHC%NU3th*M%1jN%N=u0cJ9!WfQX1fx-m;an6?;k+0w$as1Up24$WJQu<9 zctH$m1l2;{xR_HBOh6N>$uQDF#grKIFs8$JQ7nxxGGaEvuw-N-*eQ(f#6=l78McIo zebE@!Y+JWX2@OdrmyWAhH8rKh^>NkF?YQk7#)tiTof1MvbW?Y_BvdpujY$ahS`(Ut zwMpI72J)G4EjOZ$8w`p1q6?K_sDXZyQrbY z_1nW%45dJpFln2}T$rQT3DseG+)W=bi%qq-)}42(UMrK)i&y*AY*x4u5grvcJ4)6w z?z!ukcbdp#4dReh!w~NB<*=K&6S^QoO<9)PMFtf#qKR_Sknejfb5c*Y&t?o6c?C0g zNy6ThaI%od9+7-4r(iE;Wy~pf8Lud4z#a*TK+`^{n-kpzwZE$1HM}n44FzxFEg5es zcn9w)xP;@SO|5R%bM^P;d>`6?`e2m%T@OSwZfdyqg~H)>pV*6i>K`^2A>Yap<2LH~zZx zlZ1zTyvwFT!8iDpl=g3lOqbUis_0=pJith$-*Y`RYg_Z99gs_mv#R&>i!q)U5Qfj1JOR#r3pM%dW6GHWDy z{YuQR3T(GEh&tz+`$wa^8&ta)@Ffz$x})V(b}V)ZA}k#z3UcC!EtQgCQ>s0n&C)a* z_62qz)7@++Dk)36=pn8OFI984qp{sqSb07!HQh7JV5#Z)R4EhFXjWV@_+8n!oWJ~T z+#~mR*D1ayQCo8a&rLPMp0Tb3Ct*5TS~L}TMm6%<;G_sdq7VreaN!2MsHBnvzXY}A z#*4?oN=PsC#69IV3gj%KYY|w2Pgp{3Zwz@gN{LsM#9U}C0ynczjI5u%PJVUk`CkB# z5D+bit1#DWe;k{+i*uGZS2o{-^fMO$v~Uc$!gXlnTJbKR4ei`XeA0vp_i>uHD=6C* z3*16Q@(zOMZ=$kg9-;o`)&p6;BwH2`mC#Qpio|xb zor@|7zoUBK7p#rd%wrwrwt2*U{O?Zzv%>X#GYtT{=yyFswwqoz(C{7_YxLnZU@bau z*ahBE0IqQE#1X=Jg6~DtJV_T91{$Htb>E!56q zlk3bwbfc~U=fq|KnOpN~PTTl@tR1yX&Mro;mGKj)tM!x@0EX#|0KFJa_k-YU zSqx_@;cR;loc)AzfN&1d{2{{WAe6(afYY-oI1dxf_6NZ^N;t;|r<-tk2&b1&`c?s_ z*M~DzNLGC*Svy2@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/Module1/document/01\350\207\252\345\256\232\344\271\211\346\214\201\344\271\205\345\261\202\346\241\206\346\236\266/Mybatis.pdf" "b/Module1/document/01\350\207\252\345\256\232\344\271\211\346\214\201\344\271\205\345\261\202\346\241\206\346\236\266/Mybatis.pdf" new file mode 100644 index 0000000000000000000000000000000000000000..dbc348f4e7e01187ae399d65b20cc9aa363cb236 GIT binary patch literal 7135986 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 z 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%0D(5Z{GxVU2h;}g-z3nU_n{Zm=R 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 Wm@awNmseu2I3*mho*t=M8#_d}C~feRSmw!DZ$ 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

DoQ3&1u zTC<1p@@ZVl>yeyPZS>*l+2Sj;Bf6wsy=_boukrT4l>P}*LwJYq|q|bk@Jw@e}Bztb~ z0daH9k%=mfT-5G+$7r-EGGBbQ<8)D7a*UVqY3jr@?XHffP$(&&b25fq?IBj@!(`Yg zWx6C!@L4QIs{SaK;s+iUN8f)pOf>izZ-943+TU9|MxRSZn+K>HbGyPZhh948Idr;A zd^y7HT1iKS*3eAR+CBVp(cX+4_AN6DUYA(pCJ$v=r>RY4oDcX(k zpFd9J9n8AG5sfdaX~nIBbIH3UNz-fZ*+~hFIq9LGpH8YeJ#Qz<4MOHCSb~se4ymcGjWX*4}WIw12cEclaEcaUB2ye?R`mfeSb0= zz5sc9PfD-C*UWZdMtf!@!l<`pV8Y-!*dMlqd zQe3e4_&F{%jhn8fvI_3g_yT>76Ub_5(UY&JLoKn z4W+eH)U<9^lhGQLg9kAvqA?)+X5Kp{y!)nEgFJQaZz>$K?z@%dR#c~-B;LECbGa5R zN1F(O=JfXnDzK`ujYNAeti&G@o2xdn)w>tMr`Tn%s^Dd=XhDEH8YnZ%gtz3m;^&cx zA^w-lJ%yi{c@tFxzU}2Vl5aIuQD+o*@>)*};Ah}!8iK`E4Q(strkFKePNscYSif=W zt=_zVdcIfS(uFiLRK-4@e@VgFi(S8v zDTg{rw}xa4kGy220y;u$9YI!}c6hX$cBG1KqJmIbQn0U^^$DRCVDIV=cHN+JwiR^t zNga2&v=CxrW8>gFlkMz!m8-P;A6&g~ zLveQv?#11MyM>^^;Z6HI_x|4h{g5w&bI#5_d#}A_X3dNMa-?)8Ogd6-Nt~@UH7lq( zb78g3XHi)4z8qyZ!{%s)AaN58FSO<7Z~s)a4>dPqwj;T`Thxzj+8FxG6?!1ZK!Kag z2u*EWX^(aQaZ5lO->g=K_5;)%)T-{=IhGl$6c(kW_ERM$TY|{^-Q}@fr$=Y=sfWkR zk2LcE(Rawc`bW;6d{=GLS5Mc- zW;dQODM?nfV-&{D4YyIoKjjVHDfjSGl>ewZPAVa(>x{xp9iOWtG{lO5>J$ z676v6mP_|K-uNp`D3d9WMrg{Un{uCPbdQ0?s?08decf%B_MwCfA3bYp%_GbLOciZL zLp|2{l}9BuLLn>a=EAh{SOsPd?4)SgP06)#$7)%z$6rw*4!yf-qMlw&>GO6W2i-|M zE)WFG-SvOtf6J7Nw^VJ{leCI;bDH9Qh17!ejla@eFA4RR(v1e|{KJqrM{@jN->dGh z8mAQYEgHF-sH8lzls*^fZ@XhN;bra$06T706$v+^?J5wdvU z2XB|n9@LzLW@YO2O=}fZy_}Pt%bnmB#OOJi_`!SX=DTV}So1skYG$EG99*~N$6*IW zi~d9}=eIFHAF=g~ijP$C9^d2*4e7Vx^DN3|KJsJo~7eJimb<8O?@cQY*O@oCI5O$(<;M==sNov|n?0ctxGvtiqk z?2K5tu{9IdlWyunZl6!rZ0gLCXGq=8GI!nLa-_v=S3kNVO1bLTG<9PS8r@`5lwHa! zdojO}2GlRtFIc`@E8dN%ryI?)O{nr)|+2XNst%_;M{8Eru`4f}=45!9RZ2~Z4%f|7_33VUV zj-ily{^`U85sjq$Z4~2@WK_mpl9!oOEAb7Wam{;W|75dO*sgZDe#yK{Gy%YuBf`;5 z>}ub-8a;DUd1AjPUXgO?`zPa-qK~^y=-$w3KyhZY*LRorh}mIE%->Y6nUeEJX$*(; z_n%J1V{11F6$_nHw6&~-PhwpH7H}^iz0yt@b%7mqtInN`w-owIu-Il;XG6#!6{-)+ z8Gu(ck^=JBNod+Yx_vqND+t7M_G&&TWmskp#8mbnk8kgdZ|fEEi}Rs~s4Gq9LzHZ{ zOVc*Mro_&_|5kAO)jM|BJIy_qY7G_WblO4*^FNi0(u*3yqzjyVdr{`k{HaBB+!8WZ z1_W|byjB4mR5bF4tKk>9Ek1f6WYG!MjIWp#247zwt$yAY-oHRMS68a4swgNZkJreT z*-l=@5PNNrz`~CHB^jQ;+-U|WyUwhTy!}lLVS^s;!XH^Ju6s5{SPmadDCz?4w)SY` z-vojzu!UZ=C&wxToUDPlqV$KBb2z!GUXq-9I6cK{vtIihBhbLEUl~NC?4Y;|M2>Bn;c|mqjM91O zir}B2+30dE#D$3%-I42{X3C<1N3)|5_L5@wACsZqiqB4}N~6S~hkv1NO7rBunKc$)Mi z5MklN4w7#YSZ1y4VV5g!Drc~6<>gZxi~|PG-x(+4@0Ug}cMdi_pY4z&-=VFg`CJtC zCF(I=Jlr|2m_`xTCzi{pkuW-+(wD91caX|HFZYFM0GBcf@-YPi=FH#DtgKN{?ZkDe zqLm<^$-_)tvQuL01w6GVF0`s)1T(=+H~lY}GXlM<6(41F6`YGM^{cj0ejYuR(y;#%K5&r{9_6S^@;YA*R4ApbAsBhrYg#8>u{j1ve+^e&@ zk^p*Qx+t!N*E?%24?3H}5H~NyKLj@$#!)}AU4^zR1? zO0(U2>G`c}*V?siS1#S>3VRZVm9fM}P3wN=%+|~DEo|&EZ>?y}yph5WXQ|UHOtw{$``Am}I!4YXiX`AGZCQ#+E2C!#eE+%t?D}lfFt?8aUcYwj-vJ0=KwyN9S4H`dGRIJw=>m<#< z!Pw)~6t}*9 z{k=x21#Qg`0J#EiwzK55{{=VpEmKK^e;hLE{v~~#$ZAq56UeyLr7|{1MgHT7i=$S9 zm$du4nxbYPsFM>|dTjDdAP?BSb0iKsBVXKEY*lU)J&p2e3(pIzYel9A=9ng)r+AP@ zg<)#%^IJ!N0>H|P;A2ri-vC4JAmiBJl{opx=#l-|S1k`~lYK*9Ysj1#$(AYbymlPtb!%79iHg5mT`#w4zYWZg#i_-bWT{aPiel9&&Sb>laF}+29 z%GWzX^7=8>PZc73rN3NdkwNTU`tXJ(1L!WMF4bCI^RlWX#oJz%%ztwKT&aLzG^Be> zq5}z8vD4~U+&hSUB|1SQ1A+DS4?4R6*95vB&sO-2dkLBkJt&Kv)^6&t=|?;Wl0i5J=3l7bpOVajxWUE z;jNrX#y|;cl$hfd<+7$2EZgD=k1^gX>l+L>(xSunLi@57e)mbC&TV9iCBQ^<~fzvQQ9=o6m%X6U~qKPy=f&0;QncG?lbm=jRunn$GDd|ul%~|>$8>Phz+B?o z4aye|+lt*5m!xA9g(QS5;~vH23s+DJTEenp+&Y2^fbEC#dVfQE(WD}s8SS}#pd47oifpfD zoGgZA7do32KBfSM68n!RhNOyzDSQc2IOC82@bR~CSjjLBkJG}WerY>cbm(@;@rAUG zm%h)#-uEzF_QeIm*(0upJiz_9D6RKvHA3lP%>7Fzj|%qU-L*z}XS+k|Qj*@D&W&c| z!1d1VV?Dcj;74fWqm$d(6X?&76pPI)S7SSK!3hqA&fRgQ8E4aaUGE4_$`Q1+;|8W! zD-ME+Uos{!*EBjXH`KH6xevw|m9`b?@98vI%(uA;7FK31?|v*gIe+%)$Tc32ce9Qr zLEhS(g{2%&UMc!8au&Me1oc0YwZU{}o0*j!Tc*DfO=>c&=^oW)pTFau_#zX>l6k6v(oE=9ViuDKqz%^Y;bByOjg|yh^D{pQK7UZUSX{1-Rg4$AL_#rVb7{ z(U+DUF&rAi=vlK`4qwa%T%&;2i54=&qZmq986~5=EF*mv^65U9--UHoJBi@2j*kp5y?Z zT$A5GT^^FG_Ao|B(>q=9I-)!tj5MSMT|GmF#R z(jYj2-b_*meB$yWz_^8s&d=yp)*esYxPr9I4gf`bkK~WoIM>(bU+oR#ep7iYd-*lnHPL4yTHtzGEp!{4q#=-Cx?Fz zBq*fJ9kPo(gxh-ulC~{>8aJO|E^4Q;6@)PZyV@LAMWiX)1A_Xoiw|?@bOe?4e=LPt z1@elMCYM2F3+a_QM)l5xi0e1e{PBdPzX?Tf4lkqjNgZDZGVX35KInruBKKXI$P+h<8v3l=fnQS3$qvr;84Mv%VX}0qqSH2Uz4PR_+3ple9%#bbJ z@KNL|Dnqy5ud5~M>Vp9x3{#b65zcNf`*zH|t|cqkjwL=ibOQ?O=wwNw`kRoLUd8>Kn4UB@Vr(m6Nrmu1A)?*AFVC=2We0)UWGyRYA;oxBNq~eX2CP zq>n(yd@Zwr#gR_)eHMzMucg=eJIEz+Id*+(VI`RmCOCncYGsq@@)g z#7~%+migIfem|a?o0a=s-#Nuiv)DqiTEhOPgyJuW-$fn4C*PgSXW52Y-Zu3QzmfT zQ%p@v5sL(BZ#o(eskbEK) zL~h;sVZSB7HUkq+MUGzB>J6jHUM^HQtUP8~J3Cr98;5p-1>VJi>MRJ$tSuISNe{so zR@!SkHhN!Z&6aG!F=+a~WM?Qz#wLlqrSg-(xP_s%@`S^y1Q`oDUMg$~v0)VMVwmG1?KOfZFVaoijSY3H7fMwI2kq#+ z?!}`CN3XAK!RZ(#NkAl%D|JvndD>RwMMibPM_##J4;e}tWynjSi7A(EbI;)*ow)0` zaI~Gl>h;dgeU^_VFiQoE_ZegLYnd8unM-^*1pC|Q6qcSXaDcUcO$Y?}x&KaSHFZCb z@;crYZ$-a))EMX)aHxD)Fv67Nk6Kx+3!FFiku;k>K+O+S98{j6dVh1B<{3J$B2>(o zsN$b0=UOTiAf_ad>|D$~29{~P@45uyXpXArcKyOSrnj(sKfR*Qwfs{r+6Xwc6&Fof zY^!U#WRsaXV|LIMkynK@90-C`FHJ4ply+Dc2KL_zxA^G#@HXG*H^I}%H7M2u%**$h zB8j-1Vs-2@aR|JbZAM#rdIy!4j36T=h6*s3GrfgcCxgAXzT#4gs+yp1{FLJn#o@)l zPfB4{kKm{oz7p7QP}P)B>5OJP zWoaP>8U$vPE{EZMD?wXdvdzk4Ia0?!vkf1E>iAv=A+*BJbr3TmwEiZr%aZ^8iYZhs zYN(LRB;;oVgIqpagZYe+G!lW3r-+PSybFrBW~(*pVEC= zS`OQry!xSHnY7smvkB`V%%Q`KO`09cj$9d@$Ffzc;}46w1dYpnepQUTwbXtEyV3x& z`KMC}L);9v#V4G-k={~Ao7(o^dUuP%x2x|p{C(O!lzuE{vfnv9?+U+a2MC8Bz12fY z3JDkSJ#VjG@di4inK+t6IRPf&nkXJiGwjJXwD$EeVi#7R?~s^%V?aDN?R1sLHLe#x zZ?W;w`Mm0uORPpZRs+hvk!yt2j_BKYFgQ9}j-_~{>^oECA$`d)9Zb?fTylKAz!g|w z{c}Q2ijmgxAgYy!kv~e!KTw#PoT@cJQ*#y0E;hS_J)2L_$$fLU%w~kiZk#EPx-1BT z1cPFt+b1Gg-);si!eAVf*}mtlG<~?mR3!6K`&orTJYvM`XZTAYE(uEVt3+tu`F; zeyW0rV$dPuRX8~Z3bvXuCcEc&2AYYPqIn7>l2M_Cp_!_7Qx6?e=Zm111N2R*FQ!^W za=2ooU3~BotqP6umu-)|k2@l4XBQ5iX+vT8*mM}-o5hQDZW zWRHqT7!?#{@QX|>6prrYRYz7L$c*FW(+ z7{Jmcp4u;ClqH?nfMI1U2{_87v`~tE{$iAyCy$*X|6#9?RW`SJMy0Kdwx0`|gsGMl z0-F9S{#B>cvHB;XoKL^IedshxYi{OJ zKo2-HUGR$1Wt`~8oD)mSvqHQJfdxdKNKMN&fq!6XoA6levSJ@d(c}tgMutHuNgBMc z*Q0UbR?UbJ`p+juIe*62-2!8YdeK=1!FtSJpVB%xo5)AVR)y->ow7EGe@!p8C@a4Z z#q<<=gg7nX;NQ)Dc5MakEBR;cuI>Bcm(mw^J3X%5f#qB8=00zH{CV_lf-M8pi?Wo- zG8reACUQceMsSpbM@x`@vucpGmY1K)g34z?%=^0JH0E8UR5UHS_HOn|fZl}6 zXU~f%J}1;ZBahFXZKXD4jOtpZ?kiOcYo<*&rYU0n?+6j6T&_IUbwDt}CR^M5=s5e%|IMRAc247?45NjS6FO;CXhI8dEE!@ao z7uV-H0tRY5mJ(Gv}hQvRX`=4Z2ZCePsJKlOBH!BChx>|W@4Subp^Vav`Q?6v%I{WZ|AT@Jq z>NGL0H(A<>O;dtqf$#@$c%rw?!mK=5px(fs$l>GZVRq?dn8^9o;i>7vUzZT!%Gz@> zGA~u%^gu`2yalQ)3(+#t^SLw1Y(pmsS7U(>AUiF^KzSYO_`_GHhrR<8j0gJZ?UqKo z>^$}t*)E&oWrNv9!J>ljD@rbE8UF~4w6K0H&}RW=e%@C0)}R!PwbvD;ei|1NmrxNi z9T7FJPx-YJO)0;dzV}zqskC!NMp*G#>tucKdMPm=x&PRNR7OTj{8&0LwIZ#N3-sR+EJNxkpzsgxlO)YkS1xPrzRIYNIP{E8g^*I+!FKmV)dfLj~>d7d6CU zCBaOb)L(yYDeh$t%gOL<&|Sdq7mGm7xs+NE`2g zfNVnvKR>gB*_eDq5(e?Z{aE{1QZR88-l60ONlp}Tx+)uEmhfy&w`#zEWX3tzWgiO49Fgz-E{H+n|?2 z$TV)f>zky4RR*bmHwgviSYc!6YrX}EE1KH|aj$238Jvhb5x=bFl_Gza2~jr<)!4gD zrW9A-6<6KuPDmI?n;Kx}tpYMN3s6LSr4)3}OEi2x?=!GZ{@A+Y$uY<)T>nw^^WIUo ze|;6F{_^4teZ7En#U0@?Q~lO*&&DNZ6AcvoxL;>XaW}-TC}tdICc`Mf5NU3Zs$p~? z{&&OcH)@~z>w`A@MS})f0Sa@2r7J1g?oWl$^;*koc*?Qwu7d=_E10fXpjAC25{0C)~+d{KV1w@tYfQ^s9=S4`bjPAZd6R zLlH@Q!az$6I>;!s#son}7Ela0^_!XG$57LgO#hrT3;T{QFv$W-O2mvHxFQqcd-2LM zdu{fMj!;QQICo9QzL}=kxF)ZN*&#xO9e-$V3l+HCp4+nSwTwyxsCeC{%iuE?1VD0x z$WN-H19cs$tq(|wu8l_egrikYXOEIYyWG*mCS`5)w(NJ7+vl%S4dT`|^QX>F-JOgC zg}=`$JJ-e^QB2?!lfT@1(%)cI%s$MWlfRQ>T8JBAZxhwk11nbF*=0+(xkIU^G z7&(01;UPbT@u)i7mgViLSauQni+2bSA7UNmB@VCz04cS`jn__4`9^PjQbjI=2!6RK zOuK@mmZn*4ZBH*V2Nsldf!jGFkxTikItZH}Cnt>b^!L&OLw7-+VEW{~dSYI}uKsf0 zv)|c?K9*9e$jfk501vZc-3}`t30X2UN~cEu8Fl?g)9K^m9tl5fjqZsIfhk@!%5(7eTL_MiLp^@1mrrWXnL9=rG>93>GF521pZ zdCq<*;i+M|5wb#1(OrvK=ns&Fv%t?X77iK58u@b+MujCqaj@aGiesnQtP;F*T*J1k zn#q;R_80|&({}}&6tr;b#3Mk~k!RKCO<%bWHdHx{k2AhlNEatc_zg226DTgHL`Lr` z5sXZ3u(2ClQVW1%u#7m{4noo(RrBc(sh5~H%XC_laaQG1#Jx)}yWp5=sc$ZE%A5;| z7Ob|L(c&g084r<&q1YohwJ#U)6eF8j@3{U{;F6*BV&~^I+JyZVc%@f_I@=H^qb9FA zrdWl*^WE+gqr{eg?6{N{{w9_Ri0ujftvTOz_cOOk`?x%FF0j4T-^|#YSM61CrzO`L zmLKb12wU~%Fvy6Qb;KTEbvsJi3wI9}HlPOk?e*D|4HaTM1zVb_iKztGn^ncXm0;B< zES>8!%Ht%`d4TdJ%EsoZ8RNON785TuZn%a@Hny*x!98eS5yUb0tJcc&t5#Qo!}UG} z1c`@+2mH+Z7+wrZ9g_@o?o|f0IxmKEIz8LD+KXeqNfg@mAj>i{A0I7A^_e(HDZJDW_x0dVRe;eezESYv}meI zQM~}ytj}^WwAyEEey_~267>hlXSiVuTeBtE&(u{gtS$x4V%_PC(OZPS3 zl&QI)9uk(-9^-<;zvOg3r{ymo)G*AJXUi1~Ray!#!K_H$G}cK z?rhK7c#npM4>d`pEWmvz(OEE!dQu{TZPsyQ2 zwdIc7vxsF?Ubp&~!L|BauaYv0MAko2Iubuvn1AzUEjbfmrGixHW@@GeJAYPW>U<<* z$DDXL*v2fLZ;hD*=OF;lrBU#@F8arZ=nK9HEx0m$sZ2dolQZibW(?^0AfMAUPG7kN zM+~;2fD?mE2zW#E#PpBJ07z{EYL_}Q$-@R6PBhz-^wLZJ>m>W|dm*9rOV%g8h zVATtr7}Li1pdjR^wh2O=>FWX*Xno%Rpfi(TCKKZKqDRZfN#7Cw@gXBlfBh0dW%@W? zuGP5#-RK$@QhGoyv0H0&i&znA=SVizv@2Ho5jkJOg!e}wwQd??8D!Y~ z1vTrn?C)zpJVwQrmT;kIS!UyJ2AS=uIv0kr&zsV(-0M~TO#{yw3zU3X<2%v4nSRs<=Px(xh2(8rROG3^fXZ6O4;7fJcx zG5o_jjWJt|34_`yy@v|`*@$nMqpXHrFY71ZNpP6qAPzJ|}d&q@=`+jM8F6FMWjBxCBY?k@Zy+s-JLe2qsuer;WUo`*r1bOLIjA!_EPW4vY!JTDE20^Ho^|qoK?oa=HRO($ z@>GnGUqKVEd^9e|bWjpbuz}WJ!PhV!=W>`Dm6|->aiP+KlF65l5252tnX07d_Hj#&Z`x}&4?(%n(xcOOqwzDav_38_ zE?Qdrn4#`jwEuUun?dmE3M;!Y89&XF z&RNnb;95Jkb+fytLA&*>?ttTFakP9&`iV6jQXR4apipTq02f3?wt6kqTM4=ACp1>K1fg z;<4zE;Ez>Ri~YR4EtzP$lWBATuT8FWyc3p*u*5fnfyrewbj||oUdZ2~Oil?> zeuP!}+~F~SzK$PpGeX~dmx`1aeMq2pfogUe%qH?7hIj^{Y(KtG8(UOn6$m+-PCVWz z91qGPJDA&l1Tv^K3-T0ErkxMpmnktd}bRCIpO?TDY8LSzhN~|+f8Czb8rkHyk z?ISOoDm=SU1$<wUq{ly}ix*suN!?@uq##YR_TTo^$m!`Z1HVCO}gs4w)vVNfE=X~D2zm9oH_im8+ljpR*ju!DU z__77X8qoW`B&}3lH1DTUDVOf8R^HlJ+Csxn*GF@8JzoKR@{9)vyY}5_&Df1*x*Ts^ zr;1@(iAOo*eYvu|w&?v-0vQeNJ=lM&34pWR{i2R9@t>;kB?D39>N; zc1mW*gfABD1QBOm-NvInhj!h3WMEoX z-o$r(*n@X{7#7WQ^{Q6i&0GFGEPbR6Yo=K=s@s-lh>nY%iIbqvhGH@E8S-ipLLuQ& z4sH*+2}Lin?3QO#!0(yj$`A2uMtpK^Yj>mdIUa}K4AT;BQ!FN)VSqrpRwc%*d4|Q= z91S1b*FtUi(S^K^Pz57ocq&lG^~1J1ir#=Zem;++bY{T@{*==TiMdmD@-d{UZ zr0dgzpWX;|wMPx16mf+Pk^x;NL{j1)tE7Asq0!&Jtc%dTXq*b@^Em-Lnr_hKbsMdE z4=;I!)!x6RLFy&r*?MgAaHDOa$+N(sHs2%xmC@1z`)e-)Eg^p*IrZwh*vVtPm6RA6 z>{gd0l(&lP)@6(flV8nwzvT(JHh;(x`*@VW0-r(3e^+XqK~L0q6)w5qx7>KVamSF< zL)%?HYss;{*0z84v?c(L6JfHO^RgDVz!s6b1UQx;~h{`aAo*ZeG@26Jn)=yQ{w00i_m-uMK{e`%gVS zD6BA&@*1>Rwi_s|?xnKumn{ySKocxElB?FFFnK`#LNi(Bkzkd015=L=rwe- zfmFV72*;3_X|I9d>KJ16T8SIH`+jrZ-axGDEY{G%snL_WSQe|-%zyS-j)X=MHu%2> zplgNb9%Q$Zulz_=Dt1*i_`H_Ik`niQ-~?e|)Ry7oJ^ho}n?LhYH#^l+sFUE!%S&PJ z+aK8l{j+H6%};tbatjj7LeXn*6HoAZuh~-edPj0XUF?sQ0nGKv!OP<_;=kjdsSY8 z4JZ#}X`vld$Bryw0D}NoS!ORwWJ;T-J(8XW=;2)nCmJP94Xm#$BB$s=m-fo9kgZjX}F zV6knXxBAH9%$@eIdSAVWDhL2FTKk8-ot_GvlMu-ap!L`fu)()BpeMsT&DEU3I{w9~ z&x11T7{KDQ2&Nj999eHL7`j>(G)m~gf8Md=I9+O1UsTf+9e}YKlYz+O3)PF2j&4CGFrSW z(F*ndJDFr7o=&=d1}AT|C3US}VAz}uLzV;%vITDK2Ko6Ve)_b#VU`RZO}Uw?a4L@W zkK}a7>Z!Uw+uO2y#*1hjX5f*m`qyW=LeU$)!ev)_bv0xX+s7rHf}I=6VW9~qj^lO|Oz z1B~NvqBE-94^W5#OR{DKZzd960BcUa9oB?gkm0*+@6K08{60PT z?Yk>Nv>{cFx{&G?+=BU&QOvqBC7s6QN`2e8GLY1HM+<|-+Inq2w8bMM5!HHrG~E_N z&!Xc!F`VQg+S_V}4u^11Le4vZBHjGroexa>wp(a33uh8$@P1!q4jwSxJ=*3+LV@2aB4TfvE zyXiFYmC>L;)6z^%-4@5*&KV09gLXLA;z}b)lDBNh zJXfiKFXm%2oB}ZJ6c{9z&Sr5PQt`X6dcuM<2MK%5Xj|>Lk$CQNgH!fa>9tOmVbjUt z3nY>^BDo5uJWj7w>U6pyRH`I9SbUQdgU9+b7kL4KjD$C(B6OSud_y#$Rc$(u5zMe) z6QGZXjhFDs`OC+97~!dQJ&t}d75@Gl*KP}Xw<;8ug`kH*OAOhd6k1ZCQ|CVt1dIlM zpoj{M5#R~vb00mp+yL*hNW5?zk~3!9LmH4Za(5f~yOxzGqRh;)zfKQ*x)EW6xPg7S zJtK#HDh<>PYUdjo`N#<%GL7xN>n_fgIeHyKRs=> zW;%qf*Fue*THuNr}BX&5|m~%1>U#-F@-Vs>nP)$uaxHE({&@(XA87p7!1fl zDm8{gi|hiQI5?SCr5|KnR!BYH)SNV#wPL<{Q7*%`^r+_9bo`ihM@XEQs`RCho-Sg* z1LL93LL2&%hY?(@GGra|AIz8ierZ}~vC~((PD!<2I|OMsYS$x~`TTEVVFL_^ zB&rU*ERR3fU(+J;{*aK;+i#Bk@bjEyCpl3GdxM~IUZ=hdB(~oD=pP@~!mW#PESN65 zJ1u8Dw|&2xoldJD=F4I$EiJ97sj088f2|;U0!<+l(VNjE2#&n+_S7a7yyg((!mGr= zm#quPiW`v}GbzBU=7<2!rPrX&xc?mmjG>>c3Vr4_t7$SGfxhxgBdP>x76QHc*W-tJ*Po$t25+y_cZAASldNvrN6G34f$1hE?& zFiaybAQUFGT;KWMCuGIziEg(=7`5Y`ef#WZ9(AFU3gSsEBWr?defkqa#=*{hCcvA* z_k-OV1yKb;Ls8iHzn4D8?BKONWfy$g273r(#l)az{kP1tFanGwy>|6FfnH~|35$xk zdI>0?{i~(zhkF7|L^y#if{z6~{DKfqp;@F^FpKhE#cq}VxY7Oq3?M@f6r7q(p}(@S zNJ&UCv$GAJu&`SHQ;u8h$7)CIk5$rEpLQBZ%;c}tj{N-m>grz~VdMOJo9;(~zkYzU z8W0|TM*DR6iVy~Dka^z#FQ=>gLfHne%!&VVv&kW>GCj#4>ybf*v3JMRSL-eH)eY4`eGFpcSaHKf~t3toSfPzzot63l4GAAE{!BP7| z{|deDDfq*NIEk_HJUu|-zgbS}Y5p1le?UM%)if_PF1O|DZtT7p3V`e#V38(c{_z#t z_bdN*XJIP)^*cVK;%oBN=jd*am{){X248MV@Vq%a9p4_{P@fBN$~OJE-1%F09r4oQ z-&%bO@GF1$l6UA7Wx*mK>^2naA#)r=Rd|_nfJO!{v4GFMG9pMBm-W=Mg1e$$BZt)6 zS(KU1`|_C4U+9vYwcPK#rW_B9P*BJ!S#0!41wG7=$Fm=lWG|(PpOkNXQ!xL)kjLtO zIeu0KD⁢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

&-*DvD}Sf#Q>?c zca1Uq3aKBcD!Tn7OGg%|kqw4JMcqvNcSab2;-P`zWx_z94(q=qZ3n?s($3u{Lw+cU2XsPG#Dh&x&uO{iGJ)3+j$lW&HAt;ozO)bxagoXR?SrXiJdU!z=?Sb@ z6~W0GGGhkAbU5?D!9$=rp)(#A6aA_Xa8^wz}>xTJr=H8*+W#9$|fc&=0{uHKym+Ji4*9^PZbR93`SQj zPVC(^3QGqVohg-Gop}N1$g(p{L~Bj?S4`8+%*Yhb6Q`~KH#0B za2I4k;*29Mq7ZsM@qI`Ez69=O-*xj!7^}@q=qv~QW`1?;@!V<)az~ImMSVJbF-Bi~ zg+`?(ce^?82()W9FYf2Hza1}*QV^O9WIxK@O2K#+q+`e|1(GM915rjX;=^IX;u>)> zI8qEg-(G}p)llqXcTF7x&BPKiX|Hn|BSbeDhr{qh4hAxfMPjD5x53lj>~fMl!_5ZLjV#Yu;pVo%oKF2 z^CfULOP}t((dnOJC^$7tBRaZ0pnVK4MQL(n5RD%9#tWs6q4pHA`8+#Ef&Gu%v(p=I z`$!JyH1=RhN;zw~&15iYbmW9JgY66Qsq(*cxe^lmwUWENqgs%QwFoL(v&PNoCWazW zbf{dMbUd1*k7pwAH`9lalTi%V<}PDT4qN(;pE2la5lS8SqS;#3K($pE9OWbLI?2dx zcB$85ZdH)zyHVP>u@w!WJ6E2-rE}HPeB>N_BBRyT0RlgTy6X=UHLY{!L-pxT(mBK^ zU}Ol4qCDi!d03Kyb%fT81BN0sL=7ikkzb{fq>9L%PNBA8h>j!bf3uxy`^v!bjO_K7I}}7+UcJ0&}~qMA+DiS4nvISFlKHtWo_^YEz6zt z6`y$%gw=G`&@C?~ZyX=|EbF4JlCym^vWgv@A}0P^D6ieSdUx+|K_K=oEts!atXe; z+hSboH1nzr-UX99|56ZOR~=soPE>c{JepAvr=tUjo=n}1AX+xj%+Ei#?h@?;^3=+i z&TfdjicM8kAs@+}H>mzLRUUbPeSL*nN>v$`&c-u2^WhIm%}Tn{{R{4j3P>ty8Puu- z>75UoMN7pBaIR0^jG0lWJ3U8tuiEi8uA~m@IJu7wKf7oE1C>2Azd~t4D56GBOVa8N zDJ@+X`$6`L?aho$Em?fdxIIv-gw`4HedXb|;~an=q^EB4g}tJ4D;3 zouL%aDp4liBYl;cnmczlq2#W{9UNx7%n<<^e``F~-4yKgIYTpH&mSu#vL_GGN^A@u z*37!UYNuAwnm#{f?tN$JwL<47>1^cJWrYW!Zp_OcvnJ_+)q3EgW$(8?vc#&+(85~Q znJLS=A++a&4JxjW$G-p?dU_?kr<~L+`Skc~f2vEe7ybpiRkZFuQ#<0ct@pci9s)ws z_rF?2S6}yt&o`|q1y1JcytHvbDNEbgcPtGu;EX5Mh|hz>r`iNMfqH*cjX{3cx0vP^ zj+-|})0@=(LD9K4o%ZrK`oGL%bIm{+*>2(wDTOJ1Pl5udS+x0NQXaCL)NXbd_osNqp! zEv3v=zv&0PTAZ|NNuE)*Oeg%Y3q(Q=7{9JX*$T&)qj-BFgA(|uJW_$2gL67Kzs%j1 zLn7(H@%w5kf^1|#<6#&N)9ivI|NaQ=8W%;mkoA?q^?BK>=zKTE2?%Z?SIP}6;=R<5 z7fgG0iF>t&m%$Q+yFg;UA~UR4A9u9&1-z!X5gGz}28wxd6NB-|C({2m&og3Vj(&|q zdZ0*AL^*xnZjSk*h$rI}RrK{kettN06ct~K z^^GBn@0i(KVtgG%1(6=2PfxIJ9FsYcubp{h-7_26pF0?{*YZ%RXU@ulcgUK2znv`L zjXIDL6zzPZWD3Ndq%6yN|LP$?Lr{ju7dMXP~2?L8aEJ3TV-NwE?l5Ib_5EweA>Bn9-5$F0g@`?IuxImk% zI*z2cq=NjLz=7Wo-hWObq~JGx5{AB23??f=46(AYZd_~5i(&HR>hRnl4p4Y!r(4-7 zxH~8=hUNv(Z|igSneAg*kID}R$4 zla~j~^f6*Aje5hBB*RWkbF6Kz+jh|q z#ITIS^W;3~FQXSBP$qrW@%V1x5b*C0*f62MLts@{q!87Bj})=T?qIzVam)0YXBdHr zbScOl8eUFzw>ZUuP2ipjoos5m84xG^8Rm&!{NL`VI_*$CPA4ZW5*3{kiOc(2VVt(^ z|2co7@s>RfixuSdcrFZbt@&r{YdfR}uy=Z{2Jq1usC-t~8Wmjj-%H27zgx-`%I7j$ zadg;dg!1Gy`BsFu6Trx|+}9MSPW9hew|w6Dnvb_P7k6uHk=4a&Ei6wPJUe?29^T{x z^{o;f-Cnw6|+iO{uhvERH2J$sp8tSgS0QyeQ_qG{7u?;!him)@EaO!Sg05Wu@C2KERlYH+bsye z_JQz9v5$5eb`Vo+sK19*NJn2|;f9nbiY4~835I?2&A&g6ft->0%L1wLtO|jN4)4qH zpZ6`g%o|^Is;(azd1cehKanRkk}T_yIBY&TE!A+>8bryAVNNFQ4k^5ho9~=-5)7!# z_9_pE@@wJ&=*Gb1RM^`}q-)Q1NjvNtf35tM&FQ!yw`DXYh|4N=RZnoHe6U^IBo6hQU}Z=Nx+t7NG;&^3=aV0iHmOR zr<{bFFXb8Ps{pmiv{5-M3Gw7Dacws7krOF%b3@9I*rsWZXRS%i0 z=W*G-PIoh$EPPBigidxd$M*nJkTx@L>| z;$_A;*BU{+E)>ybdxxj3D!ojD!n<*fpLKb*aw}5;pU_DYDX2!>>V(jnFm$m9*%dm-GD!+3Lem!4-zfn6dFlO2K70AtAF4o+i)1CI^N80ww zcYa6hWTOIMBFCvQk;W3zqwz9&G3M~k(c)8}&rZ)D1<~A+q++RDzrt-);+(90Ikrv| z*Nv$lok6j_{J~+x#KulhV@TEo^TmNnw?(ZR)84f{4>lqboym)vRD_elBqVkF_E7bk$-3J{ zrJBo@f!L9X_|Gx$M+<4>qwN3ICnbH5=g|oAh0V|RA4~i^FM(+H!4zjPhU;+H3BMNWa;KpDVhI4s54{xG5WC~iVl$BfM z;gMo%=t?}QdwF)nJDC?GJ^#HkWB8oh9mK#Dz6txkTC>D9bn<`#bz@#$-jiy^?={y3 zd0#O+eDC3BObthU-iDs+Tt+s!`{{2>L*w65zPCS58EaD_FS>9lo#PXg;gilRK7|{n{gK zpoeCRLK(Re1ERqr_U6+HoLB1Qab4W!o%vZ?X3qq#Cwq)ae*xjlfWcVr@!@asv`V)K zUmL>J)pA>`TdcZn_oX`-Qy6f=|NK-(+y zCMPmM4!9x88uuKFddqF6hn0kA<)W8zKN4zxV?vM`o)Te_{OC3o6BD6 zqw1az19T1{1r6e{P2nVC{QL*gw@;#&f9kcEDE?iL<*(giNw)qAzreckX~l_R6MK)M z{2R>E{tfX>GEo}6rpLTJU`^hQjH`;gEIng{e<5PBdJ#0G~IN)G{LB6j*(j4Cn zDMEt~8U9pG!y33l^UOrZO#a^Z2xf47hUTsnY&Z5N?=**=f|6sKsaO94!bXG-6GiTKPVrchZ3l)kI`?ZKF`-O zbhw55c5Q@GuK7gjuUM@#%$T~yxy_Fo;KxAeYML0)#J?E#B>6*#VXSN;qd`$J?XM>x z5>ydMZ&+Uu?rn+r0XBQ&Wx^9F0&3H7j4$gKTsUif=X9nE17C(;^4A(0zM9P% ztqnfK2=aSefw3lUN2d4ObUsNbPC=_h3EwiZT3%=Teu6|j2eJbn%UOTciX1S*>&TuW z^PM>bro1tcQ`rXXFK)xLLCx|?KE^~<{7$d0_BFRUVZZ)ts!91@It}EviV@kFy_Og~ z+;7Ui^HK-*RiqlA_>SN6ubetJp)!m6N7A(Fo49pIuiTk;$&MfgG584o6BmlNu+{$Gc z^?rPyOL}31mFuP??@xDp1^SBU7UH^56(Sj(RttkI!R?Zh>GFq9eAJCJiQfJPNa^Yq zBIb4qF;7CaYS*;0%1fZzOpk|toq-h@ueZIi^_=?(%vJQJZfVwy-O1=|A3#2$Am4Xh zqB9gizvn_2aik(9IHBJyP}SYG>+0c=J0%c73;``;Q|{)@Y%-=k`YLGH392@j{Kcq| z-4qZsBx*g}kBiL^yHX;G4ZV}NC;nYz2FJP0EHNa_JD9ley5Yzd30NDZFPdGZ-#N zFHb|k%4obtL$gzMF4FY;=5m)bb(WI|5OyM(NqhRnA6R9CDFHFG-)w|;jTA<(y#*cZcdq#N0DA$|$p0-W z7sO>}XQ!ntub;2^zsC4ULM57J%fLg3J_u#Vel^#Q4@czl-% ze-e8lfWJ3BubAI(6G1^YClEy#xe{LH2y$B8=o6bLEz$y={ij1Nq*80hpL{MDGma!I z_;YqhKPBAHq*lA84*j%P@K@OO^f#+5$65y(9Hy>Qyrf;CYn$T)pV#LTq;G^WmdnQ< zP5B~mbiILb>f*3}{nEJhGpvmnbvSiaRpk27ygxdx%h5c|El^8ENzBg56j7Yae?*QK zEtDeP7vD3Ba?u~*_eltvuG^LoBW!kzTx}K|u$ZQJu8=zbI*^QPJGO2JuR2LMa>o1p z^@(96lUI6vN4%=4gF@ zc8cz>RPI!!Z?!&@0>K7yTE43K@++# zSm<8)WyZ+*h=r0pIIFwJ9ns}UbOp;C)%HbZz7fG@;VUw_#$a&oGzEWyw8u5iqX?BI ze-M=l(4!1MKuINuvSz)M62)dqK2s=ovXV_W$+-IQ?mVESiXw$sN|2u-JwH$kzgW6cGAA)*JtFTX!u)-!Vh)1tZGFO;^TPSpYD#r zS6f7PcJ?ZMz6Tg3a9;+QPIpL}7oJSxhr5vq+iiR{)zuREQ93tV2w|Lg*dCedJwsvV zq%Jk{nO9C)PyXfK0Caibc?_CKKD7?UL_bwe`9Mp1WJav{_NVAn7~rXCFzf>dG@FJ< z;US$?Z?s?3pPL~|zXCjVWVH(mr;zjDAed3D{+M9Si>E*#>CRi>nVUWgtRue$*NEsY zN2JAgG>-OqHt!%SgPd2M;a1;b?Z4psrK%F8gHKA_w1l#<*Ea=td%nq}Q+gTJKa45i zC(Ll$3HcPo;YCYBIo`{6!zRfss6He!Z2*1w_{q|JsZICA3Q9lg-UU&rq{i$`dwyw% z4Cbm98IX=^UT@(%nF*=7?H#5-WME^hLUP-{ME*c?!OYW%kY}QH)K4}0l5fka^VR(% zjIV`4e|MG2d>{|~f+WCFNrFhfpk92Ww56Qam$nt>XY8QFsCZwcSq_J&)G){(Ch+pj&4cJZV{9S zF5K`6?m?;wT*WJ(`2uPx`ZskR)s}p4O35))R{1fjA6hl9WaJWvxzn|;|Hj0r0)mOT zC-(O~Gq$28^e#ZjeuZ{aKsUP^1b|AwR?O>P^NV-9T%5`*p~#K6*_ZjoribpPvnul1 zt)fKlLtnAu`ZEELdcY~Sa8Vq{#^=h0!+jtNS~kXgJ?|s4vRN2rjIGU_OHhj_NcYO{ zW)4xMZMkr(b5#nZC37a>aPO@VEZ@h$zYoY%?4e-@hHR&m#5yH6RPdkW;wQqC+^(|& zPL=p|db}bh+;4bzRIqA`y1WSN*P|94U&cx%_U?t!q`o6&b4g@!#Uo;2ehz`L9-wZr zC-B}@*Gzwz22(tw^Es60UtDas_~Q&gCG3ovL+fM5oWY*;*M~SK-u4rrD!$VMOe)7x zsaIQUr>T*9YAnN1)mYmf)c|cj2mM@F8_vV^*xl&j;DsT8vWJXuA4SD{! z_wmo5}#aI6XD@NBb;VL3KX}sK|AG6w)c?8&O(XrU_~6gM3MLk z94jE{=-ZlZRIW`&aRO`M&}Ll$8mtFh3&*ezM`=l)@nG2-Nl2V44=`yK`q$oXkQ+7 z9#PYFT3d}rrtcc$lXr!-))FUq+ZQ^`BW3ph5n0y zbZ;`D1i0yc(PdN|Yf$v-79df_h6r_YT!suyem5z?LEJV^&NckV%HC5`e9#IEsd6m* z@bA{tCfGNm`BL{GTgO>*nEUNR!qf{yMDv5gs0@wb8^f{jroz};19s2-$A=FkszaTX z56NxNdU0B^`rybUGc>%8yU*C_q5tUlPMyC;og7 ztiJsYR_jh;1|-%bHou=neignRR6h$(w9}AuKIbN~xlk1H@`+1pY=ZN93esitVcZ>+ zg>sOxDUP_4nPo+9Xc>H`EvYpR(u;^#d#kgr>w6ZJEOo(22q|&SbG?2)tW+5fGwsJB z7njUGL+A|PM$x#?d4ZMeK+7C#?^lTl|!qq zAhoc~5JN>xt@-|rw-SN5(SBxQ+kV%^s;kd(wPIMl{?}jEl#3CbW|4N<_I?rgSV<^l z%mWFPr0lc$q*10uH)FZJ)BHsg#lb4jsA`KMp?Q`rm0fUPUKVj;Yk`Cl|BZ0D&>7^@|E{7GCX|!DxxUVT=IUt`Khqqh zFp!3S00I(kPHQtC;aYJ9(WA1y^-Wf}jX2MRW^k#8IbBLU?)R$mEQ4)pcb1bi2s;gi zGzIl84i|tRBWU}M|DmPCEG;b+6cqgY{O$^&|5B8fUtIv~HjWus($d}WPp!&}<&Q6r zv{iU0Itt$@2=%l6_jNj-{8F&h@iyDKivbd*mZsOzmQo*SI@{>tG?8jPe=TKHKY*A( zjS)!D{ulTwXnJyl_n=g1Q1~hp!oNBmzKBTB+fpTJXZMHyuU-lZB~-`II$q-^K~+uB z1|&lF_4l{_2RN7Oy-@7fxzpBP&D1GG}Avv^5!GCb)Yn;j?W$3D_0FeKH6&;{l@Aee@f2i1k4_diU zGtGZ|x3tUPOc5Nk9M=b!th2oFGOz12*OP)G1~~Wtp3q<{tp-a z+6P{7XD^atsfftdJ+qF2;?%-Wn)yF$Fcb_v0{m3Or~l7NJi=vP^A2(kFRYFppJPb7 z5=gtQG5gzo$pl(4(x8@j)tnN49jI=XqXETlxJWfa;dH4OsHx&(ys^4-L1Tt83 z;uqbMeH?r+%SV9TcPIB09W=yAq{r^5=ZC2K$@cqo*V@U8b>4fVcfO%ayB1m?;}}!* z6cbi-9Nr_=$Czgh>M1Qe{+Z*eq;!}3wb(-;rrvz=1!7qI&tzX5k%5Da!leY=EbYjR$Yb;ED+f+TJVv3{c^mzyLhJp ztdw!;{_R6mTNRGJiqYIfm+RA9R8U+cHw_G>0l>$DrSV1}B1R%DK=D;(G-bHWzmB-hM7j4o$jemK47YpTGDB#Gga@<%(O?QBNlU^b$M&b{n;to1^tQr+zE8n{M^$ z&dAectGxBdU*wJFHvOd_?tKtT`l&}h6?m&J9#e#kfm*&}IQ4IbnhJBU-Ua?&&)rUs zB?8G!tM@5j;HN8Kf@s&YG1Ty~q-xntOToj}z`+HcCUvf_#wKx${dxpah-B_VD(&Xx zX3*(T-P-E;AQ=bV-c6oxxHKp&_x4L~%DMh?#aDi}nBpFvo8uYy&NEUHc+CLU zRVfJ*^aSs)D!=Xg#r#8R1Ey$Mx6JWb{F;6v;btk4@Sx>IWXw83ezt8y_V zZ+7wQo&Gduc09F=aR}acRB_yCB0U8KEOy?}C~)W8neLI11eAFmWvivoVslwxE+w>E zMBmouOm&aFXc~Mh&rz&cd#t0h7eC$Y`7>MnB|UDa*<&3iSJ!XJQT$f{ac>`P#mRAG z)wZu8dgd^s8x0GM(36W}yJb8m0_VE+FqwOX3xWA?@&0Vx=ij{;#|7~r2Ve2vbpKVK zv;Qc1$ETnC>rW2lt;D_}7i^C&(=KgGU0jvcu>}67?U_~{ez#uK4B7%^2Ywcg_x=>; zMXnG3^JXw_>FTW{sn31;mg;%C7m{qte1Zo|8khLKITU!LLY zwnbbT>oyDRt@nL|#)Mf8Of~q3#?dZtIBrAuI!~1|ELkipA98kAuHY0}N<)Ucu%3I2 zY94PJlO7RWL&Psq`@1?1)8BpX2U_L*=jU6)6uz@GuQcyH8~5mS{aZZ#uprk#!$GH= zXJ%e)YsUbxi6c`@?|o}w<)PoL5#;O;+nF85)O5EuL_wj!^m+bckyt(X=AKZ z-;6-f{X5N9*miJlRbhMM;a)2Ex6R#i>SU$(PAkSi1L2_7ZGng%tIbfChKEo5q#8k5 z!w;a`<=?hH?pX19{Igk@eF_vc^UKoUcaBB+R_J`?eIEH*EL$8npzF8Y`(W20QIXH4 z!I%kmnGGI@a}D(h_6VePcOiUYWnQ0XxFGaGpo_U+swR)>4XXl|!es2cHyAQNGiiaj zgknhF*rugB$HKyP*FuE+R{1bgy|g~In7B6I{8v%ndVIK`YixZFUACnZ^(hVGaKh-< zg56~0&-ml}N)LZs#nSNP#Oj*>=<8?%P_D0&d;tMlzTGLF`(U5DM>;ymqm+Wq*FQG~ z)0{Z-@7P+O|61Edt$FXJzwGoNfLJ)yY87N8X|;enm;slIW44{uo*lex#61^RY8P8| zOT4zy+?@7_yFxgR$i3r`dBAd28MF_*`{Apvhb95li;w2-{+Dw0R1J=3%JJh4(EfpB zcC!fyb&~XRqzf!U%1Z$+L^n~F8BZajm=of4(_ULC%sG70?5Qq>US!yffW6|E6kvzC z7dAFF*3`riHHt?^@GQ@uADh#amsi!TsQGu@qcwW&tu3k{plgW$J-gh@yjxLHUsds< z?`qC#UmG5wqSO3&_^oQz+tp_YOwad~esx$&32%t=->VwEj@rt}Hcmlal_bGDceCfJ z>#dlCT>Mt(!X&`>-D>5X@x?TIX#W&ldYntw56|%ga=*5ubvqK7e)`g2A9ubDCHY=)XZ1EG- z$a5ANTW*fZMf3{tt%$SL8t&unu_cii{sPuC+}xt=$ zS+D)}WwAipxv1p-oXZ83m6gTqa8t7}ahP$m!*=TxJFe%~?bEQQ+0QskPh-z#RC-F` z&Y2A@g{Sd|-$tzhcj?5{@=Uc`WXCqr!I2@1^PDP+EIdS*K1>`lKQ~#&{J!WKY>P;N znm5(g`o`{kIqav0Cd_7faW2+flf1E0F%aFNtGMkn^VOOn_%Ic!y8ZW0eWrq`Uv5uV zW8dDCD~7w_W!Tj+6h|vBZ&9Bu?%-FS`(oJAtfhbQ^3a%&TSxk*jmlm!0#UiDL;l^C>8< zrB(ci+8+I0E_{G->yOx5qy%iQt^_)=xKHTdS$Kjtsm!&!SMG&t3cl{S*0P|YH_Y-v zn}IEIHjFYlx_I2Y?9GMn->U%`R(@VwO{{6K%iEM|=!qr=CZtr4i|Q#=i+)K_Vzn?_ zwfuOo`WUu%;cwJzIl#qtEOba-O?0m+uO_o`>}?LrI8Wc==|D1o_|V(p50}&fg)-+K zJCanKP80?s76_(-2jv|aaiC}ncRbu|FihmmtZ06xKbn3c0DgI)?@_ZouLAFJ6cFr4FK&o0=TE}}?ZhreOg-IAqp~5oDIj&|3 z8fKn0;u+3*#&YX+|M&n_-aj+xt&F9+nu{#!b&|Z5MGjlPeCUokhe>PD)i+<5@IHil4n2t>mOktEwoEjhT>S z!=1pY`jtfEXg8&;oVnZ!3}7hxGv>@@@yXF=Na+^e{exG(W_Y_=NkxcxR9}*P(Hx)P zVV72LJ+Gm!s#ug~>7$BPoFJnP9FA0a{Eq$S8MmP!-TfeX2{vDf_VoNROATR$yk1m8j=^!&Y{>;X0BD z(Kqr;4Pa_b*Iz8lD*{kciY9=?&0MXY6C4>LLMHSvIm-d?J>Ix4iG$pXB-UT)b2QZ) zExX4-yZ@Lgxl}Ctxcz$SH|LmjWX0bn5z>zXn>LOu4|kYGA?;aGlAPT~0nGftFoL2d zwzL&TNKE_Cqp8HgKySfg6DIhYwzh^rWJ&F?J)GLr*wV}RUt886^XE&!zsto1pvayX zLUxA>?eU0fhGL_I?MOS}F_9Jo7YRv8Ni{V!TiesiNYXXoxFnOnLU!8K_KsYRR#0_~ zncPZGRmni#`gY}zJan(wD9aP80Tn&G#xf{B0A)k>*VDnuIpGf{!sC8xb}#N;j#uX46I}gGk4z1=!2Rt8LCNVk99^n@Y`J;p3&abYlH=mC z-KYInoLv3!&-bxDH*%y2qUh=@+F$Cf)kd|KugaB_U|IX;(+oxEM(Man)4Ow+d3kjsHQl4%I{28ofYS$?=L%*L*pCX&xR-c(;;Ja z!FocpZ1!NOArOL+%HckQVf%h1rv?a(T{sC^RB_HM*-?BKIDd5sj*ii;6_km-n@5CP z-z!jc)$U_4<`8(K{mVEkwCQ7V9E%$5NeAB(1&}M0&j-p`9`zJtY5`#nz9*ia9YL*|6-CD+nEbz_ zzg>Ba;lsO`$S}cF_{;h21Ayy@7b)QK=MpPZnlIaK@khA2Ywd(ZXiD7)mu>5p`aUK_ zA@e@;TgLnt=)FHP>51lNN&N1F2-0~kqmkxNH2j|p&pU=&=Dpf?jR(Q^;5kHFE=P5F zhB9-M_O6=9$-;z;w=K1gf1KAe-THOg)pD;t#{>t4_B354$#`BAtbgr5g17Q{vc-Gn zJJmoNeiOS-y`P@5OVhoPP1Y0w-4^7o_<6EPFR~8(DK$C}%87 zKq3b%u3U~408x;jQ8!WkW;S#)$n%L3L&5ZgroPD=-uu2PBmT?22fc?0E!{%t%`IS7 zBVA9uA{s&)qt>W*>l|BesdarZvVFC=`N+)bNL65#^NBDO7oH_RL#uIP2}YfQqB{y_ z_+iRSag-lD>9>;CPzV4%$ica>)05^J4#rn6yXK333tEGzZnXmPB^6W_T2m}`>YUO; z^ijF={p#{j@#~v}`sD82wa{%PBOk z=)V5|b%y=w4aAm3=v-u9eAtMUn=)9h9gd^X9&c6hx~cnQK^S-8ny)8mUyB|4@Tb(2 zY9H0YDzt{^KG>+G#kqGOZr@LMfQ6#{KmH=VyrN=sZ0zLXBL5v}&qaI9PtW%0u^^lC z*|&33X4BO!sXn`{(Vg({Q`CoAh_bmK8^s#IxAoFI17;368>*vUre{Vvpm;T!*9>Q~9esd>PE#S@IFc$(ow88SmyrLCQXkVtfQ=vnH#stI{r#GKcJ>oTDZT^z zsdvI4CQiaksd|IKVAsCJhsmb9cFsv*X`V;4ilSKpO%#Y`!}Tdc%k@h9Qa!c{_J5 zz0VR14nV=K;<4AN+^4CZK*$Ju=*>gsyYsnz+w`H)^UC?W1&hJ{k~3OfNpI6_nFzV% z&b&$JyFPAe!_O@`WplmU=XQqMnt7N?E24!kRSFc7xtg9-r1tBz)K?@I@c$n;c<7w*>!j zDC~8>NHq|EoHe1@PZcneQy897O&;qY4Vu z0hW!3Vi=-Vt(bXRd{(hF@m_`d3-h8dRa#(ffC4_fk&5`nZ@Oiztbukq%58fI(97ug zSB7+r0I6iCl7popDMmd~IA0-V$hBTFH^u|WRHy6urV}z>Psk zhr7NtKsZtQeH685x52zw%2nWp21ou8LV+2@VP@_Es;t^LSeH>;-iGQ}$PcVc?raKvlH;i(G0UpMo5I=~l5=nl>NTjq^iZ z{~X41Cb=psTjjMM~f7T3PQm~29BpgF-(_9_!(_!=jrr#=n*kU9~HBvGGm5yZ^(CieXCVT7{0(5C*f6H;th5U`o%#{HVtWstb@J-qjAT!@MI30jA@_?V;q$*PiBpOX~^|t z*cN3Q@RLw&-fcyXdM9l)5n_g_kM=~TvT|@t!C(%Kj;Jk&6@2(4wu%pzbILyNT&bS% zQ*@s41a+eVG2bs1!-(gb^e6 zz2Eo%+{#Oexi6xkBy+-QXfuRDfx!R$9F5$!@8ToMF6oVs^~(ANaue!Hti)PC#n5i% zy;E?Gd`(S)#_z#U=c>_s7Pr_@&~t(Ipd(t1z#Q0Ubn74WeyZg$9bl?+oh%tmnDG~O zq!Y4PJbWHH5U7MKVZK%`CU6Ag?+ch*qI3QBxkJrRSBMmWuJP@0t+s5jSum21yeyUizWFZi`q9UDx#}Qeqy!X7l z<*}Hr1u45jDv-i$XlYL0qchyxOvY3MXiNMqq3H{-`ceFe8sqrzo<$0+ZImA1mp`xZ z&-n_xNuWd!Ld=i~`nQ+ls)2RPn3$M=HxoiM`25tmCwe}!ygYKy(9yvG(-v)!%#GuF=>Y)Vw&Gj2x@7Xf9_l4Nd53Dmpm?yF|WHU2j@(TKSXQIO0=fM z!tx93w>xKG(G=Lysrn}urbDGIdt0kX@7` zGUT8##Z5y*j4vLfGkLHXjjRF9m{?#O?!@IlT%8}ZQ+>#2^%U@$A9k)JPtD$h>Y49F z_lP2+HeKHgE%(rf&&*Zu<<)I>${C$hI3;5uT5@VFpWX z!hQW}Ri5LqxWGjm{b%%U99*1k!}#hKFOD%i*SU-ebDBSg4&#I$&Qx55=C&@q8_9U7 zsb2ub*~L}^NLgSO5oNj)|BzGvFDY~57vTT&5Wy}hW1$x9UvhmzF9CYc0m3_u&EAwd zIm&&w{y3s+QGW9`Ao9tw0(5DkfwHS9tnN3`-@+SMY`Dz3WiW>m4Y&-8FV40%Sd7$v z{z+#^VQ!sn;|>aDGynpnpZ|EW1Sc)Ib{h;Rsw+|?kK7s!R3)&sI_+WaLwAQjp~W{_ z?e6Ie+-_X*B3ke+w#IgYH};zhpu+5_&bE>;Jb3M7y~FkX=BZIY>QU1p?AGk{P?bbCMn88R z$>}2xX*zqG*{)~Wrd!CyN=6aJR%S1S(yV!Zy%_-V=!La$Gch+)FgL46-j3xF)$cp> z_t9I1h`$?+vNs)WVxC%Dr1k?*>a$@S@xV%XIBW~+Du6}b?J&$oTB-NjWi{E(N&k!| zduX}4!03>L|4f%9(6~GnJiCYxxXLf|!#d%SD5|$V&jO|Cm~Ij;#`LERSU&7qFB=mY zT#>fEMO|7x*NEA7B#`MXjd7V1LR=AkGP-}k!2}FuXk=7VQ-j*lW88P4FK%EeXqA!_ zUJ%>fT-63vkCInvFiB1d818KKour<-O`-R+4{!gm`6gF}J(0ar|3In#(d`dT>PMQQ z?ejDGdtm+*pm+55Zlg=b-*xXQ3C`#Yx793KWs?6%XT!e4N)`VTwsk(W0e)AE3p@IS%u5O%QnS<-ZRi8lnuO zrKPQ4eXb5b6XF#5x3$Rk_xBhW7{Gda5D285!Oskp0!($e_2@Bb{=rXviG;|E4t$wA5g+Ck5~y*hPu z((nO{S3&%ru5a}Er;M1V#_3cvUDO)=NzufWmhL(1G{B&9*ad(>jciqEiV8wLq{}K9qoEAafd?{JzYX?SkU^aWd+DC zT7!Y1|3S9NVt5LY<;9~u4-7X$#lCTI*+D|Gb-N!6C-jr+3bS)~&B!LnX=QaKs(V57 z*47WG<4d2@;}LV~+k!84`mRR;H@CO-t}Z}=eT;R#N}>+L7bovUdVe`dc?*1`FrBQY z2bj?_b_;i+UcHA8=S-gK9A`@|r-K}frhZ|oegkt`vc0#RMXwzC%mNs8T5J_VYcT4} z8P0rW5G$*HdTK3Az~(I+&1jM}0Gu0v2fTx<;NQW^FDMX~m9;c=^?LMA6RgH!y#N@e zfqhMkm?}Ou-+nL;0xE>zJv&|kSAu#&S<&1dmgJZT;n+zbdpm|hIaDV05ar1?S>#_D zgQsH`=IfjFC_|K4+doYDh`Vl1?2W};ncltd-R#;POfq{|<=u5I z{WhFvSngur)nt3qU|AP>8!}Y&nxZl{aoBa{#t*9)lw_*c!je-}!Sk{Hrh9#{bfD68 z8^d&VdAD?$LBocIIU`&Pi1J`E8I`P8{;_Mh?mHciSO6vHak&Q<)EkO8?+<2(0Pz~= z*&y^Soo^O%-)?>OLmfOIlWYHou3G=ay8XgRF}^t&Ez*TfIhUimOm$;55O^$2+%Kt^ zmARp9D4eq}nw_UsSzvZou1OEzJFkt>nIxJIM7)2Hyu1iQbva{z`_>vT?0Ju@C&Ns+C+)Mh4&XR|$by&*6Y!4dDe<3Rkb$ zjZ-B?%Z=+*Spl<3wfKB}@(k#1`B`4;e&Euqbg=8ZY!0T9#C;av_OBrRqc&ppX=!Mp zqN4Qm(^4vCODZ#hf(z^Wl3s~(`81%&MaWRk6y^hachIZZbQE2MIrF@g{KY zDiL%<7|sIAJ4ZMhjvGv>E$Tmg_-H$UWl11~%$RtxZ5XjM}adD?f@Oi);6 zHx=9#ZawYquPFr{1s4Mj5AJnWBG20J+PtkfzceCgC+I-R_||+|_6bg7V5fi1Oib6V zHs7S-6+JFQp{tRv8o_-MQ)y;g*xB`T)sL$>!n^6;bs=vBndu2M6yA#nUis7asf6FI zveYR&ZUI{2ua$q6Evl-jdKzY!=n}_XnQgJ8vm`yIgi46oLv4!BJJ#G-Jw9~(D<~E@ zZ^Lu^597?@G;dn(h07}@scH_Wl#+98OOy(H8|v=tJ{=O_m+FzR(_CZO0LXWNM-Tk zac}GIKndE0Z0B)vOnP23i&R0p`9`*_buNdZsgy7Y@U-Vg%iHi}>Oay{kICP{Wmm9PFCdUc)JKG18a`(61F_f31^}vT{y#c2#w6M?y-g0*#?+ z4bd5*oYFYY20=%`0r7qcDi}{46FHgOk_V48fq&3!Oym!ip_*s&(N?2cHN$YVM)kyI z&P?^G;oJ^R7v1%6P~!Mto(z+_<3kDR;+*86+pct;`++m9YI-8y!ilBjej3|?56t7} zfH1x(@#TDY{>M>-!-LdE|Nh-m{5)B4K%rzXIT0!c;$p zEqg;dPoS6dvyqC4q*>wB+bVXpL)@l7NlPhU86kk!s?l~lIik+-sRH&m$E^YJlAs#g zMl8-R>tLV$p3XQE>oP zDp2$ImGE>|>CDK^#<$R=1DU0G$SURqm;OZe-3b% z^M92YCLbRkFh2k|-_Ae^F?+1dev=MzBIB-_8=(Tpc*ZH&k*{kS#8K+AuiMV$ zfHVL(v!VPeXF#+dNQ6}43V8PLAIKyB7dB;PW|ESSd=~R)KzhPKFaH88pS|H|z-0XA z1qz6@|N0s~Z2kdMfJeKru~GfkqdmWPgn^#G>&k-pHg?^x`Lk!(!HbKFLqkIdNtAh| zk1b8^z+IBY2Go-bq-W0}qJc*X3kwepEKF2iJo|ebeMNln95dux@O15;3(xe!0+J~a z{`rI0^e=IX$}NlX&jrC(CdS58G&DO~zsc_Zxzxjf3S<-id%MnIA2+@~$BAJ-_@7J9 z2nh`v-KC`7bOGq`=^&o^o`(O=Ju!p<_uH*4V*u>@J=RibRZC*x;~nko#T!Wfx#sod z`M*tL8m`xJ)(Ak=^EHIC2EYbt9^ zE-cXhcdLScj=H$GXl~~J|MW$mNG7mVM!3U3^gnI&!uK^Yf%{tuHUU6b|2<;_1Agl9 z@iE}ijg=t&z4UB3@+qIl%xrIeKh{C?>Dp2LodBBY(F2l!g}$wwje(B&)0w3%7zv=k zi5ZEX&Ukqll$@;$h#9`g>VggQ?2s4~?RD+`UJ*CfF)~16P&LuFGbUzb<3M8gYG7hy zY)8z@37iXCnpxT?TIuKk&x#m0nCKZOd=WwdHpsTKl{2srwluf0v@o!+Bj!Y65Hm5e zGq53M5Hr)UGY~P*v(yKQl`^m}0?K9PVC7=x=O_M8`&qd_nUyHN8 zK96MG88gnt2@^BV#(`2NJz8#zp6H}~KxzXl_TytxOfJ!)DX@qKy zg^4+o%yAf}1h9L)*!GtP3&7V-l(K1Vo2iaRRDM?)GQPfhU?wD$-K@LRCjl$!@soB}!w3B`Q?T7nYVC!TN_@v}y zOPzHD6#VICcUN8A)nE)--pf^8KXqX9K!KUp>|NmmAz?x2l>8?>WYJo@cSr5TD*o5C z@9^+=#>K4wheo8BO);~oD(2)}Mk=Q@DLJ{{$*7~4p{whyX=#&KlcBy4nYXuhVq&5l z;+}|~yPF#jIfPjiT=|a z5v}#^q3QOZq3%7f4!2kYUW3EId=R4M0bI&V}_JvVpv z%F4<~@Hya=0eWoK^-2t}#G2 zH@RN6y+#xP-0Uy5J=NxOC5PPT#8|>;36YUHj)fTP!q{ThK=v3z%U#97 z43X#A=obxjbt>(AHda=p7wvNBYh1X{p>zQvdD`{M^YfL76OO(9cm`Psi3(IgG&C?< zqSTfb-kVqQguvR1ig|l7(6+G;=FjIzJ95%4Ux582*WuviF>i2@rviU*)6>6YqTl&U zHvY=@*4HrG89rVh$@87R&H+1duXr>?7|<27RVIKQ%Hk4HDf;dNJ(#PJUGt=ZKIe31 z1#8t?Qk^6{O%}q_S zPI`NLHMEGiMZY)NGur3@5b=l3jZIH)Ib#AX#vmmnMJpu*`yqVgC$qUM zf;KeVF1Py1(WZ!Vaj+0GNS__Ko{`Jvdf}vOs-gmGbUtk?ghHVhs3E{!nm2)lfe79E zio18$r#0fmnssA}kV>OrvC3`2p+pv=WDYBC*0jk!Mk0=(G(J2`%(&H$+}ybGaSJAu z0MC{C^~H-9Be$wVDiC0@mC-7{$HQx|+g8Yc(Q8zvaM}7hwEk4gl{zj|$r=re0J=?S zY-!1JwIfIfvK2&DSym>OkMSPV;^D5Vn`z8Dn-U$Z_s9rds4|ImyXG7{0-uN8y-psy zxcUHMDA+I)Ss%aJ3J)GJ3@pJAHUPf7gtwfrW!Pyy51S|#{mqF9KRi)fF$Qk zOiYw|OSBr+;NTh*b*qpqcwNq@?!AyBE0YVpS7Okr$n_>A;Rc2)y>3<5@PtO=} z1Lb<%tKm8t^Z5Qc3CY<2i;*`T6k!2w;`xm2`EcjVg)k_#HV=cbYdnuyYIeWflUD?R zJn~8cbrNphbYzl{kbtoQS1~_nI_2SYGQP1LwgoyUPpeE7$6p8g|MA0bQRSck;?v-9 zn@yY(@w2A@QlGhpC4`WZ(M_GgKLes9zSwVUe84>JkdV1<<9ocZtK@j*ZfJTCHz3wR zmpXMeA4Kz!Mso&s3iWckKKeCJA*whNY_jPsU!Z~+iQ9SbkvPI`5{rGmZ- z0xs#VZ6?a*eBJ$XXIh5(Z7cw&?0Lfg&d~kZIS5bto3u)@kSYI7Q%nS5m8PeZS~BOy zer0ES4F(!Z2Njv^Q;)hL7ThxVsnK{jbE+{^rSP}%8{g$aG*4HeRQgn_owP$R!S~$| zu1a*})2LmM8~LxJOQiiB-6PMtg@UCiScV?FWDgp%>%GjhzLcJ;-b!Mo6bY|;2Fl5B zg2-pB>Z4TcbrK@5%Cv#Q-MvX7XJ>COMl}!DKYfoLW?|rDHrT z?(k0H&^D(#H&o3(NA_@bSNS5jN;7+m_W4Gy_PsZixe@r4KS2dFSJrIkT3xVt5EfxN zA6<$S`$#NuoD5H%`IbMCcZs;&EtI$v)a=H^%*@Qo%ge=8S6*(->fopT$dIY@qKI}J z4>K=+Uj{0~cA9PJ(2V;NSX0>jwF#AR(Kw6TZp#7Hx7bC&Ywl>AG}c6dya#9F-p^6*nYrwfDmb#|5z1CJb|TIzCan^xJpg+^OM%9+E1Qz%FG-* z9n*(COdXJFZs>iX9Z{-6!V_3jJah5MvUxFli=6zfFH^iWEbupFYH^7Tn?J$}?2SL6 zow|ThN#t=n0H$X+KG(^`oF(PQkHiiH$AbCF4?|y7c7+2F1`9bt)$=-(L)D34OWmJIVd2J_X6sL}QV|@x#bPVdyJ) zAa3<+t}o6)Vz@)4$u=Xcnl05m%}57(gZ~wn&*QGPwA4~hFRNESI5d>k>FAe44({=9 zz(nkx>JG-P;V9n-*5m57uKR z3?v5e0&ORmCcZD-U;}JJr=Ai#b#m2rm5A^wHCJW?YtutRPl#05h zFB=%iF@$~Od2aC^I$kxpR8_^Ec)nAgADQ_=Le6^o&9079e_!;i{qLqi3_gn(@zUK7 zV9|T;8E)$H4uz=B7M84?vBC7F`_8MzFOfWlI4=7i zuC>qleb*c}chw+o+UHS>i=nWQ5JuF3-g8q$;ZkVsf;%sqPp0nI)nqbUQ@>Z#OZzW9 zUevFm9V>f$DTTUNt#bzV2}aoyxM$j!1-AEVxULD)%)Y`Mhy8gVP^pHoeyVS*GWf+? zaDKVcr{yedhbVMl`C`M9Cx1j5qN4Fg)E0|aEqW8|`B0N`Xeyu7-VQV)^m$Ebxy3W! z*TJhdO_(?4&#jg9_L%2R?6umaoxu9}JdrUaOELDz=Bl`%i09TE#_>~1#g`BL41nE9 zyj1{-V04T_U*Fe7TkfJV-jwb78-NbMEeq=Z}t~;kH2?dnZ`R$np^emG$gqJGQ?<=EzvpPY~lLF zt3CI5&N2^H`V}wXgjIC%c&)r|&Sj^tI?WOR!^6>tq>ca_yOgJ8D^FH*-rW#_%Y94b zPESn4HGQR_KQq)w(WjZX_#2R|jf+vea{EMrAj3N{G#mvAg&NxjDt!kHvzA3|o9c?x zlO^s_P?ADK7=O{*brX7}nCz2<5->yoYN!fr!t5^gTELt;8pKAzN9@%uzARB$1EfS% zCVf7|mlH-Gy{Y|F!|{}`!3c_i6)3ugSAJ0}@#|wnlh?$}A3jm5iM$$=wegs|=>(5@ zit?_bc;WEgVmpe{`0Dk<0hKdY!E|EbZqct-hPza@QcBJwH&+cI9VO}9c^o3#Dll%{ zWKXorp3x+;u{}_QdL*iR|MnM>;5YVp8o3F2aXQ$BRNn=BTYn}bU}ItBDHPn?h(Tw2 z9(k1FsPloatv!flJ!^TSUxoTiFTmbcHHM!WcI>hD~nXo3E4_&_iP!J`4>3f6k zGSgAHVYuL8WtH8$nvFHqBoV1AKpqhDXgY&So;5_o*Sv=IDe6o)Uepbu8}C)du{x$h znBB-m-U-B4pDpV}uqHekvC&6~Z6?yhRvz0))E@5FVtT{ET4pRH)CM?Q{r&xHxPyyL zu7H2G1NcO|jIvW~TqQTM2$GTEv2W?P-afdJnHM&Gy8sMTrZefaq^*i7^t`Wue>eKJ-<{k>MouPrsuG|K5G|ZURjmpZ zopSrU&Sb#uF=L~)0Z&#uhFLT-N8U18{c~Yqw9J{IjaH-SXB-?g$kL2jE!h`J4oeA5 zD7Gn-M-@l#n73=~U3vY_wWwo1XsmqqIo1l;8cv4#@opDAWfj zEZp>mcNQgOz zV8gc?q)VnZ&c;kdu{wZ4I6OSu-VO>0;jvo&4e$d1tzc?u3Q@Vl$l~>u>@0c^E`au% zrKW2d*)&VL6iuj)&a!ZosOO(AAfLNTRh75rW8Aw`eI(YHnlTEaGw~xlJ_f9A8XqXO z0Eab$V*)U{jr&~Epz#E<^(W*h20sHWE`GB@yE-}QGk2-OXsD=^LVxyZf)sear9Eoo7DF#^tb;JuxH@ zVnh+fpcs-SZ|&&`(ZsL)Z#e`sb+@HUjH?GQLsix2joLUm2BUG1eq z`Vpgs`kgXbf(o*{UUR|k?FRJweN%O=7yvw;hH{EF?I)pZ_dhr@^4k0w>50NL6YQx9 zc|Q=uY!jYB7*6B4Wrf2oqgw5n76QNt!so44ajY$Ua(a;Vkx^6UYbkni`|e-V$TBfC zL0Va|pX=_@p0zVxvPX78`p0)U1Zc(aV8wUN~q{1Lo#O;_Jew4PY~)$JGz#ldb4^A1AS4 zpt0{+^-V@M+w#(`PW{xT`)ZzQ!Yu>RCHq(A2~j7I>Ib6;RWVu(9v6fSL8=KyK6DK( zt`hF%*&~O-8_#xt#FBFabKmlBCQFW6KkCaKV{F>3Dy|l8QWVH}jrE=R2cX82X`AjP zJ2eJ-(A^O=e5ecag?-`F9J>MV{$qXCcTGD#4Y0Me8oEfo^SPe$QMQ7k^9F>I_&flr zP;PY1AoM&z4_6%&FBGnq1HR&*H{D)z5)Bcs6iFLti&A34$Wl`X`T>SFAT=K}vnzVs z%;?104b$DA70QP$*6Bifv{N(QDfiM0nXt-lB!%GCoxF{QW;XKfE9)p?8I&BsI#KA2 zF~8i?SL`8>1n23}JaUyiBQi>X+;?oGOs$%lSUQ`^er+bidu%FQtI;8!b^=iJZ7Y&l zaYHta1jLg|iDHKcPm3v3-I0gZ^D#;PX zK#odXLxUc(KQQ3RXt(*@w<9qhq$D3fhc{_OFPd-8AEJ^j76GHLn$1?+lKq(}`*I8~ z_za~XbGU&!%bPj!dyx6qdzy>L2^!g9pZ2M`oi9SrZJA*s6R9H2JVEcUp>6$Ez~QYq zVGS`WDUtlta*^4ki&ymnc3i=3Ju%J{YrH}$lSTSDRu?O(Z^X4~LjFqjT@EVYr}i#e z%EAXz*>~(hCuhP17+AF6-`yD#NbOnXRJO``jo%IvOpgOApv5@|5%9bgca;bWVgLg9 zur@h8J$-+Bc{o>dc(l^a#>SRaUWARtsWk5+a6wzr3fEzF)qdGO_8F3X+$*|F!<~ov zC3c)f{X}W{S@(m}@OfwHJ4X_lu9aJ)WF4+ilQ)gSwSGng$wky@N9xrNWEYQP3?C8?Da3h8>@sPpx=hfUKZQF#S?vD6sUcBI}%%w%)ds;hNly zk2WEG3EM?#(f;pok^;l;8K2Z3x%@?(w>1tQ1R+6euWkZePcF&eYu3$T|4i$2sROH$ zen@sH#ML=v5DF1ZjhPp7$ML@otXnZaFn}KPPPMBB=7Qfg0duw}g=F;ze1Ck9`MSGE zBq@E*X{raj8}P9O_h*E}FXQYMvAEA_5}U;Pa$xCV_JPpS9G3_8c-=}`Ct=S-W^HaQ zGQ$#ob-<5|mv!$TA2Y>8Uzg%h4l|s-K?wWSY&Ay0w3q2m0%^{_{v0UeCUPV89j=e~ zLOJ88fAoSM{ppS|CR!E_r0D7rbP<~ynmYmEoA5`3`Wvq<_>Q#UE{zJ6tS z!2LS`5EE--97p@S{LRe`kb%H%HvLP924I8_78-PB{rw}gW9?jpzZa^K`p1%Sz`t#uTr>I8v%pulah@2eLh zuj-V)w#;fjkMw|XOwkKyZ{`z4_$n#qeZ^xi^(0iM+mvHI0};8ZMJ{@IG`UZ6yueIX z9ajVF!@&l_A=w1EprW?~L3ooG=QYb^ShQ zNhbmFrtU`Ruq{q4(;Cs@%q?YzMb-JYk-HgOC4Hj#b~O~34qwxz?1^bGMHB#(!;XZ9GqQYH~8HtH>cwUFX?W z{}w*%wAV~CsSu^lTxkC5OX7N2i=k_eGNBcGDnS>D>L`D-cWn?U(_d2AEV28j1fNbd z9pnUQ>s^$0OE0jr3lFnhK>S+piP7pSO{zl^a{QzkUqkyIN!rTGiaFVQ1YNk`hSJ}w zN++t}j>}$r01QH?gaHawQeGEVGer^G*&S(B0&}NuNA!5?z9;uL?g@~4{B@@y8=mH$ zNg)Vx8aOpxlk$^Dc17F)f}4||m(GE*2UhM~p1Jea(UNkBCAx*s%BjsqEcoY3$e*&K zu(IR7))=xWP>hkuql6KEyBGW3tO{-8>i;y+9v7X;E*x`J+0?0fSb7mF$5*~?jyyCO zbXiMG)%QpguNovE789&^7z4uN(U_D;6qwP_zx>s2#&V{Pm8#nQNX2q*2c7l{j7On^ zIc9`T*@?{D+*+;6xl$6A-W1Co+(_cyV9QSkfuSn}n>45Q%R(Gb1xemP&nSuS|Hqvt*x(+wMqIhY3a#Z>_iss6J~F(!`tM^!5B$ zodYs|gu*!6{M4McPN?HU>FhC0uZF z!@A#luTEG?Y1vGr`tS!e<|7vF6rmwic1I&{sLfE&N%fpnI=26@kPtMZ&UFo^Qs9G% zhQQvaIpNu#dtR+6dd(%YKJcM6D_$4+Y0bR4iV>?>LoQiENkewd_51xH9K8$7Ep5la z^6!o^9rsYLI{_j(_XCkhRN)T-sPtW8fYUmaSo-@BpNdQ1TQ*=U05r9p!e3;*QvjYg z%`tcWYeg>|FdtkzU$g&w5$d9VpkUgzvUr>Q79XSn*ac5@9^m1TaW^zEX zFe__OM*ea8JN1)&uTXzitKi*&PeTrs2`|b`0f5^R_h;;t3TXA`1jB%fpfJ9ilQl4x`r- zmXW~(uGx)kY>>>*V%XsUT{e6RQ8BQQGC#XVea$x&+UJHeUgME}{d7F<@F)Q!YF#Mv zz}w{nt&XRVn^@MU8GFRWrQ(&w?HNqdj{f-a0bp4&;s`|2s|q0q5&!@LfI2I@j%1C& zg27t@Qa+C=p@o&7D@Wk{JzJ^QN*!mL`^|VX zOnwaz?W=s)ZfJ&P{g#G6_%PE4#N_we1NxOpynO&t(W`8~JZrs2KzSydJ3fz1t~`Et z!Z_?e@z*a?hMnt7ZNivyuYnyjz!9;@gNi{P%Ooi2s$ z149g2FtuqXf^Q$&dJA7gTz}JtT404Ne_$6t-%XIi8s^D>Jc4#@*$)l+mBb^F#d8Y(xx6Ccboi86D$BFo_vziUv?eN zyEgdZcnDhcLw(MLZfQ;pu!q1Dm51NSz|qQQlsWseAbPC)>dsaWl3dC@HsiRqbwu1Q z=AxA+XWC#_6A9wh@^xKxTGeOsXyZb_s(#zlIE~rvhPXTlgTdmpJ)BQB1_36ywB^AC z*gHiwA|53dkE3pH`2_j={?n%^$3AclqpZxyw<6BI5j}58KlNzS63>=D%8(zMUe8#4 zet%O6X{u1~S1(;c%D4Yx5Jt7_EKBuh8EIh5vMSuLYg+8vNx!O&mKBWK5nOW73dVSe zb{ehTvKs1PTSd|5s93ac?IdJAEn4&@a6GldEI^&lk~)f)cp2)I@?csM&t-<=kMoos z1W;T80s>7S)GSh~u)x54i2Y-AXLPa>tuEJ=&->>xY7ii571$v1UY^!kenI?;`;1Al zMy5&~llE*JM~r&I0L;MTtnV2BlEK z8z{+-#TAq{P5v@Lb8vB$fRr(=Iy@2R77my{VQWbhJHMqxNy}*~HQVee49}~o*@+`? zYI44irE2zQDAXr=Cp=G&W*ZIrL`4+BkX{grN0xhJ19T1a2j+X9F)Z0SPc~FFc}*IB z<(8d^tg9=_&wi{2NKA!qnoe+;YJbLVzr{;+U^`b6)dPTUZNOFO%&aVfHlJ%F*zz+A z0eK6F*R0amuD)(Dv{xTf_k$j!b`l_{0b@kuPbG5tQ%*2tRzQOi^)u>q%ky?d!fz0j zSP3@Qi@lMNk)EEO&JZk03JT!kt8k~~eT`9jDrlE-Rg+6~?)*A;O*t%CzK9n_^QSEjr7Qx$$sqr?0uVR5k#P7RK&Dd&PR0g5V1B_*!xKb4x|TQV(nVa6m@f959Z3{Bn#DR?2}tMQ!bA%p2%wiX!r`Cs~_34vUh8gK$AOSRuJWC^u&m?4g#s7?YP>YBd~Ausk6O{2gY$T(q~c^-jT|kn za}^*Mw^aUBWO+f0oPP5FQzAz(hWEPg2e{kxw7m!;RktS$B@rNz8}ki1;Jn46xjxFu z2K-hJkW~Nmjsq&Rhxf@;RL?L4!lyVXb6#730k`P7{Z`3r<(j+RN>;__O-$=sYMWQC zTY2r4;aUEO5wEu##U<|LTsJ=!G_R)D+~~GzZ0^Wm=sM}ERG;gEU)@_}4TH1r9smen z{JVUN-8n|^4PwtoX?gzONohG1VCdJh^_T{}AhcEUy>!Wzn7Z8&hJ?LDP!OL<-1?wM zG1eOl7n|W3+~Tgd^vhD}(-htc>uibnVU93Ld{rBXEAp%6K`zju%93@{iJO+Hf4?gb z<|XiHE{7oV3b140X?NW|cpWdH~e1P^GN_f*jf`Um>P8%r?HS^PPN`+bo zaYYh^?$4EhnWz|z=yaCE(q&S>*UXdAm`yA$AbEu{AvODEteQ76jc4WIbPSl< zedFy3mrE`Fxln|u5JEThqMY_WQL52=#0qO28=?;ng z`1ju3y?g%Md-mLWjz`ZK#rbCDn>U{Kd7d{IjFFa}K|Bj%8WJscPrz7hpvI~AkKORH)W#R0t`PX!r zH-Gem_O-D%#(oB-|A9P4#d3M&u>Cg{2Jv$h{0hCLm;>#nNCe*ui+68_7UZrQIBLhe zWL)@L-Bg=5SJ@3XAn$eLL$3U`+g6E-iDGXj?(q}voooi!P`QoK z$LXl*58sKp5PcQ)K>1w?o83Fi*NN?u-h|BuYrm*cGXn_S#@H$|B6PJ+$P@BHHXn3i zhpgjsM%MgidYU>Jw0`{5hk>~-$oPyfX$?Aym)wjQ3YI9<{U;f9?c=9P(Dgu) z+nmS3!osM*wWPB0v99xtS&)#d=Xj|`Ww0oZ{%Y1g%`r>EBO*?mFd_&WeC}n>KliXCxD>PrH9WW;C)xkAhc%wbfH?pX%%Wu0XU`|@RBbxiYrSr6qw@PzixBY#XG8vhNq&Kb z)qsv9D#H<4mz$lmDFW@2H!Iz0cD=`jtL7tK=RPm6EK4z`f0;?o%-_8~IS-EjX+3pA zPtzStGKBaWj^gx73c7DWLa5x!#(ezBN!tpLHIb5&H`z>;1OC4W z2%cGc%n};@ewis1PuF#8MGG-0HloT+58Bq#u+u7s?W7Qhq!*k^KTv)7bf(#ySZGGy zsXcwe!7H+yQT_|RAx~fVzZO%i5>z@k7@dH-d z6kRhK9)5Z4`<@8R-?57JLnG{pFY0jhVI+Uam8$MHr6TKcLEmFS=KB@Qip@aj-HgcQ zeg1a>u#xhMini9*uWoKACHD@HGCV?4p)sP#z6I2su3 zEg2Eo)(;#Mow(gQW~s0yiZO<1^zD8g+8dmTcDSVp5OOSTtUma3LGaDxHOzghdhUUg z??++I+?3vywdgh!H+QUxc?rA0|7+H{6WeGX06cuc4663B?>frP!SKo{;`RMt#g0PB znj*4q`F@hs=XM0?KL9a=YkrxYCM(f-+ZQ7abcru_NzKwZkwW za$|wI52$wl4ot{=9{1c@O3Km98s0eB-8Y%$|6G$#+YImk?|G^{y`XnHeL=~DVD{*c zQNe3qR|UN!5g1Y_m1!r~dZ1MlG#ZJEF9|hj1uX&m3Tj)8b@v|S|GFpNMyzDV!Brv0 z$6q}>tWamNcm95E=@Y$HaH*@H&Dx}}>7-=?HDbidjWdQhyet+lp}4v+w%GQ&ly26A zGfcS;2Xofy!0KZewEd+POBT^&Xlb5i;_EhVH;Hf=2y!&6O1d-0_(9gQ z@$-6If}R`0>WmzUiV4ab*4<12Md~BarA~v7zHDb_2MTjfazJa!%mxz}aud7kP(3HL zmNhxL;&YoP*JEl^5k_h~5bId%cy#!I8^``jjO@&>$8pIfH{WYO`3E>in)m6l6JA^R z+UmQ!mC3(*Kk#8yK%S$!=XM}fxwSsi`UJ&emGG}#HJ2mXPjjldh&ruDfUAn@#HP0w zmX~44uSY{@R3c#CJ(_8j3nww%wsw!B=6oA2f*PR8)fqgcZ|;^9j{G zcWx4XLv@nZtBIgE_F(bK{^h@aFyM%<-w=AT`zK^%ib397uNvJfTzmKFd%ucRSI0E+ zre~^+#Gp%PDdomE*Z+P8u(UiQuZAEu%vy^brY%3qy(r%imVC&R4~)yv8RoMbK73jG zZgFaj)n>=*)NoBj*6yKU_$<6Rp^7vPB<;l+PJFYju@ zqmf+x9Q};}o8-ej{QwnRQs#A%<25>Y70(~P*zc470^f~Cg)7C>vcjx(ua7fn6FWIC zNwRd;%zm7PmFE@MRbPIcer1LhPtNf`_AnK#Z_u& zKK2W1j0kK-TxOl|V0QQ--)`A=fys2?_#z|T_#&b>Snllu=BA>GsWb2QenRaod(RZ# z+emU0&8^;_vi>h}yo4#o1X%~+fU$=iz$HD6W0MNFBmc0$J~#v|!q&lTi(#zT|Dqq{ zYy%Aek8qNO<@ibVntOn9PzYA{C6hItoPAC&qY`kvXbyNoR|I%`WjseFDw+0gZ^o2k zkH1cr7MYT_`hzfMN+ZoJ{tQgOGAzDWpel6Q!r4_dmZnET5j)F*gjJ6IKJ0O}b*GfY zIxtMp45*X>6d@fzoZhO?=LxWXy_vZSgF6<4HwTA%QEAR_!xP&SlnZ0S$W{Tsn# z{YrBil~yVTVwQCtQKe%X%U53$lA=;6ia9BVnpv?gCC1JCc`hAaBj=KSe20s`G(Qn9NayF-|TQ zT{C+!RTbxZWz})i1;7ldFO}v_YRm#(8I@Vm_RNpMC&a1sy(Fed#|VX#y$xl8Hh;!d--<5u)}!ZwrwlKteAn^I!X^ zHA@ZKKxI_*LVdT%m)x&BfD}-Z)}&(2@)Wrb>Rr4JxN!HN=a{9AlM~S&fh^9RdP}pH z@Ea{$)3=IMUh*2aJP_+MNMyoRne#y{NVGmNKR;hwTpWUmQ&?0aC@2`;U9P^%c}Wy4 z{90W1#dCQW7$g-xIrr3IRi$C*oO4$RZ)sXEW3fg1*^)Q)(<^_nhEnO3mM*x7+k&w2 zQx}Q)p8nY%DkZ(<<@Seu=ikjp1B&7BIXui(&r+y%I}#!oIzES#>A)aEY5X=oFo1`L z_l$%?Sy7RPG?tE1XcdtoPrJ-7g2*Tb;+4jhGszbF!O#_D)mV|(;S`_GLmy&k)h(|p zn^G-Cq~%moN^#6WdfPi7{7~PxUE~v;*s`5UQfTG1n|=f8kfnKJ1bAVwh%vbs0ULq#H0goK2s``#CR8^|LzGW5H7xe)@3P)#(4 z`#ZY~TKb`Cqr>kxlq2H-R=rjTDTB4n*?t}qL_GaaobqX^4HbOT)v_g~bqX|r?wwr1 zx9-P}VJp5q337~LBB8`aXCi?n0I#sa1&&o?=Oo+1ORnsbsYv2#jhz=$}^|80)uS@s7` zd`!Lk!*1i*u#=>C($2s@SS!_B^PtHSLIJl(6rKISr7}nzo8{l1QPv}u9yZg1^9)wk z;WQXIlc2sP+>n!g0bvDX0Wy0t7*&*C*uYBE?kOf3d=WosV4;Y0F438kLUP%9x6;#S z;w)|QB_-;_e)DztHM039YfO2ER)x2q@llzNfzmXCZ!;K6=J0XWADDOD{frQJ)Z7qg z%;)kq47u=lgn1^8?KX`6M8R&0N$v)w2+>Use`*IOq~?8Ha^8`qL@ z@T!0E`M>W>>XYq~df?j02O1yT>u7yz{A0AK!QO(v0OlaI+3kQe<2NHoMF!}&rhT(N zg3dVSo=L#z!)p=&1JJ)lfWBOWsTQ3q!*B9tP$HknqMuP<%NKCj{A5>qABjBTZvbVM zuK&Q5RsOB5t6b7aN3-w0z8R?GRNs%_)y;zdES57iw(-ANuzxWwV14S z6jTosB!b!2P&b76%*a&tn+u^6;GoGH75QG>OW%D*p77G?0io?k!-3~1yUiSLG#rLLVEp+Yy}65Cs;z@c zbhVRddOf~o#v%td;3Z?`&6y4KwQ#AOF7Sxcj)~@Y_%k^lFq;yd9%$QRAy3G!6{HZ4 zSoLEWxD(5{dNXU0t%2E zJ%SyJ^YZ9`xJE+47*LeXWB+cIIktmA%4iCu;$eZHucMBQhbqezAf|1<-n-ck!go`k zGG}7&pwGsWwRvR0$tTTbJktqi7v5PaxKSmau&5bO)ZXv2!9S-i5BZ=`m0hw+Rl9lX z9q=Zy<(oU`j#f3B&7?yF@wI;ppHzFBAFvO1Otenx#_WT$6XE%#Cf09KES~x2=F3t?Ij-Bw5Tfa$0cY7Rl8Fp3divOq zcq-_6fvTj5iAK(1|LRFaWML%;HJJ#+;y`ZE;I>PMA!lc|540b-d3k`I7lA4byYf-k zQ$#=hGRK01s99zN{e@y%mm7vuNdw}RME%LAe@F2-ASYfERzU?#D7KenU;&bvujcHn z?_}yUt8W!(U;Ae}#1y+;+e=-)u=tcgxGN+&adx4AU$wX-K)aOWw&vFq5QJ zJo|QMkrsKSj!b9-G|THVR$)-TD$)o4d~${Q0?w;Vozp2jOqWAPUe*TMMVTae&2kt2 z@pt3iEj4DxUT&qOyj67;I`T3plNw+THc_)f{l?5-N{l8fI~Nv?J^yvC`lxAk_bw3? z8JoEF@iuA31_9>!^i7^36bKLK5H<8+p08EJb=FcOn)y>fopp)({%3u5_S@c1^p=C^ zZ&Xy|u1HBpre;M>YFA_irbJ?(`-2`5m&APiHf9TWk393>kun_w#s{v>e=irMK?4iM zF%wzt9P)InG>_O#U&`(w{Qg{hWQVb1~q5Me_+XkRR^@o6OfZSAcf6Ng1*S z)z(hR%32y7G##1)u~H7o0FbeCGXH1><5T}J z>+@dQc_uh{CZi5^#UzQ^RJLPbHyV*lq$}G2LaB2juMnsE$fft|N{cBHbw{5HB9#K3 z`dFl;Fr(t#Up+-}I*-I+0mlmJ3Arr_3jvdfzXvy2FaRE%+SYydJGW)0ue`C2o2-`O zVf>P1i25@!9!MUTTj(*)jm{1}=S-b=2lwrlodP)23FAu&&#s8~k}51U8l+;aJ;Plt z+BP@SiGpb{Xye?z=gHf-Jmk8Uv$RP1Y-t?=X<>Z0oP~)i9LpdknowhCmtTZK`6lah0E>N??vyO(y8RbG6=M)^ zQ1m>Co5Q0FG9zKq_(2|dy~@H#rL&&Of&XdN`)?0kdnP6%aQW!5u&^Asl7aEJ{8IrR zgZ8DR)`Ef!I|uXk??-7;IZfhXVv<<7zYPGPpTgJfZg~gB7uh*E@7B6wI|zkbw}-1N z`pdD}o^dv*>j|w7^??NaAmni{e|@@j=*s#L>0<83yO5D>2?sr3siUYERZ+odDsB7g zEx2jS9GU(%AGYIaxbbD)Qxi$0C z5@@$L$mIfDT{;ko`IYc50L;nc)rK*B5Za%FAp6bNNaLu|=ONm&l%7_hx| zVYS8qcjw|Vfw-jaQx0iBGNA#2RNPsPNYI!F@Cg<6V`E|(R+*!(OI`b19)xYb{nSGh zFmDa-Oa5-ucmWi~K=cN1x^4y6bQ9lWx$%%ZMem`eDcFsA%&!W`pLT=PHWvGO>p&HAepw3BXdo$97sbseM_dn5$fRK zPjxn~rPj-?(1hwYlVP19>{9srDr^b&-E24|ZeXEfqk!FP=x*0jo#1Dk7t@tycxt9d zmkod&aL^w6abx4f z5d4T;c`;;bxo|-h)0?v$pk=+4eWO{nP=eCw|Fq-R-gjJz9bE|PP56-&#gV(fT(d=N_l!=A$CyWfCi8_Y30Kn zHl}ro;dOP-b!%slTyFuXkd>9SlAV&uQ#0GneM`L?G@T6%4cjd_e@5~Y;Lx6Yc-<(o zR-rn5G%>q#8M)C@&;|H*&VPaS#Ju=v#Wft}X9brQO&~jaCYh9yVn0)bvISp4hd)Zq z?b#Xkef8k@CxHlT3dtS*XZ#RHM=n%E_^uG*h*W_v6{p0-Jn zLJUN$;tqg1D++P@l_zA-@jbSIrR7*=++>0B>NqGh~AHvJ&NZ zB(E(TB^O#$cDJ_^SbKl}{>3cDTGVg;e6w5*2I;`ez>g;3EL(rX0onvNoi@WJ&Nq#i=oPZhkHhP zbsTG-(GVa=z`o`LD3KAuO%vM1`a5LVoN>Gs9qWCM6W~PE z6SjDEWkNCRgVVtrHoCZ_2v1q>=DCh73?EprcBK6W@cv8 zgo6;|`g5F+D}RUD_QX;AONxfuOu1t|<(K4VD@N5Qn==1*oht?emy#}}LqNWlxd#klxy?**pA1G2%Pc=)vY+n< zq`%U0bc4|8uqb95LnWD6ST|GaKsBi9v*fuJ3*_k1^*EBZKZMqgd#HK_TFq*c-`Puo z`*sLyFf#1JM1jT;+;&1L(95`V+~Z(lFE)AooEwEk++^Dbwb^k8H^z2$cIt-&6)ub4 zdZeIU71`R@u(Gqq#>L5hZGE^qv`1O)0MS^3uWV`;2?^=Z^8wfo&sZ>)g03OP)O^(qIyx*2{q;X7b@e%oQDccbu*MA|MN6ao}Q)1ObE3gyacpqQ*`!BzMbk*{@eh zBwvf0UP)toy zHQ9W;9LP0KR}^M(sD1P_{bi?<8?DK~V#5OQYh`7R;gJy<_eeQhT*>JE&W~G|p+-hV zt4yBg8a8rrVZOW{s?fBti^MOc&31w+H+#x{f|i_s51Q_DM1jfz z&U48P?!63KkmP4zDuJ=U=bB#mL`m%7_HKp-hFTSRSFXuTW1y}MuZWV zU*=PIQd3h0^4#6tZr7e3$$NR#iy1{q=VYH0<6h+b!I8K^*icebJPK#t6b@>0nOT_m*%16oe)tH3SYUpn@H8qoJtHgy8 zNHwYeu}KRxl@HL;0`|Br+cKgy3sHIq*YiGlc+2(Xw`$U7K^NINfC|k#jNgdsl$h;k zR81}nd}9%HW;0|OBWmUD!S`1kX`usDn=&v{-B+)k+$_7NLPtC+%-XL6j@}yUc>AkZa@sed9z%)(aeMiAMK2(q4~uj=9CR#Apm|7_6s7mGB7~HCh2nI zb>gsXIvo_vht!HV_25p93W$>)wPH*hdNpIZkT@SLw=o)0hdv*mvA33E#LG##3ZQKJ zHje^|5{`Va4>`JUTKoJ1c2nWnlB}juout+$@YPRUVnG);C6L-EG zAj|>?Igp;uj}#NFq)!#mR7b`Mh%B59DSq}`Yh9%x?fC?yqod1803dIQ1|m&m)8+3( zy8KD->Lj?4t!PS!XqY5c-B%1j68i{UvDS#$#4k!ofYQ;@u6tX3bet`G_v9@3N352Q zF=xko*xpjB$)CBHKo`DnK*14L7~%oX?c0Vf0`x=qC_(BrK0c!4(iT$*FEv4|~7B8K$ zg%|kG;O&g7*iwg8&@Q1GvgtV{;6L_6g+`H37&yw%z}vH&dz+e?K#vsdedgWVL=tvv z&i5P>*l7U5pUqjIyb0dRyeHf3bc}3ln0P$S*^qfu4g9IhjEq>UN;K^IoUX;wt)c$0 z$h+|z-Sc258Eok8#H~+K^UtaOP|AQ+$ z%-=9KEoJ$HlHj^dSzB}r33{M_0H-ZIWBd3`hV=oXQ;#*+*IJmS`>|$u8Dl^*74p!y zuGIa2WJ(h7xeFZ88QxyTMBNgRii-SEqf9F1@x;)+et91XTwLEy>o8rXud4?BUQ%zF z;JG&O5^&EVo8l)={=NMVs05ToHw!6$2Y>&T8uz|Fu}BR0LNLT>yUehBO@A_yNChVP zb1M;M3zMROP?LZ=w~GGYMs{wtaj2FSU4>^HHd<+cU1&ue5-80GAE;KBx_Ww0FH&E?yoqE2l{ARgzdOa1Q-5VB zT!z-{=>K$BY5~qdTB>?_&zpVuf&Wo@G*6N8*LE6KmjERA>cc5080BSUJxht&gVJh5 zf{1~gkzg)#Bs#QjI{~=T4426sJ-z3uZ3v`1R#3DKQz=eri-d~3$v&auP-f6FHKlETJ&W>A zvn8Sm^JxgvJZOhnV9yD=vht_tTTDL=<0kf5hhgDL&1QHLBH@w7ZqC=cRNKL!@s#2$ zEqCEE#j3?6z#8l6%Ms~ntrlh3Qqy?^U4`&vZ#?>TjU-@4O$SAL7X>_TPGi+8pEV=& z@qHVJm#15$0J~MpU2gpGX@nPQgp#z1h}}4@{tki8yyiJ-F1AP<&D&- zw!@GH|8o~L@IwGs9R=I3-2Q4q*DXeJklgt3bzt zLZNUR0IO*R zhNmOUNmr9^9}x*e5VSik%;LqL;xrO@?i8e2c@zH!?Ia=;4?iyxR6^j2vxLNRHXR|_ z9nSpR8e9bS4)%g!VPUKpwsSQDDlh=x80`eVzm@te0=mxQwH`W45Gk~6#|l+)zkGRy z5|kbvAMZ;m>-Xd97pQEx;h(hNmioC_fz6~_o|j+md{^(t52Kgxt$ zLxnY?UyNLs4V81X4p{!X62cZ>?-WxRqF^e8RfIsPQ8z!2!(y&OVW~ z9B!jNqA;Lu)`$P@>%(wf5f;zZT`&3Z!J9T`va?gR*_czY-Tx()m((xQN^((m?j3u%obVzmSgkdQ8uzZ?d|PHhJo8ZU}HPDyjr5i$gk9+96bQU1WMts za1C_pU+iIAcy-b+E-@nc4J(kJ=9L>=c9^t-mko>E?rzRk@PU;dVez7+LM7k+5f8@IgRlYHdvjjH&=PIJsE0HRH+w;NN6=a-DcS(=G7@CM*^HY!!K9>G<#QFSwOq%xY(8ZATN<}n zH|D&|EQl=QzaIp^6rExo3U7BF&e%4@;ipDeuv=`>XXB=RifnCTvyq&<7t-3@0JBa; zMHc&DZ{Hncg`U>XhQjwcq#2Y_IXO81cT~?6>a_b#R7>LVHUxQ=ts>Uq=M3(?d%FN}?IN(8uX6%G+o&}hw*>56P*ue)Nj7FoU zdr1k@>?_;2&d);4eg+WJZ0y}Ovphg<>t zLub6na)^=?(JcfBk#5m@B|(P@YF6z`dG#XIj3~=cy%yQx@lvJrvr;*x9J<9?B5>d^{&3$}zyjK0m&EB5F zB8nTeF2Wfg@pzvi`44etn_qHU4w7Ft{V1CzA|RkU!E@1M$VYub8&N>TLG#p|j6ZC& z#WQ=U*-{h|t_(b2eBYSfIey1dG0`(j&P6xoG zDd*}CaGPweO<=s}OBHZhm7Nzy-UrT|w5FbfnG$~9Ha2B|at`jgbFX4E*Ta)Jg~3V84nBRop_ z;NTGMxpN#^r1s_wIwh^^RU(~2u`e(J1Z}ZoRN4PRm-s(GOkd&&GMXm=+tUw1Rukf! z_7^j53A-~1Zebk*IDw(oAqLl!(RTZCDycJ3`w6~xz*Jy}P-C2De1}#Edg8V?)yaLP z*EGpcWMxq{WftP{?T7Bnp5H6-jNZL(Zg;3Ab1tr#{8`@}mG9LTCJ8zOykAs7X|8nETl|zv+~Hh3#_gk)9Ma#;b73Dd0sI3jd>#I0z^ zI~+4`*<_rm*I_EU3mZsiol}v&xrl2Aer#U*wlD*K!?2DZpw$4jLs0~Fb>GjwUpq$T z>1?oz19ze|w%nuELrvw#vJ@r2jC3{r^p8ytaLs@4G{19-`e#y325bSSSZ&BES#DRB zhqfMHD{xkDuWDENj)-zcJI>8ZIerElxQ4Qd)BGFc^J7!t7nn5m<2vUTenlg!+#&ybxZOs%)MbOD}fJDw)zhR zJkOOH3^-)XiTC8o_P=EX4A88>Fa|7>02QA@GIY2``O)*KFM>jUfRY`^U=IX1N=4UL z<`R!2e|(?ZtA?!tMK~Q6!1_gwZUV6jM>1iJ1~N*u=j}R_VoI`2bfoalE^FgL z+a?B}Bw?Q^xUUrGC9#q{Ac@#C79zF6TrEu_46C=c9u6UHUo@XWm8uVlE*J?+X5aFn z;=97*WifPAoqpeK+=#d&uvE-adS7HGwrl9e-~(Pmtlj71L+1VVpYD2yX;L;>g10x! zta4vW?Al$t1*{gb-4_iCdpe zWQoU(r3?L(lebu0+v1p?HH=YyuzmD98t(;V$_?)F6uXE(-PIK}qAvf;#!eoQs4#A* zQAWjm(t4b?e4dr4<8P|naHhdbd(LgyxhU+QG;I@PjNzB(W4WEO(UGH4U#W4dLL4#p zl7uZkZo9UNXj0_Q;fCr{eTyi| z$jAW8X+WP68yjm}AxPFR$TFEx^YYylsLmbMdG`|LZX3AB8 z>iU)rTazE+v{&BRS04Br{&mD4*UWVjha@_xlvJ;5uCQTLXOfa*t91rW(#8@j2M>r_ zNeft!O)}p3BEqc36NLIOEH%Dd1#w`&uIkrDVQ4&SuIod2;#~rFE!XVW(yV=s4z-tQ zzF4N+gBkxcKBNkr$4r#&V(>-X2KF)`J8{Uf?wXAOs2}JMZ?8|mI6%wL@OCwtb8>wA zck0$RRp;vNu^Z@$gnsavIj^(MjurhA9zs;(EOOXM3nU1Fk02estWWklr}XmoVCI51 zXBethMR?$(kK#Ek8G{LMREBN6vJrz-=$PR|cD!5ePWy?@iDz{;u_)m*?rPQbG?2kc zOH#dHB$q2+roDGoqq>vI(0t(!mohtxeF8gjW9BJF%d?x#BZ?$e%qEHqu#^#Ph9j4S z^ESsfGFAJpQLyuvU4%Q#XLs$me%ckiRHxnYtZw6&M+k*fBU&-2&n`hL@u}v81Yaql3?*Q%O@1db0luy9I5y0!6Y-d{| zUc*sjlxo&lCNqj38xrtfiPQD4efy}8n@lWdUZu;C>IQRkC35`!-yA8i0! zc~x8VtKF?aN`rjWxb2MXgcf^5ysS!clTtTrA}tKCAU}Lx9Z8VQ+tfn5s_S+rk$+)nL5gS=uM%G)taiI}Dvz zYYb@2#CB42&_RZ3d}Hz*Ic}qOixgy*+6~!Qpd~Xu+hkR$#zt;GF=NzpXsc3SRgFMB zvcw_9IlnnNQ`C`As$Q&mQ}o+cx$oB1DvT`Nyf;u{J*%caKk+q2H7)bY*A9iq&@P%R z{Yk{UeX7I11!qK71;4XWxyXcnCO|DoKhYXYn0J&X54dNazpXgT z94&{;p&j7f#{IfFx0y=_K!GM^Em5joOyuXmM?}~-HE(ZXAd>~dot>cr?|~&bFaKwA z2c5!hjk};V#=g<)+dL1o;@P*PC=!|@T4tCL*g*mc+h0TEXU{ixa{SRv%hi#6^Q4}$ z{HyfeSY{RSlwy@b7*iLNM1Vfo*FtLh*LSvR7-k)Qt9KO}UqD&5rZrOP_HmO^ag&_= zcW~PHa+#y6Ws$;5w2&c&rzR@keLUM|InT~baAN9JlbKr4r_~CQJMA+N z@+`yUr5yP5PCg?lhC-6&Lqr=AgWD+=XYMp%`jm)gD_d8y4K+K?#R(wiq-~UpTw!oa zQ)iO;@{?xN6)6WyCu|=UI0ixZ8l&S4{OcKyk)FVqFkVLg!}XvmFV5|ku~Vt=uys#f zxq;iUl6hswPG+SpGg0oHb}TFXlEX72ZR5j`G{p>@yHYYK5!Cy9yhEpjkZ=#9B7e%) ziJE!%4YBPAxs+(1|AtZW1wtItkyQYKR7fkMu^ykQO8UC;2J*+>tDl2-Q{EY1_$_2| zM8eNjCSAODGLroEHT)gVabXUg2u3o6 zUBVRx!aMp8GTwh4_E+vH)!G|n=+65h zk&W;OE{5YezxZ*3Ia zi_!IRSx0woe<(z7hB-@+WS7t?wy^K0{!*E6s{s)!M~5ZK$@_2HlFgJA%ek>^ovBy9 ze5}&FV~{BE)R!@?>hzsH)5=0TDWuEi_pMg1RwH$zULpTo_-s;)h1`y&p{I_BO$zsa zNGc&3wi*q04my(Uj!znCVrdcj883@%_$QRnYLLg@l{^(HmDq8k9gdS0xKNd@eSRgI zZXfUb5#wb`?c6g&t`!^AZ)~e)9(Yw8qNnJJQWVKMa-l8;(Zn?Hmt-u_ols+5r z?&kuZ{vpMI?z8Tr1{L^$)ZK~PU^z)*J)#p5u+kB@G3u;@uN2kkX z5-x_S;{ zn>2|4KsX8JQ?+y<4Fdz4N-B0Y2PUj2yso!@Emhccm~qw!7N_&! zmGKK?)NW{aE0xA=^1kDIPd8|>rrrT~|ocMzAEPOe_D_pjJ zpW+~l|9zsiTh?LAzIWQi!(7<@l8B2K)wDj*yPp;iqp+XAcwZJm4lctV9Q$s3c6gR1gc1kUSbe&jqrgSr zfv^!H>AE;OV_;xRR+u~h|MN2K(&OW2tzA!{y8Lq)Imo^UQe5HhrSP@hh0|6-wWK6o zRDA(YZ`Telul)*qo}RlhU)6O(PcV_uxrbG z)A}deMDB)Zi$^i^9r^N7yRdJf_jZ;;f{P>XLnf(g4`j`!1*dF+CWC$n4c6(2L?gn6 zsCJ6JmnC=<=|5r~##qVuw#sJrJh;Hpc#+2OU&>%(t=qu-aNKu^mPV5F&hA_5 zv7*$PUuxX~(9jkmC`nb=D`^gKuMn&P>_BU{z@!~>*I^B*-xbMFnfjBx$ItMK1AOvlv(&+B_NU`(RaaSW;n7oOn zd^z+Co>JY|CKUuhfHA;L!Dn5O`9qz=-q*YOrb9!l%km7m`=^ayliDr|6*ff42eYca zb2K1f7o9#Jm%Et)->shy-pRao33tscAjBQ8?GReg7sT7#UHW}YjmK*D|55*09?iE_ zPl3h-`>SUtLi9Na?J$n3PT9o3z<_EIFIjo_Pbt=;E2_hD5}WicQWD#Du`jgoteP#% zP|0;?QEb~QqKk$_8v7CgCRG~|M4-I85hJajcSmWTtPyb>)hle7G&0JZQf1IG9x?Yh zt>({U$Ubj7Iq;fbcs{S|=ypIeHZ=ujxBG$hwCCZ}@qrkoUymZ@0#IIsV0fb?_=FbX{sB`GF)!y;v`Ey>}|j{FKRxp=F7p^9IW&*-~vCxWrV@0308+u8}M@ra|rSXaq&{~3UYG@ za`SRi^Yid?2=a0X3R3fNfrog6xOu=oe?|S@_Kv+WbN%3857v%RbLwcm!Fc?Qn(5tp z5l&8f9$s!{Alj7p?_0~jww?dy*0TREN95z-;Nue(76NDF<=_((7UZMm72x3z5TmU{fz(H z%N;|dH-LCd#kWG zqOZ+22^NAR!QEXNcZcBa!QH)aClE+*r*U_8m*DR1?(Q@+F#SLCeKT`07w6(U&$;P~ zuG-brRlB<1wSMo~3x5FKF09cL;`aP~<`wto0y21TOINPOI)R z;7%lc?Z%T`aN;y)Sug6+mKuNU(#EnO%w2B2@)KoKW^^r#BJBp-{_+WU!W9Ahnl&Vh z546kj$ePL#4Sin42u3lQ($&Z5$ z8{G@JKWFU151P_7Jm9V`&Zw+5>$>KmVjC!`n<6V}eq?v75Un`r`ZA(FLFcBUUizU5 zqcWt&FvWTZ8S4yQv!|q@%!u2g0I#y+cA(~U|L!q;9sP;IWD`DV(sqNBaV*phu#+Ax zSlcV<_B4cgNyZ29gtMfP3U2!x85upJiJ;;jGIZ+rtptJdpBpU8r_9vnxfi_Ez3IQ^ufr~r-o=ISXd%5yW9J(54DdZ1q}*ioA;?G`7~xr-C#QR(_yQ2 zruFJ)4dP{?eOsdi^PvJ(77Psyr4D|CB^FtMR&w z1-LqnDhVFf$rxYbb7A{~^nZX>g==o93KR(alPl}rUCkF852MLS zMxf&EV!cK-`?ew=+4d1)U4^s-Ad-qxXXpyYZ4tdNQd*;M(+S{JSHL0WA+kuEWkyTS zl&hUq#sU>a923ARTAm@sjPG3s2 z=alS~)a*SL?0*~445eq>Ph=O*nus3#`G>L%C+*VXE$>k^ET!Let<~mKw7z9gz^smK zbBkjKQ@CJ7u+*UrU!;iG#P=`aac#|9x(>IpQFzJfqe%UyZ^~RBTu%MhK^9l>R@8kw zV*VZ!2DpsY6xJW1oq!GM@l%PF)MGL)eCiHk@@c+s4wM|S4~xXN2Y%#ZgQ?{TSDF#1 zTJh*;n@~iUHpiExG{&YA09tb0t{faiWq#|2z5`W@nn$=KD90vVb`W<^*z9K-Y$xz$l%IMyo_ zrcVB8m?$Y`Ry(hR8}{^Mt|By6Tf2v^{oeEnzSmMD6s4nYxScQgpw4AkzTx61m0`{A z#8sz{h)PSn#7U)@cP?ozNG@Pweq0(i9I!#}nQ8FZ+^AWgobOu2fV%aPBJ;85)9Fpm z`55Ho=?|*nrXfXIqyeIqC{k+yasx-Wet70 z-(`3cX8UcgI{wYt?9#A7o&z@Mlw3nhI)DDq3%4>-y^M^d0irCQi~AkY$xMDK=kHbw z>?$nNgUKr(@+n~UN;n(x*x<#kXs&4)Yh^W`6V~J~$Wl}{}Vb@8)yghb~PRFXfY_ejDnZX!MnCaThk` zr0Jl(SFM=GoOO&@uP)vMvgtM|W23IuqcdMHL_juVYpQ*pZ{1+sHP;+rpCyP<6kcnw zy$+?>h)H>q5`k!MgX{ZyuQkab%2H;rH6A}VE`|8{=dKKWE8A?NSKMF*$IeqH}} zuI0EHdGEgM39s+AE9#fmtsYxm(OShM=E~6awuS7_U}B0+Yj~viy!z)~815x;0-p!% z>`<*dh0@BJo@JTpjbJf)PFa(eW>KupJvfoTZ4GNKWbCAg7pDUIE4s>MoXcfZ8|=iw zy5qu3_rryVRXh>=BEpbZhfw_G75{~ty-a(CUuC&1iSLs6R{4Y zcU#)Hn{YEW`{$j(KiDIjYB9V;<+6HCJ*1Q>`oVY3i)WQ_Cp#AbSGY(mEM6PZq4gaH zLk`sU;-YK*mcu*_NwnKTY_blX<&BhDLPmr8!x;?=RE9ym(l;zl6{UOaXxH9N;LCfXobA!j9~r5Try$V%%G$)TF7F_RLMjT#I_oqQD|X< zWy~&)dr7uJ-fmDZ2{L`&xQM*(f<=7+>Pg&xhQQ zda2`&Bc^I`HiMwp#^-R9Fxl9K$F(AP*{@?UJ z_x~1!|F2pCLu*R^cS~R{p8wBU0&}u(axwp(vhyqh&IMy}b)XCDk*q(gP3MktFdX0CfGuztv-`VL`GFq=}PO_O! zKO%W&EjFII-rKH+smrya-!9+n{p)Btve~9mZ49vy>CY z%Xa?aZNBhDVwNppkM3)rGk`XQ8CwW&Gcr@DC-xWjkWRIH=VTOy5|5Wcw}DtqwE_FA zWzjMWARYN?T|bzHJ)oMLgqH~PRAJ)E1+5FH_Um-b@2|u5fn|tEqYl|UASZA~bl7~? z_fazq;=8mzM5Lk*est2${_Jv-}^|p#SsF z^0cmMn!L|vWqP%r_!&o_ZOhmD3fOB zf9Z+00aX^SI2T`(dCu#&g-kgH2}2_V)|1=M!?T%o%cATY zq3!%UZV}}=lIG)N2w!LHws2yTr8Fujf`cjO!})!r$}5Hs#!bOMV+X}~v?(Ja(>)8iZtNj%R?C^0y902GDCyCZ7sdUX4*%j;>eBzqs(K1f{ zjt<%`JU#G(A!B0%4by;dlJk5Et42Ehl)9aXu@F_Y+P?)_C%E@__zPKx_^jz(lQ#}^hbqo zfHL@pz-2$w!}Isw)%oDa$f{&y^_ykNiQej*1grBfNx3eCB2m6>-xFC4s}@(^;TGk8 z_tznkp`%N>Q5Jgt$(c*?xG7Z7sU>asWd^n5y;EPK-PEI+$sb-O6LSj}`m{`!1{m1f zy++U2t>RVa67HX9J~7#IlhwLath97F4ONfqb|o6b|4D(n@d(s5htt_R)4P3*7N<>D zL3z!U6V!|H6EUVgG^S=UQqo;t14C!3T9sZj9fy!z@zc2s*evC_WVXzIIU-4R{@x=v z(FHNp0BP=q8*}VKY2(E}r78awaC~Im<%96Uwkqb}MBrIqG5Z0{{@cXs8g`4Wwv0v< z)xp7}&{1zMZQ)=PB`d3o2>yk~i5l8>5h9_&>WSf;AC(o9AtA7Z_$2TavNANAb#=qj zd3z(6D(d2^h@VMhWK5^YZe|sKi2Sl$mAJW)G9(G+E3Nt|5)q+a`#e4%6ye{uKi7_? zSykP1?^)nWZ9mSNM(~EP$Ig;0uS1NdlmF&g)3twNN6u=Dk;0wwo4UO=7Gey%V8vyP zV1O><#zd}}|F*33(M1hXP93WO5!2TSvR##C{qo)!eExu-nOsp5;m<1eUiQLb&-hi` z=}S@yWJ;qoLoau-%U|Oh-4`3T0;iD0dZR6eHQEu?s{q$y;?>OnW0Kxc*cntOu90GMxAZF8ihLB;}|;30{k zS%cn{s0#X`hxY~#6RbDIDpn{*jb_rkne2KT4({~ZG0Scetth>!z&$nF&s7(+|IHGz(e0< z^pg!dJ!R~E1)Qyje?2~#$tzaTTwIHi`k|sqduL`QZB7NpO9i8tIhAO4_WTr+n)=vX zvw&4Kyw5L^5idD)?7YZuCXhT?Rv)->lmPsUuWS99IZ&uBjF^%rHDIx2a&D!dEG9?C z7-U+R%>u|E3X`uI+UH_kTSTnEoWMp6gEx0}tU2;4+Ha0Mq-8 zEhS%Eea(zp<^N!g?BBhgz>k(8YCJo1d}}&VZw|1ywM3Jdu<{dhhU?=>7)zFRyL1qQ zmD^SRXTa8GnUhT$pDgaKdVAz116ZHf6ZF?Rn0SE!O}{;?o1U=mpo_}p`cxJRHpXC& zZ`Z5QbzuZIEffB_D@)7MsSKw%_`eTP3{p*aFRzk&6$ed26i@+M(O;fNF71n z75BuN+-H;D|7)%KWNgkSCUpoI7SBD<6KOFugxd*Gz0iE`+b2+VHlT%|o#lG57k$&C zzz$7&-Z=<8RSH>-0x+2J7MOgSP9yK#V@*jG1%&)Ut`66u*lp&QuESvrsh_uhSL@Ic z)RLC}+6CMDZ`uI`bneXWN!?SJHSz%w#B@hooLx#7-(%DQaiXQxJS%c2YkNrD zr4rPb8XEqN*;y@h)0C^5$!G8lV{}&otKjyDHvLeB@pp$=SZJi3%*E6_ae@_&U>tGU zeC>A;51H|mdrEiWIls1MxqXfKs8=!__p7FhG;vIeDygs>jn}&raaXRU33!{*|odB~?~z7anlfuk9P1s?I78C&H;6n4AkNg*<*RqDGv`H zBFS}I=1n6#ulx`tJyX_v2Knv70dhGK_IjYmlZcmAr2)P64j-K7i%HVOJpUr3EDypz zUjO6sOl!58bin6ICZdedY_rG#I$I96T&GG2HobPQ?-oFi&Wy2L6>oLP8{Lfq6;gsk z9+@eS?TVwKT2^$e9bzg{R*gL&@~Y;2 z`GNzWN5KO=tcqK7Y3%{>PDqOePRM7-wbWOGsMX;8oOa*e6kGMYJ9waL`|5J{JTC?V zoq~o|8g7noTcdpU5|#!k-bR-(ivVirtx~Qx{5~~9)A6*(#CnCr;Pg?Jl)E@viM!m3 z9#+hAAZ5s@QHCkbvBmFZZUnu{ z=)-;8L4q{BNv4*uu^9d^J#ANx(lveogm|H5cXt?MprTZ1ptw+;gYCpZx?P)s3qGL_ zQOz7X&pdb-}*llH28>VX4ZlVLUu!=8>m znN1Ol!^3w79Wdkb)bf05{pM| zQw_YI(-kK(N187BJfEBnC)jx1R*>MRau&O4(K+5Etdg=AXD@dPIGlN`qg!CmnMQSSNvgQ zn_S9~eRxOZuVVV|flvpWYot8XR^cB+U^Gm5ZQ!~D>#OY8Uz+7ZUs<=a0$sO9(!9ZM zl+ackxXsZrRB4S<_s&Iw^~*TPHX@i?M`;;zD$HF^mz~6?Zfrx$nraBf5?FhA!Q_C$ zKgH2g(baB>;ZNNV5T}aWKeL46BHpX!Q*k)|jM;2kHPxp^49Lk*ICW|U&9i-kDGLX^l=oWnfZ<}1t@-}yK2vwTiuDv`^8YT9A z)|!6(LUUChnk^R-;`&nN_tDPs$`{Fe$ zZ|lg4HYle`pOcq%rTkd0Jn!io5h%T z>>IK_gYpc3QoVXL)9pS-uvL}dJbt6bIS;aWdgqYh5Dd*n;~WFE@sliZPWz>AzbQj6 zp$%SJ^SpYoL>zr&0k^xgvM!OZIidTY{E?~=BPx)G~eM}g478NR>ADkZA${k$5R1urxqF}=3bgZu_}P6=)6i_zUoCrp%7_TL18XG&&&lSFwZ7b%wku5x2gp?r%SU7 zy|+_!fBHo2b)0V{Auug>v>9ItjzkPZ%wD4&=;`Nj8E=@62m$sYRHQ51Xw>H$3Vj&zoS1vJ|*IZTVq4*@rEIjA@u zx0PC~czsGWzfQ1FQ<8ZMAxlvTv{}5bs0a9rS+Lx%$|m(fmu0Ot2&07Fy38=1w4jQN zp`#j_HQm!E+!K&p#&E!|d|B+1C|ndG(Xn!?UwsTW`wU+Fp!~ciDJCVYed zI#ti9HhWn&b~V%1&+}LBRZd{?Ml3Q~XX zT*$ii(P(lIS|sWef!-bM)~h<3Yi!#$}G;j#2*f-zmwG39#+C5CH>&{>G{6U zft8?BX~LCZP^g>9QS@W8yl+b|vD0e(E(IABzW$m9m=_$|P3UqV#ODvbtX%W2w?9Zf z8Rsi&ykvYpu2^vuwl&u*1eTq(iq=)YgQ(@9Z&h0#`fatD&*S;Igj`8~zS2ve^}qxj zo06o!JVx>er=;Vpk7F$O-rv_5_!ms2b46!91S7$NY-~!hI-G(&2j6*Bq_7>kt`HI3 zv7Q@*)*2xj#f;DyF7yMr$D}h0y_V#zcs<=3FK%SS>=Z1Oa30p|p z)2gfO(q8t_UC`jf250?mUx@)B-Ot4tyoVX7n(@OG?mh`sxwwhR>h~&uJbwPmfM3?k zqmFH)HIqU(1|$1g&KDUiR}gLTE=QwFK{}a}*e!2uk@1jmR5puEm?(qzQ9Q4jxAFO)(LWjryV|Pq^69imd z2SpIbS3t{Iv_FE481E}4GEHyPB4T)#DKp5Bs{ERI>1>`GVML!F3@VNsiz} zyE!HNHnv0-z1e;z1H;A$8)u5p#vx`gjLCzF0Uas~U#G2bk4UD&afN2K8{ zYOM?5%UIrN9{V5<1=!*Xy;1#q5HjN~F?IrbA)*W@wOrez#;Nd4*VCWy!y*p{tWwCN zxbzVJgdUG@*RjuCR!ce+jhN(SN~OXUA~V{&FwB!n*>CDCpeFbNk944TADY=Xf3Qv7 z$A&H#c_x|ok1uF0B(=Xe@I|`anEBN{UoW%xLS0wz#Ov2Kt78?mJ#Kp1H636xm1D5y zVmg!!bRSu9`?f8~TlQGI22uIy>DrLfTd-0;jVCmG*=R*n1ep|iyvDO0-e2k8bfVOB z5681fs>;;`cxtyCDy2ZiM_>j=nPd<@nHcP`R#l7I+A?z12dralav)@nGL6oa>rIZ* zZ&UC6N8&umzI^%Xxzd0iFd8j`kkIc=JoPagZ?tlFmeS^W7P|C_a(_)-!ATQ~G))(U zUdyFa-V1rHEp9(_p}KKhiGQEo@6h{cZn7C~_l*U!dKNdcGA$dcv-cm*$-BGnrVN~y zC!>uYXDER$oM!B|tK?_^P?8Ev6we3zcYywFYt>kf47zO5>|qt0MBzRnzG-4_2+CqQ zH<)va?+WR@V07Flw=3PXNla2J+1RGYHl{|Ex&_^$ealCrJ~EBi?K0%C0u4{GhIdmA!QDT`bC#XkNo67HdJ&TDrF ztRC`xk--_WnrS(a`M4$CL!8;c)$WJa4Y7*=Ce%oxvLNGM%KdeRIMC>UiWR5#sAeVP zfEFrQP_y(;Ib3l1SzsquOVIWD7FbA324Y!EXtV!B=aSjZ3MouxXR_z=D-)zHnUd({*o`^PFm6u4F) z4K-S~?3BRT??^Wj+Rw|DJYsY(;S#5km-4(G;W>uJO$j%2hev9fV`>KF$Ga3hsvmEv zcjDiKM`-@uv-tI->S7T!of;q}HZS=p`)X?o$d~fa%ORmSm%=ORe0RooJ0EzFYmD7e zIV$Ielg()vHxWTeRpv$W02vqa8V`!h22-pb?=}?uGrM%>FTk~3(`@nQ0$&^wkLr8n z23#_Mu+}f4=K)ia!htIY+LWmM+Z@{5BT#SVtFA=H0DK^+Q zyjl3|UBieLn($PcXK#Z5s=5eC-B)Ia5;|BexsDx=wPSaT`uUZ_5G_4DG z&|pMPvY^jXOEsS_?>;Mf+$GcEeC(0s$Pppm(*9`^&ij$K%J)#ug{aK2!^Awv&Xo#F zDODz{EBV8@lMVTQmA|A_e)@zSod2|4ZQ0wyo_&wXE;eR-Z63;JEhKCioADz| zg%(Nk_TSI>`qq+)Ph-5zUBK&XF;t`|dR{rMvtpJL%rhObUCVvn(KQuY%L){kki}ea z^y^b5Na3m2qX&#qIPRnzk*7JI#E_1nR__{4`AN-KSW~?yXr77v0dNO}WeE7cLO2mO zpz)|SDb;tlmQem2`((Jd7~i<8y%ok};|^w|1Y6Jf)1YQaIq7ELlZL6V1Xb^6^hEFH!pA~%+9M+L-z5Q%DKM|~<^?Y?^~C!!(C5S%}IW*txemM@w7+jl;n%4@tc zY+FBgESnihz`x}dz7BbE;_;u4Dy~_Y z*Zg)3IZbk$g|dQSK(r=ft&6!v>GAY$-GCRxh0MWFr1q}z_b&tAwjXN}6OL}~!@uLn$lJT#)5m^jdU?7g_KSi2Sl&wr0&!giu9uX! zO0X~|A9bX-iM%h=r~;wJ3psh1A4`uoB6yL z=J&bmkjTQdR2C8EkslRSBYy51PM188)Za@C#|jw@=Hrp_jD5QFno0=l?-d{J{BL1Y z%YSw-);xOJa&!a1C=}bZa(|)*@EcPvmuy;21LiZu{252r5g6SFJ*sWqgEC%zcF;Im z4sMutynH-cvZ(bNjdVN5c)sV_Xz%rT(Qp6hG5n@MRJy{G4nz$%*SOUAZv@EU)UsiC z9OnOEH=-!$d1-KHdJnChtJAbK#XED`PJ6o|r`K>0|L?u0XJc~*o~}%@UQiVyDv0s5 z-YWPb816t-J%i2LZ+Qz`u67)Ewj2(tRws4O!oNYi8bKrar%|_dyOJST&=FTVZw+&U zigCwNq+~RJy6V8*%xLp_{r~2k=q4#_Es0j(f)Y7RK7vf!o9Go+D`4<{4?YAmfHe8m(M7F3m4!110?^~ zu{Cm@Xa&P=!%uPd5l`Plm&NBb5Tc;k@tLZ|DmdGds);OIXZS=+m9vWXkHPF+>HK@a z2@uTDbjWDf9D$wCfxuPvNdG@^=eumj!J^|$IKC}v1}sS6B9;0O`o3HE%zUcYWZInwe35U^HL>^mJ71i=-U5ha;!r~)BitUHT6Gy z*3wLOplCk@8aL7z!R3Da>jmytjCU^8j~}Hk@u5GIn(h?#QUEkF zOii;d^wr(8(85t`!Z^sHj>G1q2VI!zRVkLf!IwAQQ-&tdN0ar9MFMiMpRsznuY(rZ zf+fW`lftdp{J{n{Gpll4nE&}EImf$OKofFWS|f)q;Kgg`eVdr)%I+7Kev7=a@)YNl zy4RRP=r_}WrUjiZH`akyuFa5tnFRbYJ2M8rqc99y=9n|VtC1+5TC@Qx#W*PaIsqCb z95m;X8I9&m&~_t5bmCXCeCdCC4O02axn}R54VpQG2KpOFAd$T+#wOhdHR}`?MWo9z ze&G#8@3Qr`W%mO~XKsRPReb8Ip?pZwDjyU-M( zuGjm9K`Ap{=5)U|bwlcdVbc27hHmRXFIjIcz>VnT_REhsF{i#s=pPtsaBR1|W5nk+ zs6LYmqV?p^YWIrhn-AaJ9_)vIBg;zGyMNhAF~aD}*D&N_>{?hax^nvPwS(lC7_i44 zNlMiKDV0-t|5d7aVEX}dIeOd`HVW6@NB_6k1C7feF7AattCw2wlhwvT@R)&c3&A+8 zi!_QA?PL94H9xB#B5&*+TGk?udysnSBRR%zT=8UuF-h*SDDl_R1Qi^a+pGkXs-R_Y zSN1?XXa>|pWO+Bj(pE?&+LZrzHv;F(D__$5OV*~$S3jTHiwGeno?Mb>E6&W(KYA!* z@`G-|3McV}SnYLaUu5utELrEs1x7eHFgzjmqxPNeu6SJ-f0Sm}*rHmdoedT6W%<>YDd|My}AS)ivGKNYGT_x}_JfMAKaR+a)>~b8~vLuOdUzKte~@7BMpC zf{%a#h*ym_g(XD{;EPsOb~*qmdwp*@jv8~_WI%fspFYP>=$~eTG#_%IFu6TerLh^{ zVEnOj(eCh*1-rs!R%ZfvD1*}l<^7(1K_F}`J}J3ZL*HvHzG~I~h4Qr~CVdLB@BK7i zJUplIX(T1$V!nBG9pJLjq}C7;%D*zC^14Tr>&yH2(#plQI0c=pNq>T|!ksIvawwFt zqFrtSjipKQ3mlV57#aN_A<+f20E2CpMT6-`+R7Qg*OEJz@9p_}jnK%M=rVki2ZHBo zataMrTHXY&p`6X@ZZH0q!P?n^Ue4qpozR%a1(+xeRf%3M_ z90;Me9-m8$-KM^V2qUCWL2k8i=A3WHeho4;Lt1CSRDeooR^)FLGwSdb(_TWj-V)C5 z0+!gy?miLlrnNa9EZAE}?>JiBWfQ;SaEy5lws{+Fftn$Bo2)wdF)F(N-?Cza4v%5Yzhv|MWbFFTw*Sg^7M)oPmxe|lfl z;B!rh_dC;U-PmCFI{%s7?Z@m1K|^bP^(n3p+2fIx`3E=FbCz~N8Qz7C|z z8m)|Od?RirRGS@jx{KfOOxjs@A$6(?+O{W^SGcGsYWP0ep}HZ}Xoby@YH8hEf7}Zw z+aT6;)bdJLlk};RL^01~n`%XcKp=s*gyezQ~UM}ayBR^Vj&s5n1Zz9v}Br@3no@u)jJ8qHL6#m|}?{>fruYOle@^vx&i`1R!&0Q)zZPNHMhY$^o=I=f$7n67fRegx!cB}`9c_cKFXAIIzgkwOFB+qG%# zPs`z4TL!h^sfwsOs;JFpvzlg?B9HjM?xM+;0DB8)$D1qs#tRoBF8xLNVj4h)@skuI z<^51Z53g1K6z%Mtk@)TmJv8a*vaKy_Zlu?FWd&3ihhk^Omh@2vAH%Hc<02Kq)()Ku z##e5!TMW!`nybY=R+NARE`?8bD01;eO+}N;KkM)ORNNZod&`yc8tl@YBN$a!q?>J$ z_&ra~8%}Lm6oq$%9XI_-={2;Bi>D$|;BT>$|1piy1P5+eV!^!lHDG?8DEMJH#qt-Q z|E>_SQ?XTB7d2c40U9AnGm(5Hj@>5DbY4FCi2DSmyhtUzoNN*^DVV1l@+;WRwnWWO zy0e*RpCd5Ri1{P;xFNdB$0A5#Hy8cbLdgE%53IfMwkFG=@oh&?88qlD6}$;)!mD4r z=H9ZzeZ;|XjaY!Cd|w6cz-RkEWO$0S;4ZeSdDHv)O&uf45V`Vf8kmuACbKR2?*M_Z z(CGOta)A#TrZ|qv%5`S>9;U%&en1a^g1CF~a%Kf+!sggFKW^_WA2sncK-~7aX|rr$B4O6ea^wAKx0?H;;bW zN_TE2g-RQ)yvxNOLSMEZ;n)h_5;a=hEq7y#ID{Z-R0V26ucOA%Bsiu-S)KTv!I%x3 z0IcU938kmKd!6mUe-l`>)QRfiRM$QbLo-dqBxH%eWv*K5&FK;HB2V2`sebeY%>AV7 zYY>g3+S$qK(L=FkYzrkc-0Co3CBJ`u9kbR)N_QzMyTFWA4RNC>xk;ur@ z_Q}X-Q`ZF8tcrvcsKy53F$P}arQC81qtC22yRe?pkC;Uo=4rVfG|Y+S?c0|aF*QDL zljD)Fg?SB~Z6LRDsW^}I<_EAeQT>A`%%u!imTt&pFgtHO-Q}GkMRwi}%cOg|cbh5p z^E<6W;g#NAYvf`k1Fg^6Ihu3Bd{#3uK5A#%n;`Nm4rpVsC13W&}&2MzqLK$#zUaO5Y zO+>q1?$^d$PaioRRNgGlad$#^@DSHYlkCj%fW~q9jX#*kyan>TY)?y6IAYtq%#_bv z`C{>Xy98-?dpOv^3&C!fms4}@XK5*lfo{X2RGk}fIk!8?0rmsf6L|Uk=Q`9!N705! z?YBEDreM=j0$v$4%p$PbEQL z&GW9DgtY?F%Fp8&*Q$AC|Keut8XtFrxLHb9>%&u!LlGeE;81J$ae9XA@iM;m&v2>w zUfX3c;oAXzD;diB>ER;+0A{BPA{s?xXKty0>N>^3QV;qk?DYvR6WUY-YO*_(k>=2` z`r*lgh+1gxb#1JT<|ZhRv3EEt?y#4|pCey$E!y67J32`u_=Vf=ATBnTTyXP>)?Jm_ zYswJi=d_%?fbNxg3JGJ!5@e@{@1eO;-zJ0FR_<`_V>5OoJV_|lhohF;2=hq}ez%o) zo_M65+=~MIkE%tR(!&+-Zm|g2cIkC(Zt5OqlcPKHd4vf+c6%i)yD`X3tP?p6x8$EJ zm#(0EI98{cZvq`lz&k(fy>m_W;vcm5*qAJE@K2p!O<=XXD%6xEyI>RON zyL)nHVYDnH8n-AuMjh@DH7)uWmUAkj#qN1XIrWQd)2~tL1znb!2;X_|J_C`{Eg884 z8Vq`C1`|cA`*4g=vi6jojpR%d@p9*%r2)9%XX}OpV1S^{e)y!bCDatL&g8yC{AnG{ zvtLNZ9@opc87eixUW9yo-E$1wScMV&eTTs1sxse3pjjIfW#Z0$d*UmE{F%cMS-2Fa z8%YUG@D5_KytvoIFr$_kge!yW1je!{`U6Sod3f3+O-3 zBxjQT%RHkRA^Gdji&gJQ=5@2*yejV7IxWv13xZncs`%{-nv#Ak{2o@ZTPcpl*)J(f%g`HpJ=A1o)y3L$-$Fd~gy4Cs3P}l9 z#f#KsJE!Ere=%u$E4_xxpr3*TbD z@yX9v|Gf4x_-%Sz7yes{>v5Jp)xf|Uo{*m$JTeIa>NlO$Lkl3~>5?u${KTP4`Eu-Y z(!y8-JNs0FrKV<>>jw-B00RZJ!Z%OP*1n8b5%clfqG+Q5Wi+$3b?Gj@y)6;15IkoX zQ)Ws-0$zfqf57LcGR|9BDM7v48N{U{bYCov- zDjAyce*o(iXgcg0k=L6hh;9oTdM9Ju^YuHqiS-J-z7fGg} zfa*U{0uqHSuaoK##Q76%Cq#J18)7w*U;7nTrN&Q}p0Izp6rP&pGA+|o&dWwM{;s(9ebIH6bsm;b?VUjEsd4Z$v} z@J)EhF@;v1Lv!~fa2vr~#NIY!tab&fZn38$>FxvMfs*jy)7b3t4oUL4nnuTURDiE% zWoyL!@TDk%`+jy6{e^Bb=e(n?T2>Fv_$7^-IDqcYLaJv4XpRU2?`-0{bU25!UTiGH zONJdV9e3)-{#-MDP&LCjWA~>d`qRa9Ms62?H#ay@Xw$k$sI~fvax&nlWWSfXXhN@_ zpE(*FB+2X9Aui5;hg|1<=Vy9~Wqf?6kKwW@I5c*#PBXRi z99o-nkbM0#m~cF`JpmCna=Uo9)WR2R`mtE-HC=^D_-2Qdq3z`GnEC|BPFgGB78=$z>c5>dc*c@8O2Yv!tUB*B63MLk9T2a&R0h zEd0<)kxP^C{y5lemS6#Uic(I_$~OEP(FNIY2b*aoyk?pf54M}jHd~>O+|%K?W6u_^34TG z1igRLLeK`J?G}d4?v|uQ#iTq%E1e}Gdt$pX$znN9;|8gpLunUu>+s*-+)hHOv1 z5I*GNVYtDYQ`q4$8x5)-_`K7KQnwRYv;tgj9esR~`}kabsFUFHNCebt>%bm%J0_d0 z+4cT@z%!GK-X+$}v`ZWxdx9P0Q~#e;P1CYQFtuhlEMg<^tEy|=mSt*Mf=I}Mzju5% zdvd7Hf3ix6keQG2jo=7*uXr(6z6IWO=DDB{$oHG(I*#t!hn^hxk#7T`d1|>`WAf9k zLsov)0FOt2R%=4$JDhdOZ08nhvW<}lKR*p)_5e8QYWrm7h`WG;A?TZ$ znFyafJA3Tqp-Z4gZINn+%jfpZ+xxkn{>k{R&6WQCM))>Ite(~p*QcqDd^Bm=dCC^T zA_xn3$G+QybX55`b!hxu=02B({;d!?@nFAl`c3Y^#Qq+AQsdHX+wgfID$_%#cqH%& zuU+<^dmB1_B>Q7xK{%=F#RP1j*#~Mp6CTIaugA`o28C=9tDeLw)>FydEU*ua(}N{1 zVTZwHA)|?s3ZUUq*3wsdbtpZqms6G>FKvK2=C0B@B{$onP@dW1d@!U~{nb(eLw=7o zAc0sSHHrAA$MzG2zQ7n~I^)vtyN3CxpPZV`!H@o6S!Qgtrr#rjV zzdz-u5rtcRk78o7?;btb=RAIgmKC|@y;Fg1f4FM$CqnJ)!G1o~q!diI9bb>_O7_9~ zhE-Dua(?zkW*@sA>|~Tizb|w#VTR#tME5CfM&7g}Za)w`CRN59&uO_{DW$;-Zk(M| z2|3~ZO(3A_qB3xT5ODr@AmXrD1Q}=+ue3mOTaOM4HS~UMBNV~SB67jGvx2KI@tWi$3pp`8X7{u1sBYi>$LMajs`^eCB3AF3)!B zsTQx^g|PU;>B6O@QsCuw>g6K;?L*F@Q}#_7v_b_<^nJ@-LoGU~2dI=_a{1Wf#ZAF(fgQ(^LXhuab(_NYR2 zK0o4Pe`MUJNw_S4msY0Lp>j6VYg%GIJHpBNqifMPZV8KHZeGY6ntl=f@QSC_izGCg zk|Z%VcVuNeJn4{&Om4V76NmNB%}=ml@@k#Aaj{C3mX6b32lrPi6;*viK7bq_pO?k( zlb#_6k)GZQ?&KnZMy#Xz z(TbFlJFmIz?02*AH=9p3qr}Zg*tYG)R!?lR zvDMhNZ6}SByT8Bp-aGf5$vCi~Mi(s-?2H$%;la@>yQ)q6?x@)2fnjSxK_|(^u6r_EkUfb6}Fk%|X zY;Ha{z=N&2RbcM1%XhKnSw8%KGeI(c#-94W06(U-udLj(pM<`GBZ7FR7fNA3(AmBU z{+=Bdm1R9LC#9tlr3DwI6=zq-#d|ZdxvOGJvaUkfq;BHmN#*}}5}C)Zrgt0Fq`nVe zx?&UbfKm2Ad4$-}2+4gCWAqL;tPi!MB+`PBBB=?=cdOi}UR6%}WkpG1QuQS25|fs( z6WaehP{sQqgbx!F^bN14xl9IL`d`U$`hf5Ww7Iv%U*hLKDrH(KN_xE2V*ra`6UG0> zdeuGam6L*ZXPQC57|^nAUtg*zyPA7+KJ(bsnoN7v zYsaJCzwyCkGWZrQ`;v{)%}wpw{9J;&!H&X_3G#Mwr|PfG&0zB~b_NtpW?IX|%!v-|wE3=)#sH7Mi4{UH0AzMh~X?%2I1jmTXsfHnBXbJS7;c0nhvd+)-iR+>6khI>DFJr|07s!4i3JPe zO*1?H;vtA{Fk&M>rz+ZCWWwk4++!vkx1J%@CCJRPa=yD#+|a2rRvGRyhmJ0h6Sqo0 zPnJ34aW}mF6kp>s94=ig@?xutH}+L`#H5SC@e2ERHdH&2)H9^-ZvcsDVwUwCw z0UEPaYo(oxiN2I}#}OTR=FDro@%0cScbXtA%mo0CdT#&r+{XL{5?K*(;;`>zzU!Jn zU{t+ZOfO?E-+JI??L{QNf(mFkX1+W8wCu2!ce-H-$d;Z=$c?&nj)QlKX{0?}(SD!W*KIKmKefshS-XkuHx+%oT~ zmsKKn!*u|EYC|t6-HZpGNK~Khq$$M41mA9aSp95(_>X*^PHP@RWe@2;%;0d+c*qhR zxnx&l^^9Y(ZYG0cHBLDwVO-g)^p4X2Huogndde27?9*S8p7yhV-2O8)_d{zQ5{q*R zSz`|+>AggEl^H!LNoedG4!a;bhuAMu!4gX4`*^`lY4s;&EN?`SNg6z+X&k2B5G&b~ z64;S^61e;GAG6!Uc0~LZBj-KBtj?FDInPHmTvv5^NJ`?q6Fm7TbB@@ngbP1WKxNm< zW)b>y%)Z^%H__d|g;^}7lhtvql2Z>im^{hys6S68mLMX3(2|(nH;}IAa|#dAtI*qR zXPK58$2srOMpL!rV%5#Rsulv@H2}(=9u13cx>ETb6tk7js19QJ3HcNdG#8uU4lyxM ztnS;j65#=Jl_5bL5?BVWp$b6oIXi#?4-#hMY)a9!kD@Zid>T;E?GBvg?Hw_$0E*K7 zpmBX&;*;v4QB5ER?yJmEoDA4!tn3&dY%&@r^DG3fRGilh$bv# zmCGCUWUkodz3sm*zo>>(GB8z7t+r}uL@KSnjJG(Im(e-ZVbVc^_1lY5wsBTQ+ITW#{;g}g|%?H7!7wRfX0)qYf zS&vbydPOZ%-Ii0lcGs}MLWURM9=uLXCKg*)nvD@d{7(G6`7nq36T$~vdU(RJ==}*7 zV@anC*y-clvR2AK|LvVPwn(N8ay4e-?Qig`DR#G)qqKy5RI@OwhSwtA9_eA{_2nhL z3RH$k~mS=mvWkwh*NGHK%T1 z`cUzDQf0o5mz&X>C}4MYnEj4YG`RS@Lco0&uga+$Xw;UR8-Ox}+YeC^zG7}&^1R3fT}s?y|?8+VUf)Fv($7c4E|i0ojW z@4w*|X6ztoj`#G8d$TJqq7&+TDW~=!BKy#&Q((t`bIO*WI+sFR_LRs$dN%+C2)y)3 z87whA0OjSm1NYhtR{$SI^$rsp_uD^fN#ZYe`)B!Vt`^` zqHz$24mYiMBE{m9p55i|)$*p=2BUvZ)bGNfR&-Aj-p4nv02p`1zZ0M-58(kY*vl<5 z8((A+x=(>)P&$<6@u6@tb=P4#fTiUzf_61?p`y-YpX~|-ZrK3CboOL4iI&j7Z}dY1|GJM78yosg*lnf( z*WuQZ>L>V2jS+5N>rLjs(YJl&87e(8PN>Um`XTLC(WSLuCaH(fjmPw13PxG)b?i zJ8?3Q+aw)u6#B15>2=Z2cYdIE6W1nLo86(!f} zjUe)hNj<;#(Z&fr0PSkC+xW|zd``{5FYV7cr`Ruz-}*sjuAheF6qv(UR6$=7(=$Lc;Nw9P~OVUcSvl z>^+sL(U$dkUKZ5m_kI~EXW!@ZT;i|5PzkPrEio4(+gDlTI_$pgIr#ws>xM`CiQcNM zlt%v4@#=+$EvzCU>F;tczpzEQ#_|(p?6U!rl)<8Lpdyy8*E<)l^@~g?ZG;5P`Mk77m&KyQ;hYq_g`ZH*CWxmVCT{~Wg9M4C4wc&|&g#4$4UhD*z z?|^@1jN6*Ylo&fGLTygn=}Xh4D{=(Y0<#Q2UGFcR%SkTJ|3+aJkDd-WAE&eIh9qPV zprsJ2|M)WquDjepZSimdd_S-kKElvcX^Q$asj6Hsf2{iXsoEQIQr=bs`52 z7eI*v?o|EHVP@R^mz{d}`%Gi@NO!tmh(^CEm=}ZGT;3yt;0xxZGY5}~kFmXN2*8^? z`d)|gBoKLMyx_?P?$VVK0qSk*25x_n`W{c%gkjMg^$zAQm)s>5n@(2OZ~J(@vd##H ztr=+<5w6Z7o8H=Wo?TSv{IW3;4ZO}mEt{WGk@2I|s$v{(sVO`wsi~+R@F_b=L!$xq ztgnb|iDHEAVDK=^dW}j>ug_I62Cgki#5EQtB$_5sE#CN1^69njHG&yT^?+}p(r_wZ z^br66CelpFFR>BPHWc6hQBKaA`$du;fqQ#AKu_V@H*n7ssq_$lzUs6M0dWXRjE+~| zLChf)8p3Ww(9n+C5P*dlknzZ66|^n!IsUR<68Lvc42vAs8%jCS&eQoRaduu1ZWDzh4ZLC2XU zZT0cCkt8f~UI`|zi5zq&1!A@MKCiIA;ID;4BxVjE9=GJuY7XQxgV(9XGag1j&M>RtsVt$v?6|02NXkX_V7#?hgGVt zt{8At9A2rm*==eKhYG#T@I1O0>T};~U1__1X!)u(?z}b(5cS%_tqvtomfSK{qw!Z# zR~J>BZDd9f$kOSNEmp;ss}C1S8~=r3vLm3R%#BL`lXJTzoGuQRDvOZ(7#Ts&Cm=As zHcW^USYBU}u%V&K;ug1|=Ro|frV>Z!Mmay6si<4nACTnaHE@XpeMpv3l=D4C`gae`uuUSbrWCLXXP-V?$ z-IN!uX{wg7!bKSNz5+}s8YfHLFK4>;^>9gj;+{gL7>%S6lC)+MS7e7OvocW>lm#LJc_nLGJ*O;0g z4lx;r-RVB)pKCoIMRW!wZg?q!H+)n=k-OF^+wKm1>|(I{PmE@+;-!3^fj>%J@lrOM zIq@jZyo%((QupIi-K2s4q-VZ=_gXy=M*#a6orZ2v2~pSt#Yi6cihKXPeJ5!M;7cG4 z!KB~kes$ar*yZ`Gvrxt3TT**=_%eum`|+Wm zT!8Q(Cy$Vml{GY%Fr6%-rKVKGLJEko-+X&fMj18EsWX!_{NXZ{!xnaVCevt>zkwNZ z|M~>B_vrqFpe*S!kd>dW?f~Lt>h6b2Ogw)6L_plwvwu8mu^1Kx$K=l7vz1~Eq+VFe z9=R)ol=kn|_@>T_(_+7>T2-jOnX?+?ZLH{7r?&K*p0fH~mgl7C_B2>SA76t~d6FMP zW(wrto?KB~`XYaSgJzY1+4!ithCzssk{?2sXr@{02vzEOA9;hNcpw})$xjrT)E(D; z-&1Z6o4~T&JNS6I>H3{eVFW%(pY!g5$pDVS7ybJX+SfUuM?J~fo9>zuJvSA*jVB(b zvkC_PEU79EzmA(Bi<)rRVf?y~8nmspx_YTDUEHq?%jl5!M_9z=+WJ)7y%mgtZzp%Mp094(^ryAbhJ3)5Wk4if@~mTE0~$4s48L@y z;DM^+VPo4rf5V|0Uo?(v;sgJ8Mwq#wFPUQ9ZTlo|-DWz_l&!5}vc1iVyS)s%=~JDK z7b&;P?~|2r<5grD%=c+w6G|`!O9?(E-!2xfk7WOym|$m4BSl-iwkir=D@7N?es%`W zB-UJ5KN>G}j6`KzQh7769#JJ!?5p)0HUrL6L|dGpgLBCDh8)4&&x$GqA?Rw06ERu5 zFj@K;@)*<^!Adp)y*iwQb7&XhA`OSd5=if zyJSdW|8#?RzATJM_gbe7vu{w9pGN_Hxg)~oPMF9X-s*9duc@qO(frVBt~uY72Amde z>xS8}<6%C?hoR+vYsKUovrcJ2!KnEc&KG%%Zh~5Dsu$>3Jl1?wfHCU=e0 zB7=ULVkJB)-k!dwfl@A*R zR8p%c{9rDf_plcDI)=|0u`;RCb_Bn@rSF-$Fq7cvG~+Ct90a+2ZBB52j{A4%6RwM6 z9vde+c;No71iLcTaZyiShkKT=0F8Ga3R_AE*Ip_KQYcC@% z289!7A|yB-w_I!z&%ea-;j%#eG{eLtlP}k)%avIzs1gxLwK5i|yzUFXJ22ZL`ucUr z=JD-vJZvmQFo1fYCn(9P+7Se@v-6C{>GV3+^z_08OHW$#YV;aLs>2!^$N?R83%R!C zg@um%faL8`0W*J9tu_x-&zoNhm)nA?LEFD#kjJgprR3e1$4${u1-!IrFC9Y`%iSdMx6<-p;_s(s12>8tI;DrMDRe8m#}C~ptF#3Xw3ed+v8=^ zcBb&{o9TS?p0I3gaZbd`r&)OxzbB@S1TCHQcDk$LGAY@+N&eZ$(H*W-^5~)AY1N!W z^5d?WZZ%U>A?6f*#^mH_t64fame}(uEpZmsbm+^;qyVfCgQh<@PrtP>!^3`K9&cu2 zw5K{Q$ePjExe^C~iB^lH=u2WF>v z>Mw`@q)mq`4N*;9Edi_wCA@fquGbTfGbM7uYxt`ZJ(QUbdb^DQnuW;}TBcn2RX}Up z0OinVolApBuCDI+L-P#NK&V*O>-fOTe3S3QOi-&?j-1?+)#Feug447z4F@OS$%nPS zf0|#i2k5XB5mD`v2PY9-^I71-Qs}EIEr7H1v?KR(_s6FhlPUkEtjHqJwu$mEL%^rGydp!`kyK=^#GJG#ve^#9Ml z`@xyadx)i?cFwO^WHDs)dQ)as7V|MsV%m%OX!5vLW@I*^a<3l|{4YyYTyB2yBhPkP z$$^o>DmU88DLBvUHIQ7iG}r|Z3k)^D)T8tu@Y&~)p_CeZ%8%b>b>Wrgi=W@ks@)IrnO*!yF+@rR{h%WE!T*ZE}& zf=Dz7?{n{dbN%0_*NC+QPl1y+bWOxJ{LDD@m8lyKJ-{yDc^zqaBrGJSXWUFV!;ZDm zinSkxo!knmIz)kJ$V6qF{M7XUnKtQ1MfV-Et7N$taRz~!e!Yy#u@#6x_;@Jw=qpoJ z$z}M)|B8V5E$r9Gs9tORh_)V|(*f!Ex-_o^H6nca*xZymMw7Hh!aDlK1yX z)8a8x2yd?|x=n?(wL_WQcOF><$9tSBPnIB-)Xwdn2dW+*)W*qLuK?6CKvGv)gs^)&VC?u;t$pu z0UUm9^VykALf_5bAst7dpvXyHm$~!H$|V)PcD$62L)GD-3QqEWJh(qseH-0JQGZmG zj~rFPV?Fpsp1tPzaqssbeqYVL8|!>qH)-p9WM8M#rj_me>^A4uro&AReLsh1U@M6a zc-Afz&Uj)8Wr5efjnH)hFX+(3_om{ywFPU%W?sEsa@#58H4albe>$h`li%pbTCj2V z+$p&~YSP62b|;tJS$4{1S+#!0?h?FR#oMDxbo{jMart1}S;5Bv?B?eG^K5r5%K?mk z^ieuB2vdimWvOMh&`C`ZHiY}luJRLag^ZX2e<(u|E0_G(;Pz;JmUKQVVX;EKQ5eI-3=@a1j zmJ*jLHY$J8`LP@u?K|2^X6B3Adqy4(dqH2T``D~Boa$^&Ey}(1(po;gi);DJ&hc09 zbGAJ{f~tvxlLzEgHvcStYlhAL*!Hm=HsLT4;H<6})a<+-)QLWRiXQXn_sb^eZ;4gF z%SW?lm_I8XFXAt_3YKh7ctXKMi6@*ek2pb!W~f`6d7jIwjl6IZqlyu;5AD~@j_PZl z@w9b_{?#wIg`uY5TT{_(d)a`lty@Uihx$||R8d|K`ff;NZUZcHLBSg;6p65oopGaMl8W8Nsp_ZRERj zsCCHbqpHkUg=ydzUN8?At8sq1-F5+G+F{ir5kaa-);f#Bx8gr^d8Nk2hMdd}L{9o5 zAC|9Kl|vMu9L&);F&8Cjs#V&;O35jo{_n`c`Z@7{41+c7p`H|s#teOBcnykf^Cg-! z`x-0oElYr0er#tNDJfpw5z5(6WG_EKQUoFsmoY#XD?jo0EJ7wz`*XN86Wv??dZIztFa535rsflfTSY4*PjA*< z*bd1Gy#ls4jT5w$j4>{tDwY%SQ^*o!+A-stHT``B;c>XS9)#YB=5>K9|J_u<8{zRC z!r6^o_~)U2;_uC){e{nZ#Tejxa7IV(gl@Zq!DXt>-O8cRRQgfEEjAr<5Z*r?=5iFE z!sSo9i+2EZ6}s)uPwI5y;QY#`x!HQ-^;%?GsAwt*O_~Nxy;M&GYzZjy@P~imNy`Fno=qrM`|Kf>?)UR88bIBCVR zWG+eV)P#&45vEPHZh#{PID8GdQ7;!{J&zspb-K9rG5Hf!Bk=f?Ks^M!#=aY;NcPO! zs}Z9afyG*ltc_OUd{4jRqLy-rpN`E8^`%yt$j`aIQgZI>Nw&I@W;c-cicf*mVZM;< zl20Z0JSW_$Q^cb&55M;oSh2TW_y>rn#rN&2*fOjy2-X@&N4N5`RmH(_$tz^y#e<#3 zo^~vntYi`m5fKNe-di7d z6(G^>L`q4ZPTtRPYF$`~Q( z#U@9WKufA-U9MffQAa{zk}d=0iHme>`+ojo;=Qi}DF{0G;e!8DX76r`ji>5=R&eM4 zS(f6x`@kv8-P8>%OHIyaRVi&3)*bOUx0kK;_fo89tOiV_si=}yn**1V5m zU(ra#w`~vcNAIwq79tkN9Tv+2>T1EJ{?RejKqBg@({yd=+LDh5!d9_&S-LZavl*#b zi_?MeQwoD58oSuw%e*rG!0V-lIn`v5XP5gZ{kns z+&&wyL7#QCd^yP)91d-nT(}(WNqeSA_#jQQ^IQjLzG2EMISr@X1NdiJmt&&yvCuyP zl6Ta-Djt*ib_7oEKqNeoDru!KLJq0tf5b(N(Tvd0J)9s~j4W^_y`=<3Ql?8=ytYai zt_dU~K5|w}CqFXVKgISJy7VC8q=B`6s%be~^Tfnyl-(E$H0(d?MC?=ntA$)C(N63o z_wD*->g5PkscqtD;(T$hh+EgHQTdbnve1c#mLrJk-1AMkLzN@cS2F-Zrs?Ys9q1h-Z*jFt)KW?#3$k}A6k=g^(zvncs z+`X<4lk=niGkoJ^FHy^PyPxAkxmg}i^b@8PTJXyZP_6pbL&lKHPO~sb8>u>2{Dh$?oVn&x%+B$5!3p$p!Zr471ixF<_m*B0$Cu%6Z78<)LO@lhC~lFIo}M zJ_==Xaz-t3-a22dA&PHrVH4#%4Y4_0eHHbYRhhHb;zAF*`$7#<0j^@;^4?)oK7a4E zRW7m+BT1f2%fB7v!vc=JNOiyWGJb1E0TK9S9?yz0@lS;5tF_}e+7t9XF%3eyBV4ZS zMyCluJijV&wM>z4Dz1je62qZHfG`@e5}q(zw%5*5R#=y!g9Y;=vJ>p0z28&9wX$^C z&(V&Yl=BL{yZ3$H!V|cL=}9*P0aDZPj^ybd zHDB3*6a$Dvl{M;#AG-+{wN0##>+8x?2}%(!<4!m8-&dK zLOb8PIp~itmAjd8XrQ2jqC)3$YH?5pv^~Sf`1gy}VGf8CG&b(5QV~p%q9JPDz75|w z^^6S%tt>iLYqv??r%3}C?W&aHx-n8$uJzV7u9PxKJL3Zj+7Cpx>y%=@zF!_XJwhiJ z#s+!(4Jlsr`rk=)kk3h6&l^VSvs4UU(AC-;1~6*xO#;;Qu3KNl*ZRb({}uw*fxjZ$5cv9 zS(~p*Ame6dFLIUNUy?5>e8wf;U@(?N@1VTWwSCRS0MXO#fHF6a2~LfDjt{Wwlga#e zgZ(NUdY}sd_PQ&;N+XvcAr_A>96eswBlv7Qp$#aZQaQq-2!wY}TJ5H98K$N0x=y|? zqv~gtaH(>SM1;2$iH^;rp%C(_dHm2vxC#8D2<>s}(ur5eV;gvq6#p=&dlNT8;afZ4 zetYN`v?5&(yQV1o;gu~vo6@my*B0Z()#FdhBoKb+&O!YGb?HjW+AcfgCO#xOExPx+jBBB@<}JtHV9v}_ ztf198nnPhImXg|A)H}u-+4Pk@wEnBb|0+;SYZ{TsE1i&d98_Jcojc1A96DP{$7Yjf z%)*%KL~m&|3v0W$IO~zRSdn{ru`FEN+Ff49?9=Y5iIZ6eZ*8&_`MOX^->`RO05H`a zkAG5mv$CAkj*`&1WRpW-GYO@1GA9~(;Pm?&rKE-uNJ+>;<>Wpe5z|ph0(6KG(jGCf z#p@EIrj0X8=1yuV@5!qN*Zy5-1|J_C^9W5vt^L)AITsi@sN&{3f#bii!PB5nNlA@) z*DB7TQ=HUi`$3pKTn`3gFK zU{5oC^qLxBOmAr(^ZEk5l?rb_Q}hsEah|@}^sA5>PIEDSGfhyR!TSs@o+NoLsxPQw zlpMB*5hqo|BrYkE^%mN!nr!*2`DV_YtUxRV6fZkXKW?1ndSy}Xw)(=V-}-MO2t+hX zLU5R|(hx^*z8K;4moqa(xiG~zSzy#l-mpfve4{@RTP{Fv@X^gwqqeMf{TD5}+tG4e z**rE(Jvl}-JV9r2PejEVaO$Wd<+~K7_3_|`J?%L}VaCpQjndWIP4TGJWbfc$TsAdQ zXz*H4)>~YLj8`4kqW7;`!dPF?McqmIl(cko$9LTW(9vqSJ0Y_;d$?sRlg&3 z6z{XXPLs1}KdF{j*P_u~wC+eUSe|nj61&MK{k(^JT5Z(jlFfmEkeh>6_-ZyQQR36x;^`xar zGTV>Pwv0XMRghw8(_Ycq643C#Kn@H5HhJq!xnff`h8%M?mI7w0?n)yk5Xg92sMTf3 z7zDc6jjdO8$6D&gWONh&#fNEk$raZ^)G|T@d>$mwX%q9gizjyO;_JSvaeV5^VQX0{ zlhNkl)p%Pa^+a3j$tTg12)gQDbxR=X9ilC53b`CCQ`1Iv14=nowK6MqHNp~rX>fd* zbsbY)CglTc2>pu=x(0q>rt#tHvxKhvxJ(tEAJZe!?5Dpgwhq-5CRd$}lUt$Zs+JX! zGSrC*KasDxehE?g#HCDd%D3LATwpg~-_pmA1Jf>Zsd(EKsQI|YrkX?y)etF+Cb(Aw zBI@$lD6|@1ksVT(7+IW5r4QSNoAC&XlsW(Pn@%-Ujt2;ec&gc*8}R+$ou2W`&Ezii z`;{8J>HRMXN9ODJO4_r6!s9R+m8`5L8Bu_C^Au0pk2qe3AAn3{;)){65p@cR(8c*^ zEXuxgYYQ;`4H)<7?K5FNkF(Q{FTrUWVoy0P`Ns{Zaz8o^3R<=t;~%C?{gpPxt-y9^Y?i+>##gY0|^#PO&{NEr~=hXiz_{Mv6I zIxm=bdT@eaaFP3?p1nz5bRrPse@Wsrkq5BQ}UZb{R#_+4Q%8B&>VWhew#u;qT7 zpZs(>ys9}MoW|)(>5-+Wu92};nuF5A=En6%n4BnPnS)H|t|JXiEh@Mi5wg-W%1ze~ z97!t^x|_>-$)QW3e-?lXB2T4wge}39-fZ5+>pLbw)Qbr4%Vt3#NqopuBU_7Aj|f`Z z4Lq?vw`Bc##w76YM9M`|7K9iWlx5hr6tuF(1NI(k9F9i{w;)pyeVtS&nzZ!UW30Y~g;cQ9K@BW#=sn}ca zJX<@{(PLT(*d~@n=-q|hZV**(e7oXh%(rQniu_QZ2yw-tQTt39%3xJ!)fa4)@9Pdf zFHk7gnY0b9rIxmz+y##yvP-Q8ZB;-^wj_;`HSUj~lp$wRxuAHr-ovKc6}SCUTT}kr zJW7C#A#Ucs=>2?Da44$L?}CWQ-$p8ELz4sVgpkc`|9!b5{XnoP0}p62BZ=^@QhWIf zEZ7l&K=o7l(d4U!R(jTEr&}zS1}v=SI;NVYR7BuqAG~D=E-odQ-L}9iw*Rn3a`ua+ ziOGLX?v;$~n~e@L;46*NNWXoIaI^oya`+LPG@H!fJD|Mp zkmlo+@0kzbGJR72`Wpo&{kXi>_6_RR4jFB*VxPC(7?{)Jw==M!>!ruy+dfQI#plxS z*k@~J&Q=ee4jh{Lw$I2=vfLP?r=tAK@i?3+Jqd&2aX~0RPYS6eMAVVO?Zwu?iQvId zpBu1&3GEinu?1Jh>C58+W;RnYLVSmax$6IkRbXUl0OJ~9S`j8X#Y`1(!$=vPMa9mX ze--Qo1R5hzfMjJTer|)AnIv=x7+DJ|V7UnSyd`rQe`C5_mne*xAYo5Qz`6IQd_EWH zY|qGA==4rS!k6mcg!%RpzdLvw)-rVk>C5rSlBa-x6`heA4ejx{WmeV)oxz9Zf73Do zFb1B>0GGX11SwqW*v#aUg}06F9yamG0<3ZQ;t~>yPTT9+ zo$ltHE%!42r4@QG{5g;N9ouojO7#NVIG%^Bw(Z%hyf@b~!086|Y4-&;#_DC9`f7aH zC1-uvA733&bxwUQ2fU^8^k7g5@hpSw4=J?|&p)Q;WP*k<-z&drRWCO;Xs>?~Mi%sD z6NA3vaW!P>*u~k3j4dXQD3&WEPc?A-tUxk=4ml1iV`(7P>ucBB?^;|k98_!rch&3j zS%$K=XGIk1n6-9E_x1xnA_KIs2Gc(nsHUiMVwr`7^;9S*5pvf3%c;5{Z0yDT*uf!6 zQB2x&6gjUZYE3mnk(kqN@#1xi4Bfiji^YZ0W6`*Cjrp2$_Gj2O*g;11cz*_b8}^v| z2?*o@gN}JE%x6M>1DB^};C0$^1O1CatArGHciSRN+x`tS!*=4wYe{(ffV8W!d8>ug zT6VG!lA|2o=0Heb>2@L9fv9RO*N{oSl{2tWI-M@_w?(p;cA6T!Dvb}D`yMozHv!uH zT5*Z-=kdTjo&kES{fI2zt~zbCWKWNW?zH*S2o4Bc2b=qiUf}&gOpS%4Rnv$5QatoJ z$4Lcp!|6=xJ(xQNG_|DV6?*mmdO=urp8~{i*49lBEI^@!tnc`N5TWjLY35*V*w{Mn zE{!-09rm|4yxF~3>fnO3e=bE~A|ke0ENvuw8qWwgdpDDn})>DC; zB9|tz9Kj=o`sd%yha|6u5WPX~u@Ty*i@tClOQa{9dS7{$B5Va9ci#L}STjT^grUqI2DF z6wk{#METTEzQ`(*g&@4{ZN=VeqRi}>0NMliiheYng2H2yN9hY@xaQ#PP01~^5-lyDo=IhmY}L2N z{QK!s5ER@VKERb0k;+xKT_S1^T&SohWb-+Z9j~Wvez7bGk;`w<&YjF;x|SShOwA*-xMP8|LWc(-j*&e$EH%s=UOqMS;lc zU4S!{cl`;GzZ&lo21rBol2e7>#`ON8W4s?3&(HBhNKye$w?AIZGG)q}pzY)+RcZ3i z&Q(%besO?id@3=VmWOoFGZ<3dZ%sB^_=hDr$pH_i4{ExY(NT8s52Z4dhMqlLc2 zUz~UrNtx^G zY%bB;tA4MCPKuxr1M3&6FfF&%v2*5~i6!MY> zoD6c1h|k!TcxrK1sY6p`9AuCZv@zC){oeB!jBe9! zooi$U3tYzsM!0YES+dnti7HiI#zP!6Onl*ecH*W6I!tHTrio$eHH@v5?JR_S45bi! zj>L_O>ipR#hypfFp}lYkH@(HUs3SK7pplv2Q7i6uWAEt4=;-KqTX0+g?}3uxATVVo zZ54efy7KXv_0WKV+*zTqwf7JKI`MO z9peXT2MAZ+hB;uu{Q>eWi_j3*#mcVG-UQ*$WA0;3n=|4B6%*7~{J)oXeOKThWenYR z^oHTDyMpJs)%yt3cr&}l@@-!7AmC2}XiZfLEV%6bx$n zx@%Gzsr@18oys`Oat?P(4|>~fqcuE{!6NqO?R+_*^Q;Mx0pHd%wnr}qYb=Wzd z)2>&4tarX`n5`er9x6TjTl949oUU8#w>>BEda!-EsMO{C+CF#AJj~azsUSJq>Zfo( zt2O`N_<*eL<=nblz8YM0uDK9J_cogSJ}(D3;V0x$zS{QMTz!A$UGrl0&Bs&cY~#Z8 z@+&DGbAwqi=4SN!&-STv_e;b>hQ)b`bCzw!}9BFk-$zDgTqx95L7bnPu;s}aYTCHtZ7ZEh$VmwG<-(Tx? zv*4{i$8=*y$;4*$P!;O+fCD2=@&Y~J{vs;GCtH1)PP49!wV`=ccawG7sy>iGXmPMJ zb)y3*K5B!oTC9_5cx3+eEcIiq;$F@&yW!!=Q@zsh>Ppkw>)N%Suo`;}$H(?pcpX04 z!NKQZ!y_hD zT&D?KZR{^2c|G-xI+d==|17Zp*&s4EOi%k($&0Jdo(&Zuv*SmT4n5#9VCX%z-1YMl$WoAB>^jR(gpY9pi#dVmvowownqs`&0|Jwrpq^qv0_ zyagqaka2}Vg#}U3wFXstSG_IWMS4ZDmD<3^j+(b1#N!U0g^Bb*O{*O)s9Kjf1wBAGqZS$%}E-q4f&NdR>E<9K`^yDP! z@&cFbvR`d_QN2bnr7j8S@{P$xIOC6|%qCxZ@;bD{oTX|Ch0E&H)iiBAW?TCYTq)g8 zYxuDu1r>v1trHZxnHgXO5nqxX@05x{`ebsGji>_M*%_68NhlQ!t%Te5b91nBgoI*1 z5+f=%n>5lLM}p1i^-8VGG0W|6_P4XQ4-(7F@NBOrn7;p5<)@Keq|jdESfdU@%bu_* zJTlG-C%ps`4_j#ECsWLfClI3xuT#*oqS53R!w{eq#`vR(tz@KeQf_1_+@Hx<2+`-Y z;nlv{h`gO`zLK)z?YYKoK?j*%MoLEnquzP?SPCrvKY0l@B>O+`x6zWLD3UUIl{MQ_`OKEO zWJZN#IgAt;aXs>T=!N#uv$rG6H`G%fjFick|B{OqlG!Gbrzw*g0m+wyiesT4$GGr; zYjRC#@)$W>;l7$&wuXmrEfX=2`T#x6BuBtP_)Ym~C`~M-$y+$x>I$wzX0lvnjIuG} zA6vA&4dp{$$=z$MQ%qB*f}SPXIk&P$RbDm0LiEIlUfKOTW^d+2c)T0$e9Wq@%qX=H zj(-!`kbLKE?#xDgeAx_N+O}(Ex)RoD ze;@;9-PR5omircOqK6STvMB{c6*y$& z=>A^G46c-Ns+Y5B(9Z;|XFD^r-&nr8zMn9;h4P(G_uV2U_g^wTv3GY<(;_ zpDFxjySXCZZQkK}xgxV@q3mcmsZ&M3o|g3HrGFm3-{`N@c;mB@J&JJR>guO1VjNNm zjbnoO>)rg{VO3L_mh_(2cz@V4g|_f`zWE~v7yec9{+#js*$$)>c!_u`8Rdh$Jta}5 z7m`j8&8v-H%vRc@vN?L;x_k2!(U3&8c`9!k_!Va5!>ils9*V%$xu<2pUO-FEr{_EW z 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%0AE1ud1*UgJ;foG0$-g+cXpjk4XtgKDJGhcdLV1 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�Tfu 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�j(Lp zh8o~zdAXlhBLCfvQ-`Ao2) zMq2}PHi48ozJF~mFYK-miMSnDxW2*lJV_oRBNZ+AWU~TP`fs%SyHE~ZE2&m9KBWPs z^{)V{sr48q)8QAg9wXNhLnurk-vRvA6DmHCslG#yBo4_DTR6Pp{L%9{P)5D5%htEP zKQ}(0XBUJsAF1`}$*R!2LuDdDh5~C`p$r+Q4A+ytW6%b zTp+5C_3M!K*EY_tAdrZ*m!M%^=dXR7V2Pk0iPUCy>Tlp&w0Rlr7F3BV1nEVm0kp@^ zK-G6+mTS+jnA9@4;2dLp(Ec9!pAW{M?bxW;#^3H4Q*j~BR zFqm~GT!P=f7w0rjE>a^7y{$jNocZ}JohdtN?zbYIQ0*E*<{ zX`G|S{-MZM$c1mrtT?D$mW{Rxwr2c3NNdLGcE);=HCEHLWL8glzT{7{hNsf?J@ug7${;Wluk z!KCahSSdOv)P#6x4hK6f7OTjBJUoA3(dK$=1E9@{PINq;kK#Z^^kYOCkM&N?>uoEL zegu;5+qhWX+PB2tV3$#e1)NSJ)UC~B(A&~@dwvtr?y#8bUM9t<)amrg>be}BWXR9R zUG5s5>$(+E{1>WI;im|r1jK7kIRn!GpUnuGzQjCxE0ppx2>5&N_X8+pOl`I2AumJ| z^W8c)ED+sWR;@_aIoViFSjL3S{xY(0=AWGOuMGq*CQOqUN=Rnxq*+Ab^ zX!LSA0ko?OWHxVS`c45WN3_t!ccH9WQ;b57iNZm{&m)%3g0@uCML%lx#cip&Xu= zg|{F;NrfGqj_*StH8$1WMj%y4p}BKPvTW1UMPqDOSBBT?VBZ+RcQTPUaEcR=v*kH< zf;z&l)S~v3dF>!GFUSi1Z8E<{K)~FQSUk#PAtk7`^+LhZA*I!=;IS&M*q)QG{;ti+ z=sP;3xSnL4xpHE;LfRrJK27tdqsi6(_v=aSB^I_?D+T$GGWx8|aVvC=cO*ccT{bfJh32 zIjiYgRUPzC#efA)zDI4(4C}(cW)IKmXhcE?og7ae9%Xx!NZY89)ouD$WMOefhNmc3 zkBiw9k>1AZ#ORyoH^RnK?zQ3@%-vARgPhr@X9&zC*XtR|(1bJotip{8U3KUm>Fowx zgQIZBV?8549;)T7LSNXCJ<(kl=j>S-6W9r97M#q;FQ12lf<@Nu-hJJ$3Bu>5#Jd3s zZW-t|Nz1-|dsYzp*OUg#1_LQp4*!;tI?m4=PUl%MY(^tM0G`rrzuCHhlOfpzBp5VQ zM%C5#ALG$@I^Be{OiWA`xf?hvSM46VM%fZ9(TAN#LeIO z_wECH3*-ABL2_}H#P@vxRgM8>W0gM!cb;Bz)t}v?&tsE?H!{l3%a$@ zj@eDaby+qP||;;1Qd8hy-3arZ9b2t(Kp^_tZ{O&8ozQ}-hEF}2D;o*MxbJR@5=efabudubf z_@<3eTfoCms+Uqj*x*0--&2k&KFRyE))NNsTKyifj%Upo7#M)KqpyV>e!NarhQ6}c z$pEY2b0a`9Fhx`Or=0E9JQTVlb3cQ=?m_Vk-NHa?FMA)Vcfv&W1!skX09Lf?&_*AG zzFa*oN~w~WWZ%SV$}I*%8I7jd!&=d=6MHxOE(Qg&BE*Bk)dNNvjhb#|(p>Pv7+QD| z5~u4GUh=7*(b^AJSFmUNHb?mJ2p_qMI*8E#sVgz6vc4`{(?SPN#p4K?sOp!P|0^FI z-UsOk^&9bQ*=o1ma2-7P)8rnHk%y34#w&otQdAYTa+3_K!3-A5`jnWQjnFDU zG>?zl0DiqNH{z1+Ve4|BPmHSjmvg$#Ch;}-d6RiefQ)4G0!*3 zAv{z~D$et5t+$wf(WcM!95fLV1wwfD53wHm60GA>cjt=gd?Jl>xrJBnni}w{mI9g+ z+~N9WjEatt!;g)Et0HPHQFp=TF}~?{;o07Zzf2B~C!jKbv0;w@*Z>0&LxWoYG6)Cl zex97o%EJg;0og3rHC@&52oSvE<4FRnk*j{tf(o+R1Ljfc(lw%*6;2w+VLEHj)MAU< z;bg7?WvN;gdYdd@{p!9O0YaS5Op_5#o`S=Fz@)Abh}Auese>$?zqI+4Hi#SahFCwk zF4}YYy+l;lvwZugJKh*5PAx07ba1$_TX$t(YEAQk{YIF}Y@Sp56FlvFSPB#f@elM@ z1GyslB3wsxf%zFpQE&BVT$#=1A%tJJp)lr77KEwAWB+y!ZqPmjUi%i2jx7NJ{hW5T zM)Pe7Zv?#51XXbRTqe_#m3wV`Z7!@$#?*Latp>Z>!K!vcjHT(h-a4d5%@nlXPFs}# zGeSUGyhX_R9*+DI(K)5-@c()rYy~>@vk1Uj4?z#-ZFZ8P#x;e(`O8K=1>G6F3Pfr4 zzoo7*H(g~%I^{a*gWuzW)t~&CYs@6 zr5+~7zdvj90_(Y$;a+os$lr;XLt#91#7xZ`gGLH4Y|d~&1AB+y>5C5#nMvE)`@Se6#|kK7?M6F{GMoS`((5b)IXXRM=c@8INWvN`N3 z7_U47?0oI~Vi2}W_3M}TqQs=iUI1KDooC7B>4S4TF94;|Q{?|L^b!~LMjyh{U5+*g z4IpY|iIIOIAc95iS}q&h;b0<0nj7zRTFrQI$RAPe(cJMghs@O! z7s;jQD_f0UvQqUmG(_G2_6wz_$O$EoBY+K{aTwteQI#aM0Lg4D^#V)O6`<)$TYFJ_ zh1i8gI&fCM@av8vH&I__Yzn;|dzs*V#KbKr$puJ8Qtp2QV6;$v)G3KM_SJ?2P{{iN zco9Vzjj{3WU%duC1}ZphvU_hj*Z;w~NdT-Hz`yL){mG~Zc_Ty7@8(B0+JoobpM{ga zAXKY>8JRRr<9FY9`)7j(?hL0OJg7>YP*xmQS$T*rgNmIaBej?=3Ia@%4j+w~1SO@G zcK=Giz;ASM0odXxY&o@Ke{U+VH_*4a1(-&hC2F0z#D)bS@^U!QXpcjhge51)Lk16V zbX&RY`3kZ+Mkl;e7|TrijDCzKKvrV!`TPI~Cz0wOLPRJ^Oj3yBHs@=Bp$CLDrI+qN zzR8>>HEF@GcE8gP;ZUOd1f7mIoR%|$n30eb1YKGds-mZ@_}TGF+%sIA_DB3k3953t zH->4iqa-wdR1U229~&Ty)wqo8IQ<((Z1L{aT=?oR+d zpUGY_00!GFdlE3UV!}KR`~Nre{f16_lA}72Qh5$uw@nNt?T?iA08zbv@kk(tkC~SQwG^6laT=gb% zSY1?ORzg%(!mqfWlPl4{lJ`um+G^=m1L&RJh7>M0S#>|t3d@R&J(PL|P7zCm@Ng45 zFaJ{Nfe@CqR#_VWwKLaeZ@ifN7Q5tM5ua{*2=g8plGT7SNH)GhPB6S6D!?QK-;Q09P(3A`1H<}F2 zTg*a}Z&8;SLvgC*Kx~0C*TQE}1_=00>OlTXhL_{;3f)(4@d_(e2;t#O1wxvVw52dVhie<}*V=A>T@g7V zO#_y5*>hnY^>FI^!*T~K@W!(B4Wsk|d!Ul*~0D1)6<2er`oB1MYy)M{cit-W?oV;<`DT-<+a_}MJw5g||T;u*mAA%uIHfdnNsL1)3sJ_@taIAMJSJbl^W@{c6OgT%PVwR~94^t&A{ z3oOh8g`m&vqW_6vr0to*aV8rH0o;+-W$70AtWKx1aZ^}x`b|FojiYKcnbS>hz6P8> zAlE}-cia4Lv*MyH6j-D4*Dk;p+-t3vdy;0C_3fPnP+^6>`mxN8K$Pgqv~|BHT)!{2 zcv{e$-BM2%U_8x6y(ubwwE?kEMPhcljaJ*Kyj8@?KTG`n zr43$3+fowi03(lJ?<{K#Sav}EM(V{2t+xC3;5N~cWV2Lu?pKiu;u5GNWgVxh;p43| zn_5RCEoN$SQ8ZUYn6lS{=Hoq+1c={ko3%-+h&h*x9Ccdq_$QPd5?S@X5(4X2N|Os~ zT^B*9y)Wxmo(3L?Hm<+%DFF3TD3}A3ntt&n+=yuV1h`i~4gQ&K) z+|4WNLfgB8e($C zfWtZBiO&=Ps50T5+nC%=(1I`9qDFvvUuh2k1f|u<5s+MCvsBMb3H4bfaDx>>j-J!% zA+2nFzBq@fpj&Qv^CWs4M=nMwG)Ye)B`u9O`MKC`Oi>CQ`4d3XAOk+h2*VTwoalN0 zdmSKvy5n~Ppk`xX)SJ>*TTD%#PbPr^os<6wv`T)+65_wAu)*)Cb^!+BPbtc0Iis1; znTV4Jn00@`y^&TA;eykSHz8nKf(Awcuq6;4{K6(D`#XB#z4Ta;zOupXO0TG0Qc6wH zeLV&BuzG}wX1VQ@AjRFcANQ#~BPS~VrG_7()ZFbkY=q$(kO*PN->8*e-D(pO6XZR- znSvCrVPUvi-R&A1m31?}8Y|91nc}#glOFx6b{OE0YP4Y*u|Lm2-coOJcm)GwGb$>& zP9T6s#3%`bMGtE>s7viCu;ZhyU;k5-#>gfx_^pJA2=Un*5Y$Ik&_5UdY8Ct{d>Edg zq#?u)1uO7_h|`|l`JV80qxz%4T}45Lt=UY$1sz=3eEn0v0Qw8x(5mW z8+2JuxVfPbW+JXCm%R!AxB>z>Y&CCr2S}31=Qk@||3&MWW7ehz7%~7`m5y&3i0^FP z?j7j=Pi>Nau|@f!`fXbwwR>LXOyd&z_LqS@l}30tihkELEe<}G2I|TW?fZ8Yu&~NX z{sFBp{EMLh|FTJc-tHr)z+j&U!MJKr4WYbi? z-hN2aktTkf^LKX*rg~e8b~N|kogZJ0|J_s0)Xn>e2an!n&D7yLuZxQFXHVhTr=HU- zv8Z3G&RV2f*?MZ~&5Q!#1460B9W{g?5_nIm5CK#-5@Fou^8}?W=liT^$i(OhR4mD% z8vR`D?@3AF#70-^YG+?lLb4;P-MIE6b=W`x=s@QX0R%rnA%ah5?qvb2aH(Nc;PePd z$$_~Q&hCU-g&^X9w+O*{q+H@db+gk24((-A+J}LEf865!&jZtK&ogMsi+_855>e7t zloum^yJ_sGv(AIeh1u))923~MpVI2p&=b{n8#&EC`Otd9tadiqHU|NE{h9yYH=%D+ z<|bPi%2=_yREHAUvGx%=PH#wEgoQrA?H=MMh-*^Xc2 zFV)9eP-8)u&~tT$s={hL`4nW7M*x{jL;gQ%Iun0?%@03-q!&toLhv>svw5`?hgVki1dakReI^;duNWF5f)>Z zBT3ool(a+x>S!@N^%WdLN{Bl;OLMx!EiTk76K0PhCSc;EFd;=A8w&K)U`9CSA_fgf$ancM zhjA$G654u_bgWc(@Q$A->W}g3ejk?Yt<~$9JhZASiWlyyKMWKp^%^@!Gz=-q){U5$ z=oNbFiEhq<@3h`t>)5175MUrX@VU{9(wCxeYMW$rICU%p2ve=P=X9EQu(Pnybr#l! z&ddmYcHomi2NFD`CN15yNpG43JHOiy;2#Vq@m`|p$78&&2{`ohBQ}PR-q}y5!R%Qa zFv9!iz8ES!mz?7U3w&G?g}249XlyKn6gp-bm(-ysor=`GRj6IAbuO+y_N)oS6vT*= z?wx$RcclH^gYa$WA1|v9mbKko9^k#uD_VKQw_QG>4scCG?=EY*j|p(JGQrJ@;dp4? zH8GvN;y1b`J2>`c4K%G~uQRGnFtVf426b^Qz~`}|sKT+a%YAAIcsrL$2(R2(Sz*u!<vDnL z<{T06R;m?wi_q75C?B6@%tjED;Z#Pf>#L=oRql$bevc>jZ&5;PEh}N*Aqy}tkw2w} zEqqIM4}96X0~LZU?d`N{O*#MVxP+9yFQF&c3*1(Ov*4mEcswcm-h0WUPSrNlBW7!)jM#=nDM@9b z?Ctht%ZXbsGsq$$_p~N$_=-9j2T~L!)0i+|mDq6^Ul5N$M=lkyA@VYbX4&l5G=|o< zmynUO+M}p0W8;3lJTy2sIW|`FtJLM`$dWn?XG%F@8v-1dNCKh&jybna%iIjMY(q0! z+UNjl0Viv3hr9e-9B8_za~3B#*Qq*ZV(P`|>2Z57&eOkC$JLSO{cSPw*s!3_VcA|( za+nh1l~?c{M`w7yWnI~ExWj%I-Yu@qu{0s%bejOca^z`NTBeZW-1W`i1^yJ40cjyC zOH%=gQwe%SWAspwVq=pqXZkn;CK#b#$pmcIs8oQHQVvl?wtUvl@tPyymqD`l$(%@x zt@gnHHq-<6wfv)Q-&0$(eSyl_Q>G+j{>=65zHLLs-&#cH?*cKwp6sJ3)udw|GSUgy$!I*D%bjp>NOz%GcDA!!>FwQR^ec_6@o zL6oe^^qvd)t_vrZ8y?@=#+(-&M==@BI0V~zv4rRHCX#e{E=BU(;_??(FaGT^lQLQyfrUJn?`x6 zPGR{vS;2rb69hZ3*xOtx$vL7vc3(8sT%v4b-t_~c%GoJ!uTuN~0 zdm$9)E-=t{MW%c@UNss}DN`&14=ElaT72L-*hS#m&K{gS?Sr+VAT_7E$-udT#n(`~ zI$!W~w`okTD>+JaL0Nv$;yS#)-7E;o>DIYQ+F58mvX{^nfc+ZHojY8=~_tWp@jg**8!=cEP^dB?ra~iC2)(QV=d}& z7WmaG*zg=>^#Brg}vg?JZUscSz{X*7_;XCYSId11@ z$xkyjE?rlN5@4KL(EWmuhWTy2c5U{LO6nO#CN*Z2B{yuYUu|6lkN1Xh&20IfC@F|` zT_Bg%N=hn94t(l)h$q9A5a?8n8A)SCPVi zjy>I>eShH;g$(N&64|F@lHITtsvVKpInb}``MYYG!k0wrau)Wh-^|g4ZaKwiH14*Z zo#URx-fn3M)fz<%m!`&iZq|AL$pa*;uU#@4C5$^sh%qDBIYByoy%^6P$m94_vry0 zdJn%jhQnihx4C?UJwJa(Jmyn(YItyC`P5QqqvBxk^Z43cNiKP^j#=Wz;)@(PT~*=n zIo}ZaiHMzMO{;5hU?n?F5GDDb%+IOo(+LnRe>it1U##4XP?Cp*$r0reV+Qya_)EHt z9JD?I0^$=xt8nm}9?yV|de46TqvZMyen`_R`&YSkpj3)`p!Iq6{)o}KB89IWy0ve? zHl+|{R)66A8{`{Jj^R>#3iOFT=ir>fYH)sD869#Er#tbqN z7e$qj@m7|e3HN;#?f_#i&0qS4D)m#1Da+1_Nc43tHiF+IKE5YTH4owJqZz`~b;j^I z4NXJG6wQk00T*K_%Bv}>V*K~)5P*!e&5JoqY0+!nE~%_H?i-{91r_Qg$|s-7dc5<0 zda^vZZQMCoU~h=tL}$Z&XC<->>P7b)pba&9fT)pZ@DHybpGIL?sj_JRB;g`l+g06) zqY+J7y6m25hYan^ELJGDtzOYTFx7-y4|B%E7Ot_16rhm-d$HeL4r%O~*ZeNb zgQSFs)9gW$2rfE2x;ZOouvgM}AGC**_$J!);1{iN38DVM<^|(1#RIb3HeVB%?KXWe zx{>b-6%F*>=RkE?0;TEK>@v@$Ys;drn5>0dhpHccy%=G>%AVIQ!ILDiH%Aj; zp)GRe=u0-bKcFCeTbSeWpl4|=H#L*|bV0s}2;I&~*Z^dY^`idCk%)xxdb&cW4QAr` zXbbQA*w_h_d`^T|!9Ad&r6XJQ7o=n4t-a%y#{gdhHD&{ zwR76z;^HN=m)dxJzvg*O$RkzL(Na+G zxX)+`6e23O!dBPyow>1wt)RR&S*ij9{1Z7z0>nhroAxPe#A~VPv{wJIJ%Xpjxb(q( z&U&HB#~*gu9w>D=QcwK@RI`Bh;{j;upTEzntGj?Dl%T{kPD9h-^TzFNjh(?AELy_e z6wTHYD>`_H$NP+mzgg~_DhsH=I0pXpmK282eq-}RQ1aBkBM~JXs(n9;cgb}NH!)>+ zDSfr^^%cJMt$7^b**R8fTn#K4HOJNO+}OY_<$IqbAPN4&p0=?`IXJpuqRdc zMc_E_r=@}FA>GZgr_XSWivNtx_e$;3_0|B*E5q6RNFM_ui1QB}V6}xTc00*f8C`X| zy1AjQICJQ9Ey-aCKJw*O@vJy$yWg2)2Rm>pv%r2pET4HJ6Ojb!F6QPea~^PU9DINK zfPotfMm8-a*gZc|Q&8gG@-9)5y{ChUgdh$INIIHmINYgj-Sd7*T3Is3Ur48ttFA(O zVW=!a=YQ~9?&~f8fJ;RISLe+C`{HxP);@oMm0q-QMb&kZ<$mFlwGyKb{<|h4t%MMn zmoC~#fI2C10wsDzf55V)mA!wCXnmmIYCJtn*Xl9mdn{m!*&e4|-Oy|I`J)Xun4+b= zvttu3JZREggybR1YKqdHU~2^m_0BNixLq!Xt$Bfmka)MPhqc7;__W%lw&srLSK6_R! zMXdvuO~bGSl{^={$gYA-aLW2t~BN!-vxXN0RZQq7Y9w2vp6Ot$8de(KVzyrpXXz&RkYRc=!4EZ8iqv% zG%!N=@FVrb#XQGafp@&uL?lY0Xk{_diWq-W8YxFal#kpOZr2_) z3j5EZp{6o5xyg;yWUo4%6g`OY9xP}|WxlD=HJA-z=3(7)G91ik#44K`UGh~@SK;(4 zlE)Rk6E&=_uz9zv_!|0^lpP*g2%9w`)3--wB^`z*PP^mHeOrVlC`i{dlYrjT2(L>) zzjtu(;^Y<8T;F;Zzb}y+pc?k9F=;XC#gv)oHKD6t(X@TlHNL$wANf{js=VsqCz@L! zUYBvgE668qf(~E6M_iBx6x#{n5B7voAzH>8IX|Xvm!)O?#{T3$-ykw*Xw0g-jIy<( zrxJoAF-{RHPfhC~Y89HD`Amwk`$fTyMvX|vC}r8+IJ+{SLA`F`&ytB ze@V;P6r80kTuFd@1r{7aaRVRVlUHeX-qL!IS6Hv>*x)4LVT5Mq7yrkLiI=e8Jw?AY zUh?EQ66W*KIV(r7{x&+ll!FMR&>RkN0o4+VzC9?=+UCre?wIt$hY-)w#wg|DKoJ)? zOnio821RmgyUwF9pvy2~y=g6tWaf-!|EutHIEnkE67lR@?$i)*gASuieP;%$M-A7z zsruIseOC{sQ7^E|MU7=s{W)nKZ#snZ;Ymh%l1j#w%9d7N(9MuFyQt3Lli$ax`SwYH zQO=T=A?@mtN@}mKq?*9m`3I9tp@TjL{yfE{FD1g~d@cws9OpalOBap4ytEaG>8R?z zQKQ=Fzw6fKCO>5TP#-%sn@iW59Wq}TkGZvbJZ9_ml?;$&)Q`|p#zkrgZ>6FUI|!M{&DJoGA_ z4yFY38uCU~rp7L?^vbSAF8}q5q^+U3DJ;FZrHP9L0Vf9|EWL!OrMZO*0V4|=EWNP3 zjlGkygP}3-UlCI`OJh@j)&ff}Wa;9pVCp1nZ|h)hXKLp{zyV7yW@+PM>O?>H!1Z;>F9IQ}TN#*PU;q2k;0{!?x zOiRF0u&uqlJ#)xA)+d;V=sWkProv+7>kr7u{SLkja*X+NWU*pT`tA4lN`uzO;|L)1+pFaZP;!wd?xw=UI={QND zfA`Aj>g?<+4mP%*o8W)$5*PRJZe?p59Tg=)ol8LYpZ1O)jE*M)boS*FTF>MaGA>IwzZfD{3Y{+tZ&(YOZVT ze7L`7Wn*)5af#w9Ysu#C)&lMowtj~Ij}Y_GD26S4{}7bH{^JcB3uw=&F1pl5IFa*G zkWf&-+JJ%_{Ib94^7dvWC?1t7Z(P`I zb|xmK8~XFQ-pdyI&B4L`g}FI`H!-mfcC773j&Hs8|23c$N}0 zt|rUBybcl2{(tu7;_Qruj?T`~63bWV-zbJ+k^N$Y34!MTPb%UKb?z?6&zB&%I{`8~ zyGQ@ep@;!52N+WL|GK{U)Gu+wh**gDZzW; zry662X4>S--`O|}H2y_k5->yWT^`>`)c9bc3zj;lB**PYS&a+iziw2OXMCwU9=kGP za=7_YvnIf|jo1=RuEJpg+1IVOKj4N1a=gc7G-jYWCLm*q^|r{iP9LJ8ySxS`EK$>4 zQQDspz#-J?n&GZtsb{LZIfP=QI`RIO;X0Nu2u2k=&Cf#9j&k2u#52IO9AmsOX$Dy# z=^_p-OLcWmH|{6_M^(u4a~A=;vMr0r;1TxsYv4?V{Tx-^wKQs`zs>3o)$fXGN9nl= z8k^`^8N1p^Itxpj3*Nk#(iHB)u#%7W3)wVCP{OI%2@{jT-aF}Fc@N$ymo?%E8}+q-8o>%zUxcfrH&|JGB@ z4zQkpBZjDi=KZbiUSGcQ18G>U=ifk09g-vkrK02@N1gu6fmamzJgCaRY77TW7=v{Y z`q!RY%P_u`{Tjr*FEuCfyXhF!X~z0MYEJxFxa(HJX@bSMpJpP&!dfuFnm;}>%(|(Z zQ$I*|j3mo;tjWHHe=y%ohInnFq1j~k^~p6A`qX7y(c5pDyo>)c0@v|WGB;p6^4&I9*IL|JD@iNnK@y4G=5n%PxL!b038N+wZZh zLk|0iM@L7Wb8DBdTB!eH+8otT=;l4tg@rfP@v4XRL#w6$BxryIa-ND7Kzwk{t8?P8{RdEj&i7U6P zpEb%3xn+gmh1=;a$tsG@&KHy#Phh5RT^lX44J9N^dJy-Up_y@^QECjck%xy;V|g46 zId&Lk%y#d>(^Pa>eY8(P_icc05Kl9hVc4<|Xdt$rI)}C-DLmlD25J18Xr~)%6 z0joeanjZ1^BxOY;F%7!m>Uaod4_LPO5dtEU{-szR^i1YQ7+7h=`=3z7m8CqS;-P|m z7;j#p52udNEXeET-~&d#EdvGGIr%*L-s6<|{a0n6HWNGV{w_Ym)2{})31C#GALTVN5 z{>h2zqApgLo2_WN#q>9>@JtaSyns+)ETg^n5D|}cQpXpv(HgrVfb8Ju^~vU;HrP21IcIP* zVop)L*&r``Nfzgf%1wAg$M3Z7sh2h+z#0rTovb(-r?ltu{m96Q$nh8PvYf!=w-f?o zDV}pdviz{HN|v4mK6a|Q)+>AU>gSj4ZCUXt3T2C&m`0zql1rlaj2>!t84nz{Lo$Tu zT)P|Irz&(yqC)0R&vNcPMnTt){_^sOV!dPuVmZxX~RiCF6n-lIrRu?NLgLP8|@G~maFM)wZh zo;~&WCni>1uy^Uw)w$a!Z9^yfj6_YS(!qff9eQNJaG=ow-+JvGy+`Q@?p7Yhy#lE<{xGEyihhu2LhwRuuA zP?jXmffAtEFW>om=&YO5->}>JP4n8LN zHmdX6_dZ!m&hCXWnjHnS8Qli>d5NWbG}G35X?_>Jm^8JA`ME-2QD(k*(l)A+F4x`3 z-;yWYX@)I)MQekMva-at-f9CACu6f~Z|YZ~^O7<#vt>iaZ{$;>!cgB!WW4GPt6JOK zoc^s{OpXqJQWMailC)%2v0qy}Smk) zH>Zw4VqPl3G)TF0w)@;_~TzACvU3_?XT-9WLlaCYRTS+f%;2m8y(*zcty`{&^FIz9=RZo zv*4+^vt8iA^D6c3quk2p7G%|oP~uM)GiDW~b=wc{bFW`|A?y#*Z&sT%^xJmY-O{n5 zYKpT#r{6<#kr7kduH?8e#dVk>0<;e9u-KtTBssfx-5p%|B8tc=$0J5Kt3Z%l&8NJx zIZr*`)wbH^55}4I@p#~6Cq3KkqOneCM4#pdr1>!DUXoNE`H&+G^3-*@S9W&LHot4z zrj_pF^C5(M2k%!4<+bx85&%lZVxy4q||QboEBF533^NUMX7A5@?p`6;gPE6 zSAr$KqZaFqYo@ZUw+{dA8K@o@C}}qTmDpry@96Re@7~sh46W3#8XqVhoh%>kEB8By zGFNi5w)$v4Wq&hoD6M0na%w31&VAx^!;Yv%HULPuiC^*GGAdrzn&bWgicgrRsTOpN z#$Z<~i^n&xwyJ_LwCsm1*;YwkiOdxf2u3#@U~36w+&-!P7VlWMQ5SOst26zTUuJ&f zI_CETGLtO^FnB%Dy{5}5XIxIB*fokhZCTctYj92urioZ#EmW8DpRavULL}LFC$LkY+3cJ{$#=KLnc* zk;V;JUv63c2tpxTd~viCnELWp4#XTGhzR8hZUB7(EU@Fx^w%Z$?MGO`@iR^hO6X#_ zFNx$|ijTLR{3^?lr|y*BLYvNy!zK~0(b#LvTsKU^P!#CEC zVcl$;ht_Dn%ScG1hKM?zkW3ScXE8;rKAtrjXVA4+hgAhS1y&$3 zvewwXvYk>UiWuPbv})m=jVhDzaXR%sCyVc+5DG7(!w$u8SRWNbh|Qz&PwrQgUN$@4 zV8pAebO0G%t-hYVkMi9kM1W1~e_p5aTzHtO`3w#!2_)eM^pUdxb-*5aUBzQ-gU`y# zi$9V&TEZSUXXFyQ9GL}%2zIA;udaf{04Jqb^X617Lvo})i~n#ysHE04QPs|K2-+`f zP;sHA#h@^?-J?fajLvRe3Dpg<=#UM94BZpAl1e%lzVUw6^=|f(54z5kuHCIK)@mj( z2nu)oz1)eKD-6n<04XB_gw3ng3nFGS7T*AgX^{?GEOhIIG%6H!$bRZaPt?iFj~)2# z-Z|v3)P3RK?_N-VmDSRjQ!71t*}R0Kl7*&}(79qk3(m8+X3^4t3GJ!_Tj|~*LaVf< zc3czqtNQ!v8Z*CL(FLp?sT`nIOB~rMzN*do_g@~3&YT~#6Q+ly9C%=m(Jtz8sV7g7 z^*zd8y~t6x8_a++#KJMN^y=^ilw<$OhD5(I$dB!rkp7Vk34JYCI>=VjSF9YQ zo%$mX_qQiRq$~uNJjjHIgAWD;2`KcrGsG7}_O65QiJ=j4!T7W$S|k&QDCHmJOg|+d z^<(||{GF-)1bknrq!bVXEyOSwdN5)x{z7ZJbrB|;3#noD1ByK$ol~RrOF?m97}!#G zZ!q|mTN#IYP>&nT@m+A8yFYV21a%Qd`bm6F9B+{`MpV*-F#es38_zIrK zjXoRKR6Jbud0JD->xX3%={1b%tTP%!8meqE+%XECO9$YU^U5))Cc;fE8RsUcMX6t> z1I7KTGrpY3>$m9a_$8d`~%;NVO)V-IErQNvi za>GPC-;!5rEniPuaa0>+fqKlNr-lvvd;|8F%>EpBt&;cd#XL-ZVKC-9~keGFH+m zPR#xGbZn;Nh@b&XTi<2Oj1)9lR@PSPJlImP&soZvPIJ!J?V)^+egpcYAw#U0q#o@7JTm7yhk( z!sS3YlJ%4=e6)0>6%s9RGd_dA~Rceml^#tYxaC!N0j3Nj>B+!9pX>;frqB zR^M4MXe3Ng&=c`|9M(_KM9K9@&|NjjzM%d!*e>E;rVfnI4K3hA;@IGXG^w13Nzr%6#MjqyX6JTB?EVdw;5vG9VWvm@_dX>faRf0C&T@V zMEB_#IAQAGo(v}!oZ<qrf0S z*R(scr=^IUToIDz#+}TM$)uZ&N=t}}ldwF8%nwrzct6GCu8%%1v7$rs`O=`%k>V2* z;?Q=i+P$a%HT-$rd#$>|HxufoXUW1Zk^L+$b=nQJ^LMG|E@ks2g4yDA5p6 za$JsJt?dCa-8@4`&=Ob0pVy%NL9|1jl~?WOw%Rr}Hmt2Li)pXxpui~xjbE!`a@%U% z`cjk+t1VCX<>||Tyt<$kJc#{ZUvE99nF<;`0|Qfim$$UjyE2q^_mv1Kv0iStj)79k z62S6|*=lKZ?Xi(#MMod7W`8H$&lfEs%Ka%0baTTWNr+qcr6(xP$jP46^b6n{oZ$^# zj;Z_JQnibr^FM=jBf=qWw~#0BNATm`1_6F}=DsXQOp=U6BO0$u4n|k=Z z^xmgCBjraeyq^{2Z$nRC2_H7T`lNX4LHu?>5WirJtQ#UqEByBG#7IW^l_^qC0G#jB zkXs8Mm-zJQu}v1d`47 z9Ihy*_^kY?l2zXC^$>R-o!RB+XGf~69fx6C&uQBhEO=W$R~6eg zb4a=A7c~1Rr+n7m17vDLRpK&!c4q+y6oVgNTa9;9+{d1z{9VdTP^YD;a=P1l9*|De z|LwInH(K=b&W?o~?w|a>)PF8an88R_DJ(VoZT>k8RAN4xiD9Ldu`H3C$}aKUH4~82 z6c<{^+#ib~m-87Hptd$kmbV!Uz4pE#L6&n%e!g|Z#M(1!s5r(pfsdB!XP6#ytfi#a zyK&hj;?48);(EbCNl=Vxbh>g<=egtJEQ4rpr!+QJ$>0|sTB$Qhtvw$nd_xGg)o2|L zjuwU4Y3Y(A<8EMLF5r>L4U!E3Opf(lw>-xrSscCb^a2QFv%*yUmK7SFE=6hj=v3|O z5JkftAze(qFm-7?&YtNiqis;%-?VFR8fSe_xbJ;qvDt0EO3jb}^hj^+iXb>eG{$@5P<^=X>uf#34P8?{=uVLcnj6q++{_5ZRuTuk=Tj`*Tf7A_K(c6LH8J zhNowuSBMqy>N0UDk+ejQQCltc785f?V&mhm^{|fHj^C`qcA#Q=JAx$2u}9!toTyXN z1o*;Q2rZYFejP!2T&8hJ-u=x}x9d_phPdqFeBPUMwK*WE_2qSN=*8pxBkAgKBZ=L* zK+eBRO>fxWGqAjwb#mo?txYMkNy+XLzCZ*WXBA&e&kV|rX#iS{GAG?m{;nJt_oz7>IpoP74ApVcXV8YZ)kt2D$?AMe!N!a z1z=$Y?%#e{hyV5Z?dWKy?|}LMRNLF(6#G}fGrAvn(Ei(x09Xr4Bf|Jik9()zn6){V z>!5SWf9^(pL_=a?8pX|rU1xei#(fJ)MpUEkwL^gQ9-QE6@1cYWs3KgFql>k;`*W4ogW>(TsKR*pd-riO*fBSbzc%2rtHvQ zlrxJ%`1fD&Oc<9u+sSzr4|UZC3}DeS2N7gx7km05`iYZa;PZOQ2{?QJcJTK#VW47b z?8i3uf7vtb7w($2>S{0$`5vZyKbnL`!i}rB-88qYzozk{e(@ z#ftRC;5jBFL{iqAGBZr@x%FGVB8*Y1`($@kP*H+C2h%N4a@=RG#$>CBBXlV#$jOY` zO;j8OW6bz^>tC$d`T{16gNv}JufCin^O`KnD)_$;+m*l1KI+ZiOIDKmZ57Y_w+(W*g{4)!S2g-GgJ)IBX!Ia6Z;Fk6exN!7oAQMP%};C zW=tJ|!_)(}&epxMX-8mCqmqU9_%8cs?3SU5w|>v8W!!w|SaNLhq9awn># zxK*v_YGOiU3G1PjziAXbNVQU@mROk(3r0C z_$U^F7I!ir*SJF_8?zXm8!U|uS-{iu?6YY3ujn0Zc~?K}V$kKPtu_o@Lq#J*C^3rV z$mZ@Ro}M3#ChFu;LX;C>cVmQW#i4E%u)00W_*j~a$vhazCdFv1!on@;Kr)y;-gRwZ8Wg^oq3MDP?@(%b(9|29g@DZi^#0-H}g^&mnuM7>{T#LfI-; zzQ-lqMQUH@u?q--0K8C$g8JCzjNQ`k?ha6a+mE!HUSi54ZZ)iZ3{$9r3Mz_HHbQZf z?IP*9@?o3bcHPz@&miZbnoHPrHZM1aTjR>qBbMz%i_mSzY1<}xu~X`1yuu!HCcRzR z-|V~7GxBVV8Wgqd5Y03f9&?yg7hF`B z+T}G1`W5m(@>h8B4S1}quQ-ne8*YN0$Bl>fHn2z5!vCr>&Gy}PaP;Ika#*l0tg z8)6K!P@sN=G^ziZ%Mhy?c3e$iYV%0^1?ThG}C>NsDe5&mR zmpgY*d*-!upl^~Oq%PcJWnnu1=kFRr{N0PAqv5G32Wx90KV{*43lByHKeNUhygR@6 z<`h*N@~E&erlFUxg>D}ewOK<=5^+&FHL$e@)W0em!-d8vD3%03b zR`C_j=r#fawKH<5Hcc4m6REWzu=>p~N6G0(%<_pBtQ`oH-fJx^1J5Ev;gxhxu zanL$ZlBi+T@`}Cj{XFR}oK?(pZf}F96ed||m&BH&+hwELWrfiEQ&p9IS`*RRds^fX zQj_OXom7|L7JV=R8h&@-xm&AJ#kd*ke@Fl5)6GPXvH3RSKKg$L)ak8<;xLWez3gVD zR6-Xvdg81@bPNN@V&85D0#+DGo&WrN@@r7h1dK864eYvba&bzSwlQmUXJ2ZQ8(a-*uBj%``=qL4sIvBi7Np(_aEa@&Se;BvTkYhibV{ban+i}xNqn(Q#t+_5^jn#|I4PEbll;!fZclM4L)fm#H@{Cm@ z)umO|RJ`{|S%^+wKdxLu{`;1YomGH~z|2!0@#=xMr*@n0i&~83KIZ@3ogH?ar-Djm zA)&6eX99?V^dx*KgDix2aE~|MfBQhlFv7pJVJ9a`Y=C|hp7zHpe&_SjKx2)6@9q01 zF3euYJexPmllO?(XIh2JznRODoaG(}CcJ_kbeoCyZh#f^T>H-Ft(bI~`V-Dy`*%Pm z?&JOW0+0C^KfWYhG~e#)S|+;xc4qee|JV!Dy${gG*nbejhpq#sf_PoI~fT?d5?&$sVgT1udvjcOJa^1LqP4Q2Vy znO(|@;$#E1j{liu|HDa`fgh3ocLlj-!}xfc>$1~)mrOa*jqLUp;8QA#dyhWj;N>nD zOW`t0Y7>ys8lKQ@bKf!9%Cxe0VFPe|pNOHGxNgHm1U(19{n~G|!s8Bg6aBmYMt)HB zI+)IYCqbQj~=zhqYDr+nucT8D<%Yn4+I(KYzGk5jHNX z%@^DY@BIIN7#8@ zIvn7j!o~pfupa2*z$)m=T(wbf)6uih%)--LR8v*7M3)t&Y_u8!KI(>bnG=OtJlVVf|m~m>pQwtWsy~ zQy2aG6rRs(nJ&}pF82)9CTRc356z1XtN;Nh82b9g>n7%cdG|NqdS3h)aAw}QY|+}zxj7rY$T zpWE906btd~-}yb=Gl#cn9^NUjzaD2ho^&yAdRwr$P8vwp-jvdU!mB767LvIZ#Lau+ zX_=!IAIvt%K<~i5uF25TwnzL2wwt@3CQp1K@2zw*xAGYqlJcvPMOcax^aSrVI);s7qy_s*wS;n}S_9y9fi%=6$T^xu_ss4VWg-~acx*nvs^M^eR< z6MJVhd~G{A^i8i6v{J`Flf)2I;HA1WNY4QIJ-J7kKy_h1K3HhXDygU%WGQPCBusA+ z%Q}G_7Ci3{uK(Vz7eA-jpXCYq2Shv&a8gY{p+RPyK5rwFY~d2QI>Vb>jdcj?{qM5d zdr8U3$!%@l{(E;!whnrpxAtN~Po2QI0-Y*`$ET~xXt_#m$0?2QZvMw7b>>o+e;K~J zp&+P~&^GhNYa=qq|L%gGn|m{^svtr|B8*QaPiGFndF;1(Bla)~6*rt)EXiZ}-+Kw3 zALDh{aCLM0f9WpBx?X)be2*Tp=02$>?gTEUMSoj(jr&M>Vtqwn6+mKdug2)GA#Z3n zJpU)T!xoLL zAKTW1OQ}I@z__EktiYkfw@2#xV^|-BfWg5$z2DRSgVWewmvb8C8rs_0rs+b##DuLZ zwAER5zz?{STq|8Pp;~_%{D-CI&45iWyeNRQ$8xEY-6Yo8J0djOQ*+14VtZ8cT34{S+3chWmKMu*zjbL|OaFB(lA|em z8ANS7wiP$oTxRwqMUzxVUwvcgZk7qUt)muD+|(L!oqPNI@n(DRVJqU|ufJ}ic^-1m z)zQYgFTeirH78m3cPV^sMxY2~i8Wjy_wRf%p5keI*7~q~JiG09JQCf+LM*Ejy?Ci- zXa!kL8zQ+xeXSxdIyEe`9Xrx`(GMrV?j3Pj0-Yraybp z7f$M?A6ir+Q~|2fY*1(*8m@OR=K~6a02%xjBH=l9M0SIKfm305MB$6lEj1Br=B7t8 zPl|`uDZC>l`mR-lB70f5-+kqSZ(xV8{ULm4+W&#@iU2h>d|YhYzbLYe)zA1zxSj9s zJZsFR7R}{ALH<2?L%Sc{7l_8q_fNRPeZ*K4T0dsEe-P|BdUp!kNlXYC49wGC5oQlz zKXo+#s^$9VW3RB|yKuo#!>AcSZX<7TmGqJ^M%q`E?@lKQ)o@FQwNpq-cD0fWx}dt! zLrGOgUHGl2uA*hTJr@dF2Z3Ywu7)>RW%ZWblr2RUM@P9Fs=346OP%^c7+E7d!Wc)aTh|~O8v?oVFeQ|Ur ze>_cM6W)wD zG;Q9BZ*&E_7f-f$AtXw&No!Fh#A-hePIO22y5|&ISxmNdUYAr@KZ77sZJTllK|dur@2!tzUo85v#u=yRhv-rWbB856@7 zO6U-=VB?v%N=m6P_2Z2oqSqbhQSIpi7jAep%4j5JVG zjj4plPVWhq_J+YZ@_E!|AQPnoOdlphdSk&Z`j}HQ>Uejok#@!zjDIu^x@6LldkS}< zg0zT*FbEYDR+{RoI4NtmBzgv#cNmB>AK(%Qt_YETlcg0bOA9YIP-ua^YeglgY$j!M z^W{J#=?Tb5eP(uqv6Kdj{$ug|9b$Iq=;#<58{65P`xAmvxMLu#?i1t1KbOPZFd9US zl`xbXlLNdi{*V+}O`_qJ90R>!8Xvh^)cvEO# zpDvtH7+dmBwJ|6;aw1^B)hF_%^N$19SXM9qbP*$J{#&=ENW0*V%TG^rZZke@ag{im zpCQI2u|KliQYHB}NLTOML#;#a?O_fv) zFqIVwcTi51e-Q$`-{tXS{a7y{zyz`KZ9ZZ>=Ezhno7GzUxqrRvzl5yRlD7VT3H}1l zr~o9&bKr}B0V8vU6-l7;-yVlu>Y>&X7z+|sCb6Sl42|`RzGTpD1Cg~eS{`??!qw_J zLAKy0RaJ-swIKtF6gvjpPMfjakgXrO((m%Z*VPQ$FdMYyyyrXmqK zvN1a7Iwa^X3HfHmZFzYAXfLu~DV?>i5>jI`+xe$fZhT~oP*2>tqlUKsi*5rhiX9W* zU<=Z1M-C{Q=`;*ERd#iC6%`dt#!gPt-R1QTM-w<5bhB`tE%HbW1?{Y*3L&9hpEq1)5Gd>3JVMS_V)Jo za=@P=WYgbX#Khm3jL`jX(P6FaVatiLynpj&3&b_uH&haG>s3={zu5k(=rypE&G8zZ zou8CNE`X$@rf`i>j+YiaH?P3U4Vm1qemRKdkGOapi9iB&9s}g9;%>C!cs?aIN9)R| z8qcz26caQ$Y#KMZ2L4I5B|%J@35&tM%6M#;+Pnh%VdrTSR}~QX!B4hfom968F{sws z_WiFq7T*wie&(j&i8ikXIHtSJ&5vy;JF`0`CA2##Ec{&oe`x04}1VvK{gw7CcUBpDJ4YB0HcvQh6 zS|}=`QI4UIzl`d;bpduHh3b9`WY8p|?}~+Y??j7HVgZp@nF44S?9NWQo3s#@35kX3IOyA+Exhr<8-JI0obu3RmsF-_M2WVdHrS`z?Q4L@1vFn*h~a@V)iE@jStwxl#WR zYXv4S5%g6b-O`f`A`01Ex+wVNGrgY5k^8-`}zOyLRXz7-`7 zV+zN^yrMR5Qnu6%55)LqDoqvKUp9MSbC%wxecuEWS-=O^Ns z8saJ*B!83{74^O;!VZQ=_EQd=2R6^iKMZ+0sXOu-33i)TklyU1zU=DQ$IVm88*U;} zHrv=IYX;N-J7UCsmx+|vd%JbIWn!R)%p2#P9T+4doXTj8nI2!yr&VtTv#Ct~yYY(q z%v60D7VY;m_$Dr!D$8i8Hn)3+aJ=)nzgj%07c*t+NsT?)Qz2ki_IN*$3hn?xa?v-b zpeO?9+~a+>w?TaVhYQ3X0ze}JY8E`RmoimtmV*^FaxWTB9B;Hwg!(QWK_kYA327{z zf}XfAykE-)0+Fxl3tUk#qS~T;&j#zAcU=KAnL`(L=L(I}r|vVb0!@XLTSJZ!+8TAm1Uo9B6MyT7lv-;{9H zGr*iF4;B6X_7*jIVCq|(=xdm*uKJ>y{-WNU6U;r>_v}x1Rf5*C!GBl;WWT(Z4*7G> z#zulfOf69H6v7Lcy1M4FrD^XaOS3=rw2CDi8b^}?SqFPYN1NP+$PgbeKOgRT38w2U zG}!MpwZ|1+1#$Q2C=0*h6TJgaZ@_JEE`*a+i8H))+hDot?P|lvf12u-jtO1#-3B|n za_6GoKng-bVdXY_j-CzBsiyR^LZ6?aTyUPUAPXiMJ0!B@Hxx?>W)+xVz#W}0*C;G3 z-0bpuxnn@xCe%l36Cyx;!YzY{GPk$4GBPp!JcDA37h-ADXZ|Dydr>Tf>_kw(YH+DJ)v?E&( z^Jx#X(RWVxway6PHH=s&5dlL6a_}wUY7wEV<_IH53?Vt{5>i#(m^p`h^tkG_PFYn<-xe z+yYyPT>4>?DT>INh5M>U1vPRE6l3CaBK(3!B$_+Y<7dw928q3r`9c~Fr{=dT(#*Cr zw)M?gtP^4}*RmxeRK97Nq$3F5760d84t-@0*2vWpl2Q>8i&6=TkWF1K|HAT{Ek-go z=HgQdxPIM3R~)}|s@R9aESJMTsBnO70YB&)BzUpP5;xZu69)Qb>4d}qMtDO5-$=gN zubXudzrSz;Mep4wVm2(?Abl7%zWu!ejC<5eO`}7ATB`-_<`-GFROGU2=4pM`kvnxm zC)$wjBZhYqMLJXb2H`IN4SB=%WtOE@J}ZCwz=MtyZzeUWXo^U>gkKu#m&}VgJd&Xv z2}S?Bify*{;R(6XEOM%Sc0^ZuUaJxa5plPi9&u7;KN5W zBkX(Erp)v7a+aDw$4d1E{@t!epppQ1&UBrzom;k;FxH*ZEW?N z!6y?D2|-&I7EY2 zWq!JAQ7YRWiAw*JkCU9)aXs}R&9^Ae6#h`I!zwOK zt2DxR5lREsR+^GYUIkIZ+-DMKyj+`$2b}V|xkpc~7EM(G6rzqA=AbqG??)T8 z^WM|CejdU*Iqf~SoMx>0_mgy6QA(mZP~;*cbgP7wfAV>pD)R zo4V4m(INA+PJb|ca*}jPl6YvGtjVGK>Ttnezioce`%U4P#*e*VL8R)f{_Jben|Tl9 zJSHhA`ST}w2Sc1t=~dV!On^Sa^9P;Ymv-_s)7O@@`7~bre)1WCwV$wayXpQ>pDImpeirm zG_b_tW!;=kI#hL&y9u8myoyTGZ@!4i5pW@V-Y{Wc4km~PhJzyIncCkJgHmGrdh*RI zSl0vCYz@u*?-u?JVMki9Zq(G=1RR~75W76DHSQL(boZ108a2n=#XTfX0G_<6d8xh0 zE?$!IIbZ)t&yG?^4#`G{Zo2$;_50{dfxPIIA1Hd@;fN9X;=FS^K&LEY73v0dl^vn# zJNf3kgNh0QYEZLu!XOM7M4Ze{1oYyM5Ut#w9)XF=^9>ZZM?4$i?+1UE&@{f*T2CWSDVSGhe!oCf1 z;E`;`nWY6(>OkF@I=W&&NL0#)p79aGeci1Sv{>@)657BRo0?URno1k!H&e%FdUeg! z1TpGCHTCGvkmdBVD8U>^(8xbkFZI3ShC8p<^p`b+-6%_-#VqE{uyq=Vah;6dGjt1) zHXhV-V3*pmL0$a*t?iKcii64W;l>Yjhbw;Ej^ni;XpVm`{a%Muni?B4yrc3uSz%W* z0-lbmzh;n9ME4(M=o_XP+e;v~%Q%4^@e0f|v^8TerA~rFRA>11Ym@&jragCC(Qo-m z!pnr<`0lrUG)>f=9EDn7vh|L~j)%9~8-y}HbB=b5Lti1u`a3xEl^2FqTb^;OCznw8-@>TF@_qnkiS+Z%ALhVoazT>iub7D`$hw ze-X-}>P>y|_wfQ2_Aq{CA^V;Do%*a{iBl)=T&vE7Y^Nj7H+urh?}_1{LXJ6-Caa4m%B1>rW7p zm_WVWx%3lGr9ekn0bT>V!~!!u$Ci=W4Lap2U+Oiuq+09lt3a;vejUcSX(_2rWwroQ zN}GS0$;;WX@GV7GtMfIbMg1?WVmvK<#-=YpP-f9Z;++gg)Wtb4D?^+Qn#Q zqNZKjOU>7o`$`D($Ob{iQx+u`*vfeuwO5F|R<8a~pr*P%Ys}-9w~nikH#MGZl4pg4 zP$8A!YB!(GPj(>&V*mMuiYg|dC`0>G=quaRNk2;L$R~f7w^VlDyZ-{in-3>6rb@(g zA342-93k+w#cD4^&Q}@h!T5!*0^{hf~5;OrjTvu*DzeyVu_e83%_r zXzB$wDC(M)JR4ABZG7CJ@(5+R`>Vg#VxdYswu{}Wu;#SE?Qo;!v18nLl;EZrMcQtp z)pVj5f2u%f4GhY|5GivxC=+U{27+jlX1eAeO$en|dl zb+R+^M1uWzpX|pcA9NBwdPWT?TNg)+?X9gK+cTWh>$MG+`AoD`j|=WP#}G}Hj!UGk zJG*@nk36+M~qGkA`5Px#8S&w-7rXnlG4_~_{K7P+FbvhyR@$j;7g>2gqL8qA=p zs958)D}ja<6G@ShnwpuOezsg++|sht*S9;K!O7M?Fktrfd>6k5iQ(kCegEFw6O8z9 zx#@p@rX_Xh5$1Zjz}&K(FCNv<(9p#{^PVH}_$E(~w7ReA%ImP|_wZ*A1@RIxpDRJj zF)*RgmD9Azwn=W>nuf;&a-iz4JsC?S((3xE-_`Fq0ux-aXD<1G{A)7`|FjQ41ZSuh z?AkK&=dC(=+=cMij85KLz^#m)yKza?n%!JN+%0D=WSlpPx8rvft)C;PFIcjt7hq>u z(x1l66)9!=3j2EDa#y<2){|(|b~aaPoJ1#_!ErodGF>zG+SC`GlWsnYa&@ZLwRcV` z_wFiP+u&OxhnXda!soN~Awg?+ssVFA`27cdwh&x;F*K>2qFDb`RxbL{QD7M@CK-x3 zXYlgvqqgH1e0RYo!xP-^qG%<>K^ZDN+nt)GR;|kET_x2szwku!BvJ|d^a}YKCr;58 zZkVQcy>4O)S6$;>Y_b52S!9)Y`Cc=zL4j-@;xvDaCdm~I5bSPl+0W<{m7-= z`NOhuDIuoN4;n4s(fUPV2PEdPH_9l5E5P5P?T|YLcPnr62ttw>)Z2U&3Sj%8WT_;P zsPl$RZF3DY`HVER#wYs8u*V#|%@#SAPp>i?AAMO732NdU*Cf8kBwgYWc{?6I{7&s% zwyUp*?_zUY;C zOS$lxUKF^1l>7Q_tywZvz|=hfNObGZJq*PC8V-a|#8(VX8MJ_&vZPP*L15qR9k6j_ zXf*b0oK_w>z4WFP#VZ5wrrcSlphXm_YsVR}=&4(>uHx#!3=!PA>25If_8zdw)~@zk zZm4mTKgRsGKWzg(;!15_C(q6zF&*6nmuI!!lz!9Y=b|r)$`_!h<9sAfI72cJ#r|U^ z1=r9FMV%RLmTuS1YLuGIi~|#AC|3sv3#yk5Tz09^+%nmV2yo|6j7NmtHoVbBZR&&X z*gBy3`UN#46_+s#xIly_k|&{&3VbW-Cg1juGlN9cKNw*<7nQ_-e>(qc8{kEhdE zbe9F&SuLS(9SSNqg+HR{T;d%9@ch3mhb?g_>TjMCr!vx3dT)V8ZZzygk@$VKpWplF z`U}*)U~DP83U55mqMV|W@w+`FPlPim+<+K(IH5Bc+y-Q(6ZRGBvAYtnH+w=f@99z8<9?W*b1`DJf01lIu^gH-+X7v zdu=sB6W!BqHX7q(O8eu3Bh({0G;BR~uh(V7P;+gxHJ^nMm&>Q2c;^lWny_6vWYyd| zAO|!sZoT+W&a^*}P11Gn`@IwGtwx4zYFGqqLJIP_%YP9G`r8l02QAJM&)cn=G~AaI zK+#n6U!z|zdY=5SG9WlHXXI6^zM2UrHsNk`o_LF4>j-O9*rKYC3Md}Bc>(Y|n`vwZ zv!FhRt7}>8E|5-_7E)<#JysUnK=S5^2KB(%dx&N-gKTq^f{}&Thkea!yHaIlsHMCP z{csf8`4FjQV}uB|!}~$3Kqo{2zifyOr6-+Q#zR4Y{7l!z7vjY~Lnd0o!NXH9GBGj5g_M_-b$Q>NOl0w5 zf_Uv#OzrK31kMXOJ4wSXSDP_*nsaj2V@UzmH#d^tb`S_uSvfH_cDmN;5*8Nbcmu(& zjM5>hwYUDYD_O3z32b{{PJ|+ClNc%9%FgQCIFXT76 zn_(uz+1UZroLV3kJ#wQf_*ag*a_(0@t?Y|28B0vYY{AlUGC#lS_9h`$V#A!WdFm6{ zdqMS8dqdmhj+uit5yQ5gyNq=Npm}vh4%?p|TU+eJ>4A=+g!*F1x{poX{v$W7_80^r zgrq;93je@w3iw?u)4D7Lgwk}8 zkW9ciKEarqMiLU4Fj}W~;y8{(XjydVE5;U9IR|VQ-TBv9eGZM3JSF25mK(vUr)h(&=JG zIdj(FAwFtYCXPeX|xcKk|tW-`4{|h~R3uBO8?L(V8yx4a!%z|L$0%R$b zOevh>&IfE6#!h4@hmnV{me=*`Rz|H)7cYRRZR(_qEP#>oVa7-fU^^A7-!~PQ=LNi@ zvdPrfyxA*lACL9>{oVMKrV%waKq|hhO=S1l5QOngMaf9fE;~6sh;|T?GpV8>{DWe< z*#5mD2VEBAHB_o8G-0H-V`rMlW0ttm>*eiOBOD<)e=M%V(g=H-WpR|V$%6QOcb8nf zD|_>oM@3x|aAwquRzTMyHt&|5M}gNj+gpKZVWW|at;6@6$fb&cm-cEShezITWzJ`J zX#MGGsC?+Brv;YIN7-gGuIOEKQgIw;h*wraP4HxCB+X=qo>|9!k3gC1v%ZmGqW4z7 zkZErFjm7a2-<~<{eCBHFN1I#wKO%N^C+W8#_nNNcDH4mY7^*xm2?=}x0)LZdd9zq$ z9k1tJx9!H$=JO>)a*jtHOUQgSUmdfDGeJk&>NWNn6^P7RH~cZ{;J98oYi_$jiNbl7 z0APd+$?5cS@DvfU4FTz?JcAi!?@yZd4(t*}LOT_*Jk9|fIv1a9sVg#=&-B0Qj(_Z^ z!5#6E5OteRy^i9}kDjeThV06VIC08?G@>d{qF*-+Wxkj{xRLcC_Zoe*L6!wA{;EKU z9YJV>*v+b{wy+fps#LT&s70Ng$H>!ni9UPjdE-UQtBX~uTiXO^&l4cse}f|y-5*)O zp;Pk?iZ-%7Q+|jFUC2L+?yd1ia7e!af2#FCsUipLa`64srK5oV_-aSRv~Z6QZZ+lC zYorp0U>cm<@TV2lmhE4dSaAY634i5%x6~>);w-i^HC0_&T6#)&xGx;za3afNe-w|G zmv;dd5fPD}pWn*rI6t5AALOD+O4GZY{NA_p^bgN>ryuH|5!1S|vXei-;UuJ_Kendw zgs0l_>)YB^Ha7It)zuXg;-skW>y3WAy(87|hWO>Lj@9J&V6g5JEcrjGinx~=NFDRp z7mDB9x}qg^z(%5swR1P@dbV7m5<3T{N$y`I$vJc96mI^NWF(1qS)7YCsO|TBJp!C$ zva=ebA+hjoZ>xXv@7bJW*U;lsml!;5#dx}&U)*iIAmQKHC)dWu*4Zb}tuwe7s3EWJ zL%%9@dEY$t7`o`J`WrTOxw4NOTCv4TcHh^ClJ=_CIb5^lH?efeyCFwXU1wZd>j3_k z1kjkW!{Pt)YWd9Tz-CL5UUa@clrESdbn7$t>rZsBPr7olq{+!c{3W3X3@S5e*ctxd zF!|@K5W?!9qn9Smu%2Bs)EhcfDx5)kt-%`pUq1B(Hz1AUJ;v`ydr zWrn4Lev@0!bMh^Zz=pL>-uqKtA49Wj67Em{P*knQ>d(yB|8!t!*joNQ4rrhfiOW!-6ChJ@v*0O`2pxnataeJq8^c(`iX2&pW(yV0fB_* zNK89I2pjeTboLi6>Sd4iNJ87kRJ_M05cpBSvtCO6oTD_1X)y5_5aJ{j`=_E;lP&2A z>n+SqK`w+nGRo-)N>n_Q-GcGvjQ6Oy3)*ku?+- zjMBu_E|zyH#Q2g&iZ-tBf%~?=-lWxJT$mn`T$HP2i_rK`SN*^m2<|t-C(h)rNLp$L z@fUZXTWu@9_GlhHi~RYw<^VG6h(PBh#3y8DAPV{)ZhV=yvGQglQU(UGvtR!|ozq2a zT2r3AH1{B2-0S;7BK$Lvwv)xwlT(~}2v5&^mg`yi;^(SWon}5rTTf!apX;4tYP&`q zwOWI!`rJKcv{f5omUd9g>yHV2dqxR0kJgxH!p9Ht1B#YAv@y!t29^aD@eMA;V^S<$ z{~%EPbx-gGBv-mV`%A007-I+q!_}DlNC&9`Tc2t0teq_B=Tn{2;ZosdP5W0SCZC53 zy^p9JuD6Rf?D?+PQ301LgkL3D3QK~_CRpsBbkZ~^oV=h&?z%T3b=TL6H-EF=JmF`o zb{S4Ubt7bml*F%mb=m6=?HZ#iJzH=nW#&j25&v)L9V3OGmZ4yC5QJI{>pGq-9E0zK zF&35uZAY0vBoPtCql}l+O{O(p`S+?h^X0vb?Fkf_RZ47>Kj3{Bk+RG%p&y^h)uV#) z5Qp|^)CCw*#OSS#=Py&5CiA$QaYf#I-@-5mh3>WL50_h?m3;1qd1U#vR(!VjY#qRH z@$oAhK9jF%<%?Cg*a@lYyX2`d6-PBLS9rMC+Xl2qAKc)o)*AxG^3$GFOw0`EI09BZ zmaePCJ8b1Ra^ZK!kfhw)TnPG`!lVJ|e)u2{3E09#r6wd$+#U3WqSWB>c}YoGy1U;) z<}=%`wfy*__+GXNX)XuhRmbV}ARM*1sj2O1lO4q3tl7FdT~x^C+uq*pNmYlxdm#_( ztFn~|e!Ka;RBwtq-*cg0oO7qiBEI3o2-#av#@d4amZyH@czl0hDu*KrA6V?B{Q5@5 zsqM6Ii?}O6FaOy^(mYGWQ$(JuQdE=mUSwFA!*Or19q_V-R&bar zBx2mX=>P5s(V_CPkJZc{8S=5=y2%_R)_r(&`!N^`$jkDy!F{}GIqmx{Iiyd%;&W`K zhnqlOP@l+8IU2JKHO_W}ewp-{SB80={*@saO69ksW@_<+Qyvg;-|W4DM_zb_Cqlhx zdPf73-$>MmA!?$2&Rp)|+!tG%_M&DLAZ>KZ_@=g6`Ov*Rh>Eu{w$ZF2%lM%LQrkQ# zMI?SJ_~sTksH=6V7uE1MxViTX@y>Q!%}+>kv${M`7p8hbMJcwRJ) zzJ~vWjUSi7zVb3puZb9zsF&wZ2W)qKm+5I>^Q)0bT zZ^F}{y15Nb;Sf@Vv3p8#6vY+BZ5gk%4b(K4y?>)>2*64iXJap%+A^1_{5xd9hHKAR z6k{<9DSnUWwH-!#{icFn9En=MtRz`?cb(hZsbUwswzi(X5U+|WPt~7ye9rk1-g9vW^*}tBix-ILezR-GE=bbQ_u2{B=Y<1)=pblAbE&mji|OK-0~P8mEJqdp z*zSi`mVzVp5l!id|MU3`t4}xYwG5z^eTWpP;=VrDXi|uTN=Eod(!@|MPM`D z)DsGarl6@88rQZtkDGc}@|HMSR&>!eqnnYKF7Gu_-EoW52Yr-OC?#3%Uh5exKq|OZ zuO&Y|Sp}WxrI*(^CnUM94TxTdrQX8{#q%E4;>t*}#8_rsj9un_!S8x@>kzR_Q?uhl z$YoKDsVO;kITf1othZtGHvV#GaG={#mY!*VHY9%mRB{yfoFtLD)S{)Sx^^gUtoepO^4dLZP4Bp4r&gLnQrQQvQ8qIu+O( zvN`m>nWE)<$hrjNjW13w$jKDBu_}u-$`93Zx72mh{(*9K zM z9d8fyiW2MEDD5;LP#ZOzCt^ z$@x)M8XT)x8h3!>3QeaBLsbC7mrm#qRdt8R>_`bSgGv*HDY2vo{{73XD>9wdH}~*c z(Ta=bQ&K_Y0ByNI;hzzl% z)qhr2Z9VLpR`9jcQT9tf?AoQQj=WN!nlkx~hj$_qtQ;iS$6s6Lx||~Dd^rKmsg}&x zJX$ZSvY}8SL>jer^fMVtrk2mH3?R z%*(r;mYo@J!@mAqiW%b3#j&VMsbm?Pw&#R3g`Kg6nLGlGE(LwGhzRe)(Ox+sM*LJX zY5ZVx7jw?RSqoPj6$wY&n;{}T>bZG~BSJQE)1>1(H=pOAQJ%atv0Y2Vr3U?je*VJF zCONPvI=YswecIk%0wX(Iv&$snDWVtl1oeY-B123gL}JDcB2kLIaD3f#w6U&H`B%&K z={^D2SEoRu*zGAuBc9Ms#8Zna3{brjA)5Ju);9@hd)5&!uHy}D3~?dXWpQ{{&v*ip z=Chzt%XRJUhQgWiZFFLeKCU@#qq5Bw%A^3lp>Pxu4b`8!k!pd+qPNFK5(6Bpr{agQ#U4m4t%*@Qo%ggig^KYz?^|x82EJ80Bd2k-< zjO{Ojc6YbED_@<1n|hKeIocnFNmBsM&pVB))gp-_YU?Xu>WNuq#R9hQLm3~sZ$ecAp z&(f-;uaz{~P;HKf=I04;WVEjKquEa_wwU=V77QDU#jI(TzL&m z>2CNR?M?cH-;?ki5Tqg#Qzv7LHv2VauO+Aq{nX=X_Dhg7i5+2W(!b8|`4{jZiimPH ze;M%0b^4B20|_~&of;!EN4g?-0lOkA++t_#35C~gy;jS+7*cM-N2OjfYu>KW!Q2wN z>X{dlknFtOH39bb_h)8i4yW?`FAm(nTR$)`6u>7dD=Xz1)uSUL2~yMs2AeL2lYx;6 zIp5s+!qDgxas`}r`a@9&c6N6^3O1pkp;J;)elKrrOU98wvU{w;!XFT~ui1Xx`)sLJ zrTAx#kRK6#xJPYGjis&a>kgzKZvPOYSwv>xCgk0@r;2i2h+)=zo@l#u?gnv?|M{Kl zy?E@vtZ z)YJI*{`z|IuwKB>C>T<9&{0+-%#0Lo(>~JZKO5CpQU+U)?1n}8*^{G^GF2{c_g6(- zGnn^pL)AkO^EzQ+i3$Yy(Z;JpYPmGuZSCdm5zUyw~AJ7vnx`AcnV^ zC3=U`gllNc2Rxj&PhpKumFaU-3V)A$vM-+ZUF(2oI#RElALpB z5G3aeO@<~zlcAyMo`?7Q-uIj{b5Bjp)cxb$nyCUxpSbs4Yp?ZNzqOyebk$6qNo@LX z^&*B?KJ*lR{=?jSEuM+KYX%vceX$-_uKB1S4RbZWXPiGx!19Y%y~ROpg<~!9&TlOKUT%j><@;Yn(Cg*=}-KSy^PHl7T@Qu;M=~jG&t*UiPjr&OngKK|w)5 zQBe_~toQEU|K0x-MoUY3`}S=h#Dk1FaBy${)dfVo&-7b-DC5vTmO3OPWCkLyuRj+} zFVot7<>DH7Ij^+TXTKLE?ECG~`qr4(jQi>Hf$zoDK7ofjU%%bL^r9fj){hS<3H+o^ z@=YkErTZK8RJ~8VS8;FgHS@)3rR#0QGcLH? zqSSVN8P0EC2opelZuK#(Iq^@Rff;m0YQ{imG^d3NAQDznTVtiUVJeMTR9s6oZI2w+ z$nGq^X?X+H;3Y6epY)M=D_IlLnD$(`p_-8RI+p`YX6{lJkMhM{@KNL*D1Nv7w6(iJ z&TVxxj;}@jiO1@LC;US_+>szYwQu)R$M%))C8`>_4FZGFXM3=rR6*>BflX1elAk}F z;oIayL#_@$=G}P|onHM~VhtK{NoaHoFe-L)bzCeg z_wS^P2tO9^*;yr90am|B)ByHXhri3p%BtRVYjh+_X1Vpr$rZdW5%{vJOx@5hJui>x z<#|TuwY{yah}-tV?Q)RWOj9UdIpp=6$#0w=0=k zp64+|f3h%Si~AND?k{(tl?pA2lJh>Vy(A2>wX$Lcn!k=(e)BTS5D%!h@{p9&>*C;< zrKggT(z|zew1ILV-WCqKdwW0y3RN|=t4B`G&bP0Lh=`=G(f&Wc^!NM;tpBZ~yEVeJ z=n>qA)P=GSmq1PUA9G!b*X~NNJGpu5TCDk7_9!>%CfAD&BtMs65lP0qKd&Z-nn1gv zcgAvRY_*gpzJ17xD)jz2#w?>~IL=$1seb+$3<8Y-yV?RJB;F(q3=HTaU z@DLCZ@;As3bTQummJ%Hv{#dN9ukVVa!!;%%AaHeeuc@w{uLU7yDlLF~sWFM8v-TR0 z{ses9o!gmtTKf`E<7gUTcWpgAVKmngDuv$x=nm(vMWAL)0G0a||86w?{rlE7HdjUu zxB2~jW)wEsQrilT<@E6TU_BG_zM$sp@!=5iv?4vd-*R+@;6Dv&j)-|qJ#X)jv3%$v zS1hkT>n6xep%_TG78S8|JG!{=?0DawO-)R+FgMQ~qmDZM^5ss_y%?Xp*=osPB4Am( zl(aO}S@$;pl$>9MiL7l$TEKlAc%od>t`e{W78fSG1LTZOmqej`#vON)Yn z0@t84KOcGHUa5h4Kg&<1r_Y67y!i6AO^$=)3!zUk7(@LT%+Fim%qt(mxJNMi|y9=!hOAAL^`dPss0r4>hkgKrRS}*_f(tr zPx=3m1<2c5I9%Gs(sC1`0vuGON`rCBMCC8G=V^-gekgtnR2cQeznouKFu5w)xhgkU zbaKNlGI^Lt;2L=OS6iYa2&rYn@bK}oRP(3LsU1X7A6-G_+7poX&6VH_JS}e%u-*c{BO$asO(IR(kLSJ2Spo!$y2-X~irZ zYa`vzMK4dF@{8u|*{OFX!Kdq>&R_M(hT7vQzTEtgX7s>A|P-BAHW( z+O@Ni<^HUs5;|!&gvk3m^2*F+>di7q=$2rd^joK6t%b54jT69|$bVwZudw(5{RAj7 zHcsP7V@?i(uy7;b7co+qz-wc-)1AE$>w$&B!C|+&cTr%|jR*UK#wIOd2JN^^%E!;L z8e8aQPHD8J$`0p$LPrB6DS@Ip4p}%N*HZ}8Xu{6@a{~E2X3Q*tdCl6($6WH=CxuV$ zCMr_=HlN*a}l9RO+#LOD^+Z4SLg(yu1x+YUCI7i8R??{fzuR zEBhhZGqFiykJBz|el^*&vPSw)56kNHp+0S!MN~y5F9^EYPJ!r?Eu5g#K|WOdJPQVr zU2Y1g6E54NqFl)%3kw*WZ)BrN*Nj@AtKgh(B``}X1d?NmKPQMJ_RPIHYNo@9Wv8PE zh)jUG^)c3Y^38qF@ov^1(+dm`t_<`-^AK4j6)vhV=;^&9UgJbC$lV>tk@4~Jow*Bby25i&GScSyR(9BUwVnd7K%GV6F!MiXu39L=UG$~eM_oh@n% zI@y=_S`W`@MAF~>LUoX~$V1zj;pA^??A#n(P4+22Xc#Dm|Ma6?qm)2*Jf%gh!3Od+ z`M-jk4Flt|YWoL$k15y^=9wv|ls-0_ZY@0C5h5}9JL#v%b-o#7PX7W(OoD;+5hY&f>oFe1WF7-=ybK9TectMI>}w(xys(!> z<#VRcRPVQ%SxU;~VO3+O8Da}XDAYD2+F#W}){yM$iEnY;gui(u7+eM}j&GKeP|?wH zbe%wkqEVp)knbhWDrWTo&(bd39Wa?{Kv-gpn2B%g4%4uC$Ll)qHGW>FLvt~T+amJ0 z5=56JGi28L5Ue^V%mMix>rJwoM_NG*5NYCDAn*qZNBQ_d3cN=?G&&NSqB?gfa~^yb z@uu)WHoV~4NDHRZ(C)SsNgVAN6QgYz*J|6kB1%`DczuE|_a{SvL=o#W1^bxz(x4p+ z_L{SLksf4Q|9QC0#De#2`Y1K0u<(G1X`mK_~adXcp3;wCYdBddne zxm&{S0+CdV91!8xk+Yc=sUl``^Ye}KPxSE<52+8sR39xts%#Sb=8|X0q*)g0$e&Q@ zRk{_nui=5(M$OF9%oV(!*6pgi@enMpz^(FJ@raMjGxT$lb8t%H)Ra2nrh3D}9=PY|7Y)4RrP^`qdXTld^i^%)z7IQ}r@)&7OlU z#z)QkuZYrKm%H}l`0hm;0`&sXj{wu5rlw|XZ4JN!Oz5T1BFxCmhu61fWk#&ESXVFNuwX13r_V2wyQ1QRMa zR^`!EfD(}+qs5h0|MF+*WDE2tUqOz^xcbM8IxVlZBfLVUOc?7KacH3!cm-ZWN$k<} ztJQFI?k=WS?@2Im{b4&uOFB|nyJdQKhUYq>VZqr?qffIaP7Az5ma472pjiATmaqG> z-{pWGvJOn4;riKI65oA4rYSjGkG*=UT}$%QF`xbH*>LxLb9#+a5w94ocr69}xo@iN zPc>arbj>5EbMDCQ(rJPZqHteZUUv4-wy2|Xg2Uk0i|tU000_|F(htv2i__EqlVM5@LdFI>9|eta^uH{WQ0S2YM7aUkjI z&Tjb8-K%DSa<>I7yf7AasknT+4`Z<&iLehmHs6uYa7E<4{TgU62+Sf5L)AyG#y6DQ}V75#~yYtxf$sUnY=yBwqwNB4-G?bxy6C>B= zj(`LLt%w(2>;)g+>0Xl#v4wmKcqz>Q6$LG1BVIaduDYN4PxU8uFY$3>fW-e)(nMczuPxc)#)0i{lqi2 zPH+Efx9*`G>>Nn{1~IHvD*6HrIs8?6aqRROknJ@)bH54zx5ojw^5yvTSkL`}g-~7Y z#gEA6t3SH$XG}5tSRBhOyerKuyeeALpZZ!w!!&0L8R|#osV*H6m%$^G5~)P-KpWV| zP3{nn#h@dPe=XQXd|)_9T*+ee&cw4tBLi-uMd305k!6Py;g>((YKVFreQ6x?0ME-3Js&(?9hX4T)$Qbu<0I{sjSjQ)P2eiNl<+I zUVdV$vc&~Fg0`wy-;OueJgX0c&v*2e04A|ZlU+5%EK_hEa$%~@O#)K|{P``u2p?4~ zttlYb#{6vY2M1W$Y$xLv>AGwMRTRf6u@`T(^Ucigc!YNgvC42vYcQBW$;dppt+ETU zzodQBt-4}mktfkVvz!J^d3F`HvSXdGwFfWERc_Qfytm2#iw}nb%H}f8iA?5sZE;=1 z>)c(Ok!PhXxF#z*tME9#$cLXLcr;zsGU7ww(2JU0TW>zAs)F@)k6y%-$6K>j)WDu$ zYKw)>P@3zOZS0)TPwY&sg2;rFQ>vfMwS2;nMOE$Z(+5< z_ln07iz%!nE0dh!k|6&+r0GH1_HCe&jy$C)6i0r21x9vwswYpKiO|8)#YcHSQzJRX=@ zrp+zWoc?rfZ!ulJ3qusxq@tE*9LP_*=^%C7-ksQ#l(-6)w2K8$-bP~8tN>C!9?DwgeA=lnS{t`-@o-|9lG^mgo9p#fpUZBh zFDvG(xTU_qibaof5Y*pMECN;&)+*R)-qsGWZwr3Hgy0x%H5aPV*%F$;1f^uA@C@jS zp^U<-c~BytX^-`?+iigb4VSCc49A2&n!ocZ#Dba%3Ut*0FJ4!7Iz3V=^`#%amM$kd z{jIp#`IvEUZc8XyPe+g6kM{>zX7=%}Ae2PE_H5tf_$cqX8c{p66O+}|98B2UVh%TP zMC7j`!f7+_UE0~lR-4DyhgD^bOT#{xsK1!hkvwjMEFN>wKh$FPc0Cxz-x?q)Oi2C? zGiT0!SEOs);9VPfz`}EYY7Z8rF?t7d544TqEwtdk@0-O%d4B=ofoB-F97oTDXv?!6 z{`h?k{faP1{g0mo?y_KwPl{WQlIJUbG2G{BJRhGc@#Bu9;9vru`v~kc8N|@ zJn|&&g#Crw%^v`ha8OVbHuhz?w>G}rWNe2%mYF~PH2|#)tCEaVG*~&G`?l6TSQ97O z=Eq&H?7R*NVh>bC9x1%F2Iu%6VRIcS_|iZ4?c}Qq?nC0ELmzE&tc*cS(^b?5o2Gpl zi^hiON{V&t9z9W0xCXvquP3jych~R8tFi!(CoO4q4vL_;RR>v&)+S$re2>V(Hq@mQ`ACD|82b8J}C zZ8^z7{N;{8#`yyil5@| zFy`|-g*sf}hiIuFe2X2?;SU5M#iWKNT=rF}%BIMaO_mVCNwT{5jX|$EpX3pLorW^W z5Jk^Io4BJs`GJtRUVP-qI_4*~aP*1)`tioKXWf2(lDm=W+~lC3^!|Yrxq_qs`%_K# zl?ZG~M`frWr;+rH3f1gRQ z>BWhnF|hi=3M7hc$*JeO->AQR#cK9m;{*ur*@*bkzb_K>#S|v33b(BiBg~YQC-36t zlE0>ibI)1hZNvU#M%<4jW%jTdSe&+GC2frV@OJ5M?28mRyWp*v?3#{L>7;a(@%u{o z&8sr-D422Emm(aGtfm#BNvSMO?0y{Hp6Asn1?BK}558mpVKLPEoE_MYw5ZC~aSKHE zB_<*4XM_6NiR4iJGaxRCy8`d-i|7WYs~io|460JwDW;tr-v7Y`B9nT>XufrI)^N>Y z)@YL$y59cfOHt=qQ*I&u!tMf`G|^D0XcO-qE7V!^y;tG&y3ro+p^D2fV>FBRM{zUT zgcg_JF~$!mCS6T)Mk?QW8`}W3+Ozt@=-G+``Y_oclgfAg;{(%Hi5p{;42Cr#@k3=r zAmqqH359kt>o1z3=>m#6Ljr*l3K2Os2%tIQa{TJ)P049GKfoH#&l>KZjpl@6R_zL`0w|c$F^=)JKfB zmY7cq`wRI$V51=t4~TBvI9IdF>yWiXS4Q~jT+;8Cic}9+87An*OBMgV9xBrJ?Amplth-(7p>zr5n605B`ZzZO5f z1$sSrGlKtqk}<5C$<+(^!XE?zVM6~eXA{A|s%wC+)zr`cI3b|JH__}r;{-%YzP_Rn zKK@S^Y5!AOZVq(I+&IyHv*XhqXTof3VbVDO0r!7y9FS1SQ_Tm`Cf6MIfzcMg9d{s- z*CNiUNmd#A@-!f2o6#JfXKCV1ROt}RT$*3_tXNc3be9U5UGKXj{^*W`_INGl<#p(z zpld(KeSaV9Dp$^h8cqz6hr)w3*7k&|ni|r3U%r3;j;4_662ti0``7{Bckt#1-1DY z9_;et{B<>ObYgUJQd3)7TT6?7nEYQ?0;gK8f!$oHYHKUa*2oC{x%RNCx;pxOHn0Z( zk*n0rGjAS}k1-g&Z@ciE|eB57~0dVpM2aZ(XLB3F~ zzuN&3_Sj


zqJOT#uG`KN_2;;$g!yDB+= z@YVX)paQ3mXJdb(zp(%AoqzZK@7Mm*4I@DeF6#y%$^WPXy}%)zyuEX0>-{K!x=8ueyuI%sIF_X)N+C)FftMhgOfzH1y z?e9O6ofCalveum9x7XtLJ4W32cmH|%kQIOB(4b;M>=nu!kU+IHFemJ+VgW6C)y-3 zxEDB-iA7`lrixBQB+p}MUp70fuum*g%IhtK_%B4H9Qro1Hcpnanbot@4iE zSQXDF%=8tE*4)CL6y2=ru9=8s7%hZvb=rgCsXL8DwS>Or@wfUMu~p;;@CjU(j~kvQ z(hQ4KW7qXcp_Rnv6Jf+Nn{nL03p02la(Set%+7>4u3#STroE(l*`lm9(jLtW2m?D7 z(sHC;XUW()X@-=mW&{aW-)QsdTNqSRsN4QGq}uFH*}&jYQ>WeII&@oz zcUuLaucmO7!AHwk>cNZNG0}tY1=m3>O2(naQ-91^D0(y%mJ=3@IWvS`G+E57%{dgC zASNQNr^KT2Vw=ORr?Ab`los%ln_vp36m8)}#T)0nN}N4%6+`!QbGAg;lLAo0 zO~99puu|bwvWFyyT{>Rp!b-U}@^4q@y-R=nk!ez#C&mkx6)>aWw#!ICovX<1HS8|> zdTxUTbJApC^0Ho4aQ_U~*|fylFBcm{cWyhU-5Iy$|a?ZjfzS#{f-fSRb$}Q&#F3^KH5mrM9;ME%sYUAlsI}Uk)p_64g2~aj21c(mblw)I>~cP7l+Cy>Bh9$0BYR42B98$ zk0}!fxopV{LLo>VyUa7siE?%hvO1T+u4iLeV6bT999|5H1ADEsu8*`)on1Ics_Pnx;+W;AqNzCa)B9K@a;30wFapyL zLt@B3^wl-H6-KUw!l%EGXyxMu@F~rs>dcxBmTXBG;;WL%;au)+QN4q^OJd zNo0!dA_%N_0O41wE@Ol{a<1iqPxeImVp$ z?sJ3Qbx|$6_IgYMIZ+&LvGL1Kt-(7b43CxRFFc4Oy|iywry zY#k{dLEg##7Hk~88!Vz0?HitS(S^j6k`whsdM`Q>L6=Fvuvfo1`VY(_K<|sHWwJrC z#EH>{ZRO`8&jX&Xn5>fJl=rneG z4jZ32BYqGnu0h_sD&?@Y=zfmLqhr8ybui6(%j`Ej{P+;Pc8%FsgY+D*MtH+KWqKac z$EM4RHkRJep1&tzMZ@h=saC2%^bLtCitv8djY=|2nkPLoB#a8Q67IU&FM-B2r0&5? zrP0bZ5QT^F59*An0Mp7eQ${%~TqgU4&lVU^1fm6%=bR#n?qsHjr5c+H9hmZr3}+hR zHf`skOJo!(Bg#~u+i29Ar6Mva?&RVEgSMd|o+AhgS5oa3$|3KAz-x~DibP695)au| zyFUjz?F?SH>)DGtCGL!78J-zNGs^&(bkV)a)t^xBAImBFq^B0zUPWSCl7RS+s4Cs1 z+5Qqgv>#ukJj9Q9HJp@;jt+xKMLAr2n}K5`2br2X5q=f(VBOrD|CpR^YA$F+BQpQn zcTIBx-qq|N6fD#6g7F1o50O9ov=wag1P`!lV*C{lKvoL?a^cU8N+lfT88HN5&qd8exRkl;JonNFx@rGN#)6} z!~mtZLyvKFqB#Ox&)-*qU6^iH_dz~&^C$+HCTTmj=zhv%=cmf@K0m`Pve^=QUcv`n zwo@C~C?QXb`k*Ea0HP@!_(4cqlYZWKxs;i0wgv7@Ier#>D6xDvimjv@JmGbdnVaUi+p3*a{IS6fl=C?Arsb$sXJtmbN$$HT>jpVn# zg-KASnj_AWY~as?Zv%E`?)J}kMq8oa-XV!)Cq?jx77d-f(2g+X^Tv4d{`I6-QbpIm zKp8aZ7eVZG+`;CZ8Q&;hVx)?0ZU1cv5~o4%h_Ol#b~0Lb`3<0`c~cbCJf_i@v7v(j zMOLMYC(UHG2pTw<_2w~*{gPT?euK{j+U0TtxeBZ?si7_bjRCL&hOCj~7X*-E>;Y!8 zXE!#=QXp6TjKnl|r-KVqdKXFOVYg0ma6lLy|Le&G=RSZR5pf7iZ_DR97n{=^(-$4T z>X;nnyI#D9?p1UQ&eC%~wMd2=g zxa4(u%(}{W^L$J*lZ=-aAoBtCeY+OA4IJY8ZcFArVjW!7i*V%X> z(-$f2jChTIz5&71n)OPVdKEiAZXPh31cQ=q#e*^kjBq1l>vm|LjdewZD;8iXF8?wT zc*_xDDx-q0N^whM1=S5nFJ2`&hVJ+!KA{!5cvp|x*}?dNxob^NA3qfkDNnbf>vg$z z8+WOjk-fNmaN!Ho8ZfF}cm8gpQyF8Wm#vk`I3Ye^kxD}1_h?qR`dqAbpi9Zva zA=Z0w>$?a7)isPOU?h*1VG^U;2G|5$kY2f0$8ji2*ERRy&Pt3Y3c4$HVzBzMGP0kd zkpp+yONyCQg$0O4);km|t~+f(AIyev^3L!_!MD6b=x+2WJCg=V?Q@|y?1~SL=I<`67ZGj?7tjFb+RzJ>{! ztPrNDb#~-6xgjX1m{9!2yT(LW9NfYGRfyFd(Bxy^Y^K$CvsMw z>*+w1EK{rCrxrc{)<)U{Ugx@i6KQC@aJzaHI}W|u0{BFt2$Nh|C6V1r>E7>Z&4Tb_ zuPeLu()GUBX71MS)~$(q))umz6MWNXQD$p=e57w-_g2OZejo9s!TWEel80@W?~pSa zh;qUEK1Hf7R3*}pkd?T-(GV%>N8V-9hBQiJy zSIA8~@-R-g2_6mt^uHjk>iVDFXwNb4L{;bc)*2pYeJ>lY#$7(jV$*l}?F}GtJPZ&A z^p_two`s45E)WPd7AJyiiij6BP2K2~`C3Q#y*3yiV|}F#jZ2^|Uj3SaW75Vmd^<*j zyUPjJu05N`?u>7}Z{8pG3Q`>n<+|mAXEV11J$QZ%S<6_>RzMCpg(N1KUD^onK@&!v zZ-@W)PjPFI%AFO)5R0xcAZ6Wh=x7f*Il?2*nS{|wJJ2lgn>GhF)rK7k>&GY@VeF zk?=DmVE>?{OWX<;_&)$TOCN`e8@^KuppiU8aQ`do2Lh=az~)q+tVG&Vs+O48Y_F7*Ud)Z!Pr;3mdOJ0#A!7EXr z!=Jv>W9Pm5VcVr5KX41O_rufx_`@^R+djyunp>Q7k&WA;0%N~$5LmVG6y6-=hLAnGd6>^J$u?*_5*XLlbp}Dk&R!dbXvbnnBrH zRSd?44e))|TR_;H+CWE2g}fm2Y&Y{&6JxG}leVDhYF(%JjtMDL<-su+8lRt^R9l|< z9D%#zafAB6Jw$;g+VtnGkYi{Cp&i9E!R%7iX4wXs+V5QSdAkY0#Pl3yK zJ>Tg~$cjauzbd)QF19k^0$)8rcX3~F!3^ZJ>|HxMqcC*R45_t*zUx??XX0vSPqDHy zrV^@n%mLif(@ID@I76lQgsC#X=JRp`r@bE+5Wcw#FegSr*BWoWuK~(MA9E zRfatvZvFGPrJZ_*i9aMQBw<_u?Y#EeubtZ?_Qgd!$i_^Fp zNWI^@L0f)Y0gb`Hhje~6Mpy7LV9s^nWt(MFEjG7C3k^^|0jp9h%>JxrlGSiest+3Y~yBp`S@*m-Q`ye@?!*v!!0xsgN z2|2;rrQ$#ASWNfB)B(5s9Ek~2uvEAGWNC_OOOXJ)Co<0`T#Gq5NHgtVzoFl7odQ~> zJq95`L`_Rjqnoo6xiEbMWKT#qjsp>DrhItb&Ji|$8{eX9+H?u7nBuHevTIfLn(D2h z#m>s0QmjSi@VdQ6`|(HBMtFPt2EWY?4qgqCUSYTAuy)G6%K){u)5D!Va!Vr(ivbql z_1YfA^#<($5FP6K#8`2JhhokzFfBGu&J78b&+cWLQk$AYED$Elf7|b)g$gcuhRn;$ zfpi`}c$BA~**e@FU^10@lniO*dHGz-?zrN_6UnOqxxQs52g}Ga{{|2lx%)1Op4-`O z-4`?^-0`UuL{3McKzQObB4*nqbrX1*^>-MQ05H3E|MNYM#}*sp)u&BHpjag^Fm3D4 zS~=gG;YZ97&ALu%nU|{rF@U&>xVlb{PRejgA&mxRzWT4g2%ygP8mSz+UacI^SowmF zOj3|R@Bn@x04vxv1YVW&p#d-m*axL)xV6vMiSX96L{zY?D^*R;*1_J>tp@J(CId@^ z24G9QXdB31o2T>*D=3oA<`@fk$RwYsQZnNMxtorclBxvy`eKA;h6hc z)KU~dIW%gVxwmOI*eeSJ0=pICil;{Ug@5rR_I`HI>Ig}G;p?f-fD8fia(##qHUx}2 zK&CMh)0GW6O@bryujU$Fd5cI3SttH+kD0bWoJR%K1994xNg~~GLSQAEXdJ(Bc4Dsy zf9hF0AG&|RMwU-<7Qv{vMBMajoM?%K0!haS07on=Lgl}@18MbHgJ5C3esjZdM`Las z1HV|qSpVWMarfUO=K0~K2U7aZcXg7ZSKxrB`V52Z^>Jsr(Jpc#HLy>~ zpeg^d6YD*(5P(N;#%m<=NEu|=^=mqLUh1BP`!OGhM;Y7An^b$ig|Js&GrCtXzx^zjeB`G5Ni!<87p_uQjpQ56?9oUF_S4>q9{3Ts2=mrDU=CI ze(9@yYV_cZ*Np&-0%9o~&a(^>J-ODHyC>`>=y@2l4I_Bt2J{wV^U?D}{*;Qh2SWug6xPuxKEF8ZKBZ&|Bg|Ope+6a0scH zcedsomXiBw)$BUO$2P``^^7Qo_evM^&S{e>Ej^2M-8z-hGcV<`Z>>R|N&@_G2q}YJ zwH0ECAo1i?-XlaI>HMyfG-NT9C~`C!&Aod z^&rQJp>nmh!31>I24m)h{I+VE6=sp~ub0sQK?ZeBki*_nUYn`tc=aOndV{V(CGpjt zz@ILt~qKp{SVztZ=w^?tA7dPUG zh*PH5fG#qt&;VK$z0=vd!1i5T2EN3SqwliMX&B0Ty6no0Ml5h zwSRI^s5GEkomiv~SwXq|Sz69IrxOL{s&;M?64>mpKwk>yC8+1lGUb!vHB5zBA0P6} zJDI~2nJ-tH>igDA$lDy9sBTmW#@5-0J&la^+|D!l?yz9RY@&~%WjAOp*RMa~o-fj_ zm7=V)8}dVA2lqx`BQY9)ZKDj=dcS+LF%d!~Muipc7%m@jUov_{$c8@k^wV8HV zy67$^`$o>n7}@L!n`B}$3>wfat8$+Qc8KLq<@5|14JJ+(Sj>TCR9jCmtNeTc$V0%@ za1Db=lNa3+a!ojEF&`sZ{oPl)w>yW5hYg|7r7@VkIOefR#Aj;0!Ca6i4<@lx*|@jg zvlEo8s9!fyZ*$&oO5Ly5qzbNbKe8XGsP2CkYtdiscBs}_hbs-3%lUFS{v%8wkZ0k3 z`r$(O74bQ>K$U7vZ}rZ&9W3*>Y6gGMpwZ&VfzcvH;|RJd?7BCy(@W#MI)cW;V{E4K zYfUF`WQKmcX$Q;nmse_~U@pCTRCCyfGL8towb*U2>_pdpoXfTX?as&JUW&;_y+Sr? zz(&n_qcDD9k{eQJ%%VZ_4yS2H61Q0&da__(^Ds6r+umZ4bM^Da8m8fNdq}V8`NaK< zWQ@&tk=b=?-$kHN&l!D}LXm#X_7`Rzco$$l;H>IJi$9`wK`)I&HRs$;l3v^K{acWe zfz;g!WfR!yf$`RYI(mM41g*86$enMIWKy$B=_mOsFU3s+IB^VQWBdGII6riB!K_n- z=)!iaW%W1QCJccQVZuNbt7g833#%3%BqNP-)79G<<-Uh0yGUDd;fBF-eXgSkR zd?<+<7#@n~_YCd9l->tqzGQ1~J?St%pJkEJxd@)BRKldxu={cJV$6CI=1tuCPrP=9 z1ko6jo6RaG-Z6cbB9I3IJS)Xwa7E)`Un%r@qH%G|!u&D66;&6Y%HIYyXgIY%fWuRKYVG^>TjNlWmEWgcgjDEDy*~Op4$9!>SrlabXiw8_ zmfw2L6dj|{85@10X~8~IRXTvZ2V7p~ji1FJ*dkMDIX#l#(L7rF0xuiRch#zO!;yWO z!pO%hcO6l4)fp+Zzf`Ngzw=7gEJ|x?l3X>kLnqct=Vq?_ky9@=G;qHaH!$6TP%dr3 zX3@%*MME_H@~3Mw70%a_&hTDDnSjq>r>_ZFI;WX=PH%il?Zx#0v*axCS0C4|wk(xc zha5_F-Eu{o_jG6XLp-aIMhOHof|?DWF>~=(`YoC>F=L4iwRVg7*45j9M`8k`7knc< zsIbS1PeCjyk;UM$c2SQ`$WwyysoIA~L*Gzx*0cU&3>3)23P0Q^nJ?5SbO-t@&!6Sn zB`zJF!KSv5gr}ws$$SmK4bzu{VwpR&`z7l2vIS#Ta*U-ag_E0j7=&-+I<%S%oh|u2 z9fKiX$28+c*6t0@I2M;PY2?Z$vm0P`&(EU@Gzt|`ns1)-;0F0%2F0ISA==1t)rML# z=}Yy*Il+%<9w0YQ;4t2FA7KH}BdCbf8`BsiZ4{z-HjYh4*7K)CyL4KUhfC+2)I`Bl z($%<5P!!IMXO5m^N}F65SUf2v&R2xEiaTG%9DcF-mSs`;`f4lDbpTVrrG*eeiJErA z9vIcQOwp#dahWhF#-pI76JAV+2NOoGvHaE`fFWBVe`2z?X1BIRW9>z%xJ*W6vAR+? zx3fvUd&Oy3(J)u$attC4ldt9jjMmkl7?9CU^bYLkHnB6fRwZ;fB#bp46f@4nrxCf0 zpyqF9QqL^_V+U)Ns<fH zpAtk6aUw52D`}_RaocL>6x$_v$RI9ua6j7I{>eH;`coS1N%PA+Y@Iy$TfLRt-_7Jq znR473iE`u;4I8`yDwTe1b5Q&RpNz)NXhjyvRAK=jxGU`O_B4D1>qz`_;>s20GBC`5 zjV@NLo=p$vQfubD^X3&G6)2y_9VwkBg1ojT0y0A%SKs#0Tg+A=)JuGj3B|BvcA4)$ z3?kBX<{JzEQjf#j@S`lP_x*>*Q(%Yr8ufhDw8k?5$aTxM-o3xDsZBuWVmkxtlvaU$ z{bK90c9}@6$Bb#CIXk?Tb*`s46Sd0Jz-p;t+sy{XFUX*!K|^9 z_9@{QDKI!2!Y-$SMV_JIz8=$?PK{@Dyv=W3d=7g9_?o{XXTYca6Jh_af0#Tm>Iq2- ziW8?b^iR$jCduRPNR*YCSrCX*X+Kl0A>bofYaK8CIU@vrj|07j#lZ;SAVt%!jQ<^? zdfv51zA!q$I{0*SPMVRlOOlIDz{2|cdd#yvm?6Vmp~m@NrxKHPA7uZ1>VMy;^>5qEuMrDvzg z-7fZ72IB~zU3)_ZhfF@TV_{;Uf zJLw@2)sg|N6nN65a3wqok1_n zqT^=n-Qb#LbGt^%1{S%-4k^v^0^Un0O65kY!Vx*PTstAP9B^gB!0a!yKb8mMU!4<4 z!|>}L#ybXl*9-YA)MDx$@KP*_NL;gsn4kzB_HMa75n*oLubP?})K`zal%(N5O z93Uvi3R!_ ziR{?kVTMoXp>{I{RHY{yhGYpklwzadMz&_J8cCCREb>RPr8e5e;>f{^m!*+n94wIx z0Ln=Ct6%cRn3gLiHNNzOWcd6!zB|=xx1H*bX8k3?(SXvhsFc@yasPnmeanE!lQ+cY zGdQV~6&$qa_-$}koF$c^55^iPT2`i@@7t^4PI&~m_;Ab~kU(3bMq4)}WIqh(D>+)$ z{5grK$)>S7{e;>%!Ak)Iv4#<>T zqi!Sq6WQfm55SXEnKR8hxzZU2CD%IwN(KB!5VhW^;Uq~YY+(2&-+d+#<)>B~C$Y8r zO$3+fn|m3O`(W4V-e>`XygPpUMGE$c>)zYj8#uT#VZ_1%%;Tfc0Cl_$fA$gLB%%-L z;QBjuA%#^7KJBM4;2W>WW%aK6cf!f^F{IKY_Vy9dy>z-WlHSg5SrpgXzL+Z%zdsjRt%Ipn@hDdb?CoszPHa>%}aS zBG<@uhMnque8qCkc8cVc4D`F+$tn!_id}qIPVjrZi@xsZa z8WZYRSC#HlZHL~a1HIwW)A-N#St3wvd1+G){v0?Et&?M@PtA534xNGA&$#R1z_k+rj-`&P9drin>XjMNz-#V0E&F-)I>( z9vXWaT4-76B}i}Hs7XdBxKt%fifq?1+p^o*B;Bx*$A(aV;_@yF^z(BV28qZG|HVHa zg_JD?t_3_W6?MlZ+8;m zA-`3vF%c^FZB{J}i5sy17ymRgK3%M=u+2N89>%#lCRSnS85qC1+3j6x*0pbDNlSVW z=DvEpTejL{@Q`M8dRS#i1aOEs4DuqJ*1Fo73!G|Gw>&-Kui!Wo=$v2{+#qB$ac78t65a4G9 zC6M7%=_x?~4HWPWJ^S~><40rqmwNgM(V>=TKiZvJBp zTU|~NO7uiwvg~7`m~VF3XYllzo}#w$PyEQ}l|&P&C~u%! z|Jq;=vD|Iuz1&-Hpqfzy>i|>ylo6OBR!r6JuS;8&K{HY_yb+QH%iXkz0hW$ICP8eN zWTGhdXtKAUQQjxTlud(0LEXn@7Dwh<&)GnMIgLI3IocS&E^*9D(2_4&+-Sq0C$%-O zE#ZS-6BlxR7E~+kl!;M5k-oCR^~yl#Qm|HpNpc=w5EAs5#5IYMlzhHz9L}%CGRFvJ zU9cp71u((Jq=6;uFuxUkD%{L(AWJLFs}=)8AI!`!#FfadJ1Twz2j&sued$G3m@9ls znkQf;v@2NMIA19czl_W&0d@v&*%inbk|@sZX#TaFrPZW~G`I zcG{b_Z(z|as%Z4p%4VIsU2C4(s0ygy^BH;#q?4mZ8as}6Q-8widB)S@E0%XB7WKff z;8IJ4Knu&b5n6IgeQq}4)KTs!Eq(GiC7eJFC(iLhZ?BZJ3xe*;&I1(Pq|`>Aj7}2~ zQn8T%qW^yxeSlWV3pe)zRV1BE(1U{}+*r823iE0x;;bTI@+OMabx{i*Xt<*Yx6 zuTXaVDUogz98^k}rl@7bBLAZgv?=vgI1mRsT}Oaz9aL?oQP+XJk}r*XLX6X@y+wde zSU0GbO}_PkUWA>xK8*U*>uQe9ggG_zOc2(@oSOzB5Zj91c1E+jmxHR^%d1>;>I<6Q zo=JTIDky{sZG2VL!!~m{?`3ItkT7`sps|I0-zRnLlTS6{Q|E<8m^-v^uooNFB0-#` z-iu5RaoW)c`+>q2GzFa@ho6Sz%dCw<-$w|-NC68Yy)y5V=<@TA@|tW|Rmqf}yR0|H zjv)cJt<$rAuvM>1+4nff49n0o`d2=>U>?q`kraE1?9^$X^nze?noGg2q=gvs{#-K8yk*xpZ)fD#Y6tivMCwmCPhQB}g?;5=QhsJGWS-athUss|; zpO!9(zWuAl=r1xX4I20?!rX6v1r707a|Yv&(+_idI~9gThS9<|9^iz}?kt~%7Eq)D zo)ZiXU>il%eCYUsxWf>09R_OAd<`Em^atFfza$*!&lqh>s`{5N@BncIx&kgEu8WAu(?Mm)0ivc= z%cznjKH&UC9v})Bz6$a>vB+Wi@El2VUjmm_l_cOHhf=A6*6Po!%E{BUfO zS1>`aJjGs-MXas+r_?p2A@70s6dPjFaGOKIYyCa7j3HpWb+@r@zPWl~8I1z%Sx zz3{u#I=b6Rhz0WEnh(Er3T$(8xG03~_nC2TW@K1CGXKTQ>Bi>gn$=sk&?}pkh8FED z6qD4-?R$*Nd=nxRgc8Yz8rzCNGwOLDO5RDcw9W+|9I3RMr1KyF`IeQ(6Fv3+GRJBV z)t}sr1bh1Gq%?j5X0N0n^d7E##;%C=)xmNM;ygfb%bZg=MFv}+XYROqJ^Pi7FDiVO&)yvaj(_-K=53_pCo~Jc}~0s zHd&ECbDe47U!zm$8$?sl zv&fC~Kz_-pl|R$#pUj#_5$y!->^(M4)Fm?TqWcHZw-x!zCnQ5R+ z3Uvsb9qa(ulv!niRXHuPE#KlS2(l;d1W+rY7W-y%XmCPabMGRapLj(%EcT}4_>S*^ zB;C1Vo`f%EXA2*`e>Z||?blWg8=iUfn$OOu4QS&UN zVqUa~s2&gJxK~5*5EPI>Nr1p1djK9|(&)spkmdI5mCQvz9>)qY*2XxKt9_?AA5g|c zK;{~FUaf)`5kY}WDvfUIN%OqSMV2Lt06IK0XnUgZ#c#ECT>Y_H;Y`iK8Zk}4AUnr| zcUi<7%(nlFTl%+WObd1cRmE_I?C$PVrH-L-YLBs+v093F?*ke<%_or69w{`d-mLPb z|0rGz6oVJLdI9mvz>`6H=A*p=$O#d)^a+-4bP4^<5%`k_3>)tMrGg&&kb&ZHG`1ni z2ZV3wIPZfRTmB(<2IH2ANT)EnA6K(jrJU*reFApxlMugRtxhEDx_DCjCsSX$lOws{ z(-ThkS4(9EH>$0OKTl{`Vp!AC%zX8cO1{oa3TjB(5#PpJbn3!E7bUq+AcnK z@>@TD8WX2%Xoai84bZ{9d+G!mWeNi)YCIeY0Y#Q=>L7U3g+m&G`*gZiU^0QEppjoM3^pYg}KdpozQPi_MFgNsXS{-(%!_ zmcBZGbcEr%l*ZtI!}#}mnSeDQXo3HPIFJq8`|iDY863flzeXTrQ6AJ)cm$@+7{MEC z78L#W4&I_h)ql!-`qKGqlx#b=EToR(1G*w6J9HA{f`1OR364VR>~fB=-vznkl>mdzT^%wqx9p&qyOnF4a?20VaQo>0faCw;Im{_#~ax3`{0%GdS>q zT0xW28S7Kd@-OdrH3ISQYh%c4c1kRL!-J31MJWwAJ=Ug+sP9~G)78FC4P~3%d=LH? zao<75=C5My-~|rWfZ4+%0tO8My@d1py@Ku9iN=cs-^YCxa}7$;L2ly)?dg)9CfVKd z-~qTG0gZ-hWo8E24NnV`<$OkpM?KLm8S*`DzL5O4oGnV3#Unn1`@zfqF`R>t4dDH)C2rB@~&;OnRSTFwHz`^H1zft9(ce76C5cNf7^*h>hQTOcFkO=8RMJ{#Qkx390d}v(4cw z`^bM*_k(Kuzb9SuzZ^Hh2tNraE7ht1<7u|}n3Abdc+ww1ADD}$eoEh0HJ{+kBPTl2 zA93}Sll-3yJQaoxg)LcY)IV%}e0=w_-sw>*=>h}gVK!1Sq4Cu|ern8xm~auDLb z2l>Ww3J8FiDx>GYKSX!|W&!K%>g`raO^bq638zO}T;_JDUG0`gDqt)fdk&?rcCZNw zxCAKbfXQ282_^W4l{&d(V74QVO^1znyZn7xoSK3#A8HIEjfW_%5jx8>b?U?vCOD-duN|8xz+OD)ED;^|hU;GOYVvDq6K zKYs7|_15zah0ypt;c~+xC=*@s4?VNV+_n%9zmBTnN+rrLR&)w z3r6;IWaw@{RY|o+^k6*BE???8a{ZfEdY07yNEE>Mitb7`H$|CrkHfYwXRF=|ev(tq zNG;oq{wOJefpfb~ESER(i$LMOteqx6n0x65WjiBT36?@5t-OQW1G*OI-=Q(-ikYKt zvKEZlbxF8CeE-74U(>EMQle+{GXv!oT5>?1!z;oAA!u2V3Hpgaf}y>|1t6T#nXqCt z$ZZ5VlL{^!SsXH4cU;(HZB?q+K~i~g=s-Z)dZ%czut)7J66B%I6#!{KM~OU-1Pa6s z^+)hWGFc%yrcLXa;k!Tb!2F^7?g_8jN7Xjjle*X({GfE&mwH2l7)I!?6+iF)QaN16>iupa zvU%RWz&Zm$CW6(f9u6qJf@jQUbWh=(vbPjG*M0)QMcO48d54jwAS7onc019c?Ds1WWp;rbXfIhe4RD| zokVCnS4QZs!u+vdtMwPpQXXJcgd<_iX5c3U`Z3SXFX};Kb3ZF!L!=Uk@-8R5!_aOS zuw+hmbblYYxDyEz4Ge$cY@- z5oLR)nfX-OG{!vu$I-1nUvVK)Nh!&Y3T*k|i^{Ul^re)1T6kCT zlAA3V<0DfC5(8!SDC;u)Es(kpXyw_7g!-+Pm#Eu!?)k6Wl#qr>vsdryA3@hQ24YsW zo5+hnV8v8+4wwi8a(&{ewLB3{WN64p1`PSWtV1s|@CYP6LHr^f~32*G)hQ}K20omd3ubmQhy~!o_(p$=_H*0ne4MyL)d@{_Rlmv0i%BB;o z2^?w}C^RcKDcqm_RjC$Z6SCcAoQDyzzz5tJA-j*zwIh3IcdLT6l?oqp62Di??zE>pV^a+^&g6IH!faa#XqIOK>gF7QjNA|Di7T`=Jc9VbHf>oNA&y07a& zsA0!w;S&WFdygN%#$;eN3Jr!T$qOl#*|5VD%b@2ru|j4tP&}fygytVv=Aw_h14pm; z@BoCwQpsTj>AYS*p#1$JfHlXN22BYJt1oZW>SaDW+LK}f7Zb631hM;mRE$ge3aAN9 zk-CY1QRj!el9>HW{XJySddWH)$O7hW934Sf%|U6091~r512xE^#>K%Pzpbp~y`2gY zlCJzmh^Y_foes&^!4;rTx8OBz$ zapWBr9A5zAt@U6y*<(jT?fpgse5Tgy8vih9ucH~{aEA|)|3_PT00FVFZ_KPH5m+K(m-KLk3=5UjUMv0zg~&stjHr6 zgbeNjt_`au8z&f$f5POpakU40;7LP|`(-`Y!h*(P1GL#O*wCy{?wVgGTyXK{y-XVQ zJZ5D$^Br^w<>Pkr}j2@rF{MX9`C;wp{(Ql`|_WrPV*m|w#JBFdgXy)j5$rBvJO z_huu1e=J%F>zQmCTTfjVT}wIz7&kyqKzDvIb{BMD#fHor zNTI146-#)a{T3eSEN?fBfUXx;D6w`^bhD1Z$tI}=loarA_dr(-o@{pUo*7BSuSz;P z&k(3Uslf=EuI6ZyB0BulTT3Pj-N0-F7dYXhK}n`CH3k65eIL#1G7oG$lAr=u|S7UMFDBLk>cSoZt&IVI`RM1{6 zOci=CK6nIVpqq}%9v-zL{b0lfOtlcGN$4TM0}gxY3#y6Bz}Bb=WzSS*a_QrsKfmiw zXN&J@SqEt1;tqOF#T`s!dXNSauo@lf$R{)-g}L>n$^367sd(y2|`@;keIfdW%z1s(AKXNear)Mfbb@ z7O3Vxsf)=oKPB_KCg9tOH$d!}D|D~z#o9*n!h^KlQ>XSM^YM=WjOgton<>{IDyKDx zs#Ht>#2UxU)W>$}`_b|h$`9o}a_Ah36kXW!ANdK5BUjlGzk6iLGCOGW>IJcsxM&!9VAc?yo^I;>Y+;6<$Ty=xOJM&m0?TQ-;_V< zN>4gt&HtAZ%w#t0GVJ3!ZSVFFG=>KW70(tZ((okyu1LX8N@EWD*d#dyV=ldSEJYA( zinH5fao8ubDva#Yq4`E}Zlauhx+ZN`f9A<{hp>{X3AUq(7;mWS zOa^U?GfT$3YXBu_0aMS~p%I+cuzfhl4W2um9s`!akoi5WI3hW<={~2d?POcy$UBt- z2W-Qw6lBNh5y;GbRxSEi2pF7vp$@>-FuGetZeBb{t6N^_Md*wNcKMRT3(ZcH+j|`Q zVPngJXGMuIXEQ0m75TeX@87Tiur%+#>}?V>B;cIUqv>mKRW5`b?kgn$)!J5$%tDJKHZH*YM?q;6?D14uv7 zjY#k@iZcK2Ch`Alb^ZenMzr@@H^@6J6Y(6=eA+1~o%N}TJ}pUZ3LnY4IYPj#d*EJO z^V&H~@IYM0)M^kSCJEMcN4HUtl+73oaJMD=*F)zK??MfTSy$5lhsS)_;ARs*ShrL+ zjsDpFi21DiG30Y+FYnCEd_AVf1uY3DItBkuh-a?GD4p#HK7b=#i0S@TY#zX_Zgs`+w zv3oUsTLL6xVPmUjq?o895P9w1D=1LqSoHvsS!Af=Ocuxw;wX~*w-l}gk9fDFHrujQ zZOOs;r09EQRr*{=?)A2im5+lCJEaL-nU3+U8iC9 zFolJ3ah@9kJ&>G@JnA?*WYfv(ThF3;+pPxUwumIp=TkT#!1??-C~m;VH4?CZZkpoo ztRPu5`xQ{Ds#bn@p)fe5#u$=_3#(ZlME5Vnm?Dq4Z+&WXu-Fu8ZtOH^<8E5 z;3~6%kyz9n!$KhwD(~z;jle{*Xf^7|!;$C`(KB}Wv*(_yKKRS?bivVoA0B)XIeI|^z>P6-?JhntKdXT?TbvH8{loFvSQD&^Sg2>=Uth8&)*4cPH%rV313t5!4#39S!Q$c3-h)tJ-GiBclm zOq3LuA^fF<7h(N5+vOOT{b5CtgWh?GpaPT&q744 zjDF}dy12N2*I~OQq@-AZSzVi(dt^zN^-vbuMDgGOLQXKK2p`*4>+1SE3xAJ|Ey-D1 zD!a!jli(k=$B6667W$o1ubci8TZbqV?K=jNwq~5CDr&3RM@F=Ji$I>hyv|$2_h%0P zgxfzmK-`FOB0-n86sAKc*foN_J`9Dx^<(ls6;1l@K(6J3ebxd`mgIZETlM0Oh$}SR zg5~l$#g@_$NmVqF+I`NU-7yg5qtF-K>mb^_o}vG)RI${UV`W%bVZkFa`sjcJ}w@fe)cX-ko2*Ran{yPqJ$~w$3Ehp+B07g z?tv~7SI#%dUkg^XsCqUXyIeH!JE5RuL+h%3S}Vl+Rv9=)@pT2??J}FBv?^C@`ocEs zB+FW1?2k0XoGp1RfSxKcR$SDjiBs-)cK71e%T}fK=jhbdw#t@%gOy6VVp=F+W;=&# zrRIsm;>}OmQj2pF=ZXN-7kZBE^rG=)X4BEErkEH%4??66qT$oQDsYc)5Ce2fOqkop zfh~kT+e~Iuhj<27EJX^19FT7yUcLgWSmUl1(^i-MK9r+w)aOi+SXoTi=YAITe0>udUKC0uC?6YI_)Bk3%)IW^{`t9bxdN`5V;xzYa@;n<6w_L z_b=2hsZF+5J8J#QJxK2&mSn53O1abDalp(r7wS>R0($8fjWPxsc{iG+n)v%80fI}`kn#neJc)kX*`aQtlW@|yRE0M%{#bEJ}T@7ZIM;T!3eWqiCO*A z^algLQga1`Il#3cNBX${wT?B&1m<+d{g(2F2Z&{N2fm$}Q3OdRTxL>;?6>vKEkqKg zO#C&{TO5QMNrDk_4tA7Yf(IPCIAWw)ywti-JRNr=)LIToA>}Kbt~b$P4a*Zx`}d@r z{CSFIYKt|%j1_xf)5Ook0Ls+gH{Zr3t{ODwux2Vb>P#B+onbmoNQRq3JCWDh=KJ)C zdE@agdjV=DYsLbPU>?1IES`Q|OL(aghH692+HgP6Mm9s7FWk!kT}KwwED5rtd5|CO zl7#1|-lp53rdjLjEOPwuEbLQSe;RT0H%ks^|533%@v?584geixuFuGOFF}#~KJQ^F z68@*wUb3`WuNRc=$b16+6MBLG?Qz`euq?y{&2ZQe6{IJg-=W#ApuwVgBVH5%-@^0t znBz~pJtNFTbFe^^gGlMrNz1|&Zz{o+*>7n-cOIVVV5Kb*!vB!#tG-ol6VVjyBu)zT zKhyw#Zyv}4k6NbCz2xrJGCbYM>z{VUGHx^ZW~h+@n13cFZfNgW8#FQX*jGJ~%yo?^ zOX}$02}>%T?&ZxZIii-Fa>2>AxI{SvDD|DBb@FxyiIOg+B{drW>l=MrN0egg$-#?` zwFlSlE+%CVFEjnV2D;*DVnu)kJ%T`r9GH@FANbg1#8HpmWC+}>NHz{W@DkN6oxN2u zydsMEVOiy-^OV23IOdKC&U}j@$~R!uGxF72Dq0S)J3WGK+7H{Gw8riKKJ1jx&T9HJ zR0g0L!DAm2qTmmAsOgBucIcEz+Tqb~N|o=T)0=&@8eqLIWDBBO58KL4DUf#en8~Ll z0oVtp=6>)Pu{vI3!>t-4WTZ-N4BToO!p*lqz1{j8QQM?gdL-yvwQrFJ+M$SyTFD)i z4s?a{bg{Zr&J&51tZ_ZvK;JF-Ua+eE$gb`9jV}pGmk}Ic&Z`l(M!JuYWH>z8jmqgZ zzkDUB0yGF3q<7EyO0RgIfC&=S+m}q6f-@>BrAS?*Nx8&%t^f+UyEePx~Y9k(eo; zQ-iLfMSW0QRrbTYfwxr5){S0jn(Ho~KczI?;ODD7_yz!0r?w`<95~IP13MgWbeS9^ zOUsbkRaoBj`hmUn%r_w_O>{Kx`$m58P2;F#mt&9FYC!Y$MvedXi1O+rHtQzlM=vVye>uMt-4Cn(TKOU`WE2c{f6O-7w8UZCW`4~ z!{W9ZL8qKIlkDFNs?qJnnS~?7EZ5`HpdcFufEV({`P>$rhJzU$iJ#o9!mkM*C%U}m zMHWTb4UEZb9Rw6wOMp3CRv~y6NKkf_CZ|QYe+pR7P0J=Ge-jsjpVNyouXOToh^zJ* zT;^6KB|Z0vkwIGTOUpv!UxQ zQHu@sSY73?n3&{g#T@jPkgy2$Y0xfs>)itz1@wWoA{&Qb(JiKBi%5_);`-^)NYdV( z3QCmrSV}Sx8gj#bqZKa{3#geVEyR!hTImsJ&84tpg*zu||v9+VjQSy@su zirk7jGg0Q`!_;XD{$W|CIWADnl&lS-e0M-X{9H6!vWqv)!AJU z8=KRD#Io@FP@*+0c;{QHqDzYlj@1#1FKh#E5o-#ikTWyIuY)#gW_>El^UL?+GIlxd zYa;rYe)ZMhc6BI{adVPbfCaX;y!qA|>>)4|d2>k=HMSJvavAO9W7l%@Yx4CwT2UA5 z4St0!>yCA)MPl0qf~@+t?xMOTG?x2h5R|nIL7j)~IDf1QR=1_ST@@PJF)~s)w_&T4 zlNv(Isl4^9_#>xG9w>X_5Mh~B)5dH~E7Bf|5GjVz68b#eBX>OsFK1;Es|UEoz$P?rQ6?73>cz&%(1M(4K{b(;41zMzP~kS{ty&!p1VH>&dCziSG>@P&TMO zIxQFotcWK5mmn|y0c_#_4$}Egc<|$dTHwYJ=b7`Iikk3)+e;Xse_}g2>Hy+m^W`IW zP;@f!1(x;98FJ4xou5UEeHxu%wr3TSLXlG;@$4Z=e`7ujFsX4F@$nO$7YYp}CA|?%k7K_V3WUP<$IIjO{0vFeF}bTH!f9 zc85`|7$v-+Jq6f7r-pDXKGkZ9Zrm;pwuPpAv`4@fIBe|oP>*$5BW{rS8O- zh9031>ee;EU6xVVfwez!a0A2SS&W_CPEV&xq^22jh4|sfyV5Xk)GZ|Spfr05a({E( zHej)}GMxa&N5oQyXN|s{K}`5RcSrfhQt%W*zKFkRJSU<{nDbi>w4FNHg)4-vw&{VChu^Q*(K%I9ZMCR zB=y&^I+MSX-Et=I>v5CP9`&hdB{X$6tBIx0K*A40!%1OMTa zL-1ZK_2!b-3;DkM{&Xfyhc;x7u#(QO^BtlBrU$$yT~cs!#$4f5{P;z)!MY9y3D|>j zV)=y~P0&aI50uIQ(J3EtiVj&Yhw024aPd;d0gF0VeD%G#(MkXP&`|0Z2yrkPMWm0sAVpYo!a44jP^qzL$*-JK-&?{_DuI=TAVdEXFKb+z%eduV6t z@!XC|RMXDg!PoHycmvqK-fPrm-2Z7(`f})~$xiLPzUxY22YRhe_`5HzRsJoUHBdoHV}-z4ArZ z(uFT-{z0=Lyv=`ppU@!YAe+pq0?Xd<|m&MZERRqR{09UDdyuvRXi zBuT|aX2M!zdN2B8!rNcouwNZ5l%r%XpfW;W&@NEk$6IK7@5*OE34d10KcmGCg90_E zGV_EoRimF}n||^8e*LbrPUg?(aNYLGXAJi*C4T=Z{Qf(|z~BP`o;&*w64ahv8_0Si zN%3?kV0&+))G}E3J|`nL``y5!@y162>9MaxtEE$Cjz8dsPS)g(RkFWEQL+qfU8%j@ zR#Eu8LrhQk^|d#TFa7$ecPndGalltzFEL=?^6Yhi4Jshck~LdB52H@Zqp+n`Rzr15YdT-q2G85};d{EBvHsTt(@^Ou~ zoA>$}?0s+Bp>%7z_Qi*67fdtIG{@Zfy~<1s&Br)b%N&v`}i}XG(1Nu zC|aaTtYwBbIG;Fl=Xn2V`TST7k}a+B2KI1!d|OT1ydnDP(%YN3N!Gol=8JvpS=3&S zUnmP$My+8I554r5?oaF@N0W@-J=bs&$uTYkudCBj-g4Uej2xl^J}f z_({{;HE7EvjrT9~V~g0A{*2NnuHTFy@{IX3R1%S~{``XHdztATqu4ym+ZA3i!fkqp z2vdV{X_s5Uj)|Ui!WVDU6kh26Qw0%KyuG2NY`XY4l!HCVi_lgZB-_3{4j<##ccrBH z<2?(1--Yl1hA!$E^#M))fx0G>TS^U=l`WrCTvmCJck9<|#bk5c&7&J0&Y~3BPSC-p z*I(<3E@X!;>|>j@?JfN8U=@{V5a(QI#a#X;0wp2w?*e5Qx%xq8+>5? znA)jDxQ3#7mTBshg(tOpi|~$TMQaMg$eiUoJ{=a>R zSM#o)*3KCW>JBj3u_?`pLoNM~8>M+o!{w);WsJ-ha9QHAa5#NLD6gM1K)_-K<4JJ9 zlX=M^x9G6CbaIO`W(5~qv=;=2(>*A7^fCGN)If|+Qk__F07)Hh1*@>2E*69a&1wJm3sMB9!YhK7VgbIfG z)lU!Q$);#y^jo>86$duyZpL583CBX$+Sb+H#@mppKFFxmIjdV%bl8D2BRa2oMT|_u zpDBTe=`zf`%P*!VHi7(MvQGI&$GQnlglv%qyfbOpKuW3b%wo(dM7rl9^3)qInq2O@ z&YX|XqsqUco`;z)NYrt()ym5<$p;cf|2SWhrJh~C$jWNUafi{CS+!zyYA-@G#1h<( z?ve||s9y`;%OC1|JEp-&C<*>-6DOi##A|4edk2sR;K45;q~@oC^|Zd5{c*!AuLjvY zvtqwD>5{r9D_7Soop1;HQ|OoM(!q{}D?Dg(m5W8oG+{krBH%VHdo+(}SR3)ox!sz& znoJpd|KrwO>tB8qRAtXLsRasN>osz}$F|5+ z>PjD%xPG;8@{+*SurG*%>q0*B(Q6u4Gn93|=6yKS*S-vGaH+O`A#rovY`Um4+U)s~ z-Y9m}ivlSUmuhPnb;vpInz1fWDIOhpY}Ha30{sa3LM-4KAYKcLiM&ZF+izvgTJ_G2 z`$?#IEM;`g%Lq&HBPFK-dmkTkFVN_T zOd~`}U9@z>55gx_eAy-`&=UKn*Ko*&RR;HG=X9M769P+-zCi!*uVbO}mQoggasTN_ z*VqXQvnqLg;;$^qc4O7V(`4tv;oxyf(A~Y7>kEm<{AiOq80Lk<%;dt{XYco``eN8P zey+@1c`OvpY2sEWAN!lhnkiXD>F(_}xYP?4@Y7{muD(}tK1|dkAJU9GRyV5oBJ#)R z&j;sb6cCZ&9u9eGCXf|EjjC8NyTYA8LX9M^6{}y}^31hfq-ul7465*fR^_k48x2&8XC6_oy8v^Q@icb|8oOSBv%^Fj*TSotS-ADYB z*$<0@$6;Y-P|tOom@jgw{kHJ0=U_O0&D?-|LWu0=C*LbO;WYW=^>#o_z|R0ybZ^EG z^4e zn*2%ck!AmiDLsN-jH7!$@@yx5wI`Vjx9qT#~Q z5=C48-YEMH3v-`_aXWi6_LcVLh=cg;F|~AVU8au^yI~G3sk4IUIhNxGI8Vvj zs;z2LilgP(ZwlT^=4xuSh8G%{sUH98thHzqI+`lFuYUMq!|`#E3W=G*uVeG!5ZEpF z8qUK_D8k09fa-1bbP?(5@x^B}SLwLL7BNM&e7_0nHKtZS&fqOPM0EGSz&tPwl>?bBd~M6`5Lw z53PQgIlREcab=iJ^GsPI~bree%b`#8EvI64WJb$~W=V~>QiNsLL)fxTrM{C#3Di3D& zwwOJsi${^&>Gl`HE(@$l+3<)vI5H=`lb#oudG%d`jeN%c{Ij9Na@Lwx&W6s`vh|Q}{x<_}-;$Q##ys6IVwRR-? zs&{2hMWGwsiCaYGvPoIGPQ*IcjK10fB&*}BlCw3u3zZ0ep$ax zRuks%qaA*IzLduI$(F+^_s3v=vE^$V?{WTHj+N3i8kFJiHtGC>I@>6Y`#%PK`<@LU zqk`wDVrc!p65Q8%I#(}jn&Ii%#We*f!<`>gGZ=|U`e@FZ$=+0tyz+&j_ju6SX-%Hk zPn9C0!W^bN-}w2$Mu}}~7Prjd=PZg6T`DVs^$SDv{+!R$QcLBWQ=XQ5wkSFi!ZJK~ z^kx3L^Dw=Yz)c3XkWqE^U)wh9cDxSh$)>=W@rC?GgGHOO^e-Mgj7a}w5&unc+}hw_ zqxF!@@9$0(<4N*Vs~5g0m`=WyWi&J#VH&=ep&u6H|3Q~w^-LH&6Ld_{^vt12H$&T6 z=r6URyE|)b6c|k|{XmaZR_#~Ok#yG4ZKdZk7&e8ZlLcOrZ4X*Z`)6i&X5U*pJ;Rbr zk5+cQvea7K*^=cRse5fgZK8;WIlt~<$WJD{kI8u&27b!QEBa%qRd4rlSa+y63>&{^ zyh!HF#Nt<(g2oM6R#NP`b;j#ULvqJ70}ece<5VdL9orI1aMZYS(a%Dw3GP%@Yu{TrHF?##&ZCoY)aAiXxF+?m1C>r;dfE2@4FseA+?lQ` z&xR6zW&2f-T2*)0B}at2TWx8f7S+akcGYkWhMdO{a`|ClLSyR_&Wqip(o!FS%7SgI ze`iS)Ods1_x4iTfy_~YwvM-B$uol{MJ;*Y{>}u@GE041?aS9c)8%^8$6T>1 zyE_-a6S#Y~t?>2_MSB(X#}}B`S~L&1ukK&^^sJ%sQP@Cx)3Hgqv8xbcOi#aH{A*t! z$Ebbwh$nKUWJR7`QB|h%*Vd&AQor#f|Do2(e_+qNXgpk4nC4Z{_r4>>p~AA!Ra>p@ z+U8X$xj;)(h9NPO9o+#u;A@X6y=QD@;oj$=#DMzxKl3wgJT~fJX1!Xd70ZbgZk$u0 zztg>Gb^e4%{D?N!=`twLt76$AUTe_MNnuck3}Saz9bM@9O1~&q$CK9Z`;bbX$~S2$ zqKIPhJMOt+zQR=TmT=ju*IT(q8l!4wt{XM|yzs|Ktey|c2* z*jxPWJnm43Gt&9z+zhVMt7kv^+FDvDimaQOM4^ITVv9SZ&_3>$$B^uY z2Q{j+0xl3|cegSRRapl&F>&twnV!2jQ}bTwbmlh7a~Cqc6nXU}U#6ssdK}Po(d^4* zB0FQSBTCb^u`9SqMdb#%5MBF|9Xrh;2fg%Zb!wrj+IQa&_B8cqO+SRcTX}j;Vy~un z>ru;RMg{7~YRiXU56`9brJHj7S$!1$gSE2?YpaVEZ3TCVI~12t+}+*XibHXSU@h+M zZVm3P#Wi@*;01z9aqrE4zWaF3+kMN+{&seDmdrWEoa^{Pz22;GI+pGvDoQfnFx)cU z6+VI4Xy>80xYB~Hf`2XFvCs}_d<07yltXZwRn;(T>zr_Hb7(vF!TG+uaXLbxsj|se zT=aGeVBIA5We)|hC6^DaKR664H=Vq@{j(|&PJ$w$Gf#LIzTIyH{TJO6DSzWlo*}$IyxRJ2JL+MJnlafKEM1JNdj7)^Tl3whGWvDkXn&s} z=-z-o7eeuf+H*#NBL6!=kNgi2G(?ho&C3W{%qyg=ub=DMZI>-A%Ci%P3GK+w(ZeKc zcRu!Zw(5#2d&pHnrIUtlYjU2oS=2=dsg;_Kw1;JL| zNTkOLK}ZjP%`)Pk!Fe&Z9O?u`MNFn4Uy1zH6C`V!J=Zhes_5o#Ef=jr?F;h=7IFzO z#)UKXY-&t07|kr8!t`Un^_;eSWRXIhHaE@W-0ha=HMy?-UaPaqf=gq2>(`&fns+_M z80BtqKx0w544%|kvZwmV{dzTDxkARji)KI)HF{SmK<(7^)_9|Fl5Uz7XBP5XPfG!f zWQ9vo|4Y-01e;a@=xaLYEIII)L<4Gf3h^V$#>4$>YHJRSuMZrXDoB+A`l@eAZP0 zs`TFPTpQ#2$p7L+2F$lsF>r~u%_eth7c_Q7&*AxuDJ)}WB8QdeL?Q=^_xU#){_`Q7 z=wt3~tKx_3&GvG!tZG#z%7X8+J9zZ1ic4f7FliIal0!flR*#qfkWw=!{Dj%Cu&;vfiun7`5FAh_`JerA;%!h7k{fBv&I(Xy;G#8GOC29AM>=S?O4bUX8EL zwon<|I45mHetK<+X`+TMK=q6))@Ynf`Cwd{UiRAXa2f(-1x}qf&$a}K=ANgVUhKD_ zjc;kpT(P1*S}5FdKE^FUISGdodqEsf&8%)|Q{%X36=_vSiZhm+|{egP;Vhhc%LCzbprK;XeVQu~WVJZ^6PS zGQF$fR-L`P$Sr@Y#f!!}sTH88fmC4O9%nbPN!y4lfD3B&mp7tm+tH%9Zpk2b=k$h3 ze>evrJg>S9?)I{!7Duek6r5l>62XFb_H5_R&QGruq2V69#83Pl_xr#6mP-P?p03** z$Jds>!>v?x2OTHS=EV0nD7?svF7(*{slPpuAv#~P?kIU3g0@-2fO+*#>k2e~5w>D< zfhD?E-Y1Yn#Gy3&W}&ygAr=UR-DZvPawYd}X_{~M+y%0{PHpU0uxiJw;4QD-on3AkJgUZiAT<{L+3{b7GG`FTp?J; z#*WzFq{VxOg2vc@!30`!JLT@8YnI#bj7AOl1G(EjuZ-RVD}SKBQ(nY;PCQZBHKT8q zbPjnkyckp5cS@N9SFS}M(4c)ABw3%&*~qT9S2^ppCL4Zk<#p5dGs3Ei?lctOz#RTI zkrY+3cYl`4Hzg&=8>twE6HYS(Z>70|<aPA+~AnpiuaeeZ6Qc;H2xB43ybyrJq`H2+rmzjz-TkT&McxbA^DFmlVovXSh z{xx9jlGF`#M#KlDz4^MAFIy{x-;l~?A#SR_1g=wzWDHp)A)vnyLwML^cGFUaB~KT_ ztu|exo?_nQoPd8h_SMfJVxe!!bP$N@mz5^eA~_FCMC>i*`7;@#CM$UvDidN;BAPNir9 zKSThBx zdHKr}`bm1&kb^}&QhN`{;6h0)axpnN7kADfhK}JafQ#r()Z_OU;rV_jwWsnTE@wk0 z3Km9L>#V-Oxd-kgqX|KWZR#xcDfUt{xgr}~Swh&oXvo@AcjfNWrATWYN+15;3JUs? zBdK?W;*z){low1VnzA7uIrX)L%C7BN@(;;8Jn9P;{5?}g@)v_)z(d8hKb{)Bl<5E*f>HAj0tr|f_jSn{Gf zzOn)xllvl@FPhikZtcv8?vT6yf~QM}>yQ+WF&))E@6{DfoTG?2(VB97sb#7&nUx7A-JE5F3Q6vQRkLxub=RT7ieS?RZw!X?P`Vo#SyajyQ#Z8NKE@_HR(1RYb>P^dPlcyqq!%*wPG?2Cetax2o4H%!;mb>w<( zptKH+feTxS5?{?k?nEZfP|?#fdIvj^+F(sZ8;zWRQ)nV-_GeX}e*SU13T|c^T5;w{ zaxmhh{l##Hkp6+6EV-_(Bp*Yf&mW2Mmj+Ypr+6hH*1Ip{f9kIWRL0Y(o{u}umRsq_ zvlEp^JIFjT1#QnwZQzkKh_w?!KF=gSuHHE<@4>rjw^kQ`hhUIv1Ap zW1+-`VWy3Vap#F^Ly%Gh>yW?Pv9H3Ik>+RdL>Zq()-`jZQ$CjRI0wbR1z|<5x5Q1S zV$N#SMv!cMC{BWX%!h~_vGWnd5OFXdc=9?Hf1CPjC@eFS5te|K_eNaV=)XM{DLA*H z@>7gGX*OwPR)%({D-ku<8XoZSujm`;FNUOQEjE2gLaa;2n^bQ%8KH|O&Kb_UUf4h7 z(AkcH)*vUrxJdfWJ-cr0C7 zw4KwC??CKKB#eE!TsJD2!FskoLb@xlo{7w$r!0B&O-CsUJ!3Pt&EwGX6fy&2w^N~s zi{Hq0C-lQ?3CYE-hDH;2D|%9gS^2(zy{N6gZDOL%;1gz2+v+>dSDnYe*MSvvlkgp; z0jmMYJ4geuqg?u{3qa!@B(E%qguq|>V=#-AzWeL~jRg)Q|6YQv* z@F9;nkU^=NqRfgH8GaLHp!}>BX0>zBxk}L^k$IPCy%i|P#!j{a?Cu_Ra3lS@2^(oI zO^r#$1~ZFxh13j}>)_P`LapA3qWp`LrdZ*{*;jE@`Vxu;Ix5AImmuNP7w@YUM7+tuWt)FzZqnU;8ef`VS; zJPl^VJ1zzQFBz{Y`o?P~_}xiqbEQ<`vwQQ+&CggvBUkunk5T639}1Ql&I>)6P!>~2 z-<6r?E_KD^?%z{0C~AiP8F+`b8GpH}5 zT#|9aitfycjl)$sx0daXo40Bx&R)eYSD%~T^C7T$F0e69XPvzgS3iD+$@gObR=&LWd!w4p{cAX1TK>WC=dJ9#^V+qZ^d+gbVUF{EgAVGfVDijuPLrld z(IWJ9hN-UkP~GzPX081G02m*y z_u8zTU@YT>!KHMhAy46-ONRCNnDLs--|}~Dmi#=IXDw$2|A<8SF=bsH_qbLjj%s4p z^OL=ByW{R}@_)qryt=g)G^YKI*E;5RB7?ZLpVg)`Sx5(DcK(lId1GS`^xZ88?3h0< zUArx?OxF&3o_0<5xHsq%eKKV}RTNx_M{cL$!;hRAxXT%oPJ`|_ea?80&Pniq~rT1eP0$f*w+VdV>10LL>htUc@$+F zak~?6a2vIG**-Ab-GS3Y92T;WB7Qr7OeT~;&)dNhhZwUbxsK7pId>d!9GdGpYJ1g( z(GGV>7gncbqZ;Ba(K>cqurP#2zBUY(!$6c|u`^h+Meq)q>MH@3^W{1;aY!7groDmibXJnSo*sS`UlgLnR(irp zmuNncwto52HV@wm+PvrL;@|Us9~V@{I$KLtx^7RO)cHra6)IF3)29O?ZdTx>y=u@T zO!Le6F*ljUc{Obwc+b~h#17Wd@joPeWuC9vpcn2P8k~Y}REM>j{R6(M(W}7e?B{Kx zh#^nnawf)ECiILvW2D{ZN!}+Sw@C<74K*LFo03(q5z0>^m%xm;Btx!y$?kR}O`y)AK3 zbV>2>td@(7ImkLznu^lqTqdG0`^=gfC&XIIbo|M%%@=gw`uFUMKd8>eKI*t|plqUn z`j?^SH+o2hr<5)3u6dDO7>j*E%$Kjf8g^mN=^PBLf?zpEs}>Bvdb(FBIp-Gf}rY$9n7s zD+*}tdXnk~hb z1Y~7#+BS@+xx@ob`*=TD#)DXdXQCN*d=3aResx;^H~97H*EGE0mA6>tPkgEC4n1G7 zp!+Y+95p{omYI&~U}uy97=6PX+-nAG-bgr3@v%`fX37kge%_qpH9Cv>Onz&QyL5L` zbl07>=T6dgayw_7qOl=iT3^gkTYRCi*;ID;?e+2~)42beAap~# zH+sA9{|UCgE{xo?tvNP|XZ`;GtJi}aCUr0VhDiU8@p=erMO*0}x9-)Mqx{v@*fIk@hiEB|gkfvKZc;aSc-$Ba2% za0i#Q{QdqpfY-`#4h#nGxU75$)e#K^#@Gqp#~GkM=(a$sHNyDe^rt#l>d%}z?>B^u zBwN*T^oKop_0#Om?DOjEwY$t$0fnf?Tj#hl66~xZYOgB!8+Dzka4m=OYxXIklAtXV zS#$D>wW8d%gUd^iU^af0$DOqbyc3;L9-+vpY;SHpOz$yv&DdWxC~Anttqv`39Xhvb zNq0+@qEc5}_4Rw#LoLz?jd)hr1It3HQ*mg&O(D_+OYx{U;>wqjou|}$?_01T#R701 zwRORj$w8yqUzR3ag?)@}KU;$+wV_cbFF&dep^GtN@4xHQ;>OvD1ub$8^`2^~iE^q= zk)l^~vW(DmSNQtf(cGdCPghf#8A)mLm$G@Anpi8_IWeecHnvvx>WImrAC#CPGkT?k zb6^jQ?V1zB8vK+fXQZO#63@{&DQ%I^p4(^!xH!12DQd(5Z)HHetZYe_&_K~tebtfuoIPT=GB4Cq43b0UUuNd6GDTe3Q>WO6o5a}_ zPR$1po{7D_3kV4tN-Pt?yK`G|KN=8_U#eI68_yvtI-)9I3QM>THS{HonP5nM8o~N3P1ac1 zlu=>PQpg6jy|v4q&818+1++CsN^8Cjuw(^@YV$bG4Y8^t?eGhn(0d>dNe~lORubCv zUq!CX-9pYgk7l>r2-^E3ydWh+MIOFHzQmwgCtCC&gM&4 zUj$lhmy59utpY5=u~w{ZSsfdfjJWADl`A7!^VoZgglVQf%z!LxCAS5{-1H0u37|<& z6;D5sP{T$!kpwYxvP<8Ez~2@%!skq$$d#H){jMA;tR0Is{$XiLT;{iEi6P&4SZy*( zJCQWvSP06oze9O4QKq+juX zPCer|PK3#%xE_fsjAj#s;R~1xAR}R;{=qrG>UaNPn`mH+mV(*k)uXUI*+Hu5CBGIU z{ zc2ZV}QNh7ZlfXKb&jedhT-8E8=MO4d%LH&)q*SE$uNEF63CZX&<%K6=?v-w~>+qpb z+y85R<1m|!VzYbr{KseDMLq{FmON6iN`uI8NxW=m1V)73Vo7b%o4ch z37ot!Hh67e-ri5SlhyA)$fPKx%c~nKuc_vcNtCFghS2j7M6SzO)6pFhB@HbmVg@dn z8SK?8sR<{^n|}1EAa1pPp>Dei>4MCu4gO{78Z# z(6MVn7dyks-MYr2z#VptufA+l%MHs6rGL9X8UEd#l#6^-^hN{nx7ctK+oUC&;|Ru5 z!FU;vjd8Z0kw?L-S6*4>58_}a^P~1@IHp{%PXH;8&h5_=*NxWUc8Qv1oLhC>y1mEp z=7>lknpIixMM-ysY%8vj;*y7M6YWXIf;PD`8*lS4)4wc*KL_ii~iOH4?+g+x9tydioE%49%oGdtQ1yA@8U7U$i5!5M(WH< zVVN7@B*gG*ny>B>1NpMw;m4|cI7m$z^|W_h;C#Q~><|B3D1n5`<7iupwE_>aIi)3&^mM$_-VhF@Qw%%B|@K2I!FnI9J*TB6TMksg+ql`{#A8r4;N*Z zwPNiai(D}vh2Unfj(a7bwsf+bbU)^@0AhWrxu@w8*}hT2(Aw1<-ee-tKwa)}PuSrs%WM!MRzw}b>s zpc$>fz_k0RJI6(flF{Msb4}GYclTEw6m-Ff8p641K$9H+@#2EbUeYK?!nD9mhD7){ z9RFLYykgm*TX5~@@Qs=8aqH{64xVJJJw58*E_^doX%F;)Up;gSX`dqWTuj}(?PG$c zEj$hgbpu^6{#h5nHnJ^>m+jM^!bWbfb|r+}2Sc91c+U5iKbJJ<4^ftnlH|&3U#OP@ zM%$aE`!g@M5;-s05D8Ki_6?dfDCj+$X;W}tqOirM4+~Ny@&yrlmZ73+aLz%7ZAtM&5 z-Ila_^;|gg6gc+(DUI!8R?+P3(3w1gNnoau)&3sxxkhF-F_*H}839;)b@%~|z13>r z?$kA`QO}q6FiwtfUrbiz*&q#YgWZ+WlrTZW{NR9_?^Opz^^0Xm<58@@OtDO>U^tK0REv~9^JcYoS$Tw~@0471RN|#PMQ@@gGX`q+ zZmYWQ@TK6WNuQ9eMV=2=OcXAl`g`nIa9@if+1Fc^3sxoz`zqH~cZ=5v%aPqsOZenM z9LGTkr^)HH5~jL#KeTL`1N`Kp+CsUN7352laFl09$Z7c|nY-YPPKgiZbuw%X<99t7 zYJm9)!R%#@bIgePAz(l;*{nWvwz$zi_#s_S@`9A!fD%ZKK(4#gP}>Hyb3U^RfJJD!`L@&IBXh>=(A9&0y@(0_Jj@zt zay>SLFDC?)gFXE|AEr3{e{stoCrSqTLyaFlIv?=>767t*UHw^V1&x87m;jXJt^@}b z;c7(oVDu?73?+)Ecw?NXwNVE3qS7WNa?M7 zKOt=b&(hOSxGdXACgVy@W^A8@7$|RCLA;5#yWu;XRzLPdb?|WPiN7Hl!fniGrLF`C zJUL_IB(9uHxw1q{N1x%TXC7gzeuEu_s~JhE{(?5}vHHDku_i^7eX-j--pQWzq zRb%>ywia;eyGER;N-G=Qn`gg9yW7QlWY7pK<3V8-SPBCA{`5UQY_Nd*}wZ0S} zE(QFO`S<<#<#~;$rfE@#BCtL&g;!QB0 zhoJuT85a$C77tff15*)S2~^H*xE%1O41JQp;ym$C0IU(kfMeA^bLw-jn~~qj@PEY) z?9hWgT4@s^pi$?AlNe^v4^$6_gHPeY#vLg#BCXrA80R|?{xo0Z^dU0A-l~y2|0UQS zP3mh{ryB+WH=N^Kjn}aId>;sUhjoQCqGfRxnHM!B$}7j9aYDVZ^ttgG=^j|!|3#~l zm{O9GkA;r@F*VEd?5r+|^dT1Fm-B+dBy|x-N%9f>>^DLuJY_6@T=_@-D{{yzkoQSY zoDqod3xT2KGWpmTKWKz4;h@#>zO84wsy{)Deb`R-1=i_&s;?M-E#LpWNY&H0K0oq) z)3rfBNN>36dqa7IG1;YvkQv?1)MNIiFP#~~O_c?Ip?K*m4N{SYiI^oO{3Bt5zhoI> zx>vQEK%#ePAGrSKA(2wb)$glZToq@J)Vn1Azsk(8$0NMH&7C>;edJ+MPT_>QeB!x# z#!c%~_x(!-c(6*B*`3!=N36>D!n`YUF$dBj{Fi?Ju@uFg@m8isL%K-UEtp@t-dp^8 zQ7SJt|HAd?RjF^_Na2cv?v+3`-=!-kaQN?l`n8VsqtH1ds7;4&&&$yxB`$i?Ja1E~ z{NKpV^`)IZdx62@1>Q7$TKt@X_BiLT?fJIU*MIR^F$QhMuZgDtI7{B_N7<^{nY#mE zFseu)^GQTp+XaEk#g0q)y-2HXi-<>7Cux|$`?1PR4bcb#ZL5_tFA{JKuShqbEbQ#a z-mubP%Rs@=IZrzC!KH1F-Yj8VSiIF3d4p}^jGX$IyIccp85kuWMz`6)ypjpg&&J&Y^bP5f1< z=A{hd#d%?;%lBD?t!r*K__z|Po21c`RyhvrM03dxe&1`Dm5p${@Jv^IVa{RqtIxKo z&@_gr#mH8%hUBd#R3sSmr?-XT1dvTqD<(O+F`EJ@8^ikLJJlKpe}Ha9Wi>_0Q$|-# zP!&1AS&b4=>!-%E5EPx%?-BA;IKI#scbofDD*tu@EYTBlg$7Ms6nib|OI<6^C!Mp+ zQz>j`_cN*{+$DM7&HR;peSPiT6A9~u*j2b0Ot-9L*X2W&7Gb_nr>Clw(-S37Uv`{k zfWO~izvpAzqnEPiC&@kgQaFw@TLf)~j~fOYqW-kJy&1>uI6_2=^A)TdjSyU5(rq^} zyOq$l6?AB%LjpBXb!RZLGq_0>@~qaCCe5i2PU@Ql=JTy}jJK$zs^AUmu34&u7FB+l zZTMjl0xi5KOwm6nJYF>sCq6`VWDE;mt3qfL(R!dvVF@i%6klWvt$x?9l0lcOZ4=tC7ueXex+6G$`CXcfj^~2m3?BjStxBeORN%&!5WSF19`` zLs){rEpuE(Y-B*ACzdGuu=%!S&N7x_wsQLYac;7{b~vYHdVjf*d{J^l7@#`4A_29i?&g!Vk-nSwFnw&Gdl_ ziE-q*PHy+e=3JACF|z9SY{3gCVGW5b70clALsEJdg0j4}+PZX5@C|CHainSERn;K}2iaIqz;QVNx)p(}1*A?dplI zWKRU835_(ZQHMvQzFdg?dDeNzhQ<_%%U3tcTtcXwqW!=SJl@D|>3Vv;-RzCN{L`aH z#dvDN*u79T=pZSHJyatveHgWxq|wuEUqLmf3qQo20#~m^r2xujrrpq#-w`MMnT9ar zMXaGd-zmD8BaYM=h^^G)$o=X+=Hi<{M`=+%Ne7V zVrnH^m(U@l141HD_ud8YwYU&<2P~wpO0~h3Oj@9{98SFi)^wUg#3+ zxg@#+_h_M&)y}S0qh4s zx^mt_4X83#Xm9d&z^fIh(Xb>r#=q|qmpDiyo5^bZ+6Fwv-HyD^#MoTn00Y~9wrbgj zEU=%d0t<-?ZR4nLk8~h?PWKJcm7X5aTF(3pjT!fGFzH)>2Kjf9{=V(U>kdIHxPBGf z-D@OR+)-2FU3)aVU|JjUy58nV+H$>Gq!Cic8i!F3H8+UpI{>+8!*3Sdh;g0s5=UN? z{~fM+%&(yDyE*5m&o;#gsR8^%(CnriY01zYP6`6pSE*be#ZA3dy@`HA+UTgO1{h|l zN_yMWwcnT0oEMlBgSzZ=AEnF6&3#)CDFm!{+{K0fHuD@mR0{!vTmui>C7WX`wV6wI}NY zxo0sIOMQ9Q{PK7y{h`VDI6aVe#M3y~fuA-X96Smdz|12Y0v9Rp|Ngu3X;+|)w?bxP z1He23mC|L9vBq&c@HAG2iS*Sb`BoU8;@ouWGmCyrb;00*Nie#1B+LkjMkW!53E94``lBtJICp@ z(U3S%wXj*c+xuX4H1Z4t22)z6qqB_l;&*3uydxl-6F^T9?ohd>X4TphlkElra~=nj zy|!!jH7JxYBV4&~#O!bIVQ}h5SM8_1BN1OobPPw=8WO?zapJeNUp4L6;nnwNpxOCm zV$uwPomp8uAxN8Ty~t6Ch^^_YfRQY;#8*WFKMM)#U2p4t$L`Z`xV@p{o_i1zTPg+U zbnPVA0`FRO(O^%@SZ4#@blA3J}(-ua)$%b=Ejr-YGRj8+4J`I-=}p z1&Iyu|CJ-0oCdv;M}sWPr%D8ss;yrAGaMtKStP||!V`9)cUXMx*pck2ScJ+Y5mON< zQ`X)#)a0?BsR}a5{06p}QqrWYa1%G-@L* zfh!Uzsg}7t;yLzm=1rrVF&by-*;bwIG9=-sc)@Q$=JYxI8^z;g&)xAU)e?NxfxN-o z9gyEx^+>YMLyYuTtFAER{_|VO+kDJp%U##w47g{UTzrFTt*fQ_Oy&;Fo#f)~VuXs6 zm_s3jb5Dqyc+R*bizL)3SpG@=w$qrOXyJMP$j5w2CWLn{opV*>(*dp1I2`7jdrux= z4{+G6^`&sc<>$!bmVC_Bl{ul)4l}^X2_`b)sQ%jE_!3c@RsI`uZ|UytQQDK|I|AI_ zYQNs#lSY%@0ir|QIVTV3(OYsDLD_LG+UG$)ll_A@D7{NcfgH(o+Il)XZkJ&%yy3-+ z=_jYBxED~XKRf+u_U8W<*<@8Yum~w!US=3yKs!Kc4iDF}zCA&h>2L8{#N8JM$R)ne zla16iuk7n0vZ@6@SY6##fM?2Dkx=W!!*yI&@9sm2XsX55zRJ+sJm#0b4Ht)Q-QOor0Me?CVLBktHpNiBcP}xK4)-1Y7*=aZ{as^X%}mp{2|2VJ*rO?;sI+ddG)^J)UIkH#K}m zsn>=_)wWrH@Tbg`swC|l3uzTL4tQU|gdCuzq#JkPBn~hggz5zTsJ@9sDJMesXunqS zw&bq0!(y)zLG$qPY|lwQ`|G$FrGTrWO3G#&s4`?AC|4a zuAOi@wSWYg0=Rp(2(t?Air?oVXQR_SCeDok?Du2)1Tv*pcIC`yTne9u}Gl>PY zd4SytxB_nd=TqmYL@fHA=f9Wk!49Xdxov={wId41W5>Ewz)y>a{XWex`q15h`1|$R z+^(D55lzA2v}faz%G05ftK6z&OqpcCtdsB&t<1S^xCH!|45v2JQw6fSNc>{&+g-W1 zqXEIx8)w*Q-#5P)@K&EQ)iaG0kvU@V@W^7G|0aLKVibf&cu!X2*gb(w2$Ah-t$B5- z|MzbUW$xx%zA-wc{YdHJGJ*A3mLcX-FsH3UHv_kD%pqi$L_##1fg|U@MOch zp-qD5zCEGBQ>9z;J3U1gc_S_dQ5RqC(y`V0V=OeK}2+{aVQm^A%wlx zACqn_SBx5ehD+4~*x>{C``I3R@QASV(o_`u5mJj0s}Z?!3fT$i4xaC@>su8U)V-ym z@NIMsUA3{qk}5135$RxqA~n1GXv8D2h` z7)^%_7`bqDyA}&{9srFDk;5^O~)-Lf&T{pLiVGL`<2{*wg(;3P@%3l~tmJN>d&V z+dqrDyjy^kdWBG`o`mQmoDo{75IGpP-4tFgd-+s(nI8tb3nayDC^S$qtH2?Bg7%Yy zY7Wh+e<;Uv#3)OfOFZ>8^5b{7`Fvp8#Ajg5hj)4MU_0m!<38U*kSCfFh$Ve>K)ioC zEv}hHhe}#YqPEZ3mPItwEt@I=q=F*)pN(NV;~9wf;Clzgd|5VlwN;;=RHa zFwRzn9LxwM$KKqr;)&txQtdFp`sk{v2Fut0d4af0_(Ohjh^Lh`)4Ks%Dl|pQxW`fa zw1$w}MN0?r-;YOTEcH#D=28>qVyN3hIN&K`cnsZ}5lT>AwcsVnan$=2G7(_9P|G3f zPXitXgre|J@ucg8@V>)u9}rp!=O={-1iouYk$EhXH(HH;i6p+pb&$Y*MPqGN5HZA? z(zN2Z0#dRn-GF*F#l~&vkJp2ADQ)8iV#S^*o&u5^f7(RM$0{8LC$YlYr_cvKCWbC! z=iK9(53ET-9P>U`iUK2Fwcxu0iELjQpLtN*Rih z(JysbI!^p+|5qN6c*IX_d;MYy)_y~$=VqFASGn+#pXC-Mwf5u7RF zHq-i2L>p9PPf{QQuoBgQkqe>AkBu)eno&Oj@?b7$003i{mEI>6A?ypBTzp9GM} zKGP+fESMX43)h~~#c3ccAWmzpjrAq7(9+EU|24CqZ>v8wV{$t+@wB3CSiz`%e@Wh&s!q({rK)F31gn`9_9Mfct;WC9QZasDez!f$=|6OU$UO zh`gu9{AN0bxHh6pMQA!?(j~K>TTjc$b?>Pdywgo05|Z)?G!1J|9WkTT=V!q@^hi{) zJ$i@6ReT&sUCmGW8WfHVfJ0)w&W;4JWzZu(x$coNQ4w;#`x0RW6U}Gc*x>M;5|Hgg zvQVv}U&8?zd4@0282wK)Cr)Z|J>0c20#Oh3KoR6W`YdSIl7dRMzv)+Faf$@8}a85BD9dW(f;q|EY@xN_A5v2eA@g^UiW;6n1_90 zxLsZ)t;6>EE~KR`YDIQu1NQDgiU1ci+1ou9{;T$tsM8AdW-8GRHeSeH$xET6aP6Gf z@7khYo_Kob%Rr#6l=FqJQ5!-Tg2-D$OZ}V=<|1EfT3(d-J3KyWKPv078LD<%CB!o4 z&Jw1X-6sMroWWtCFJQ2)m9Ri(QS1D5HU@a@3#hCBq7SkW;8H$P*3&;>Sjqh{DAe53 zyw&LG+|f!goqEf{uR5MyDap;j0fcUhD~3pK3U9}%`Ih+Igbw@jy)0sc`i4{SN4Zvf zvzqAXmi98}WdMDwi8O~p^|Jd5iW-&1QLrF{@xb9QqMB-SVp`E7YANym-g52H-CWD7 zZ}SOED}9n6xBZH?#K$E?YOV|#jwclDWw|iHM>Zy3t8(I+b1+q@Ku+Yh9J_6Fav?|d z__PkXPfElSkpwQtnXLI`w(DyCkqp!rBIQ__qSMWv^vQLe#u2oZFUd) zZ>Yj%!k_oX1IvDF=7cU|WMu669Z1S%%lgZvI zg0f0*ysxfWc>p(bPG|>+xV2!P*Dwe{_!$VVv>k8TXzsB>aAV%C(e#8}w9ij|1G~AtTO3*2}sV*)> z`?Q4e+dNc6pe>P-K3Hf{HbCklm@y3qZ2;Ojk6FUAK@SpzLua7Ln2Re8a4+6bog)k${qQOo+*3pdz1VM2Us6B z7?t_C6IuKsV{!NQ^QY_X;dx(F-xYP{N+kKq^|MUjgSx&j4F!xC;gj29_QrnIHT!=e zF<1*E5{Inh`{KEimxj!9H+LsP-UC4Q4<~~wESVgV@9)d3KJF##6|U7gMEC)f0}DR! z_~j<@iuh8JbdlsBTyJ$_FFj{EFx;P`QM^qblpMo^P3SVVS1#0f$Me4aGYL^otKtc%N9wUv0w7{ z8Lh0bCWJh>{|E&ztmAnj)PVS*nbrAxf1M6HV&6?u~j?f(-!U2(K_d45nq&ptix$e43q1B%O>ez6Ue|(3P zyxHSM#PFSkQBq7A!48-cysrLd9&7AR z#1c{{xlk>PjIiFe*ITd|jIJ@_+evKZYQjfuQ~3s&peuyZ1Xt~4G8y+&Mg@YDTZwjKM*`jh7>ETX~C(Gm6C^& zDO}fOZqwPc9qDsU;%MU0IiJyB9Wu)x^V}!aXa~D^pINKuGDBX<; z@_C$-U|O-pRr7~V)$APdLp4Yga`q?Vkfkudt;&&{2p{r6KeD$&MSj^}wZzzAYP@dY z*UJ2r+PuZE^FppMmH6KR)d@lt3OdfqDmNk2m3AG{R|orIyml-n9fk#ceDdQ4`#YEY zAUoK9w>MZmR&hpTaA`}x%Jeo=k;!m6{$MEjv3B6cqO1O~Kx@-ly-O6?0C?L)2^z)r z!5pLg0Y)^~5sgmC<2#%$i&A$)OvdT)4{RSF(n6|b>9)wlQ3|7yg zuAcCL*@uMKR5U+NOCpC7>RzHXwN)^KefRWzR2fkZGN)H}B<`s4WM?F&niGQ82dJ7V z=Wp626q{`HAg<}g=k6 zr>lFf*4=w|uU^knRu~!JCRH$)zq9-Ez4g4YWO9?>zQgFIb?5aB1|X}t76uP1`KQbm zpFBKhI&2WB-Sj=GYRZSX_KSV~!$0m?F2Oh+k{QCje3_^v0w$m!#nn>ZkuCS+HzmFM z5ieOfACYEpV2HH$BqtM{1Zq6SB@Q9po(lM^#_?0<{Ee!CLE1=|3@19~wyz}!nqXfxT*sw0XzTTcPncGHR7TgOb3PU|I zH=Ve6E6lOr_bqy(i=~`*^E}zF#eSRH8%Sboc(plRDsu>=IBARayYE}kzt?gmGe2z` zum{*6yI}hZ$B?sjc0?Gih}mqWjf@EJ`j^$}P13{Q!9VzFYT)j+k6g`oHQ;G|v#{+w ztZV7bpd!r{#o?7I?0A5b4ZO;2&HboIUtv%&uij)YxJb#v2hvR&$!EXkS^cGimrMI= zI^QO$)R_2@-Vslb-5D>zAJqp#L;iigdS_8A5^YWy*EKWNLWSM2DqX1MF8Hs}SvTF2 zxal8rJe`Bv^=s*0OZVU4{{!J2`;L3qyn3E}xjOrg$_Kx9u&zTp5r0xrYh=(w!9sMg!#qmiKdd1kbiOe`jTC2KV@XTUs+jnou!9% zt3bd%aD?IPXStsgD=RBmSy{1dkk~5@V>8D0S<6!Ysn@n!PcH4TI(143s?m4ui;P{YLlgM6rL_B3Evh^x1~dlF#mUHVNB;4%_S(>r=g$gff_Z*Fi?a(%%4La*fp=nIcFFAA$&wyz}^VM1H zf3tr@A4vk01Szayxsu$29udzOUGu?YH|wb=>KlU_NW>_-Z0^Wd=SbO>@HYNH$rlAd z_QbIodo}K_?=X-1w>3g7B#U#EdU|>oCVtRrx*t8hyxy!o;>zW`zc)m@Bz~a=^*81Z z3YAa2_tnGaUvXuOal7S*p+(XKon-gIvz-P|dY$dIaiNW5je4w8G{|&AX@iB(@n#ehT7z)`-@NJ?HzFqD6vt(UyWF$PoaVO~wy>vU z-@zN96mF!-V_6VN`e8paxawpNhF|W|M&;Q49mWsRDlS{^&6%C1Na$oBHNHQ{&f+e6 z?Uwu-PrZlk0IwfB8P_STZ2InOqvC2D9`nA@6Ww6%qgtXcLzC#|;lm8^9y3|8m zfOQ;h<<39FBAYmoX@|?CjA-3Gar_5mkxoH3J}D__6&Tby?Uq`5O08eH;m&&ne)rGq z!xa>P2hGE{k0{9gVjPe{?!^q^-L-x99fXI!`~B)JJ^Jw87pgH zdcP0@i`n{MN!w;i{?=3mj-qUcdPxN2zlJQBVw-0mxzBwRGZzHgGlXx76l6rz5fCo` zp(Wp0G5-!t$@T${T@mTE97LYnXN>*+efr)ldtrPTa`N)>ma*Ax+y9yTS>_gbHYla1vF0e@O^|s5nz)>J z+qV!VS|cOJJ-{;Zy6k#B@`f^zDFtFpw^iwL$9C7038>+pPFjb}5ix{j1nWIkdO;8> zPjPKJzj#=ObIja5Up#t(8gjLh`A9zh9c;<^sCvokZMuiri0l<79?rdgCne*ySb(*{ zo9Xk2*59iCqw?Q~2NuWeGI5{s4YIVtzllazVbfx|_`%%gs%r_1R#^!y7hCNM9zyFz ze|21WZ+i%}x3nBP^Akh2uAd$4KYq|=oEe`bDD}1r9tZk(;mGAygjf>ld`)#HDI_y; za9z7xwdVet@dHjtmS4Ba-af+?^mxyt18%i-^C@!_jl?Q|lm$=zVYA}Wc6MmLOzWSK z^Ndk~eBFXEHl#>Pr#VefdOH1nBuUP|!_zbW$sa@Q1&K5%v&2tTl(zOCfZXJEBs|p8 zer`U)=twm{UjQTFwh91{3q5T7U`5E5EFk#Pp)716RKqgTA&jpL%`dF9tg=3K`tj!qb z&My961mOQm!~WaY_Q*E~s2Ic7e~0bN^K1{`m3>{g$?i>K$@IYRY?-*uOO#4H2cKL3gqBn|0wi+{VlDH(GMhc zPVWCGCy*#U6_R?YH!aZM$pE9+-H~KJsreN__S|J=x z5JI2Za$3Z$8Di=>|*$&ko#JWc;6w+hW$wCEvN7z4jOtAW45$G7P zpp!$Ai(iu~#VdTvM-}HUTU9h!46h&J8Uru8!EW` zQ8u`)qpHu^hDEIH_n5%voN3241SnHh^#+3708pKjdsnS znUR3OGV}%mpgM43uMBp<2yq50UrejfN+-3=L^aM*+1rkzf^SD!w(BiI>_ZMgrRb%Y<0EbvTqm$sw{o?WTL=*L)q7mqb;yt%5P2d z6lm`%+oVmwmf}yAFtQGkXYb~&a3pGvBcdR6Q?VM)f z)s>pKRadZMAKGBelKd0($9l+bvY$dq#h5Y&{-Ra$>cFw0(pm(`5-G9d!l(!L(~nJt z7jZJ|)GTkl79%=}+^((eDZSDaD6^_FZtt#`unsS2Tck44$G`N(N715p+40>t}DstyJH`->aJ7`YIg>2g`AeNU24OlGTXqzstBQ`ut~`bW zZDscIYqG6@DzmtMb_yY1Jg;zqOuES`#>kU|+#E$$P2zTu6@)(e%?-lWkB;10Py{&A z?{GQv9N$z@ROkeUvP=0Wqs4?6=MYU|^5{WKRK7}S`omKnBO5JKuwjn&idyveV0u$a zN>%Xck^Pmm)n8Ma7EQyi0ZYjk7Smvqlk1~*AL#eD^<^Uq<1JxMv&lJu1E3+iG zGsq&^mD^d!WzEMXb~28T?X^TW1nSsdK1GYRglZ9m)9oEL23{R!GReZ|^@W@=Q?|)f z=ACalYJMHoU5ua!&Ch3?+f!At=j~_v$Y*32ACJHzCk2y6OS5kn8;?*xUpHS7$`+lQ zzSCl`a}GT(o{XJK?o(wUNBM`I4pw1A^1^aV^1?hh?y^^PVHm&kUZbF5+nly05|om{ zz;-7y4=EsB7Lf;gS>Yf)CzD}R1LuGxY@QYC`w0IrggiGM=ga%gK<~&Hage=YC72W97Q$8Bsb~z^BfiS^X#42bA0QQwFSM| zN8VlJ+XFI;{%~*i(uDel9^ptP=BW&~G#XFJ*)8jZ^!5W1D#qzA!m-{3dR(L10x^oA zJN`7FQFi^obhc~!8i0SQfS+=P8g}$M#|q8im)MUL^Sa3V)?SCT`yaY`O>-efTbSj1 zj`}U_OUGQASYO8I#hDUzt-#@YT`6s={q)uKcPkwjrdq0Pol9zH@n%D^8W3x_+@0TC zA7t<8I-al%H>Nv(!RJgdw|N|Wlg83&VaYi_G?%T=cK9+KZ2%})LSZ4RPA6(9=c&EQI?n*D%NV91TRif5ysfk%&$WB&(Lc3F=puRtS>4`gwDHsGHC z8u={LZBdcjukt7)dk;Kt3F0#)XtaBTtCrrS8YIC?A&|Ags39f_dNSOy@1{T5sZUTi(BB(LkV zpA~?#Av2=M?0!$*;0s9$7D4#cK{qJwU3#RoC*q$H%L~a?fb=gs`KXUA@7N;sJxiR{ ztN6R2_D_bx5MvycjxEOP*!RCkml%0sM4AKIYRzoB6SYS%>acvw_sUlp&=o=v1$ka| zjly=%vyF#E#Osj5&4ycC%X0<$jh3xb>22I!OhJRPXNL}D72YL#ewsag99l6!=Bi6j zdxI`jsha0w63)m<3Z2dJ7_sQ)-a<8e*OwZK8}XesN*gkcpw^C$^y?Nr$_O6jKFT4t zcRF7!_Um5oB9oGIWlIuSH@M}G)jK7DDYwS(t8}i1{WmXUUOi`8ot}(iO~$$p<-sPJ z^_E#j0Kdz=l75wD=gz6ISofaOW&5Z8`jsb^89XTvqf~qv9qdW7R!4pgPh|}b)>o!; zM>^-D?ey;gxG1nkKN}r5b3YV&v`*;3@U0!eUXMgyLd@#1=JP>!wz@yHTDX9w1S8i7 zYzSRfAzJTA60el{`yILgbOSR0N2JOA=|0->P!4RxGKx4JkSr#UHcnutp=}OBvh{Ob zbSqg5=Bn#-AJL-nkMv1N6DcF;4&f(;CoXM}o4Dd4b0;H?*bmm$F?mACEIsV#m}G&N z304QcKM^5$`K#SE3e0Jvb`E!Im$C-Kpp}%H8pl9B)6PBk@t)q)K>G2dJ_6qSJOIfy zj!n25U-3<7HiHV~;w~!FlMPgIrumQd@?o<=_wVb9aV4r!aM_B(NS9PjU0FBQ_2pa@rI^=1|LEL2 zg$`SxGOUxxO0$Z>N_7iRdv8JKt08EA8k-;RaUFjcA~1RR(dJW^9aWHun^CHzU1N(F z&e_t%K}b)?HVC+IjFU>%20C`=qG`@tqegTPNYSP%uy76!Nz)Z*>;mP& zw~Mkiy%ppLCg%O9WUwO#uGW2sONFZ3;l$$*9LFcjx z2MU^=75N@(_ZM&QG(_Tdy{PYkU}qff_GpKH*4a>u9pZq7p$UnW0h_$Fd`rjKOiSW# z=Axd)mOd0%{jld!R!5v1_!*!v-#RKXqph83Mg}^@&9Dda{(+xi-%MChk#GN(=OZH%M+sqp5$l z9t8ZyTI;{X^~25kA6!3tfd6MyKU`cq{~J5kNycizQ4v-Ef4E!Aq9X(LFNb8}XAZ-W zToJzPduQziQC!t#B!82^we_h~K5H19cA{vQdB*=mHCE%oQdn6zy*sOB)n%j9-Zt*7 zXAMu`PaOYw|E!YkNUGn+&YjVzJ7n?O>bFJj0|Xn|WR@jO>fC!>HzX*JC1sdGCMGH< zIX!d#=%~%Pb)3;Rd#zg5-{6E}a`yI@_T1m?bE9&A?Bs|H$8L_cYv<-80yq@ghP~$3 zcc1o8vff$pDga?2tO@NhJhIu7PBg6T(lj+PyZxx$w#un|1XwtYX9x#aUZldT&%n1i zKY;MScZlATHNVj?$+g3{Q$Z;@_R#spQUmgiz%i*FO{b>7?sy}IR#aZtKJ9AQrcJSF z3y)}VJ=El`RNoke7+g?ud6fP$L}kD|Bqa3QC%J!ex3n|gTT@(X4!_hpsC<+*_YLnj zX!`PNsPEdb|70%DPlLa?@cxuOkBm2arK8m{8o#?~-1W=#pTpurtzfwi(vxB4XHlrE zC6OtRp*?ehEa5X2P;z2{n8Iiw>6>}YJVn4C#6sf&B^F5};m*}(FpzstY|3VPUov*K z)NoxN3eWuQp-02FdQ`?*`@SolRpV@Fj)AZBO=VMFoj#Hdspe8LeuZpPo@Pl5j9NfFL1FxZ(d|bD>jM8eC&s7Md2Q1NjpJssX}^`-Zo6Gplafjp`Tix(oz;# zWr=VVmhSGz3T-i=a6xnR!6NnMO#GQI%dr^h&cj#IWRgzE zEFfiUXx@5zQkBVY0CDu!<~c<&KV4Qc4U-IIgzDL|U((aje%_WY<>nS_a2)eWtUk<0 z`(u>;L$v_KSp+^moqF)~V{Q{0pP-N3I>!0BaoMr!+FK#gglJ&V=Kv1MLluCz07v&Q zsxgakYhnz5lw26P(#qptqQzcCuC4GGM`kbZ96CK5q?Dg*W0=%b#02>#Hg1nk1d3OZ{$`Z zGoISXol4QQAo!CS0K>2mZX(V~T`Hj2u2o4y^`Eus@uhTY_R`gRQ0Xe>H?Oy!L2jo` zRmCF?q|dIcQU)zx$WsR5Cop%#)m2Ze{kq=9&c2~}%U}()xEl~p{hVtINMIghS{fSY zdeC*lMpEPb?b}6|#1E&uZd3h-62PN;8;&J}~@rQf7uxef=)+y?Gvd89}CBPvfgiCh6CVDv_a2_vtak?%Wxgy{ii^1lVs#M zSPP`!OONCY&hTS6Oig4Sx;We`mr3-l%mE5Y-exF_fk0k=T9n-Q4tW}x;o%_k9XtZ_ z%^W1kD^QgH_(`hOCzAtxzxoOnRaP%E)HerHme8}Bn~*8fn`b{iqJQyJZear}HFvIz zp1}-}J%`TMAux3V%Y%?-Mu+i1e91n6W6NXzD*m4%dv_-F$0o$IZnS;i*Hw)V?A%C! z(Xxybs!SG64)gsKQ@$2?7Wqd)a5taGO*fxwFBUqPxaQ}j4tX3GqGDIDDH-B9RL!UH9(Qp z!(EjqJhx7q7mi5cKi9=}e~utdoeWo1wS7gE&1h8Ujf4Xh5PUuvZYIl7$1gG16^LJL{XboEIj`dNC%KmeAVLz5gb^%qY-G)~2}xl! zt}BHr$Os>Lz3eY)^0kEr_^Z5~v<1TT%fx%_dG~P`v*~6>jD-g{hHk1eZs_Hw@s_v^ z8g|PXu{i?YUYlRfyyq)f^;%pnJ{{gnhrB$UmGUdsaK1hs-EhZ!c#lZb_m6LB5x(5& z4V#Y+i^ftz5gy1kq!W|TU`L<`3d~rbXl(sfcL0wl!qC^Y<_X?-`S1&HMx{{0kHt*$ zrnH{>2gKs+wF7HTA3v@J>TbF5R&Z+OtgCK-zukZK90m^`ytc!=vA%AYO;)6Jvw;qp zlSHfy-CXL`13;3&wIrfXzm1B(h(CGCU{yfLGTFq^t73o?cT0}Qv9p#Ku%OiKby)S_ z#GeJY8gwVl?G~Bk&YV2n7kEh^gJ#MXAg;Zz{OheWSuzJ+RN6aZ zuGgrDF_PZ?Aob@1(qygT8HyMJQ6}V*FpH)&VpuVkJvLNCD+pyA{Q6gzxBC}fZx}TJ zDAQ-{nPYL&I#!Aw@QStNvo}Id_WDjL_-^~#1B;eLkNwsco3?{mCif;oI;M3ar$>lB z1*HctFUzu)6A21xYwY`ZQN_KIjIEZnu2{Qly4DCwz$46uuT#>+>fu;;Tozhu3QBql($fwT4%bLSf8i4HFOpn@hX8PouKj0 zXbI-r*2C=rIKHgru`jd8v4*3eCe3vGCan+U5A(gC^>doZQA)AP{`FQB8U!i zcOgbqrW@;)W|-5PduMQS+4NaJjZK?G>#;$h0jsh^Usja_`#p{b51mgK;v-R7#6O{; zXTCYXw5qOV9vK#Bb0+K$btTM>TJHh>Mx0r@7Jao0^JReTL@g{r-f~T6I!@S(lY5ktntsvS_n#bfEC>9w%0aCGA`~w z&G^gNz#n3tG*+d;NVnS(HHE{Ni&CK34{Im9S4XJ$XmQ2D5sx&3XX==V9yjWt!Z2rvDt^jQsVDIexdN*4Vrw|^28iW?5uX4x`)|7ekJx$xxw8O3hIaciaXcM5Z#6_pqqW~BZ*pP@D(e08j=@^be+vt8opJVv&!eN38OTA#M=f<)exwa>)3B!$s7CyB0p$_bXYfe%Ot zb&L~kLRls|OOkcTqu428^5*wKzP)6I+-d{;YESX0rzj#{embE8^l8_aE?HTNEJr(Q z1JqU%HG~H+50*lP7cR_#IKx{(yTw@oKYwog{wOS7d_oTh9H(rMPSd3C+~`rRLVCr+k}x#tH5D@1j)t~0V~Lwht76rHD}|f!=#*iyE+4mVbbD{L?&KM05@!|A&t)cEW>n^*0H#V(V z$zO5+6B*smWL6fQjzJw~+(!#mVLU+LiM4iVI3d%1j|AhcYI0|rkE7ZeSbirhn4Xs? z1vg2DXpDN~X337&-~NzGSCj*%E5YrmvOOwb2rosu*Xinx2z^y{M+7@g3aPI9@Q2;^ z1Pys}>4A)yZJ_ZA#)HjGioiZIp#8vW#kIw>po44fsRAJV>D2vU+rXdw5y>_G8PxA8 z+TiEQDKVwhf$x)_T{xj@deGe*JVd`ws`($ndG;Rpbc+*LssiGPUUdwmVSXa*j7P*{1In1kHW`7%h z0FY8;HQy9#+jn3_5-BBuR^khESHEnIMs<%QQ5l!s5N;P7nkB0LBt&pSroFH%Irjk< zi?c~Oae6ZIS&#@^YA#))IuSgpNje8^x=*~OIY4KawQ!+l{49vIA>+aCOu!rZuDZFg zlXxE2L?p>$osv#g4s4n({0Q7}z&~%*CfN`WVTuY7Uz_8z&<%X-e-cMQ_tr(nD;u=?eZ+p|6!iR-_S-Q{J)e9_B)u z5e{`AoR2bW$>YBzhTz8DiM0e*9TsV;G9SECX&2%_vJre%9{?p0|A7wZADvM(7nX`x z(q=c(Ek+;HTG}jvDEb@_0EI9dcEuw+kU1bIs|nva#cj5>hhTEX39=KIM_0D-I8~rC zaC_jB|36TSOT1HQSMmg62oE$HWo9OL95ubw&UKRYtYLp`rS^|T;eR3jPV$KddpQ6s z+pL%F@?gzI;eQ;Zdu&!m(XRp;wpindI}}5pNY*_ztz(Y_ha?PNev@iR)db!f_=k@3 z;k$}KQ20mlkL6h}PTD;6^P|BLyKPy_j7R*4bMyQ#8-XDVj>(COO_NWrTP>a~Ut?2S zjnmezJ0)xz{q#2$O6bIAnM8Xve7b+P4rQdHCBr;sT(1b|kAY<@yD4O2TH|n9@PUob zg~~sg->tNL)1KOkzH$k=VA3fMjw zMJJ5;?~t!w6279NGsOk|yS<_RM6CYb+Z*EI{{MKO0et_@_J%mwI63|c3v^5#FNWxF z_ye(x`{=?r`)|rQ|BGyrlyQ!H+2RxT9C0%S8kpeCbaLlHWNM{xMnna@N{Ih*mD=)U z$rVP8SC*eFaQ+Ohpy4;eSLi9RS8(G^9)GQHS8EQ+tu2hak@X9 zJg4JSzyi6R($5hM(6VJ@= z)`@kh;3tpt$OiGmJ#6d>;ckV)n^<0X$VA`E_w<=%{jc+>4a38Wag5g4bEeT)Vn%8$ z#@oq|Aq3Hi)CEphwP!2shLSSRBC#{);|*qfx$Kn#;3 z%uTy@DQClVS8jC`I!dH)=CaKO9`;|C5@+KsLw=&Zd8DT*y*7yOMS#f@sfOyj?dQIzA~M3sWJ(m3>P5~B<$;V zX(LMDLLX$}p2_ zDFSN20Rd}i3+Wn=YACXA;z!gBk+VxBngUC07X06VSc$UhlWu7urrP$H^NZkycedRk zEYm2uh>C|2y#rod4X$K4Q?-W)s%yz`0b)`fPI&wm95*JbZc>HSZQx^7e$vJsVKK&xv`iySj-Fyj|{RSPjFX*^GWQ^j9 zeeyG{u1tq){mEI}tjO6TYVlvVv(!Q)f9MJ9U|4eqpNJUEP$x}1^4BXMfe^a#BSwpI zN-WlLj#=54gf;K)D6ytvO6v?d|{p*zCl z=H(;e6j;NC-Wbh1qaIm*{~3k5&KY0Jf9<48>0&j%3+mq2D)B-+DF|!%i*MvhR@9Q`0lB_#s15$V!iQ zTH8{g-AddDuHfvK@Y3}D0^ya5)JR6+nA?%H9~vclms-A`q|AEgub%MHZN?dv(UGN~ z$IG=DEiF;x{mY9$S2DS*szD)_rPk|yg4@=qRVWhv)zt|`Z{qAs77C?&S?%ncW?3{Q z4v*Olb}6q>BLPGImnXR~Fh%m~bNwi41r0lMfRVZtH{euV*2Vj!G_0qm84(~A{<2Y7 z_f$w_Z^q6q{G%gKx~9cymZfGbG7li{qJ`#C?3IaqD<$uYH_KAio@7;QTUms?~NCyMR9xYP7mKZgr}!?YQ3g@ovuc~?$py;w?^I8or`U09v7~Cd7VL4bc#0R2ytX*eMp1m=Y zXtgUi^L-Hi=vC8^5+E@GnG8~xGknDAnW1K1`!c;=4ESY*H?3XjWy^$Yc0&^{Wxwo+6#Q6T2*yF|&TZ zPuIH{Hi(sm-Lwz~HR>sD;?jW(bfHGS3>YtAbyJlJzh^QdG~$wwp==b}S`C<*^7-7n zRc!ovuP_fsL`|EL=9HK`ku$$BOyoI>^^1twOe67yrO%s1`zjPKKmI@jpZ20j=TD6e zGU;NK0vhhpR#Gx`s~l^0;DuPxJKCwpDTj*m2)CqD9uG5CuGoUsdvnu1053@;HI3wQ zVy0$I#qI17u>L8eCAo5PB6?9S1MdzwYQXyl5ub-`GfYgCLF=B_e_Ew?q4t zd+~I4dlKoljnH4IuMKkkrK`B`U>Z~gj)QRs@H z#3u#}H%5eDlAVU*cxW@EimVqu8zM!zEIuhT95o=6vi`kdKnrb4PT0^H?<_(nZwz;+ z0?RT@+nkfqi@JKt$nHk~4S~$rgnDgwy!-N~tkvJtNW%D(u^*TnA8{7|OY>1>Qh0b5 z*xXJcYIH285t|&gg$ou0?H?ktT%*58N#1-0#dT2*be}>Uy!MSC$u{eyi1@ zpLPRwLRL>jaJvsMJB51E6tKxEQq%sKs0}go1mf#0nEfO;ZS4d=s9=P3xke_GquyRI z=8pC6dh@7ZT6f>ZLK`(HTi--CkC5(U(DX@odIJBvitqg-5Ho^66MKKNg-a-rGbUpV z#o}8yt0m%ds<^q8G#}eAva13A)FuJ$Apr&r*FV;Kqr z8@0BVZ1ty7@ULTf_Nb^k)&3y}2r8u}>&w%{!X6!@$OK4;z+9*Hb-`Q-nYw7aPt!FY z=D)p-U08U6{zURKLqmiIaCoMiIJnuWuy$W~jcmRX{^9FoBU8lSLo6VpMkYk@db-6* z%e2iK*+qvJW_xDmw0#JR2vhe+HmbsFeEFFW8NbEly(*Vy#G z*8FeySL8E#RlUXOzgd8AvH$-xP6OEf!#E9K|35B3lw}PaEXmoqINsGOy&rS7aCA^G zwHL9mwzUD80v*YD-_Ji=SUJ8QeP$K2GITWkW@>C>Vv58nV+#E4Xim<_#m3I_pBE&@ zy0AJb%iz0=pX+XSYYy^cf^Zqo3`lSbK8Oqwl0?6hD1*5;yE`yMT&N7mKS}|RrbwhD zU0h_^S__l2Z(O(90B^P4`}<6{dOyo;Jdd>BaG##+9UL6+4Sqqw{Ud~sVgB{!J>(+~ z<0s120RfHjS7gD%h5b$Ts%8Fzvat#C_!!~#HayIZz2fs*XatRnT*a(D0h8~$o_l0N zV5IF9jNvd|UvDG+y#DUvqouIzxt6XoDxOdO=EZ$N@s~$4Ye+n3s4(pqNkczAG5opEPTh z(4Ye+P~UWJpsW7#H~&GW=}hfK!03mdSJYB-@(6>2wcviQ(CgQw-xdK8GnX#?!iDR( zjD;w|?q=Ru&vdi{fk*AHM-Hs92T#ZSZ^*91?FUdBK5uU)jOXj#PehxH8=a%OZx8iP zb)gd>M#DCVBW5r)GLF=S74(Rij}F6lD~ZhbLjhERaxFgTP|weYjE8=80As+UOrFP_ z)x>B$H(#7A(q?HpW)be94ksjTr}EK#ej2niV~10i&+;YiW~u5_Co+<5>2QS!rUUfL znFsD$YuKBa&ax6iCfmbnL1)W+}#HDIR_PF z&h}p*Y)@Bc_b1qbAxG?r+XH8ua+e6~Gi5K(0F|FSA;b|!4CJ>w<@A7hdT5CxQ&CVt za+Qi0NPV^07-$ha6+V-j*)bu-qL&(B#mK75?h+hrb|MzjGv$R6Pm$3Ua2lsdcOvZ^ z>^@kVD>u`ktuuF)EI%OeKRPDzRfk1Hm@Y@Pb5ye-Gvec3v$Pk|JQJ2S9GyRoHZTMe z2CHm9bFn3r_;jl(!1|nlYA=Lcn|NKL!Zg)KFsG}haW_ACcnJKumK!?Qaq)aSYQtgU zr1Hd0UQZNfiM`v;D8s12b$)dmYBoO=Hq(^ zndbuXj@p0tDRDt;xTl;&qsNKt4^=2A1DC%|w8kfIK6Y8pJ=d^qJuIKg5eLmRg&`7xPGBxhwU`UM>SmM)H`+3R^G0WPficlmPiBd-z=JY zjJKSb2iE=pi>RTB*p9w8W?lV|MhPFC&Q55sLu6|at~F{h7BoFs<44es=czs`P4lk_ z*H;Xs9nm|SG$%|oL53x>TqIo$r^3S3q=@CsbcUhl219?`6N%jvTwKO0!D14>kq+d+ zpD*ADZ}P9R7whmgTOL9T>ty_;Q-wV!k6C49TOg=yGTyGc&<@!uN9(D1TVt58(f;nX zk9^j;t6t-A|09gI!;z!R>A{c04cI>>>F=pwITl{*UE;J^Bn)ZS7FmI~*gsrBx`Oul z$HOjInXVyit!s-trf-B&sGjb#E0L79wPK%?q5fiSGstLRohLsGLek;U6?3e9X_4K^zf`T zyLBHGzj*V!kMq90D~=B4Jt7W=$GNva4z9=A+O85n{jZ?c^Db3YJzY)B@jq+z+DnKp zM1pMUPddUUS_UU#4%Mu_#RA+F`pi=w>l~_Q6eO1TT)H{DgwDxwSUw(pn~79Xew;>~ zvCc?6+%iqpZ23W7jOs(&ToDLK>rjo!QffC|=#g^p1Ff~k2!rkGVb|E@PgVhXLh4_A zY#m=Vg#Sz=G1|sZ0ivu=lZMg1fl0@`UgnjvE(e5DkkP|jJ=T+$5ilD`KbMz&xXwfa zdK~GbUKl!$egjt%kXvL8P{OS}P|vnz5st<`WZpa?4{e0@&rv7iGH)EVa5Gn~w zz08h_cwQ~5k?7LKjr3Bh>MZ@DtE$CCoRA`}z-MW`IrlSVGOBK-7U*fu3o4OX6~gL* zvt!O9V@7=6&EgGY$op{Nm`S+oTzV{vCL!om<11AaA7Xmc2|ZqU)_iThNYAy5`P=R? z$L?}T)0i;xhaZ!#fSS>I&$Sh}*t1z;g&k-8;y7kQ)iPbm8#9xssb8IMbH9lP%;LB~Ky$5M zM1-z{hZbwT-FcWY*^u5Wm$w9JKsTl{u<2sQ6Cg;fmYZl$DVqbOBSWR@*2yjS#r2qSr6~iEv;|-a`aNXC1g9g7o|)V2Kqh) zebzx-k2JZxHR9rEo%%|1`hm47Tr#9d9$&k!EQ-9d-Q7RO)y${8j*~nnZyrAvx$KZp zT|ljH_>9)VtfDkoLXr6L!oTo4>4%A+w^NEmi&C zMg$rfVlT4;&Zs7S5pzlLVUgGFkx@XE^Uv3kfFI;|%dv_L5_uV|Va-Wtxw=X>V&u zje~I*CdsVb&jiLzI_ecvYsteSu9SGam_K8W~0T0#k73JP+gA^c0|8$!8$D zTkP=iBSp*VkM0S=KJ*}pP*+zT<>pGY4|_3n7B$CvBTxaZ?75kcMK^#PM_`mA}) zwF?)MZ>-L4aa*jY%x=d+gLM-Lr;J8O01vBb%++1DMdO){kcvA^7{26;@$13a;{gso zZ?a>`U5R)vjA0vKQcq3w>%%?EDLm$lqgmtF{=`@->12Y&T_gb{~1XaT%1$FD$O)sHr8?;jdpQB|mFK1{j^a z4!yFoM0WU!Hrw39rdMZSO+p*oRo5gMmR3exL18!w#g6EvWGT^q<47E=6IwuhzZWy@ zJL_uBPMMjTIu(hDRV5H+36wMP1_ft{< z4I8_CgzeuPj-=3HLA4XG1_a&Y{5qlV1S)dkW$XDH+Lz3jbeYR8-h9F707tHy&YXcj zt~{}r%$A~$9?cJo^VXn7_Pa6w3AWp@;UGGjIfqV3dVPLiV7VA!;rT!I@>A+G4X(Bv zX#`u{4&-r)DXgM7nJyDf52?)+!c*98vbyUI$HxiW4|8t4-I6pN*=4uXN%{$Bk~WyA z+_L8iFs^hxsn3T^e}Kl$5=kCze4?@}cK0(E-oYIsG2WkrU7IelxMc`He= zNSJ4n^^xJSVqvmaIghmn)Z^C$?(w7}lzo$DI{T~6XDd6VUtnx#;MnW-ceY`Q9ccsYU332G&D@~VAOPUM=ABx5%Mh;x+)(J%=jiHeRt#p!c-$k~W~Hix{SxtYlnZ^(xe$jYZ+;Q0}mlcICEK%o^5IH~geEfgJw z&p|mrTW+3xXAtk^QZ%dwWITp+!>K)Y{v|LClfHxwL-bxCTk7@@_s`;{a>|_};*TBF z52Kc-a{*zl-vl2}Q@ysju;QqE%UtZ-%n}!_^B*pAR?8CexkYxmMS&hM<2@3vO<3eE zo0J{#bHEw*BZss#e;y2z^eTiF0F`k(jN}it1%2xA>P(1eh{vws)I`Csa>Nzm@m^-_V#AdgAkpF?}W zP|uj>aCg;)3pOKx+J0RVzE0jCH!+b4eQ;hkMrQst7Gg#=74^lg;WJl08@V~2PHoLj zJYxa_BV66{%TLy9pMkokoYI0B#>k>+K4CR8f$K5%7s#w~E=+PB_)ehh{b&6)sos zPk&>&q4Hft#k4LJeNZMq_qxm0F|9o(SJJP3ZqU$tpd{~W8O(_Y+O=CVrs&3Sq{H9 zt$!fJq(QGUyfz-a+m6ehu`Jgz&`AU0k#yVCte~im=cyYwyB#U|o=&^b^XF6j8>IQP$b}nB#hWQ>$~m=ST{x8b?#81hXZWFHD3wc*|0; zrj|Mc%YNGFyqX#6_;0m>_UuD7^3$8}F8iL7z4A#po#tp;ay}-_SMhk?ak4)jC*%l> zHq^rc4)D_=&93FqYAxF9@a>Oir8>Bqxa7U=q&|T>1&4qw=zfWxjaBlYlPk{eBgPM4kxYvswa!V)94P8-xc*;6)?9C)&zDTSDrWnLi? zCGi|@Rk=Zmv}2rJqoC^D_9tU?djr6*Y+N>3i#VEFW~y<2uXYmpLU18)-l46lQ+ROr z5tDa@TR%-?b+%@doNxW%g7SFtxbo-W)s&-(YFpx#)Q_meL$=&?F|8?*p?FM zt+M@978jne*057fKI^}m?JKQrEzJFAY_p-?!vJ^3tj(b8LQ!r+EZ`U#$hp4W9#S+! zlO=JI+HIj}=8ww8$GWh&w6!%myEVJW*R`dJMi`TonbW@jz-=LFXJBLDm6gHI&d3s* zPeIl8B~gsK|7R*ac$AcK5(j0r&l-hya%o{}NtBvOhK)RbT3F=+9w(-#gYV(v08z3p z{BEuAblrT<|KjFO{Eo7e{ppVMT8HEIYb;14rOcl;7k?sN&cBom^qCmcUc`<9j}4-4 z@B^J9)C)twPbTJ7{eh7Jd-N_fC4*cwA*|KPQ36pDOX14#^D62@^v3kv4P6^L?+H!0 z#$Sz7x`Go2JpVp(@QCdxgDnPs3&CHrDc?WSa#U1D|L916)90Yc8q&Vfx8k?pU3s-D z|I^KVz>e|Jitk1!=g%sA)W#%fK3k*E3#jYhoBO)=yFk+?1kmNgavxxr%9Ta=eqxr@ z#1Yx|Y@5HhS?D|J!o>sFak*#!T0%msrIRhQyNz%^vL3iieOw&Sgi>f{P+LwE1RI4( z4b+g&fk}@TkRumtWy1*2+bhL}iR_G8?_t4QHy^n4=~MGNZ^#d^3+^R zj9mpt%>b z^N?46en83X!_H4u%RHJGjn)aM0r4){e{^ki&B7u4^V}{pK+Qj#GUN^|Iab?Rvv;%& z5NRk}FPX0k%hfcZ1K{`J!<+-QYmfP3{~TfuSPFM=P4MhX-O%}@rX z-SzC>?Gt^3qR-N&!vr{yUv&(dC-zbYDGp%lrKb?;L7(R;QzA8C5V6=N6na9fFS{&$ zrd@)RSqh}K5_?6AfWzprt|1gGU783O8m_n)l&Qp$tjDR}tJjL8r)R?W$W28?dVHXh74-|p<9Wf&f&AtZ81rdnQU zjXFd}p~^+)>)|9K8%SpPbP;~qR?o!QKe^|P88FqNjGMbS_-#Dmz%`!0*iX41s7w8Q z;#sABJ%j>`5Klxc5HdPH_0LJIsvHDHPQlvUqsKYSVnZ7Tv)HycDORd*I?pxuu312{ zB7SC96@ZSAFdv}Uo&+-|6p>PwKN|kQneH>v0|E49SNNk>16p1B{afel;+E}mjp%H9 za^bkNo#jGg-Z&CPPKxEKIQ96CQ%6tFpq~`qww+q9-C0skkoEKThSPF1Q5qp?Ff~bS zt}!{iE?!{c0tIoOh@GOE*cU%@>k4fh`Wsx_wK+piov|73MY)bC$}k)* z_HLYWso1T-Jsp|W2)DNQK9Z}mH)Xo>oSoA#XrG;BnHNI7OD@R~48vUP@^{21y~vjW zV%HkL%O_~Xz~5reK$FJjeDj%!E`+?0GeJ;EA~70!N{?xHcWVc)gr;QjIuUAC3}4 zS6JDyw7j)ge3~w6t*Ze5Z7cGD<~8v3{CXNM2=dk4-Ls{ANaa~J5U;5aw#$F&nI8V# z@px3M=_>d1abYugb^v;U?_=|)cWGDsW8B@aEcH*XKM_$EcOM#cw$8r z1>2uC>TjPVs6nThWnI@dc9q>k33nI)t#0}n`rd82l-XP^<1<_9&{ggtu^Q?aS&-3y z*QNJ$VHPj%j}I_w>4U;t0g-u(%S$P-ExyhK%rquZ91GKSxcvSN9a>CxpSApu2ZX5U z3zDbzwLhmko|qW{ow24CbI{E``M4mw0a+yzZhL1}r+dQ{b0-{EAT`F*vGu^-P0@5;>C^3-P zl1nC3_Z)O5@~tZvi+VquaM_=47p+T`;ND7dK={~Rypei0*+{~S27w^FN1jyU>JWtU zDVN812W8&&F*CnKET4O31Y@IRlU~B9bz_L1OyB<`ywd76{;*pqgKr@=JHSQ5#lpqK zy|~7Xoo5iW4vmq31JjDO+S49zl8WxGX3P22^?9Wl5`Gi5LDjRhN5Qm-Fj)9-5#Yz? z;r;?8tP=PHz0f1i#-`S3#P{y7IWo?~SehkX47Kf{$5UjucYO|haB#Ytxmp9#g}wPt zpVa+qjWnn@yE<7;{*OJy;GLWrsfY&siTj&J8!x%*E`7)+TU8$gJ*3(k!l4q`T3&ce z-gz=?{&iI2i%lFbYs(*$5GrkXu(IFd2zFnD4ja;m`WVXF_9Bj14nK`<#^mU!l(Zr^ zrgSLTxFC+V3l!9*?QFSOig8cg~$D}E=N&KLs7Cj4Nol)2Pb8M4`2!J}KZ@K-Gp3rCJ)FHSz(O4h?*<>%c ztQGO2#EbC93FvYwV8lm#nzx6o(gF%veulF@z1SeW6h2x?*9R{CKIS3nYr^weYr&$P1tZa-EMazzV&Yd>X^`^3C4 zoMFc%R?x|^0T%T4Hb2MpvPT(XI}PuTl_64nt;i~AF4hsNoK$I&b60-P_IP7XgiUno z%s+h-a~nfrjDP>cNa9ysw<3R9YI$;5rWCdY2dAb6^VlcEC~o7|68Y{acuS_@O)rzV z<;lCaz@%`fqbV`XA0zr9YW^6FVqj$iRhr1Hemg3e47HwwvyY)m-AXyy9ZKJRBSlF{ zIyyQswM&mwupmsBlnd1HGydtyv@iB#AfYoL*<{?lswv>Fj83}0QpQ>awFBJdxn}?y zFoY9=Qk|1Nv%j3S*5|)EO2V>xNeI7sR1>o!u+9E%Ii91-drpQ}>5&HHEQxz^wXBln z*HnP^Oc)h~GXtK|x~1Wl-&K#pmJ6L{3&*)Z>bsQ!_fQ^II&cq3u}-0iHHwCH_7k0 zm=FLZe*jNvo3BHNlkQJzWS%%9y!;@fa(nd|!xu?k2w3ik_3Ak@7*5lD!vT|l9T{aU zOY*q)(u%IHEUb+y)DnN9p!M;w-x;Qv%$MGc5-3h;}K#~k-)84Yh}SiWvkt>xv> zh+YyVVE)bc@V6BDIr_FXM9WoMUZ@8EiWph?Ehm-=YK1_ zD(D9I+P(dGZSmWvx8?>Gz-){ngh{@45LWa2N`J4a!)3h}*#$e?eJXyE{=#g4a!eda z$HsV=1OR9O1~Btnq0!+UMGCUT($3@|?ZTbFmN7$Uo`{r^h~@wd5S8C79tT)z9SuWu z?6E}q7RJUF1_m}@A}<&Lcd0fq&*01`CviwfF!1@IS8|d-@c|GnWh@(0L1k7Y^oSM4 zu?5>M-hG_8m6eH!i8-jm*>57&6c@eH;HZdM=S9k(srW*}%IXqjlG2ZGBvRIUp1sbY zh(Uc1>JOJbL=-qWUf8BVRWlp_%5p}-80#UQ_P3c>__#m2(w6hlc2XP4XA!&hMJNCN^-TT0Je(N7a5 zwnWa`f%qGK%ra|WnuX%!O-(WCQQSF4&x>azltOa8AK;G#^~uB(%-PaScBK}*IQU|w z7Ke$#m3FtWKbnq(@Nz3(hB*2bNXF)?S+}KD4o>DTj2D)((lg<+=d+`2+Yc|rM4B)5 zxk@ywmg~WWtn_%KIZ`zBe)b#SVQr{pj?*!lDtGNOihh++`al z(Cf{?_bPhGm$GO)6QcRkiSNp>DGTRCc;aAX8%534_Prn`59g(xe{1&7+RGF@q*d$Z zr;h0;MyQ@psia_sYc{Ku7vmlq@Ed#b=fi`ym7%MNI8}|d^*S#G-6U|crJoj=zk6KL z=SAj0ZI01#Phn}aLi_j%6OlGe+eUlS{qeo@dp7fg`Q$_5E?W5_ro z;*+)%S@A zc%t_Gcwoo~r3;Xi$q(wE^qz2}jEZd=n;LeIom0(~3&$qWe z3eZBgs$liJ&-M}6g(v_A{cP`ol;mGQL8;;Eu1jwNz^ICYp-K3Co{|}8TWa&0IXRFt zG*&K}{6EkPdFVxJa)IS?T@Nv3^l7MNJ&L?|}YJGL!Zvrjl)SFeQ@4M%g{tx03=4l5cvp%fP3 zDb57-*j%RDSHMRC=2Zb}L?SLsfj$FG0U}tau88~RUXRj0&&I0zP;AqFs4t@$S#0u$ z0&${bw|@e!|6I^uSVF zdi5F9!^K&rK9Fsm|GLi503X1qd6%gfZYYe%B2q5TC!gcKOrf(S0f_y>=;Ys;uS54{ z{Q1ettr762y$LCxQTr?VitFw7Mmh&7qu&VDXi*|$&q|9-h2rmg!v5eb?e8KQ5rNoZ`Q+c_VZdbkeY#(quyj1UzQ9Vs&L{AhJiJ!RN^Q$!VC^@EnWAwmX=0=k-yO4(^-%)SEo-e{@m$u9f5EmqT=xv%14S(~mxs@V8B6|LMhzzYZz)N8~*&TNwb|Hk0TY z^I;2H{UPF)NeIIj&}? zJL!8;!l8tmprGNkx_T*OE^td*&WWhaqj~hWj3q)>C{SUSDz!rjQ$$3(0G0lnT-bs$tcN!ShqU z&*Qndryi>$Z^p@(1H*Il$X0q6*}yLR7w`HZ#x>-1q^#z-{|AciG<}mZm=h+3wVSAX zUzPhLqv2V$g${cWze9O+72+ncK{q--hT3t2PzI+x&HkSsOcAjJ6O%*Z@PsUK_NDm#R z>+(3P=X;X!`J_aPf%FN^DSw7Fk@4&AI zU-4Cc)T{oQIiv$*xTHJvJOguyF8cKODf{%Z*5W$Lcn24Hn<=(V7BCwhq7RQ?=3BF% z<_x;_w#cl@SNPhJzCpJD>_#R&pCyvdKJlPK=ikb^Wxf+^s2iTot8mZq@G84WaLXBN zD$~(0FzNQ6L=z-1DSqVu+9gT;SJAD7lzH;-)@%U#?iU@8X``fU*xYkgE=Mj0*JdxTUW z&7*OZs&*6+Yhp#g19xu;1W>*0&Q=JV!{&dwC$i&KkboA*Mn?PE?Zi4m{S^U3oKm?W zEk+Z#D6l)sQMq>J$Sdy@S=MC(d&%dhqLyx;;+>y2n96WSFgwr-E1iN1Y9TgmLX9aAqW$_S z`yE2Wr&MYaR1V1sGf5|Z8$2Z?MQ;g6MI7uW(nU9^+WnYd>9`>+(S0dhnwZ(!3m8ta zQ9!J`&hO{G+}w)Y4kQwfybIRs+i8-`W!af*>0P7niNxR^^HoqET9tB0r73=yM#=RuJ#Q4^M?FLb1DB45)Wt*G2hI`VHtWbVQ# zZl5FR+>=^kLtlvr(DmgYCi`;-!I9i6Pw?s)_LAt0F~g7Jfp|gZ`PO7oL%lTyW?^FV zRb~$H(DO-5F|qV;MU0e-e&+%6%}eELO^Jm=m|5^-TvX`Gm&h3l@HH+(Y>J>VP~!VH zINCeAx;Rn(qy+=O&cyxVM=^SotH=AMx6n}R;D2zp<)m%#F5!hs_UPL5K`%=JB7^#k zf2lfKMpAXr*p1~Io4juamkndxscDzU4%^iWH5QIKU(@WpgL3&fJ=23OT9q-KmWC!i zHR^ToIn0Aa`)P3U_(*6F_QW*!>--QG9!Nq`jJgtZWvzwRTF=$aBVZiN=)yZ^iP})=cyGeXJrKd~rU+UO#rPTl2E2DDw z@@1Iz=<*aDi{}yQ;79onNOh?3P?N*l^Hf_Es$eL~GCH0I&sTEooOd8!Vce8#Wf0)f z&v7-Xjpl>6^=dEUsqH63Z%s>ANr{h+mYR2JUtOT_#eubZ?Z7n{$nbV?f8RMO8v!^g z???VH41a&Y_lunByU~QqesO^-iQQ#qkMQ%M{}X;JT=GsWCL`%L0Fvja8V%=th^%>N z=;fY!xpSQD*dLuu>x+D-cknZd^1M4{Y?XtPW97ATf*AKW_Y6dj%`sDI7+JhPfw5oi z*@N;Oc&t>%$xxD9+&gLwwBAO=v*{R;0(SM02IaShCIm0_!js68L{JLee$*VNbadne z43sLV*>qKb4DbD2`_W1Y%*8Qg(mC^p6{Cx_s8_2C+wJ4W{Cx>+Lq|x+YkJqgw{;K7 z^NLPh-+57>Lb&GE#=*r2gu5x_AK&{EE8Ot?-2Wkmc%K5XZ7D}+Hd~XWs*dDa z#!?eXr1QRNgNKrnV!N~diw>!r5B_y<#nCv$GaebC`UAwsfn8Y|;O{I)J8;q{wPcIx ziztaWUD>^pkD?il-bU8iUOeWnnsW!@!&8+aGuT!xY|Byr_SKSySWB>oZ5n%PdyB{Gu`3GA zY9hGOOjod-ouez`oLbvEjEcmDkF}gjGNKamonQ<;zb5nmylAzn7u=B4;K=Btd4IdW`DLCCE z>D65bYkC(mJB{!Rb**jXyJ}t7?GOxEk<&%N1!$y-<%R z&l=L~EzQW}UJD&|nt50onhMV}@SnC;! z%rs(It&ML^ZT_t-?LVy=4Sc2-3^y)Up)l|zW?9rNqc{uqOEu^F?`@ZcPfU%C(uO&< zl6i}Mje@jPEPM^@%>9lk-mzm#a+TZZ7!D`kUEj;`4Qy1*fu;-TfWL6*0a9Nrw?|o{B70Kg@PYK=VPXq( zC{TuEt~y8+=hKY|7_A`X*_SSdCiR}7>1A-rT`rgI9KRhml-pVt6cUqvd26@k`|JI2 zjys%#A-^V)p*X9LC1I9P<3r)HmnIEb=``K)IMGdb1hXx3GTDNKeQm*2P|vU`rS;k7 z=~`95U_(Ph{|~lB&T=Puz20sy78a=z-BHm;q7RsOewUEaLd;TYZR{K^Yg~&KZJd5o zD!bzOMTO9{$V*{H2#M5vD{2)wDFK8*Cr$$k|IDcoqX`28Xrb+(Cc53s{s$ludfWX@ zP1HK88Y+tJCN|`Ic6F8nsT>TLUEuB18fCJ$b7!J0>vcwWkKZ zwIz>+?tg-Qy0{z~dnkvb)849LwR?4^aj)fU zi)l#dIi2EC$6|1sCBbE_reqRkm&7FSmIR3dTdtHnCP#KYOmtn%H3pQEGwGTI0jn1W zYxcJ*N8rjo&w9UU$Zg%c&i_lfOnp->cklm0xlmlV?-x~g(NrcgpjGzUrU`S&0?bg2 zM#BN?Iy57+i?C-)g$1@vqKhKiP8x%gB-kq!0^O^(B_ z_P5{rc6FhHh@K9(c$AiJ^B=?wk>k7gSa_w0bBdzV(q9~z9Pb_;f0Nd>6c|QnGeMu~ z98Kx12}zjs#RA=wFX=^1$1qr?0wC-b%w4nj0CGShxpkl55#FC0@t(^H&B zgV%+$T4&dJ3&3v}H)RfBZAo2;Fl)C}^WP_xsf^u`{tjAH7pBe#-2S_fzn&#kv+0UQ zUfQo*T2vC^u8l4e5i`8WJN)_KVgo~o#tXAPy`9l417a?k8^|8YP-fv`+H^E{*bmU0 z7PwzYYX|{J7kpJGG>#3-+dC>QGCi7Mw(ae1aNlBS&#{--ckyc zGJqp7znsaGpi@1`;c|^^tuE)MLoeMD%tO^4lagBd*S+oR8G59~Vz`pY)o6!4oJCzY z>HRyCWt1$!*}vprQG1~zby|d1Za4qotYVV6-vH-tBj<{;<$WY@CYkuZgo$y=l(G@I zXBo}7XA+n{0$+REbBYV#)U8*)Z4(wJ|AB6Ag=rl>$1zxJDc8%bwKn^zysCuqJgtBr z%5pbb(}Mgmax@V<0G^qR(T~ zOxtr=N`TNlfdQZ-&>8rktN{!c-L|bD*=B1o#*?a5PrGQ3CpA6SUWbpoW=Fng_%1Q2-gO89HuPQT%ffBSksf?Bej*#F>VSCJ3 zsYGu}Yss|E3`SqzYc?3;GJQ;CWKVON3<@ZaL@@mQtZ9m*K#!y&h`0Zf`_wl$x)f43 zwDnh}LS#Z2rM*T9=Yy5AX;D`~W&Hkf?9ekF%5)Bc33F;H#zXAwd6)tu!j7UoY;_EX zZA>VlGKXQr`tix3F^L^G9=aE7H6VeMt7JBn!AtHn@@B$86&Q`d?^jk1gJO*OcA8*` zTFiTGNr4C^X%6hY&=)dsw+FryqeKjPoIt9gRx{pB=Pn<+C1!hTzY;GBK02PK$J;Cz z?uA%JU0=>hklTWGF+;0EkR>eHfno(OI}sT*w-D~lxOZ?f(%RH)$cp#@cX0U0i>I?9 ztjJN3<3UK(U}9%p`+}raEGHYGCb(o&LBB#8KPP(hu)kOBMcro_VQg^j(07k9U~G|{ zeY(p}fkNZ_hcxth6yT@*+wWdGS&(C2Du=%Y7i6m0v1hZb8=sG>yRp4d_KpvauJ$f| z=)lt1?zT%B@^}$6&|iHFNAE+yBxl*?l>-~dWA4lioHjDottdt7g=)YdDn z)RGI5%o!-1&Dr-3+#!{)^=y$-jtJb{kbYO#$<+LK=4-xCd%V4Kadov93_e~&tTgyB z`xwXR>2ft+hj{b&#GKsavbz;XGKW!h*~+l|8#1LcG&Hol-e_i=JMY~tj#Epciu>XI z_V(eox7}liBO|-XP}CATo}TIgo6G%^iy%*1LC%RD>=M*wnsJVk_*GSYXtJDNX41~o z_{hZLGRgl>fcS@4=7D?ZR1ivDZMSL>TwUIlp=_*WT{X2%mfrm1?lDofyXCL%VRI2H z&*Cb3>lxYvFLOTxDIei*BOj@|L-ksp+PHmqc)Ih)+l=++qf5>GmrviX`n-Uosy_8& zPNo#g}9m1fH!1I32RtCC5dh+*fL0-&E z&D9l|O)VuiOVsLP4vYUW+z}OAWt_zhE|Pj93+JzcgZ;CeE8CJ{r}v&WX-OG#*cc48i?lPTK;1Ri4IS*xc-99L2vFJ6t{O$ z;TCOsS+Z;AlelQ}yeXcU#B-HI$}F#TM+1k(lZ}Yp6}?gFi@Oj*g-`Az0>dm(f*?zp zmCseRw-s^OX0RV(ydP~w2X#m@zBvlttHaOK?hanYx+qeBR0NAcWAK5eQ=5Q@0vjEN z;K>_7@jW9gxVkyHy*)i$iyzdUO21B6OLP#D==`{FF^^I;rI+c9ctwc|urnHblmt$R|*k1qxQJT@fEljJP3WoYcs;Vi! zDNhd#yv@Y6U~0U4ID5`B&M%c=#x?x6@$47(T*57O(A{q1y^Gg9Yf^cMclpZPGn-8a z#_A~V5t2W8(mwjRtM|Ci=FXn3Y7}234M=mXVPJfJ_a#HNviRGl0tYttj!Q{ z!hYo>{U!w{vCaN92G<%1Q`y^hHJ|(qhQu&9-?=!@M{E`j!j4oDMVHodck|Ptdvs$0 zT~2x)m|yH2ox+9c+nD%O0J9+CrKKB|%CWG9bhu}13mLd3lB7@!51)A*@Xoz8JN+9w zU2nZ7_o&E}n95e72$5?$`Edp7@Ze8`pO68AlvGMSFukz;W4=|*=l!qPBbCWqoqYDm z{@xzU1|p=Cp@I2rp8rDiY~Z!7M_Q@|f9}nShr=jzSpwLmb>>B!-QHx;kS>+Uhvmbc z4L3`l*vd*we7Imu&2^I~#p`s7D1>{Ecz*z3QaU56AojcI;m9M;s=`k>hx2yva^X<$ zonN7#8RsV!e2}*t%j7GKm)Ji7un_{d(A5?0>I;o8DG_`IKcLy-d{rvaKd5!$2?PFg zj$A8%j5MhO)N#+NvH8>fKk~bXws4|QtOV7Jn@pT8<2CS53{}O{sz3sGVMjbId*zrt^Y%KQB z68Tm%@HAe0kO~~~Uu&<(O_OqJc3G=WyUPfwWN(n*YztDAY0Yz(6u|r8{8WdcStuZI z)6@DvI5-9t6l`_>j5|8|rKk4s^gEpLV!ihJ6IDk%Ppfa6gJRZObD*Z$hN=k{4o)_S zu4`y%rlhurCaZP0t8TD|f_Ar;j7^ABpXui28A0xDsU95_vDzr47JieTh(bU5tQ-yP zERNp|hudF*7Vaeal+FLhOCaCQt|kQyQ!?cc18Ai$Hw@2`Lz-&el9%i#U)D-Ch!yF3 zCz%f+(o!`+qM*jO6IR|%{4ZJ}--~8V4zsK!9r**AK?!;fMQrFV2RzG|4of|)W<%2P z%bj;&$Al76pQqu^Lzm>4G^D_};Dq|5z5$!tPZc}aL;S@#X;x7v_LTJW{>zMdO)8O# zN#|NJ7ehxSqwbavRDStR`b9du89xmz(6jIw*7$8&lGHUpRQ(e;(CFn*$iwddtp#6* z5aAZ58SYwrq(H8eih8qk_g;Ii8C*(g{0}K6_?a$sDASnfxkJXME!}@=%oiW=#Ftbz zf*>D|=AnYCV4Ev!jZhC(OnmRGOeDoo($-q=0okemf@9r_5f|Y;zyt{BP*bb~u1m|_ z_e82~)=cT&qX9{s_LZ(r`cCR?*Ru@ggEr{==Vgp2y+^rl;Q0AJh}&yFKz z6PtynHl=iYGSd9NVBYoa{CHH3T71vtJZ^p0*u1~884|2%D5|bz8{)VC-?o(xhV;D} z*Xo?%_Q#A|Z`2)V!z!kF2t_K#%Ja`mFhZ7Wdv>&W3~OrQvc$GN*M32vo?C+LEd)!T zb-L|}CReEr#lJhY=cr{{cLkxytQCn@5=Qi17M`SIG-Yof2b2MWs+zJilTBib)Q=ar zo-a(S->K#L?CpD9;*2~B|gIn_B6$FNx_FU?NCEoV!?EnKa zJQAmGQ^t+JPZVCdr^|4EGJ@<~FElR2YfGOY9gr0v)z#>D)28*BVt z6;XL^+}@A!5I$6Q>{iI)a`^6}^cTpv`%~Vb_rKu&YrOfd80Yg3gF3|jm~g%y&t3n& zG{b+bIXm|?-_bXt8FhfoD;+^gerT_aO*djF`DLO(5|K)e(ce_7DkrzOBD^#kc*2-L zufC;Ugkn>HT|4X!`Q{#&;{ z$n*0oU{5pj?@spFrEJx&Nnc|IJa@L((nIu3+G{W7g}oEAANAiucN{AxX!4OUzUVh1 zO0PBAWhh%+DAKb1@wl;qQ*ir%paAygVGO!W_dG*LG}8OX;6jBt_D<0d7W+5z;{aVn z9yh`asN9kYzuc%~d)U^F-7I6K4zdirED`43kukQ)3=P2tVz726Jkz%i$QQQ47?p`f z$6fdC>n%}@qsW>HGnA-&vMzpq)j^n|*|I;Tqj=9M=JIG?e;cy3WSzN~x|d z__ywbu<6qCU^0K5GCL4imABK=oCcnPh#na_Cenyt@OWRn>nj)BlVeqbICQ$jq!L>! zpRCvLi?7S*X!khqMv%R#<)}G9j>5H*vopqw3lAFtY}e3;H`hQ6uIgdU4cN@Z{_^_r z(&F+-Vyy%}bfQUl+eu1%TN84@0zQvnSq=yxc|#R_ZW^?-zq#Z8nPJ6Mh~TBg`sQN+ z7>^89VrsNCcJT5t^hjb%Gd%0RzT~7%pLwSOYa&iWcvj_+b{l9!bpJVY8XWFSdi=LMg)J;!;HPvE?;d9f5b9xvF(D!zy9TBwGW7jy8OU40H!N`r`=dIYA*I;G_*!Or4|0aj?C+6E*py>@dPA#v zCJ!)27U@3} ztPIKle&bi`2>7g8PH9nqxX#fnQnsacfZk|6o^sSHn3~FOL}1%vr;9g|>3Do4-KCH! z{W~!c%zKr(TXDPATDKw7E=FjU#);0N)b_ifqHijj&aY&-0Yz*=k9;5F>N2@mGcUc- zZ#~z$&v%p`Dgtb7i%s_XWW!4iJqkXiQZ6Vt&)!)VmnPr7@74jnTx2lGM;^-**o&}@KdIgjMi-uJ4ZoFhvih|VUxhB zA|eyDMlV)@Hyr8*tJFdo0%_uNRkF0{&9s`3?p%k5^)@6G*b;@x15$m z+A)>{~9W7!T|X7BDkmqLoIok_gi7+jbDqx>}%H3WSsxt-{SuK-@_ zyoKvD+X8}>Yrjq$#k(_Zn7WH&i- z$f}q8)h0(p5YgjWuu7^g56{GOT#PBa3`43?D}EwWN-CHUiaB{vVeqxSbLVB6o?9)bx0D!`DRqVUTs79p>s#8`xpkpX-Hg}nD$$`&9DDk2~pAg(+rz#lI> z%5eWv)%RnV}WR9UPtHgY_a^hysYZ@z^OWjcyV=UM8BZ3GmsR)z1nWo zU#z@744J1r9!JL?7uqRPQS__Dk47y0G0ZCIUnr;hCV<+Hbo4ddKL~R){~vYl7%NK9h3RhFwsp3Rvu)e9ZQHhO z+qQMKZQIuDZ{~h;bCa9-KS_0^synS!-JMFWXT9sxUWV#*#(#y7pFOPoay(GNJPM3J z*6Gdc>+3`DyhP5-uXiau_qpR(QI}b3&v8p>Wf}J>bd)_4F9pfIpdk!M*8c`1wxZIq zf+~xP)HY5FuH|0s33%G@!=`jD^ouBoK38RIzvD#$ZSIGNPj%!FZ3aD-oc#>q(+*ZP zTAM55?4YE=Hu!c_e{MDJAJK90L$W=y8IeKs*_x)CqCWZwKO_sRb2W6xW1C6RH^kQh zIX7b&x%liN8T-9A;qmk5L$!qzv+x$Xz0|RUfHywz?Ayqwe+lFLgoRQW<#={4>N6CD zwC{Yh<@p3<)1(Du#Dt1ItfeT}Ppm#@BnEXqR+duNdHBcygG$Im=~Fh;`|&6?6A*pP zyJ-w`R>!e$--jOkxbmV2*%OasgoCJ_w|Bh_+}{sS=bJ@Z;Ter=VJ|ZrSh6UTv`DD4 z_bTDbHNC*-9~d9*NHv-ga#$weAW7bv#7@nDuCm_0k$S(khr3?3_?9bo~_fW<$%ribd zKI4@luOPWW#~;tdNFYD} zD1_nYA}&I!^dOVEfJ}Adks6ZGq-75oHz(Ei?^!&Hgmn!Hbk5eTDnL8MLwivTNM%V3 zi>u%r!DUR76A~J(C7@jCCSXv%it-`W1!w)a0C0oSd9<%EprnPp2yc zh}qaOEZd#7z5lMa3MfTXj>+4Pb}?_lADFbmn&a2oEpPn4I^n~yUQxS5OT!eK@$Nlk zCpuGN7|~;xm*?b?-nckJBQC2>-bkhO4#U%9_5(Jp-i_T>CCH|`Dd8*vGD6uG0f6c*BsW6WzW_t@Z`N0)^vn^9{){;<9!&T1^@eq}eqYnAE zZRnxQ}rr~Ne8bsHRDSvOTrgnI44&k`%lW%SE@YH^H-)1syi{VZz^|Jysxa%N zKbmIV;O^M7lt5~koK6hptaPR=i(^KyY#+r9aM3pWLMABMG18}uf5)w2RSp?VFC)`x zpcxcV*C&PtCym`o9iGO7Cx0IfdVj7p(C#*EmV_QCRyO8;TT4rvf0=a9ijDSO+wQn0 z&kon>_qPAz82j~%<@Db=0f!`XOP zm%0MFKet0SaYDZ@%bUVRVZ&{ciHP{g0f zLx5&P@7|7KMnhBev+8vu06)&89dKve&53r3K_DzE5BRbk;%sxzfr5Kq!?9$=JTQYwmb6phBJ zKgKZkX!Okj*g+0+YvMU8=1tkLcLQOcSd8vurPVM1@3y**mey*|RBt*3Tr&d7a$gD! z?1dnU{sb?s08i;`95ZOnjy(oAM!P}TyZxWhl|}karf69@^Rj;R*iKzaTj`|wsXtdh z8a0M2V%>wKv^;>WC@sL$`y%(0A4Kdi2!!5arM3k)vX1Po zmjd@d#@FM)g`rKm(~tQrV!D@DkLFBA-fD@$k7(eTkdwx=HuL~$L6EU7TwhUNCp7?( z0K{bI?iZE0FBW+z9o)E7#a^onmiD?ra977~UcB*J$Kh9tna3I3S=D>+*BUw9@wX;X zZ_&_O@J(&7{|Od8tWP}{F_dE+s{a-O--}+c51a(I*#D>aWSzy9c1%~|aS=JG3*T_< z4#@m3&2aW8DcPRdpUl$J?Yge-Y0=mbduUDMr}ADz#nqGdW_3&TxM1A%u)&m{uA0Pg zN&cD=NZrhXp00osndosa^@qz)qEEjoJ_o|h>d$Fr;s*4- zT+j6iNl?$W(-h7=W}H^@=^RYMWh4Mt@H_Z>sZ2RXo_)@;YEtp;TyY*#`#ph2^&o3%-C(r|+dYn z?(42oad}*HUR~ySetuy*Buz+-F@FP7Sn+Yo)_5`33uvSg8F_8X^|m**7by_7n|7$- z54|~7%82=qlt+iAp|D$=1t&Yg!kP51uDP#|kvUK3!sI z1{x~owOyevPhHmeZLSZrz@jksbCLe)cEW>8dZ8{#R987LqIf*yb`|kV{41cBihnCqNyvP><+V_ihuh~&i%t1r-LIW{dzS=Tl@Rr}qT=O+i( zQMDd<|Y*cgvji&V@S z5snux+Er`Y;&B%KyZ#1|f&h#WZYNivyH3)ufjjP`GEAnQ&P;#XM8RO^%8dNgCiN9n? z{-tF)wuLu_Uog&$0xPoGAmbvZifpr=zpJYrQv7C{ob~>c&$+C(mkMnR5EPyoSBLu5 zOVvvuhzbjKacg)II9uzV_*19m1aZ6@ejWy&Gt$Oiv?~JlA|jrVjdAR&C}2zY1*+EILcYcOMrfr|d-O zP|8Sn+LCgNrFmBqkmKT3`S3jCs062_K zP6l8tacv1gb_XF@S=FOK9(NCcw`IAa#piYO=( zibpBb<>=lwF?Nr5Rkt9!pRAdbpfM&Qgf$_u53vu5d_YYhe+>)*@ZAnBHP$)|BouS?2oSqj^V^VN zgGn)l2x;rEK_Jx3w$Ru}g&9UkS@*N(`-aEdA(E6L!avgS@kKgZ&?!dsK?##o6r`f^ za%#&U3RElzaV;RiId>xMsOKQeaa@9q-?)%vsX&F^KmQ=BAPP(ACgQdqC#rY>rRhfH zOgct#iYeg>wE>ReizsI+u*4>Dtk_9QV(L^h3ZZ{SNk?QZAA8gNe7yI7ikqCA(eCa^ zk7|93tycSFE{FbGnmiKX)w6|*isx*1k4rAMr4f+~$X)(-0b0o6PO9w%6Ca2tzNiZe z2=F~Yg2J|{>j(R-?!ZC#NLHx>U|Co7ey2*SuOM~mApd)#`70kQ7otpRNF7 z-s{&|0=h{_X=!PRDSFr?1rLnWazAZk1jh(G9q*(UVBB0S+Ppyek4`-D*yqbI!cQ$f zVVS@1#TJV;h7m=cUPdRE8OFcrWAx(_H69ew>1jVGPNqqx5mI-3n~WIDyc3#E-`!yU zPeRyUpb~iF&YQEbtD_xnPGe!MXLwLdCD0N$S)lKaON9N81?>TFdov$s?)$hdBMMiuDFzV8?Gcj%<7AL_jcWELUI{tJRN1}Z%Z8`ue zhH=ugMdq4*&`qSM-JTA9;g1mEt(o0%^5ElUW@Tj*#&jLJ-kooD`71}6hRoC6EcUG2 ztM{(|>M;*jB7J(8nRuj(YteLtGw-vPr!W5M-Hkcz?FAb5lB@2kiS|Wjdwp`YvqGA$ z53~Au@tyz3L?vT~+j6*n++j3oZQS4^x82oQI!u@Hz&vo!?pPn+dVWzgz8UUvB&EWS zcsx>3jU}erAn|5*sg0p9C9*TEq+?gP*d63L0i|9-n)5{F(Ke(yjy`7-nc5V)&RYve z1{~4)X9IP*+}V8b&-}fld8o(LF5eH>F%Mp3XeJTM@{F{L`1~No<|$VhVxzCmCL>ga z`MYyiSppAP{hHNn+BBr5vJH^?OJirDEd^a~Q5k(0E$vb!&42`Es}kCZE*F78FU2Pe zY_M6Mpdze}Pq)jCl3gc;FZ!a6CC+Y<_!!OeDflKop%N|}E**XPr`gW-7!d3yd~wJa znTPX^ea%+Bbguko7>^;2u0~G3pNKYNx!T{RS^MpdX{CtZRZQB5 zyyTG>GL1((CtK_v_BDf4vUofrZ&Q^8I1XGsj^KX^vLWBkvD&L&BtUh0Ja=YV`C*M4HlEX?Vtw^n_%?>4stB!Z?D^u3C zk@#O{I4!yTL}9SuWc{%jqWy{4NLEA7R2?jJP7T2;BL$;T1C=QrKYS&dIW(#T>h7%e z1ryTAvm6(RGSOrzoVYta(YG0QDXnJ0G#|SSvumyy__+(+NOF(%_6%SNuprV|*gJzn z6Tq<*>ZPq;8o1xJgGw!}NU5vM!|VV>{*;-P0%U(GXWzUC(AFDaVTH9ELRNa6wVg=u zPS%Xx4poy+VgqW}k8sh_p45d(21~96?4=5QC0nxNCqTo3d2aB&$gN>2f0f!HVcmXV zRx0M5&aP}#n!x1cr_e2hWY(TWp}FIXttQvpF3h>v^X%ARt@V6#mCgd{qVurKRAb%@ zVH6ru#ED7upzmi#Cp3n&Gz6H|`ufI3XMsIknsa3Hwtq`+ErHd|u-`s^xC5B$OKExY zt2%#-q1GoRw%3~TT+L-nAJ?pHjAJ|0OIn{%h_nb@o@3h5ieij`a;YaFTU#2suR!K_ zy5m>4ZH1Fng-!k5eYD3G=3;aAt=#z`XbL`>Y;!mZ`|w^^5e z)r4!uGT_6rxRekOQ&sxd1sp3lxxtR?q|F~*22Q4|aW1X(+HNgG@)GMSJY$~W;9OW; zdc>;(^`=ENbxcK!$hn2q_7*(Xp%LiWdAcm->=Hw$3K3r}RxXGw^_y7#bXQcR(wKlXkH#G(Z9mUMhV>vY35lRDJ0l<2-7x`EJu|W_87v;RrOgkj1 z!vxdeh4WFF_42siK=;odR&up!qMVpr8d;t}3kVxCeQfDzh>Hpt-(EM<%+zdohL1SM zeE+LHQ{>NO(|)mJp5IAA%z8Q8xBpX!8+`VPHX&7TJZGEC@KrfwJ);_eJ(<&?)z?7V zBzK-ieU&5E%4{!wE;T58!qRa5G~mV|TVU!e8^MSyIp^*~*D7i-T+I7QbLP1HwhZ$R6Tu1QGB3;8x zd(7oV3|t=J@JR2O`r*akk*rrWKTC^i07)|qtqXiINMXL;pZa>H5}Y z;Kfy;oDWUG&kiaqNA6*Ho!AWYQk=0Owm)?V?gp^m>&x06lGFi^$hH9}94{h0#_gNP z7ggR%gfZb-QOYDFB&Mu2x6mQPbavQ6^*leeMu;>|m*arf#Z=-o3sos&QP?+kn&GvRd79XjKThEgpHW~UN_QvL4FOUE;+_Obe zc@rUGxSJZ|C^`I3YCwo|n{IU!ToytkgEA6-USLT^P7Ib`^!pEmp-mB``+i^gp3z`u-&NvfSpGf54&{ z*CEj8h@$GIyid<+p69sq;(HTMvkFgv`{WKUJA`EgDXq=*4y)wllpmCjtK7o#`kJ7q zOqqsSyH3iks@RXz2Z4sc(+e&FyO|yiMo_4h0!M*8Rq8tY=mw(}BA{CrFCj<)g`LtI zIeHRG`AxqCme`rMK8fcNO!V-_n}M9X`_dO5+E)EaD|BIc*_T)xPw3{B%fu}eyfvn? zBLyo3z>$spa}^M4t_0R3y(Y&Cm06m*$4LBjS!{YCGU5+%>qH!lw2RMhxNyWjk6dfckRi?gu5 zOw!3y&n9Fd`rbAXUyr|%ioP#q=4Cxe@uYaN1e^A~)LnN4o*N{_E#xcOGWH}jO5M`aQwX+MYO?G&S*7Y$d86$EegaDBZ$xHJCsq)p%*7UqPfRIO)5U~il;8%vC zumzNUIHfmOp9dSn6CpEo|2Sn7G(oL%jy-Z&YTdnVH9lS?k0_|Ffw%=Nq$=QBDQQzF#K~ZUdrM&!C z@ec^<&!WU#E=q^)#GQ|k9=*grIyn^VJ274K;2u#vYr}AQt|uE3RAUs8x=$B`nRLC~ zMNC<6_WR^=vhUD#94fX7?LW4`p|Vc)J^gZW^U7(Ba`<5Txz?`oC#x|fNmYj8TeT0G zp7#Bn+QvA#n^Hg}4AZDX-vgI(geDiro9(I-Ve786c$Sj-wOo~rznC);xmU2Q3n-0K z;85ynD=wAsv`PG=?kBcmrh3@+1=-pP?t4jK6?5*a-4<+pd)n!&Sa2FV6DK<7B_$t{2yi5SQ_lX0m ziD6L}a*a4x&IZ?$%!Cmiv`$`Yr-N#|?lc?IdK%AG=XC*h@9Lz0(|1xE{#$rOyh8M= z85~v6B523ahfx8{+=??tqodP!P2E;;|E3fIHj)N}l?K++fHX_Qx0;AXWKTVja8uPX zH<;mnrrdS9?>o0B!P|_!^XFvpBDL~wNP&}d%dfx3mxXl=dPm59Rg+i zQO?kr;Z~C01#0B<5KcL?AXfLyHg@Hh!GA$*Xz_x+eG+PKQI7NG8uOciBD0%|{Y>u< zzpOk%NfM?0yiiBry8ISM-3wdL!;ixd{uRd|NUf8?j?#Slpa~Bta^Vu~ zL}%5(De6V1YqTRB((Z_&Hh#W;Q9srPbnn<+WZ4bLsLmeOr6PZ&faUDz6b{ADS%wfx zapIV2Vp96R1yH8+AZAGoi%7C6OM{R9VzR4tsOXCgsv7n_$sSjz5QH;fBJ=VlH>)gh z8Yp4Hgu|Y4W76K#1E){DY#t{zv@<{B1`868B1LDoL%D`+I8^vs%A#Qu@bBn zhRtQcDEy^|on>o?xICNO-Wg61S89+r?4%ieQmv!Y=v&-?vF1#uqO+S-!{{hB{=wCh zp~oM?y?LNkB8$%Zx&|Qffyq->XOfNVHOESjG6&y|sUG4Ci1i8q*P=I2;EzLjiPBj@ z+C=)l3Ov|9s0vd-59SSKgl6jc_Qp6xL)&FVthkA(i!=RL`hjM-PVW3#iq z$*CfBi*u|mz8`=adZu8Ojt5)CGP!}hr=}gB9BM+MRp%-(eZs9Kr{&KsPp2yD5hA3| z0a1N)8}6@fGzI5nSv71@I&K@W8?SF~uGfd?yCyGxDymO_8wLa zIYNYVQ!+B$lJ+TRO%XY2`pO;=_Np)Abib;^2Da_lMB*?98Q{NSC~xC)-@lGcJgkmR zPw){_j0TdJBK{-RTdG%d_`2h7eK)8*B%!(P!eLD3}MjFwmHhp40P}Zh6xd@-eG!OQ!>~ zcCP5T%pg(c#WN?N5&Ft%!g;k1(z4K{kiKdllmN9Y4hMzXQ0U7 zu|>5KD$88^f*$?67I?XJ7MGuz>x1>%B=3~LiFtE+)nhwFC-h=p_OTNz2pePUvZ%$~ z&3e7}B;J~2Y}o~kW1;$UXDx3vt#r`X+$F7H6CoQ3KV7&s z4Ump{^ufA`qS%V~{pI1|CXjm>$e&SH_HcVwo`BSRe?v=)-3+yC;V2&G_X`!gwY-L< zT=DvS zR!4i=9g-u29bndlfeU&xSgt(N7Z{u%s;@GjA~r~ZzI2Yf!Ne1jk4iiNnF~x_ZR1YI zH*1*~QZ$BS%drn8>QEks7cxu;49>t#DsiU4EvbpE1x|X_L51=14ie=n#WGd=FHnBZ ztYw>Y7$*H>gko@~98P?bwNq(94esVtbD(8pf#x~ApsN`0+H=C_8#}uz9y^$?MB_5-_D9oz#5z>hq4Fis z{5DHa#2NUpb5l{rAKX^0C_L_^OsgqxiV|d}dQw+i*ovZPhedc0|EW;LCw8`ciL+@y z_9Lxh40^AlfyaLiEO=RJu9mx4zrc-#&~2(T8-CSaS@Ejy6y;6~m7Z^&)e^M@;u1vZ z!9irlDYRpzItZwGs0PbU8e*##trFr^Kf|}phI5(j$i$tIn=IJ%523HZa}`X*s_S{J z_TFKUv+CY-)?6)IP*v1T zN4X%Vy)OX+kJS_FMe-47!6^`U%MX=0o3;#Wb5HHpstQ9V?ONIeVZ9X^dM{Sv7CKCa zTiumUwUnl?LG$wsc3Un$vuCT2;Gp&9Ra8mvL)JLq*ZLvI?DA+{SM`D3B#XL|4>=Pp z$~nIJ@iW#@-=vrG(&z9F5=*>hXiRG*w0_TSJtQN<6RDeLY5;13PG9a~(q#$FdlSG5 zlgDik!D-|Vc$|_+qa7aUmw@dTkI`)Sn1?dq7KS&Ch2)k2%_oNFM_wfD!{Apq}6P1$fVPGtXag+4noSFN1w3H@VY>*ce#G3mI!Ud%3;Sd9R%sU;2 zk8bQgj=^f)4E5N-%z#Lt3EGc~HNUQ)cdSR21CjYO8%i~O8MuTqU0iYdZqYVe-a%%AsKUG$JAf-nG}?zKAvIR#uR&$82#P=yqpi_X~G+B@JM+}lD0BHS$s1iHwT2b4hXK5fNFN?;tby`lK z>^QQnM&(qHTHXSNh!w8^Jt^cZ2_MP2Q*@i9zhGOBRV6q0oI3TK+=+z&!bysG9xa)p zG_28@_S+bs9wLDy&CAM`%Y0i}hih*w^K06?xzyb+)x9cY_V9$z5l*-gI)1YxZAO#; zfL7nunZSPLis+ckZciAv zIP*e9)Lu(?qI`DI^JMbGhh`7EOSxE*eGaj#s$4e-+-9=>#LZiYY*y0Cbw0sr9hq=c zANc1G%F&whDFcdIDy(F1B?`zAZY0ERfy~H(_BsBLTrZ$zg?UB znx5z0MzRit8?GGC<_27CsJUB@AV{$oDTRT4Gb`(;Y&dB(zUgrsYSvT$k{WW zWl2onfoN(A`m=wD<#??VlA!a=VRLC~K1jI~Lv;SCU70&wT}W3ri4N>qkFwXau@BU< z$W(xb9heW#-4B7&>k?=opV$|NArbsYGHB``5Fw`cb*=G)mk$Na~2UrvNoqCTy>5ITTUpG>*}GSOPds? zN!0d08dR7??>dLVmd>$zL02-}sCg#wBJlSMaTp6Ps*4=Y3U`xJ+pvH5NC|2&FGSCz z)NXMFwi)f$`5tWC;x+F z97Woovon>L7S-#J7?O}zY7{0~w2*sSHuA~Gu?6#L+(I`8q!X+Vz4@-y$0VPwZBS@w zD%-&L`mRe~pbY`?{NfPnl9MY^6a}u{c|iM!w3J`-sIw}17sb5> zLx4r5a>J`5`Wbz3X~r{c>`d%Uf#3s)ySO&>RUhg21$3#Wg`&ELp6Q!+z=xyb`a~cns}@>fz=r}X20M_p*-30$&2+Nv>5>7uPBmVSptK$XiKa2 z6MfcLC;o<03{m;r9MnkxL~47=O3Gh$VWI>I3{=(HMTB9H110=vYZ1kIs3?8At3L2d zb~G_9RDRa(N10U|J3^$rXH2zXps?k;;_im5RfE`mCwNlcnn!1rE}~Q5sykeb1rQzj z){>RCZ^wqaHY;ikoNK?4rFfHXo$8hD_|tq6gb5Wb-2dogA14D9Q|<&3~nXmt|+z*yfw{qe%&!3@|F(?RLOcS!~o$PXA8HdTC@@I^vO*o~kehWi-0!vi%6v;sJJb#7&G6p&Z#pmHF@9*fs3nUU8d z#7Xhfv==pcp-&Xd{`yZ`M@!*=746{4oXS%MF+&p7#5JL4*ZtE{MYo+*+!emJfeFoi zYMN z%Fqt`VJtKB8-p#V6n$dtETJR#B$4gn(H((!F179HX1TiU+g%MLm|Z{h=O(d zV!ZSebpbWb8DOv{0Yi_PtZJB~l?|`6?2VM{AaPJ-W8=ft=W~5a>dVB=L-?JQwMAWS zZY=yfFm*WR6l#hbTg&ONbDlEX=MG%r{8JY4y_YX7+!0(byC{#Xhvr>fk$wn7Ls$Tb zZ{0P(u1@*16m9`Id}vT7U~N!4-!;h+yuU4utrzN3UWBm|IUHND33pAtHKlf1%~+(E zbzXXR|E63QC(L;ijEuMZeN{u3caj)pxn%Ujm3ErtgtXXXWiAmcs<2R3iT!qX$A_z& zTv=r&6-)r^xY;)e8sMpftUoUpU|@$E_~;VsJb6JUwAWsZjg6eCn$|bx`TmHTruzC| z0^+=pv4hg`#ddmmOV`-zh_gw|NyMO3&)a^S>rCg%4tPTtQ>iUSdnbQBV7>SjOmrH4 zW$a79pdRgvzpSO@{Y`R4W@ zks05=N*9sg2LqryKY;x0wpS047re3v2;Zef0~n+EzF)0)pU-rVK8#!}5PSQFf%jMa zZtcAs{ANLCbq1Kni-j(sC%7V56zm`PR=}YxiCpL@hxy`LsFT=zNOc! z+{UH}rIOa|72RCO@>AU}2C^vS?K_dS4t{N|YZ7Jp9#9K!M95(O>~U16Xxek_bB;-7 zdiKI}i74<2B2{F9u#(XV4^`mE)Tk>dRsE*kMCd8tU|`uj20hO0 z$;)#qFD(V8hUb#F@#QKxT?jb=3Lwz-GsG}?e%BCQ3d5P}nDvO$jh29G7=qMIJ{lk4! zbds#~!TPDcCT~z&G)d|1Ix|A!o0x!AF?eV7TXB3%?e!G5c_8xY1!W5$C*y zt{J;44?8OXDugLM&35U@5g?cFA9iEZklos@R)x5~eY^WmM(%Q$f`N9a+vfVM4+Caw zW@3gp14n`V5A&--h0-3AmwCfm#%GhL2pgnKmhAlR;ETLumC za%=2+k_kTiw1DqRq#+Ag=HC|=HmDCk4veTx57%+89Nw>^MvZk_*ynQ=72yRU(-*zC z`SRofNO^F%pPANk-9-U=P#?niD6mu2_I*c9w8k$ApwssKTs<2>$u&#c{W>GN_VpTm zI?2lZ8CYg`erv0>@FPtPBcuU!!)~3>yM4QaR@*!{-x~Ne{PPPkI7Vf}$st6lGJMRu zBmndR6&W}^mHKePplhWlvxb+yU;X9E^KXT_LSWHR1zvmo%41ZB4ScYZd-~fdowP?9 z^|+7Cvzw{Px*fQN^Z=|`wV?7hsHh@L6aC0G;De9nHx21eZ2ZrMiO++{gl%ezoX>mD zPb3|=@8%CnPw!V^(^2Y6%cRP_tMAp% z2HTMI&l%89KeGD)8?dey$HRh3Nu(wPuPx4(!(bn8k8UaI_mw%c@j`5&@0-PI?hnzA zN%svfOI)^(togI8u9NRu>f7|jw(CX;&0+Ko+}G0urrzu7eJkbuNQvg*mUvdnXD60|9{D~UxclRF+BV?Ktn|I4;~(hvT{TU z8fQK7f6GEcQMvfsQgKm9%?#210@VIPsquhWq5V&K?LU$X7Q{l#xxE_baYj{Gkmr+1)u_XGXt0Rv@hW8~=M zV61QbpO&qG1r!4_BLO|Ze_C8zbV}}a#sqX~vIf8Uu1-*Nip~a3|8tGFwZ5q_6rHNM zk&_t#8$Bx&otUw?shJZ28v_)bpskgygQA_j;qR_O#xCZD#-a}T?of0B=1z`s#twqE z)^@fw#x_m_>`-(f=2lL|4g_=}R{BoHLdJ%+M!$!ZGPW`OJuV|XJr57T|8sS2Sy%Ib zumAusg9JY%y%%OcSgZW&1XFtJFeTIfH&j=7SAfPj@QMF_250(z4gPohy7?ynlSkeF{C+t(c)aA81n#<{a8cUe_TRj5lnO+W3XU4!o!kf3wXP+~ zG$|3zcZTu%jO7BKwFkE+$i%5S&}c#sJsyDxS?a=Yp#=yUOi|9(ES;&(jmwdTU-`pRw1{&4Df zlIInlP_las$%gh8DCvlkwaJP545KD4gCvDOq8pVKkKA;NJaaeB{-8`a&;Eqts7#I- zrGA4mJe&}nEnMt9L;@`NN!9Z5#}?=nG&Urv{9Wtz;rvW@r23xk{&ryReTJPH{>bM& z^YKjD>=yIkvbfHP)yiaI6R~rhH{?kMe~AK8(Dl9K1NZ{*y@DbHNtME?4#0F%qiyH# zxE@HS`WVXg*~1EA9&z~CZ;zkF;WCT%Q+R?OcfbPvMeRIv2rC!;IRG`VR&iouun}hc z+%f`@+o{o@Win#Eg$8HB^z^CH{Y}kgJ8cJp6IwnZ(6I)|A_!nbghJWWii^+9B|MAP z`ikMXqb=vW`Ow}KdKy(O#FYL`>_^L} zeE(KG6L4^x#SVQj&8Gb0oy z5&sLQclk66tfvet5dfN|Sp0Ja^DoQ!KnD91)-AVm9Wdi|-n>FM?+;!T)&+K%1}yFw zO(1h!UI`k=y57N}1^v$oa5p|hUQkSfaKe%c3BY^+<`BNnl8ztN-*sXVOiZ)c_`|BJ zCDt;rK$dc>J*-y+XJTRd)XS8s043Zd#VYjQY&F-l3C$0~E5P;-TUsM$>U&m?&uiRAcoe;s_?0aeBB?sze`?dpqAHg1O@Hw0{--k^G?g!$3m{fG#-Nu`*q5j#`ZDX!SpD9w+ErkG{@bahS#scKZewuAD zqLz*zWNy$q?rejV0JddDr2}>ZBC_|rGr5M9bcfOFdScr%_y3bTMBXj|H)5C*m?wuG z-a#{KXzc)VJ9YXobCz8nzUL>6lJb(PJKb*sfFC&CRMv-dX zaW34t4&HV&J>nN${+2TrW-KllUfR`LYN;b z|I-iXKcdJawAP^IU#HFl)%pTREs+UqGG`TB=gK5>PM9Y8W8C;?KW1`fku@EXDcNTf zL)tK3I7pIdOekJ-Jd+ehn@yIV+bpOcv`i#UCbUCxWi%OgnMAXCLf2$JV>0*od#WUH z*2tpYrAeI?*di@SlE^%3ipV@=ipV)(N^b&Kd|=KBO*|sgo;6Yl*EvZ#%}kIrQdN-k zg3gSU$`zfQQY*4^?gV|5Isgrv7MC(drc=kD;IwQ=M#XsCMCpVSC(>DB)r2?&V<*`C zzqa8VN77`FrT-LgUkc0)Xe|+C-DWsIlnZ=L7mkWKk~h(kJ2S*X6=k#$xt~0frg#KxPN{3AZFposV=+tb(n!{AtiyR0a^K6&sVRT> z(0(87HBXn!s`DU`xsbSRg_d8>cQ7`QaBo|A9KcvfV*ysV-eV)){2XbiV9ijELN8!O z6ROOFm@{o$cv~o^I>o|P&z?wUcDcKB+BqXy;gvuAvJLM zn1_&BA3mGoABGqT?Ij246)s-jSNo+yj41LP1>kw`l4jZ?oFd#a{x@t7!gi6xK*4+)NP?nH_(` z6E)Uy^0VN?a57*?-36Q}st3BoDRi%lrHW{UeU?rv*d(Jg*Tv#6teIY@=ki55v~ptsVcTtjcVkEUhATw_SOdc^D$b)go7bq*q1X7rz4<(|-xl#p2$F;iP? z;l43!Hdi~P`gBs`o~gz&s)S~FD$XALmwS$_!AR#VluLrtx+3YMx8QW=r!LN>L9vX! z6JBArUaDb5Dkgpe>04lN+_5**eCybKAvhHlUnO~1P1 zi$7`AdH;2IwP%+Rj_j2MQR&ju#z@u;6QO%uQT+6N*P}yM)lzoc*3EQ9cf1RT^cb3-)LbRZQs^gRLMHSR$;hb1j(Gh;&4U|Y_q6TQ{ z4(-M6oXDLcno2D0rs8jlDp%}%TP z97zVv^@^7aw%@NxxEz2whAEc7NzN9&h2lQ@VPDlQ)hzrJ`Qmr6{CMDQ9Z4xr?ji1d zt$__t3EwOJKiGTAu)3Bke;5q}C&As_Ik>yKOK^90cPBW(JrLZT5L|=1ySw{)a&Py{ zz4z^z?w*;C|NVi7r*@rPt5z-9Yt?VBvUUwe%nx`Vn#q@RAg{xVAA8H+~SW(v3)dQ?B=GtR95RG5ZaFsVl~ed}!L*fBYK z!f2A6r8ghNF7jZXHu+*R$d>fJt;AZ?^AbOKx)aptwQtJ8c8z9yToq{(URzdCGEKN}xG3-KJG{!1 z+?2sEZ0flzCH2!JfB29m$=S6H4ChV;<^kZkY^KSMxPO>f4ggOc` zC2fVD@MyIAhvM$?JSEeUHmzWBRSlKZaWRdlARZ-r*AVALw1>LN{zuIksx=FhDX9u; zIYW2;dlw@3d1x64cRT1Nfg^YAau+FbZBp5bMkr4T5y2vpFS0~93Et)fRo-eM!Yw~) z!zg;wXtunlgX3_;f{#4adDP|4^WDjYbx=4~=84M_&$ehXVf&$01g0gaG&&9_wAr{(<-RFP)e0Ew7Qae;>ss_AXi#C*N@pczDwU zWvrPyaD=zq{(Yo3cbxp%XN=6e1~OnbmsmrmmO)0&o~?A8{40#+Wcuqk$bKojwMz`# z4`BF57`U6+Qmchh-z1n@_B#`+pglQsWIwC7gF9G#n|U08(T7QS8{s~s64z6Nc(+6OF1(=9@-O;po^$Ib z57803S}0mOb=vu)lgYFLo)&dM8`eKV%qLzZnkJ4RQzyhHwxvIEiZ0(MCoH+0?rvk< zE5DDne76I^dWh&5`A(7L62d`tI1_h6NG=QI)sns&V}9KYyBC+ad;e}Vwy~KDOHCH8 zm*?<$iTd4r-wELKjBil>{_Nu1+@@(Fmo{eaj=U7L?UB0iXpOXa#$<(E2(DW_^{H-4 z_=f}ZyA3sZfDYvhi-v^RRCP@}KbNXZUg;g7Zu(6b#pSV2To^2?bNI;vAsF~V{$pPA z86578Yi+TtZBoYNQVzUaB9XRM2E~m0fI@D$|7WLJX94kL+#BD`Tgb_O6sEHMXPEjg z-murhG`IV@hY#T7%n<>Qxd z^M}%*s#oUT^AD9Qw)O!4KcI(HitqyqMuHH?6NjhB&4s2w6%{|D15};RG$%C7L`)0KAg2(Fl*c1} z3Q}{zmhYFLlq*i@>?0&Xe>!Z2ON5p|`~hMn0#%m>t~o&{LVa8Zj)_{ASNnT^Y7y#G z7lQx(X?lzPQ82%cm5Z90l!q$K^;tpSx3Oq|4^pfPFo$BI0#X9J8?5T28llQ?!Y>M0 zzW?hka2Ux6m?GSP;+)^^{vw)E^T%I_;6}!T&OyZ;k3cXJ2}LQd`s@d*&nl$xB78}5$AS!gf%gSMR*yJ?r&*jAg1*nVpr`}#(UN$@K zy$cod^|G@Y&JS#SF+1Plb2E8yMP?GDP1dX#jYW9fULPMHNYxxFEF_ie8c%>Pl4(YB zCgBWoMhP(2ZFM=>9!!YE!D_n+1wV2nGU_MC!Hq>mlyAqKwlwY%*NA0d>lL#*vty{EbaWj3Si&I z@x$W9w#!BH@2`(Xp0Dgxr|G`dLIp}TUKlt1tAXIPwY3ec+}@$%JgSeftt!sbivzO? z_3k^yi&IlmTE2_lPqF112q!7oc%vS-m}9R?gBwVHn|p($mWo(;v=uIk*@!LFX*sveY?pv&E)mwNX3tX+gHOLz z%SJ-6G}rSeQP7EQe~iOmuzq)Bx+p_${~*3+;8mhvOoxn{n|iB;@IInmnxTD~Ledbv z!KdyvIug@e{VZgdsok@-UQS$w?yWm}3;bJGrkaMnju${hplxRzW?8m5TYJwAai-KQ zJ7Zz{$-GQ2@+X#)NI)^;@^#_bFpPD_qPy#sm!~LSG<7F*{rEvdX%OM=JN`LI16<5N zb@~{ox~u51;>G>xUu)Jn)p5`P9<~q81)N>|l#N$7GK(+)e(dsf?+dUMnEQN@Zap9s zokq${bvZjjnt+l{|MB?6WlAclm{5@Mg#H-~+511p3d15ontC0-T_eat{KW#MlfD!T z1)(5=#XH`ZFy6n<)j$~j7cX8Jg|9)UOsaf}R<1t~TZG9=KRJFE7RLWOqZ#u;fPCP4 zg8g&1inLoW_)Nz6^RKu(4R*TF5Rktnx%C!S@Jo7&N&h}EmpWz4n_XWQay4?!YVN!7 zXf@vQ*O#-4r#RaHzf2%?i{@OKc`?PPO!G2oj);2v?TtshoW@r)q@t+p&Kc9WISy;9#82&)(Cm5s59LG4)NL$ z2$1EaEY{Ns5T6YeHH%7o+v8=1F(o~>>SOM}V1BV{CXMxw0xXQ-Bx%i~vS?OP`qn9C z#(m95DuZLoCf11hJ&^O|_e;dZ#1GJGbqROhbz9;c&P+AaOoH)y2p0mtfGenKy!if* z0uA^O6wB`t3Kx^3J!|O%f4gV4NGUHiNw^t4fPzo5WH*++m7TY(^<`{xnH==pxiASh zDlhUEFlQ3n4L;` zazKEje`2(rjx&O0KDllrAF~lIl7Ilx;&R3eY?U8ivVK-zn(+Je^HkPDaR9^@Rs!5# z+;27qp9GzHX8{iE+*Jn(&tRRy3gjn^H1;^iADd4Q_SbOXpBep`@*Un-8nWQ5$Z^jQ zfWtDJ^eI>iU|RMcMMLl)FIY23b4gc)_Ir|bU04Ob<3=9j-;omr>!8q;?~|R6jfC+a ziig@-p&eWSO~?poD2-|zqA7LOn*Vx1YR}MjH-s3n8f!=*+~1HXT{UG=O?X_l@};ES zX&Zx>d5fCj?%b+AL1Y;}cHW5bo2HpYOnsGcN~_$anG`}_BmPpc2h%{!LqfwUP#IX& zr*?PL)haKs8n#Z_=DU)^+g)H{qs_jWGh-oL&ECmGgBRU@&2Q|w%ZrWRp-**DvAQpk zu~p?|4n|XUH?HwB$Hv}1i`tP{a%*HkP`BjAiSh&?eae+*II*evk>+ywhCST#)h_DA z?GtHr&ZQEC7c8;f;_17d4!jFc~eu;08+ zj6kPOaTt;VQw(*m!TX?LHFOr04HlnnPdp!XQuG&{W{YP0!J*<8j|Nh?RTe7MOonJF zQe6l=R>f|mI|SmV%Fn;`D7|&@T9aQ9*U9)Zfw=N5%3twVn(kjos-m}4R@yE#ShoX< z76t}JMn-A|mXwraa=F?p)|p@JjvnfHcyO*sEJ;5N#1TtIjFt{q)aZAI6x?!3(qI;5 zUR=@{?!}=d+SgrEnuV>_fpSv3S1QVO%1ud0d3t(sJz1=`-|BmLx*PlXv*=h!j>mb7 z=PoKXc5HO?Q?r8zZgI+C!K_3n@ED4>)7CRpMQsfc)r2$|Y&|~(c?RoF^d0Y|31HHz zp~lj9ai}H9KQ=0=82%R9wk^)cL8x7soc>cw;zylUzeaF!)m=)006ef&p;HdX!ckyp04#J>wBl8>L||4od}9< z+|}uNUG!da4Qe%5DL@?>cO5^43UK4MoJ4)ms#}Jp-0O9q?#Z>nY0oo;jgQCgQP+AL8H|e>T3t^meWc z(Yc1FU$yakf;Xkfz#hWG>JuW3sabqRBpPavD9Z+i?CI8MQa^4Uzd>g)gZjA zRm+3?v=pY66YQ5!CMY`5Vrc+xH20i|Ea#*u6MihShPOgE<8=WCzTEZ9_8rjQogWvDmt##xxb7gzw}b0#eVpxWAkx3 z7L;^z)rd|^%~Xi_RZe&rWr8l)<}BOV>IGU~R(*2ti!cb#DZuyCeN2$!{MI=yeZ=6K zks6<^F5k!K`Dvd{qS6OvDtBZedS3<`8VYE0v181^g&DR3%)#}+fDTE2@xw-8YGvEs zEUy)G5j+HBDyuv;(1@WG!JGM+gV%%p*3a+VADTPgklzC(_YD~nLGX!>NNK!Y5VszJ z_L+|;eC@D6KA7e+qzljr24%9g8!fM8(zUhuBw~i#CW^h5&Mg4XbV0|DEzpw!V%@@j zW54C%Y4SvR!_x!?vDQrD7VC-N0fn5Jd7{hR2;V8h{4WQyk=k%V*g;c@ns}n$*`plN z05h6hS3l^Qgd5HZ(mx&cf&nF(4Tf#aYQ4m{$jP{iij$7;J7>aoglNzjMV8<+uoYkD zUE&$t4EQpyL_=NiYeA=e;xBO?9In*D|ITiVS0PS?k9;iB9<630m1nu$JI3KN=ri!zudIBt*w7JH#m63ddQqbnR5N_@#nQ z82i_h{Zm~G*i>lWVA(qR-kp|S(p!_mQZL$Do;!qi8E#=acT)gewmkMPzg_N4#B|<{ zWax&P=E8PKm66GcgaGtlRX`7BDe5zaMb`FCV%?;u=Ay^Wedbj*vEbV{M4E>`{ zOiU~#IT_|140L}qHd|j`-=rZhpeeKr=ClC+{e>K8+%jEPDKV%CaMUVwfT0IoH?T^; zC+cYh?9b)-?_@kZJUnb{D)h?y?6jNg1ZbT+;HHXdoyz6Ktoa*aTJ#rT0mZ{(85~Lu zbo}e=-jCP7xQ&xqb|jjU@FiUQ_orA~4OxEmetEnJ4}bq`gw8naP)e!_o7vGLoBneW zD25`4^&)WC0JWuQAbR4xI!vZzs>&xaUJ`HCD znNMlx0!dfsQWuL(ZwSDe984gW%jSInIv&mnNMU~3Jk24cud=jsbQUPUp_zaoT`zV12sDmG^>lnmu+lIaBV%szWRn*##2cQ1aVEj) z;e_d_QyLi?%jWa-0rJqnK{5J)f&k+8AEbZza_}6J9?x(MT+^va5#0BX)iD7~Ck?3R zQ4~Rc3*mw3g1-jWNpm0LIzGQ{Yi9bXI`LC;0t0i!x-QxO`>6kapL&p#c```P5jOLH zHUKH#|DD`RP5rO`EZ^`?N6vx*re1_Me5qxH$^KF1>Q`pz-$Ate3z@6`8Ki}ok?l{Z zstHg~5D;j;oVTx~`0vr@bM+qN90PVCM&GA>1dyA_j%Va>2>ic>Kk-9foV{(&7VjS| zGsj<-S-{4|_K&b7X>%J(Am)ew0L(JlIsgHs1X>Kh-!OcFp;rU~oCvg77&++JnAjPZ z379yT=~&s=02~A?Oe}P4%nWR71k6mpHV!5hV0Qt6|3F6x7&@8T+5pp-1oSG35-`91 z5K!owaMIJ;FmZ5D@&d14#Quh@V)-@PpCs{rLn14H4!{UtW&@JQOb1}&U;_{^u>*i) zGqbV%%QP}GF#Lr^#{Wwinc3+WS(q6CKpL5VtmObw%ftetk(GfJ@Ndw__!k=gfKmJJ zAX7~29DjyP;S9%YHC>!mj&pQ6M2M)yL7>47SbL610AFGfj^9OofmnFv`%H9`XH-k7 zQ8STweLZiT(qquBTcnly{y-P<@+xp>)uU8pobdke=&t)aB9?%=A>89PcZnbOFbbyz zCg0#V7Cy8DdAp@-JpNb$DXZ&limuok%l4^AL;wEfaerA` z;`1^_SmCOv>cQ}%m)3`aqAcyr!S_uw8AlgUmu^w9Q0C?_a$UOYAfj3@R8y^T4UrG5 z>b1n<<;2b>Q$w#6au)n^a%j?=ES@MHNvucIz6^IV>IY18`i|G~N95&T!h7bhV*eB5 z`(VF&2sHR{$R7b!$6a}}!eQalc;v!V;5hIB$M5?WVQfIUYhtxW@7fmg2@t_g$kGl& z-Y7nL+Td3N57GrR#i7#>cJvMxvwsfN;T25LbCSQpv~WFi53h55o_~bSt@x;$#d9v< z#y6v0G$(B{WkQPN$WKxQpMiefNzL1c-+!af0pfyXYJ*|nFu z<<1;^Jl~;Ew2L$&%S_-es{X_vWi($QQjSxb%%#a$W`ywpwR$3NE1`)?EVD9~Jm|eF zVTsBU4~Yd}^DSd==sjJ$m606!MTudJT%0A$9pm!g8OwEEut^|t```)z?E8rm%{wjf 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�NXp+rL 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

C=HOL!HfCVH(5AyiuJ+6gB(CtElo6@4=!7j23` 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

>I_sy1vd)_abv2J4S2% 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 z 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 z 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%0As%h;)OXCvp;j6=%b&|09cc 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