MyBatis代码分析资料_第1页
MyBatis代码分析资料_第2页
MyBatis代码分析资料_第3页
MyBatis代码分析资料_第4页
MyBatis代码分析资料_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、MyBatisBy:satan_0103基本配置:3 zrc-t* app+ L_ Main, j vf*莒 r dvipain :+ 0 User, javaUserMappiiiLg. KnlXj logback- semi禺 rnybitiE. KmlHi JKE System Library JavtSE-!. T 目Web A.pp Li br ar i es& WebContentD build:b D META-IHF -G> ffEB-IHFlogback-classj c_1s 0.7f j ar logbiek-core-l_ 0. 7. jar mybati

2、s3a L I. jar postjgresql9- 1902- jd'b|c4biii. j sl£4j-Api-1.7.2.眩S- & libarmybatis.xml<7xml versioE=P|!l, 0" encodi.ng= "JIFF-£" ?>DOCTYPE configuration PUBLIC "-/mybatis工g/DTD Config 3.0/EN"/rnybanrs erg/dtd/mybatis3-eenf1g dtdw> <confiouration

3、><typeAlia3es><tipp&AliLa5 匕匹亡 doiEarn E7占巴£" alias= nUser"/><71 ypeAliases>皂 nvi rc murent s default= Mdevel opmsn t ">< envi r nine nt i d= "dsvelopzEen cnranaacElcnManager type"<dataSouxGe 匸评启="PCLED1<prope 二匸y nariie= r/dri

4、ver " value= Marg postgrssq;! Dri verpp ><prDperty nane*MuriM valme*pljdhsr:pasturesql:/U70 0-1 rSdJ/Cpen1*?<prcpert;y name wusernanserr value* pppO5tgrres"/><prcipert;y name = ripassvordrr val.口皂="归国七孑芒合氐眸/></且日匸aSouree></environme口上 ></ envi r o nine

5、 nr s > |<inappers>CniApp-ftr reBouree"wdoBiain./t75*r2d.ppmg. xml W</rftappexs></C0 口壬:1甘口3:且匸1口11UserMappi ng.xml<?xnl version= '*1.On encodlng= "JTF-S'H ?><!DOCTYPE mapper PUBLIC "-/rnybatisaEg/DTD Mapper 30/EN" "http; /mybatis org/dtd/m

6、ybatis-3-inapper dtd*A<mapper namespace= ,rorg-«sybatisr exiupie BiogMppr*><reaultMap Jtype=,rCser,' id= *L7sexResu21*><id coluirmproperty=*id'f/><zesulv colunm=f,口EErnminu* praperty=,iJsernaiEC*/> </resuLtMap><select id= "seisctUser" parameter

7、Type= ifint" resul匸Typ= "sex'” select * from t_user where id = tid</select><insert id= insertUser" paramet;erType= irUsertl>inser匸 Inta t iser values (# id) * # usernarae)</in3&rt></niapper>User.javapackage domain;public class User Int id-l;Spring nsema

8、nie;public int getld()return id;public void 吕总匸Id(int id) tbis,id - id;public String getUsername) return lib&tnair.e:piibli void BetUsemame (String usernarte this p勻亡main亡 - username;Main .javapublic class Main * gpaLram args* throws Exception*/public static void main(String args) throws Except!

9、an String resource = llmyfciati.s xml啊;Reader reader Re?corees -resource);SqlSiss5ionFactory sqlMappex = 口居科 SqlSessionFactoryBuildex().build(zeadex); SqLSession session = sqlMapper.apenSessianO;User ujer new CJ亍皀r ();口iSer seld. (1);user set-Username (Ww丄d2 n):session insert("Ies皂工tUsern ruser

10、);代码分析一:建立SessionFactorypublic static void main( Stri ng args)throwsExcepti on /指向配置文件路径,格式为classpathStri ng resource ="mybatis.xml" ;/使用Mybatis的资源读取器获得reader对象Reader reader = Resources.getResourceAsReader (resource);/ 建立 SqlSessionFactorySqlSessi onF actory sqlMapper =new SqlSessi onF act

