版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
.鑒于講解的mybatis和spring整合分類:spring2013-02-2221:373373人閱讀議論(2)珍藏檢舉springSpring鑒于講解的mybatis和spring整合博客分類:?mybatis?spring?java?ibatis?講解javaibatismybatisspring講解ibatis更名為mybatis已經(jīng)快要一年了,mybatis3也公布了,可是有關(guān)的開發(fā)文檔卻極少,查閱了官方的使用指南,也是說的模糊不清,一筆帶過,特別是講解部分,不過列舉了講解種類,卻沒有對應(yīng)的例子,所以可能會給某些兄弟使用mybatis講解帶來疑惑,我想就我菲薄的知識想對mybatis講解的使用以及和spring整合說說自己的見解,也希望大家劇烈的指正我的錯誤。第一自然得下載和兩個JAR包,并放在WEB-INF的lib目錄下(假如你使用maven,則jar會依據(jù)你的pom配置的依靠自動下載,并寄存在你指定的maven當(dāng)?shù)貛熘校J(rèn)是~/.m2/repository),前一個是mybatis核心包,后一個是和spring整合的包。使用mybatis,一定有個全局配置文件configuration.xml,來配置mybatis的緩存,延緩加載等等一系列屬性,該配置文件示比以下:Java代碼<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEconfiguration3.Config3.0//EN"4."/dtd/ibatis-3-config.dtd"><configuration><settings>7.<!--全局映照器啟用緩存-->8.<settingname="cacheEnabled"value="true"/>9.<!--查問時,封閉關(guān)系對象即時加載以提升性能-->10.<settingname="lazyLoadingEnabled"value="true"/>11.<!--設(shè)置關(guān)系對象加載的形態(tài),此處為按需加載字段(加載字段由SQL指定),不會加載關(guān)系表的所有字段,以提升性能-->12.<settingname="aggressiveLazyLoading"value="false"/>..13.<!--關(guān)于未知的SQL查問,同意返回不一樣的結(jié)果集以達(dá)到通用的成效-->14.<settingname="multipleResultSetsEnabled"value="true"/>15.<!--同意使用列標(biāo)簽取代列名-->16.<settingname="useColumnLabel"value="true"/>17.<!--同意使用自定義的主鍵值(比方由程序生成的UUID32位編碼作為鍵值),數(shù)據(jù)表的PK生成策略將被覆蓋-->18.<settingname="useGeneratedKeys"value="true"/>19.<!--賜予被嵌套的resultMap以字段-屬性的映照支持-->20.<settingname="autoMappingBehavior"value="FULL"/>21.<!--關(guān)于批量更新操作緩存SQL以提升性能-->22.<settingname="defaultExecutorType"value="BATCH"/>23.<!--數(shù)據(jù)庫超出25000秒仍未響應(yīng)則超時-->24.<settingname="defaultStatementTimeout"value="25000"/></settings>26.<!--全局又名設(shè)置,在映照文件中只需寫又名,而不用寫出整個類路徑--><typeAliases>28.<typeAliasalias="TestBean"29.type=".wotao.taotao.persist.test.dataobject.TestBean"/></typeAliases>31.<!--非講解的sql映照文件配置,假如使用mybatis講解,該mapper無需配置,可是假如mybatis講解中包含resultMap講解,則mapper一定配置,給resultMap講解使用--><mappers>33.<mapperresource="persist/test/orm/test.xml"/></mappers></configuration>該文件放在資源文件的隨意classpath目錄下,假定這里就直接放在資源根目錄,等會spring需要引用該文件。查察ibatis-3-config.dtd發(fā)現(xiàn)除了settings和typeAliases還有其余眾多元素,比方properties,objectFactory,environments等等,這些元素基本上都包含著一些環(huán)境配置,數(shù)據(jù)源定義,數(shù)據(jù)庫事務(wù)等等,在獨(dú)自使用mybatis的時候特別重要,比方經(jīng)過以結(jié)構(gòu)參數(shù)的形式去實例化一個sqlsessionFactory,就像這樣:Java代碼SqlSessionFactoryfactory=sqlSessionFactoryBuilder.build(reader);2.SqlSessionFactoryfactory=sqlSessionFactoryBuilder.build(reader,properties);3.SqlSessionFactoryfactory=sqlSessionFactoryBuilder.build(reader,environment,properties);而typeHandlers則用來自定義映照規(guī)則,如你能夠自定義將Character映照為varchar,plugins元素則放了一些攔截器接口,你能夠繼承他們并做一些切面的事情,至于每個元素的細(xì)節(jié)和使用,..你參照mybatis用戶指南即可。此刻我們用的是spring,所以除settings和typeAliases元素以外,其余元素將會無效,故不在此配置,spring會覆蓋這些元素的配置,比方在spring配置文件中指定c3p0數(shù)據(jù)源定義以下:Java代碼1.<!--c3p0connectionpoolconfiguration-->2.<beanid="testDataSource"class=".mchange.v2.c3p0.ComboPooledDataSource"3.destroy-method="close">4.<!--數(shù)據(jù)庫驅(qū)動-->5.<propertyname="driverClass"value="${db.driver.class}"/>6.<!--連結(jié)URL串-->7.<propertyname="jdbcUrl"value="${db.url}"/>8.<!--連結(jié)用戶名-->9.<propertyname="user"value="${db.username}"/>10.<!--連結(jié)密碼-->11.<propertyname="password"value="${db.password}"/>12.<!--初始化連結(jié)池時連結(jié)數(shù)目為5個-->13.<propertyname="initialPoolSize"value="5"/>14.<!--同意最小連結(jié)數(shù)目為5個-->15.<propertyname="minPoolSize"value="5"/>16.<!--同意最接數(shù)目為20個-->17.<propertyname="maxPoolSize"value="20"/>18.<!--同意連結(jié)池最大生成100個PreparedStatement對象-->19.<propertyname="maxStatements"value="100"/>20.<!--連結(jié)有效時間,連結(jié)超出3600秒未使用,則該連結(jié)拋棄-->21.<propertyname="maxIdleTime"value="3600"/>22.<!--連結(jié)用完時,一次產(chǎn)生的新連結(jié)步進(jìn)值為2-->23.<propertyname="acquireIncrement"value="2"/>24.<!--獲得連結(jié)失敗后再試試10次,再失敗則返回DAOException異樣-->25.<propertyname="acquireRetryAttempts"value="10"/>26.<!--獲得下一次連結(jié)時最短間隔600毫秒,有助于提升性能-->27.<propertyname="acquireRetryDelay"value="600"/>28.<!--檢查連結(jié)的有效性,此處小弟不是很懂什么意思-->29.<propertyname="testConnectionOnCheckin"value="true"/>30.<!--每個1200秒檢查連結(jié)對象狀態(tài)-->31.<propertyname="idleConnectionTestPeriod"value="1200"/>32.<!--獲得新連結(jié)的超不時間為10000毫秒-->33.<propertyname="checkoutTimeout"value="10000"/></bean>配置中的${}都是占位符,在你指定數(shù)據(jù)庫驅(qū)動打war時會自動替代,替代的值在你的父pom中..配置,至于c3p0連結(jié)池的各樣屬性詳盡信息和用法,你自行參照c3p0的官方文檔,這里要說明的是checkoutTimeout元素,記得千萬要設(shè)大一點,單位是毫秒,若是設(shè)置太小,有可能會致使沒等數(shù)據(jù)庫響應(yīng)就直接超時了,小弟在這里吃了許多苦頭,仍是基本功太差。數(shù)據(jù)源配置穩(wěn)當(dāng)以后,我們就要開始特別重要的sessionFactory配置了,不論是hibernate仍是mybatis,都需要一個sessionFactory來生成session,sessionFactory配置以下:Java代碼1.<beanid="testSqlSessionFactory"class="org.mybatis.spring.SqlSessionFactoryBean">2.<propertyname="configLocation"value="classpath:configuration.xml"/>3.<propertyname="dataSource"ref="testDataSource"/></bean>testSqlSessionFactory有兩處注入,一個就是前面提到的mybatis全局設(shè)置文件configuration.xml,另一個就是上邊定義的數(shù)據(jù)源了(注:hibernate的sessionFactory只需注入,數(shù)據(jù)源定義已經(jīng)包含在該文件中),好了,sessionFactory已經(jīng)產(chǎn)生了,因為我們用的mybatis3的講解,所以spring的sqlSessionTemplate也不用配置了,sqlSessionTemplate也不用注入到我們的BaseDAO中了,相應(yīng)的,我們需要配置一個映照器接口來對應(yīng)sqlSessionTemplate,該映射器接口定義了你自己的接口方法,詳細(xì)實現(xiàn)不用關(guān)懷,代碼以下:Java代碼1.<!--dataORmappinginterface-->2.<beanid="testMapper"class="org.mybatis.spring.mapper.MapperFactoryBean">3.<propertyname="sqlSessionFactory"ref="testSqlSessionFactory"/>4.<propertyname="mapperInterface"value=".wotao.taotao.persist.test.mapper.TestMapper"/></bean>對應(yīng)于sqlSessionTemplate,testMapper相同需要testSqlSessionFactory注入,此外一個注入就是你自己定義的Mapper接口,該接口定義了操作數(shù)據(jù)庫的方法和SQL語句以及好多的講解,稍后我會講到。到此,mybatis和spring整合的文件配置就算OK了(注:假如你需要開通spring對一般類的代理功能,那么你需要在spring配置文件中加入<aop:aspectj-autoproxy/>),至于其余的如事務(wù)配置,AOP切面講解等容不在本文圍,不作累述。至此,一個完好的myabtis整合spring的配置文件看起來應(yīng)當(dāng)以下所示:Java代碼<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="./schema/beans"..xmlns:xsi="./2001/XMLSchema-instance"xmlns:context="./schema/context"xmlns:tx="./schema/tx"xmlns:aop="./schema/aop"5.xsi:schemaLocation="./schema//schema//schema//schema/context//schema//schema//schema/aop/spring-aop-2.5.xsd">9.10.<!--c3p0connectionpoolconfiguration-->11.<beanid="testDataSource"class=".mchange.v2.c3p0.ComboPooledDataSource"12.destroy-method="close">13.<propertyname="driverClass"value="${db.driver.class}"/>14.<propertyname="jdbcUrl"value="${db.url}"/>15.<propertyname="user"value="${db.username}"/>16.<propertyname="password"value="${db.password}"/>17.<propertyname="initialPoolSize"value="5"/>18.<propertyname="minPoolSize"value="5"/>19.<propertyname="maxPoolSize"value="20"/>20.<propertyname="maxStatements"value="100"/>21.<propertyname="maxIdleTime"value="3600"/>22.<propertyname="acquireIncrement"value="2"/>23.<propertyname="acquireRetryAttempts"value="10"/>24.<propertyname="acquireRetryDelay"value="600"/>25.<propertyname="testConnectionOnCheckin"value="true"/>26.<propertyname="idleConnectionTestPeriod"value="1200"/>27.<propertyname="checkoutTimeout"value="10000"/></bean>29.<beanid="testSqlSessionFactory"class="org.mybatis.spring.SqlSessionFactoryBean">30.<propertyname="configLocation"value="classpath:configuration.xml"/>31.<propertyname="dataSource"ref="testDataSource"/></bean><!--dataORmappinginterface-->34.<beanid="testMapper"class="org.mybatis.spring.mapper.MapperFactoryBean">35.<propertyname="sqlSessionFactory"ref="testSqlSessionFactory"/>36.<propertyname="mapperInterface"pper"/></bean><!--addyourownMapperhere-->41.<!--commenthere,usingannotation-->..42.<!--<beanid="sqlSessionTemplate"class="org.mybatis.spring.SqlSessionTemplate">-->43.<!--<constructor-argindex="0"ref="sqlSessionFactory"/>--><!--</bean>-->45.<!--baseDAOclass,formodulebusiness,extendthisclassinDAO-->46.<!--<beanid="testBaseDAO"class=".test.dao.TestBaseDAO">-->47.<!--<propertyname="sqlSessionTemplate"ref="sqlSessionTemplate"/>--><!--</bean>-->49.<!--<beanid="testDAO"class=".test.dao.impl.TestDAOImpl"/>-->50.51.<!--youcanDIBeanifyoudon'tlikeuseannotation-->52.53.</beans>到此為止,我們只講了mybatis和spring的整合,還沒有真實涉及mybatis的核心:使用mybatis講解取代映照文件編程(可是官方文檔也說了,假如真實想發(fā)揮mybatis功能,仍是需要用到映照文件,看來myabtis自己都對mybatis講解沒信心,呵呵),經(jīng)過上述容,我們知道配置搞定,可是testMapper還沒有被實現(xiàn),而講解的使用,所有集中在這個testMapper上,是mybatis講解的核心所在,先來看一下這個testMapper接口是個什么樣的:Java代碼/***ThetestMapperinterface.*4.*authorHuangMin<ahref="mailto:minhuanghengtiansoft.>sendemail</a>**since1.6*version1.0**#~TestMapper.java2011-9-23:afternoon10:51:40*/CacheNamespace(size=512)publicinterfaceTestMapper{13./***gettestbeanbyUID.**paramid*return*/SelectProvider(type=TestSqlProvider.class,method="getSql")..Options(useCache=true,flushCache=false,timeout=10000)Results(value={23.Result(id=true,property="id",column="test_id",javaType=String.class,jdbcType=JdbcType.VARCHAR),24.Result(property="testText",column="test_text",javaType=String.class,jdbcType=JdbcType.VARCHAR)})25.publicTestBeanget(Param("id")Stringid);26./***getalltests.**return*/SelectProvider(type=TestSqlProvider.class,method="getAllSql")Options(useCache=true,flushCache=false,timeout=10000)Results(value={35.Result(id=true,property="id",column="test_id",javaType=String.class,jdbcType=JdbcType.VARCHAR),36.Result(property="testText",column="test_text",javaType=String.class,jdbcType=JdbcType.VARCHAR)})publicList<TestBean>getAll();38./***gettestsbytesttext.**paramtestText*return*/SelectProvider(type=TestSqlProvider.class,method="getByTestTextSql")Options(useCache=true,flushCache=false,timeout=10000)ResultMap(value="getByTestText")48.publicList<TestBean>getByTestText(Param("testText")StringtestText);49./***insertatestbeanintodatabase.**paramtestBean*/55.InsertProvider(type=TestSqlProvider.class,method="insertSql")Options(flushCache=true,timeout=20000)57.publicvoidinsert(Param("testBean")TestBeantestBean);58./***updateatestbeanwithdatabase...**paramtestBean*/UpdateProvider(type=TestSqlProvider.class,method="updateSql")Options(flushCache=true,timeout=20000)66.publicvoidupdate(Param("testBean")TestBeantestBean);67./***deleteatestbyUID.**paramid*/DeleteProvider(type=TestSqlProvider.class,method="deleteSql")Options(flushCache=true,timeout=20000)75.publicvoiddelete(Param("id")Stringid);76.}下邊逐一對里面的講解進(jìn)行剖析:CacheNamespace(size=512):定義在該命名空間同意使用置緩存,最大值為512個對象引用,讀寫默認(rèn)是開啟的,緩存省刷新時間為默認(rèn)3600000毫秒,寫策略是拷貝整個對象鏡像到嶄新堆(好像CopyOnWriteList)所以線程安全。SelectProvider(type=TestSqlProvider.class,method="getSql"):供給查問的SQL語句,假如你不用這個講解,你也能夠直接使用Select("select*from....")講解,把查問SQL抽取到一個類里面,方便管理,同時復(fù)雜的SQL也簡單操作,type=TestSqlProvider.class就是寄存SQL語句的類,而method="getSql"表示get接口方法需要到TestSqlProvider類的getSql方法中獲得SQL語句。Options(useCache=true,flushCache=false,timeout=10000):一些查問的選項開關(guān),比方useCache=true表示本次查問結(jié)果被緩存以提升低次查問速度,flushCache=false表示下次查詢時不刷新緩存,timeout=10000表示查問結(jié)果緩存10000秒。Results(value={Result(id=true,property="id",column="test_id",javaType=String.class,jdbcType=JdbcType.VARCHAR),Result(property="testText",column="test_text",javaType=String.class,jdbcType=JdbcType.VARCHAR)}):表示sql查問返回的結(jié)果集,Results是以Result為元素的數(shù)組,Result表示單條屬性-字段的映照關(guān)系,如:Result(id=true,property="id",column="test_id",javaType=String.class,jdbcType=JdbcType.VARCHAR)能夠簡寫為:Result(id=true,property="id",column="test_id"),id=true表示這個test_id字段是個PK,查問時mybatis會賜予必需的優(yōu)化,應(yīng)當(dāng)說數(shù)組中所有的Result構(gòu)成了單個記錄的映照關(guān)系,而Results則單個記錄的會合。此外還有一個特別重要的講解ResultMap也和Results差不多,到時會講到。..Param("id"):全限制定又名,定義查問參數(shù)在sql語句中的地點不再是次序下標(biāo)0,1,2,3....的形式,而是對應(yīng)名稱,該名稱就在這里定義。ResultMap(value="getByTestText"):重要的講解,能夠解決復(fù)雜的映照關(guān)系,包含resultMap嵌套,鑒識器discriminator等等。注意一旦你啟用該講解,你將不得不在你的映照文件中配置你的resultMap,而value="getByTestText"即為映照文件中的resultMapID(注意此處的value="getByTestText",一定是在映照文件中指定數(shù)名空間路徑)。ResultMap在某些簡單場合能夠用Results取代,可是復(fù)雜查問,比方結(jié)合、嵌套查問ResultMap就會顯得解耦方便更簡單管理。一個映照文件以下所示:Java代碼<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEmapper3.Mapper3.0//EN"4."/dtd/ibatis-3-mapper.dtd">5.<mappernamespace=".wotao.taotao.persist.test.mapper.TestMapper">7.<resultMapid="getByTestText"type="TestBean">8.<idproperty="id"column="test_id"javaType="string"jdbcType="VARCHAR"/>9.<resultproperty="testText"column="test_text"javaType="string"jdbcType="VARCHAR"/></resultMap></mapper>注意文件中的namespace路徑一定是使用resultMap的類路徑,此處是TestMapper,文件中id="getByTestText"一定和resultMap中的value="getByTestText"保持一致。InsertProvider(type=TestSqlProvider.class,method="insertSql"):用法和含義SelectProvider相同,只可是是用來插入數(shù)據(jù)庫而用的。Options(flushCache=true,timeout=20000):關(guān)于需要更新數(shù)據(jù)庫的操作,需要從頭刷新緩存flushCache=true使緩存同步。UpdateProvider(type=TestSqlProvider.class,method="updateSql"):用法和含義SelectProvider相同,只可是是用來更新數(shù)據(jù)庫而用的。Param("testBean"):是一個自定義的對象,指定了sql語句中的表現(xiàn)形式,假如要在sql中引用對象里面的屬性,只需使用testBean.id,testBean.textText即可,mybatis會經(jīng)過反射找到這些屬性值。DeleteProvider(type=TestSqlProvider.class,method="deleteSql"):用法和含義SelectProvider相同,只可是是用來刪除數(shù)據(jù)而用的。..此刻mybatis講解基本已經(jīng)講完了,接下來我們就要開始寫SQL語句了,因為我們不再使用映射文件編寫SQL,那么就不得不在java類里面寫,就像上邊提到的,我們不得不在TestSqlProvider這個類里面寫SQL,固然已經(jīng)把所有sql語句集中到了一個類里面去管理,但聽起來仿佛仍舊有點惡心,幸虧mybatis供給SelectBuilder和SqlBuilder這2個小工具來幫助我們生成SQL語句,SelectBuilder特意用來生成select語句,而SqlBuilder則是一般性的工具,能夠生成任何SQL語句,我這里選擇了SqlBuilder來生成,TestSqlProvider代碼以下:Java代碼/**#~test-afternoon10:51:40*/package.wotao.taotao.persist.test.sqlprovider;5.importstaticorg.apache.ibatis.jdbc.SqlBuilder.BEGIN;importstaticorg.apache.ibatis.jdbc.SqlBuilder.FROM;importstaticorg.apache.ibatis.jdbc.SqlBuilder.SELECT;importstaticorg.apache.ibatis.jdbc.SqlBuilder.SQL;importstaticorg.apache.ibatis.jdbc.SqlBuilder.WHERE;importstaticorg.apache.ibatis.jdbc.SqlBuilder.DELETE_FROM;importstaticorg.apache.ibatis.jdbc.SqlBuilder.INSERT_INTO;importstaticorg.apache.ibatis.jdbc.SqlBuilder.SET;importstaticorg.apache.ibatis.jdbc.SqlBuilder.UPDATE;importstaticorg.apache.ibatis.jdbc.SqlBuilder.VALUES;16.17.importjava.util.Map;18.19./**20.*ThetestsqlProvider,definethesqlscriptformapping.*22.*authorHuangMin<ahref="mailto:minhuanghengtiansoft.>sendemail</a>**since1.6*version1.0*27.*#~TestSqlProvider.java2011-9-23:afternoon10:51:40*/publicclassTestSqlProvider{/**tablename,hereistest*/privatestaticfinalStringTABLE_NAME="test";/**..*gettestbyidsqlscript.**paramparameters*return*/40.publicStringgetSql(Map<String,Object>parameters){41.Stringuid=(String)parameters.get("id");42.BEGIN();43.SELECT("test_id,test_text");44.FROM(TABLE_NAME);45.if(uid!=null){46.WHERE("test_id=#{id,javaType=string,jdbcType=VARCHAR}");47.}48.returnSQL();}/***getalltestssqlscript.**return*/publicStringgetAllSql(){57.BEGIN();58.SELECT("test_id,test_text");59.FROM(TABLE_NAME);60.returnSQL();}62./***gettestbytesttextsqlscript.**paramparameters*return*/69.publicStringgetByTestTextSql(Map<String,Object>parameters){70.StringtText=(String)parameters.get("testText");71.BEGIN();72.SELECT("test_id,test_text");73.FROM(TABLE_NAME);74.if(tText!=null){75.WHERE("test_textlike#{testText,javaType=string,jdbcType=VARCHAR}");76.}77.returnSQL();}..79./***insertatestsqlscript.**return*/publ
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 苗木工程協(xié)議書
- 蘋果分選協(xié)議書
- 裸車配件合同范本
- 設(shè)計禁煙協(xié)議書
- 試點投放協(xié)議書
- 請人做賬合同范本
- 工程清拆合同范本
- 工期延長的協(xié)議書
- 寄快遞協(xié)議合同書
- 做活動合同范本
- 地鐵保護(hù)專項實施方案
- 國防技術(shù)發(fā)明獎申報書及附件材料填寫說明
- 2022年全國職業(yè)院校技能大賽-中藥傳統(tǒng)技能賽項規(guī)程
- AQ 1097-2014 井工煤礦安全設(shè)施設(shè)計編制導(dǎo)則(正式版)
- 廣州城市化發(fā)展分析報告
- 全球職等系統(tǒng)GGS職位評估手冊
- 科來網(wǎng)絡(luò)回溯分析系統(tǒng)深圳超算測試報告
- 脊髓損傷患者的心態(tài)調(diào)整及支持
- 大學(xué)體育(健美操)學(xué)習(xí)通課后章節(jié)答案期末考試題庫2023年
- GB/T 31989-2015高壓電力用戶用電安全
- GB/T 14155-2008整樘門軟重物體撞擊試驗
評論
0/150
提交評論