11、oryBuilder().build(reader);/创建一个会话SqlSessi on sessi on = sqlMapper.ope nSessi on();User user = new User();user.setld(1);user.setUsername( "satan_0103");/ 调用 sessionsessi on .i nsert("in sertUser",user);sessi on. commit();sessi on. close();分析Resources资源查询器:基本原理:使用 ClassLoader.getR

12、esourceAsStream(resource)方法实现而Resources 对象,使用ClassLoader 数组对象,进行遍历查询.分析:可以使用Resources的静态方法还获得对应输入输出流的对象public static Reader getReso口工:皂盒吕11皂且1 亡二(5匸工zing resource) throws IOException Reader reader;if (charset = null reader = new 工llfu匸5匸工亡mRe:己且皂工 (g巴匕Rpsdui?匚巴卫sBtTi&szE(工皂已口口工匚亡); else <read

13、er = new 工口口tStTeaziReadersource) charset);return reader;调用 getResourceAsStream()方法.public static InpuuStream getResour ceAsStream (Class Loader loadeiji String r:皂 source) throw InpuSlureami in cl a ssLoj deirffr aippez" gr匸工 uA:3 5 匸工eaiu (工厚 口口工匚匕# loader);if (zn null) throw new IOException(

14、'Could not find resaurc皂 M + resource); return xn;)这里使用了 classLoaderWrapper这个静态对象,而这个对象包含了两个ClassLoader对象.分别为 systemClassLoader 和 defaultClassLoader对象.pnbllc class ClassLoaderWrapper ClassLoader defa'jltClasLo&der;ClaasLcader systeiaClasaLaader;ClasBLoaderWrapper()try ays匸吕日Lciadu= = Cla

15、ssLoader getSysteClafr(); eAteh (SecurityException ignored) / AccessContrclExcepion on Google App Engine继续跟进调用.这里使用了 getClassLoaders()这个方法来获得系统中存在的合理的类加载对象ClassLoader,注意这里的ClassLoader不止一个.public Input St re am getRes 口 uru 邑 Jk;3St工民却耳匸工九:!© rescuraer ClassLaa 且己工 classLca 且已 return getResQurce

16、AsStream(resaurcef g皂tClassLoaders(elassLcader);查看 getClassLoader()方法,返回一个ClassLoader数组对象.ClasaLoader;) genClassLaad&ra(ClaasLcader classLaader) return new ClassLoailer classLcader efaul-cClasaLoddz,Thread,Thread () . getConcexClassLcader ( rgerClass().gecClassLcader(), syflEercClassLaader>返回

17、上级进入调用getResourceAsStream()InpocStxeam gecReiourceAsSi&ream(Scrlg resource, ClaBslo&der(J alassLoader) for (CLassL口aid亡工 cl : classLoaderJ fif (null !* el) 查看到对资源(mtbatis.xml) 的.的加载,是通过对 ClassLoader数组的迭代查询来获得/ try ta find rhe resource as passedInputStream returnvalue = cl>getRsourceASrear

18、n(reso口ru亡):ifnawj someloader« wanx his leadingso we * 11 add it and cry again(null = retuxnValue) ret 口亡 = 匚丄.get Res 口 uz匸巳工亡!azif 艸/*1 + resource);ifk(null != z皂turnValue) return returnValue;returnim 11;并且注意到,可以使用的路径表达式为1. org/sata n/mybatis.xml2. /org/sata n/mybatis.xml工厂类)代码:都可以.分析 SqlSess

19、ionFactoryBuilder(原理分析:通过 reader 获得 mybatis.xml配置文件,然后通过创建XMLCo nfigBuilder象来包含mybatis.xml中的内容,最后调用XMLConfigBuilder中parse() 方法,来获得一个 Configuration对象,来完成 SqlSessionFactory对象.类是包含了一组build() 方法,用来创建基本结构:SqlSessi onF actoryBuilderSqlSessionFactory对象的类.SqlSessi onFactoryEuiIder SllSessionFactcryBuilder 0

20、0 build (InputS trem) build dnputStr tan, 0 build (InputS tre Mb, build driputStrtan, 0 build (Re aderD build (Ke "er 0 build (Re ider, build (Rad:SqlSessi orJctoryString) SqlS&ssi orJ aeloryString, Properties) SqlS&ssi onFic Fr op «r ties) SiLessi »nf actcry :SqlSessionFictor

21、yStriy) 列止汕訂mF t hryString, FropertieEloriF&c tciryProperti ts) SqlSnssi .rJF d .:.fy Lniild (Ccnfi gurati on) : SqlSessi onFactc-i y各个方法的最终目的就是产生一个Configuration对象,然后使用build(C on figurati on)方法,来创建 SqlSessionFactory 对象.代码跟踪和分析下面的代码是进入了产生 ConfigurationXMLConfigBuilder 对象创建,和其对象方法parse() 调用对象,并且最后

22、调用build(Configuration)的过程.puullc SqlSessienFactQiy teuila(Reader readerr Spring enviranraeriLr Properties properties) try (XMLCnnfIgBuilder parser new XMLConfIgBuilder(reader, envircnnentr properties); return build (parses.parse()n catch (EMceptlon e) throw Excepticbuilding SqlSessiGn. n t e) j fina

23、lly (ErrorConcexc亠巴乞七占应卞巴)resec(;try <reader.close):* catch (IQExcept i n e) (H Intenclonally ignore Prefer previous errorreader 是指向mybatis.xml 对象的IO流.environment是显示指示使用那个environment配置环境,如果不指定,则使用default="some" 的环境.properties指定了替代属性的Key-Value ,$username进入 XMLConfigBuilder 过程.XMLCqnfigBi

24、iild皂工 parser = new XtQConf igBuilder (reader, envircmaent.f properties);首先创建一个XPathParser解析对象,这个对象是对 MybatisC on figurati on .xml对象的解析器,解析出一段Document格式的报文.还使用XMLMapperEntityResolver()对象来验证 mybatis.xml 使用的DTD约束对象是否正确.public XMLCDnfig3u.ild.er Reader readerf String enviresnment-r Prcpertiea praps) (t

25、hi a 1 new KPathEarser (leader, tms, props, new XMLMsapperEntityReaDiver ) r enTircnnse口匸尸 propa;对象.在this()自构造方法中,看到new 出一个 Configurationprivate XMLConfigBni.lciE:r IXTathPaLEBer parser, String envirarjnentf Frcperties props) | super(new Configuration() *:Em上orCanext;丄寰£D&iiue () resauree (

26、''SQL Eappe上 ConfigurationM) jtills configuracion».setVariablea (口工亡ps);tuift.paried falejthi 3- s e-nvizo iraent = environjuent:thiStparser = parsers而在Configuration构造方法中,是对typeAliasRegistry对象预先填充一些必要的别名,女口 JDBC,POOLED,UNPOOLED 等而其中VENDOR别名对象设置过程中启动了log,日志系统.public Cnfigua&ian t-ype

27、AliaRsgiscry?registerAlias (HJDBC',f# JcLbcTransationFactory-class.getName (): type Al iasRe gi s Er y 工电 gis:匚色:rliBLis ("KJJTASED" f ManagedT r ansact ± 口 gF县匕七口::茁 口丄艮勻弓亠 §<5匸应呂上1段(); cypeSiliasRegiscry 工egisC-erAlias (pijNDItrf JndiDataScu.rceFact £y匚丄“国芳g色匸EJ皿亡(

28、r type Al lasRegi s " r y 工亡gi 日匚亡工?LL丄巴色("FOOLED PooledDataSourceFaccor y class 口亡 tNme:(); typeAllasRegistry,regiscerAlias(HUNFOO1EDWP UnpooledDaca5ourceFactory.class.getNane():type Al iasRegi 3 try Hegiis 匸丄工上LliaLm (氏 FiERFETHi工用, Perpet ualCache * class B getName *); cypeAliasRei3&quo

29、t;ry 工egiscerAlias ("FIFO", FlfaCache匚1盘宮审亡tNaL就(): cypeAiiasRegisry 上己qi.戟匕亡上岛丄丄己s ("LRUTr, LruCacfie.csl比乞合.gexWEme () J ;type Al issEle g i si; ry B xe gi s terAl i a s (H SOFT11ScltCche1«, clsiss«ijetNae ();CypeAliaBReg±st.ry 工egisterAlias (円百丘盘號卯# WeakCache .cfIk序孚

30、.gEtH且me ();cypeAliasRegis ry 工亡gi曹c亡工Rlin已:("NDOR"f VendorDatfibaseldProvlder .class(H值得注意的是 typeAliasRegistry在构造的时候自己也注册了一些别名org.apache.ibatis.mapp in g.Ve ndorDatabaseldProvider在ClassLoader 加载它的时候,执行如下代码为日志辅助类private staticfinal Log log = LogFactory.getLog (BaseExecutor.class );在LogFact

31、ory 中,看到static 代码,就是这段代码完成了对日志系统的初始化static tryTnLpleicentatian (new Runnable ()(public void run( LiseSlf 4jLogji.nj (;H;trylmpiemsntatioH(new Runnable() public void tliel ()wsKainianwSggf 蜩();;on (new Runnable ()public void run( ujsLoj4 JLogginj);八;trylnLplementirji sji (new Runnable (public void ru

32、n( 口 se JdkLogTng-();H;trylmpiementation(new Runnable() public void run()s i LqTWjrT cer * n/r / *回到原来的build() 方法,我们查看parser.parse()方法的执行查看到这个方法是对 mybatis.xml 中configuration标签的解析public Configuration parae () )if (parsea)(th row tiew BulldftEExeeptlDn rrEAe:h MApp-erConfiPArser can cnly be uafrd crne

33、-e 畤): Jparsed true;parse Configurate 口 n (丘呂工 re:工亡 ¥赳1甘口£1 亡 C1 / eonf i gur a t id n,r) j return eanfigurat-ionj进入parseConfiguration()方法后,可以看到一些熟悉的字样,接下来就是对configuration标签的子元素进行解析,填充完一个Configuration象中的属性,返回这个Configuration对象给上级build().private void parseConfigura 匸丄口口(XNcidje root J try &

34、#163;propextiesElement (rootevalNod-e (tl-propex!txe5w) ) ;. is- til"? rs&d propercies firsttypeAliasesElemeiLt (root B evaINode ( "tpeSLlzases B);plsugiilE 1 ement (root eraLlNczcie ("pluginsrr)!);obj ectFaetoryE(root亡("objeccFactary):Obe吕(比口口匸它甘彳丄凶口日旨(用口:吕匚匸*芝冃泾口亡:扌3匸匸0工

35、65;1'1); settingsEleioent (root. eva3N 口 且£ (° settings1,1);芒口 viz a nme nt sE lenuei-t (roc 七 evalN 口:iis (trenvizonn.eiits11;diatafcaaeldPr口暫SditE丄匸 «:£匸亡廿nlNDd亡("datataselciPi:口誓久厲匕工11);te-EiandlerEleent (root 旨vbINid过它(ceHandl&is"):mapperE1 BJ&enc (root

36、evaXNQds (mappers11); catch (Exception e throw new aailderExcepticn("Err口:r parsing SQL Mapper CcnCiguratlcn Cause: <r + e);对properties标签解析:可以看到最后是在con figurati on中设置解析完成的properties.private void propertiesElenient (XNode caD&ex.) throws 'Exception if (contejtu nisLl Prcpexties defaul

37、ts = coBxext - gei&ChildrenllsPTopexties (;Serina resource 二 eontext,aetszrinQAetrlbute("resouree"):String url ® context . gets tri agAt tribute ("urlji jif (resource != nul丄 £.& url != 口丄 1).resQuxcfthrow new BuilderEx-cepion(The properties element cannot specify ba

38、th a URL and if (zeaDurce ? 口all) (defaults.putAll(Resonzces getSesourceAsPxcpertzes(resaurce);>-If (UZ1! != 7)1311 derfiulcs Pput All(Resources.gsturle i (urlH;IPrcpert ies vaszs = conf igu rat ion * get Vari abl e s (J ;if (vas != nail) idefaalca rputAll (vaxsj-;Ipasser u setVarxables(defaults)

39、;confionr(defaul);对typeAliases标签解析:privats voidtypeAliaseaElemer.iXl-Tode parent) if (parec != ncll> for (Xllade child : paren 匸.get Children () ) if ("packagen亡qUAla(ChildBgeCSame O)txasPackage = child>geS匸£|丄口0丸匸匸1|)且5匸它(耐孔期卄|;c nf igux at ion .gistTypTdiBiBRegjLtzzytJi 工 egisCerAl

40、iases (tn: eAlias Eac rage); else String alias = childg皀七号七匕工匸护七1:1:工扫11七已(叩ml工ms用);String 七沖亡 - child try Class<?> clazz RescurcesIE taliks = ball typeAliasRegisicry工egisterAlias (clazz);卜 else (typeAliasRegistry .zeffisterAlias (aliaSj clazz|i: catch (Cla53tTci:FouEciEx.cepclon eJ fCause:thr

41、ow new EuxlderException (nError regi3terzng t1 as for 用 + alias +如果没有使用alias 元素,则直接把type类路径指向的类名作为alias 注册到Configuration对象中去.Cla35<?> clasz = Resources ,(te);if (alias = im 11) reAliasRegiBtry. regis匸芒工良丄且(clazz) * else typeAliasRegistry.registerAlias(alias f clazz);对objectFactory 标签解析:的 Objec

42、tFactory 属性中.把 factory对象注册至U configurationprivate void objecrFactoryElsment(XNade context) throws Exception < if (context != null SVriug type = can'text;. gev5CxiizvAttribute ( "T.ype ");Properties preperties = context. getCtiiLcireKAsPiepertiss );ObjecuEacrory faccary = (ObjecEFact

43、ory resolveClass-newlnstance (>factory setPrcpertiea(properties);confiijuxation,setObject-Factory (factoiy);对environments标签解析:可以看到参数evironment设置了启动哪个环境配置.如果没有制定,则使用default 指向的环境在配置evironment 过程中,总共配置了1. transactionManager(事务管理)2. dataSource( 数据源) 两个内容.最后把配置完成的环境交给configuration对象.pr-ivate void env

44、liraELraentsEleme乃匸(:KMo吐比 esnLexT J tliFcwa ExeepEiDB if (context !* nzilll if (enviroTunent nnll> esivizon!匸 w cancEMt ijietS 匸工丄iigAtt工itoircit ( ttdefau 1 匸*);far (XlTode 亡hlJLd t eonEeKt .getChildreni () )String id 匸匚u (“丄日呼):if (1 sSpecifiedEnvirarunent; (id) TxasaOTionEactury cxFaG&ory

45、 = t z anaccxa nManagexElerDe "匸 qatiild 巳v刊JL却口(1芒(Htxai!aactiQnHanagex") J; DacaSaurseEac匸口Ey dsFaccory - dacaSourceE 1 eoeIalilld»evaIKode (TldacaSource");DtCLSource tiatsSou rce - dsFa cto r y, ge t Data Soy r ce 0 -Environment. Builder environmentBuilder - new Environment rB

46、uilder (id)»txanaacLianFactDry cxfacr-oiy).daiaSaurce (da匸在巨口口工巴旦);eo nf Iguratien* setEnvlreironene (envi ronMHT.Biillder. t mid );tran sact ionMan ager(事务管理):首先获得transactionManager的type 类型,接着用通过resolveClass(type)对象,获得合适的 TransactionFactory对象private TransaatianFactoxy traEsacuionHanagerEleme口匸

47、 KXNcidte context) throws Escepion if (context !- mail) String typ亡 = context; .亡匸宫匸工丄匚弓査匸丄士工匕口匕亡匸匕丫卞巴1'1,Proper 匸导 props = context匸Trans a at ion Fact dry f actDry (T rans a t i nF act r y) re salve Cl a asnewlnstance (J ;factory 3etFraperE(ie3 (props);return factary;)throw new Builder Ex cep 匸

48、 jldh (*'E;nvjL:cc:mne::n:c decliar a cjldii requires a Trans ac tia nFa c 匸口 ry.11*);方法解析,从 configuration别名容器中把type设置为别名,调用resolveAlias() 获取对应的Class<T>来实例化.protected Class<?> r皀solveClass(String alias) if (alias = im 11) return rm丄 1_:try <return reaolv&Alias(alias); catch (E

49、xception e) throw new BuilderException(r,Error resolving class . Cause: " + ef e);最后却是使用configuration中对typeAlias标签配置默认值进行解析alias,来获得一个合适的TransactionFactory对象的Class 对象.protected Cl«ss<?> resolveAlias(String Alias ret口cn cypeAliasRegiscryhusoI甘亡耳li社勻(alia勻);dataSource( 数据源):数据源配置和事务配置类

50、似,通过别名来获得configuration容器中一个Class填充相应的属性就可以使用了private DaaSourceFaetfliy dataSaureeElement(XlJode eantexE) throws EKception if (contexE J - null> Spring= context哲亡匸SEringAiLEribute;ProperLues props = cont.exL.geLChjLlcLrenJLsPropertie3 (J ;De匸aSouro巳F<au匕口工y factory = (Da匸包巳E"rc匕口工y) resfll

51、veClasa (te) newlD3tance (); factory导皂xP上口左皂上匸丄亡si (preps;return factory;throw new Bui Ider Except ion ("'Environment; declaration requires a DataSourceFacTory.pr);对typeHandlers标签分析:也利用了 configuration中容器,把type作为别名解析.private void tiT-eHandlerElement(XNcde parent) throws Exception if (paxen匸!

52、= null) (for (XNode child : parent ,getChildren.() ) i f (irFac k已 ger, -B e (jiials (chil d g亡匸己皿巳 0 ) 5ltmg tfpeHaEdlerPackage = childg巳匸5tringAu匸ribute ( BnaaeH);zypeHandlerRegi5 tr y regLsuerz ypeHandler Package);)else String j avaTypeNaifte = cHildB get3-cxingAtribue ("javalype");Stri

53、ng jdfcaTpeName = child, gets匸工耳匸tritiiit:巳("jdfcuType:*);String handlerTyp皂Ne:nie = child 旺皂匸5匸1:兀11旺直£匸二:113口匸皂(口dl皂芷"1);Clas3<?> javaTeClasa = resolveClass (javaTinpeNane);JdbcTiTe jdbcTe = resolveJdbcTirpe (jdbcTippeMazie);Cla33<?> Ei'peHa口d_l亡上亡 1且弓弓=TesclveClasj

54、(handle:rTeName;if (javaTypeClass !- null if (jdbcljT-e = null)(typeHandlerRegistry> register (javalypeClaaSi tipeHand 1 ezClas3); else 匸yF皂HandlerRegLstry. r皂gi_st:皂it (javaTiT皂二JL且导SdbcTiT皂 匸亡Handl皂工匚丄己53=); else eHandler Reg la 匚上 y 工匸建上(e ype Handl e r Class):其他标签的实现也是类是的方式现在回到build(Configura

55、tion),使用config创建了一个默认的SqISessionFactory对象.pilblic SqlSesBionFac'tory build f亡cmfigura匸丄on config) return new DefaulcSqlSessionFacory(config):可以发现整个 DefaultSqlSessio nFactory对象就包含了一个Con figuration对象public static void main -args) throws Exception String xesouzce: w niybatis auril1'1:Reader rea

56、dez = Hesn口工口巳却§芒匸貫艺序0112_口&卫占1?!5臼已三27 工巳!sou工口皀);SqlSessionFactory sqlMappex = new SqlSessionFacxciryBuilder () .build(reader):5qlSes51on -lessier User user n-ew Oa 口sez setId(1); usersetUsername(mgllrt 叩p er- Deful 皓评电si “rJ actory (i 4255)4 e coEtf pu- *ti &n= Confiiir b.ti on (i )到

57、此完成了对 SqISessionFactory 对象的创建資滩寻址转换XM报文为Dmu代n侧謀基本过程如下:1. 使用Resources中静态方法查询获得 reader 对象2. 通过XMLConfigBuilder 构造方法对reader 进行读取,具体的读取工作给XPathParser对象完成返回一份 Document对象,然后配置类的属性,完成构造过程.3. 通过XMLConfigBuilder对象的parse()方法对读取到的文档 (Document)进行解析对mybatis.xml中标签内容进行解析,设置到一个 Configuration对象中而这个过程中,多次利用到typeAlias标签对象的Configuration属性操作通过标签属性type转化为alias来查询容器中相应的Class对象.4. 最后new 出一个 DefaultSqlSessionFactory对象,而这个Factory属性中只是包含了 Configuration对象.的构造所以 XMLCo nfigBuild

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论