




已阅读5页,还剩102页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第9讲数据库WebSQL,传统Web应用程序将大多数据都存储在Web服务器端的数据库中,本地存储的能力很弱。而频繁地访问数据库服务器获取数据,不但会增加网络流量,而且影响应用程序的效率。HTML5的本地存储能力得到了很大的提高,不但可以像传统Web应用程序那样将数据存储在文件中,而且还支持本地的轻型数据库。,本章知识点,1webSQLDatabaseAPI2IndexedDB,1webSQLDatabaseAPI,1判断浏览器是否支持webSQLDatabaseAPI2新建数据库3执行SQL语句,1判断浏览器是否支持webSQLDatabaseAPI,使用windows.openDatabase属性可以打开本数据库,并返回连接句柄。如果该句柄为null、undefined则说明不支持使用webSQLDatabaseAPI操作本地数据库,反之则支持。下面定义一个openDatabase()函数,用于打开本地数据库:functiongetOpenDatabase()try/如果支持则返回数据库连接句柄if(!window.openDatabase)returnwindow.openDatabase;elsereturnundefined;catch(e)returnundefined;,【例9】,在网页中定义一个按钮,单击此按钮时,会检测浏览器是否支持webSQLDatabaseAPI。定义按钮的代码如下:检测浏览器是否支持webSQLDatabaseAPI,【例9】,单击按钮check将调用check()函数。check()函数的定义代码如下:functioncheck()if(getOpenDatabase()=undefined)alert(您的浏览器不支持webSQLDatabaseAPI。);elsealert(您的浏览器支持webSQLDatabaseAPI。);,2新建数据库,webSQLDatabaseAPI在中并不包括专门用于创建数据库的API,但是以指定的数据库名为参数调用openDatabase()函数时,如果自定的数据库名不存在,则会自动创建它。带参数的openDatabase()函数的语法如下:数据库连接句柄=openDatabase(数据库名,版本号,数据库显示名称,估计容量);,【例10】,创建数据库mydatabase的代码如下:functioncreateDB()if(window.openDatabase=undefined)alert(您的浏览器不支持webSQLDatabaseAPI。);elsevardbs=window.openDatabase(mydatabase,v1.0,SavedataDB,100);if(dbs)alert(创建成功。);elsealert(打开数据库失败。);,3执行SQL语句,使用transaction()函数可以执行SQL语句,语法如下:数据库连接句柄.transaction(function(tx)tx.executeSql(CREATETABLEIFNOTEXISTSLOGS(idunique,log););transaction()函数的参数是一个回调函数,使用回调函数的参数tx来调用executeSql()函数可以执行SQL语句。下面分别介绍几个常用的SQL语句。,1创建表语句CREATETABLE,表是数据库中最重要的逻辑对象,是存储数据的主要对象。在设计数据库结构时,很重要的工作就是设计表的结构。关系型数据库的表由行和列组成。,CREATETABLE语句用于创建表,CREATETABLEIFNOTEXISTS表名(列名1数据类型字段属性,列名2数据类型字段属性,列名n数据类型字段属性),【例11】,functioncreateTable()if(window.openDatabase=undefined)alert(您的浏览器不支持webSQLDatabaseAPI。);elsevardbs=window.openDatabase(mydatabase,v1.0,SavedataDB,100);if(dbs)dbs.transaction(function(tx)tx.executeSql(CREATETABLEIFNOTEXISTSt(idUNIQUE,name););elsealert(打开数据库失败。);,DROPTABLE语句,可以使用DROPTABLE语句删除表,语法如下:DROPTABLE表名在WebSQL中执行DROPTABLE语句的方法与执行CREATETABLE语句的方法相似。,2插入数据表语句INSERT,INSERT语句用于向表中插入数据,基本使用方法如下:INSERTINTO表名(列名1,列名2,列名n)VALUES(值1,值2,值n),【例12】,functioninsert()if(window.openDatabase=undefined)alert(您的浏览器不支持webSQLDatabaseAPI。);elsevardbs=window.openDatabase(mydatabase,v1.0,SavedataDB,100);if(dbs)dbs.transaction(function(tx)tx.executeSql(INSERTINTOt(id,name)VALUES(1,lee););elsealert(打开数据库失败。);,UPDATE语句,可以通过UPDATE语句修改表中的数据。UPDATE语句的基本使用方法如下所示:UPDATE表名SET列名1=值1,列名2=值2,列名n=值nWHERE更新条件表达式,DELETE语句,DELETEFROM表名WHERE删除条件表达式,3查询数据表语句SELECT,SELECT子句FROM子句WHERE子句各子句的主要功能说明如下。SELECT子句:指定查询结果集的列组成,列表中的列可以来自一个或多个表;FROM子句:指定要查询的一个或多个表;WHERE子句:指定查询的条件;,transaction()函数,使用transaction()函数执行SELECT语句的语法如下:db.transaction(function(t)t.executeSql(SELECT语句,function(t,r),function(t,e);,t.executeSql()函数有4个参数,第一个参数是要执行的SELECT语句;第2个参数是要传递的参数,比如查询条件,如果没有参数,则使用;第3个参数是处理查询结果集的回调函数,参数r为结果集;第4个参数是处理错误的回调函数,参数e为错误对象。,【例13】,functionselect()if(window.openDatabase=undefined)alert(您的浏览器不支持webSQLDatabaseAPI。);elsevardbs=window.openDatabase(mydatabase,v1.0,SavedataDB,100);if(dbs)dbs.transaction(function(tx)tx.executeSql(SELECT*FROMt,function(tx,results)alert(results.rows.length);if(results,接上,for(vari=0;i;document.getElementById(result).innerHTML=text;,null););elsealert(打开数据库失败。);,定义一个“查询表t”按钮,查询表t,定义一个标签,用于显示查询结果,显示表t的内容,总结,我们在数据库中处理大量结构化数据,html5引入WebSQLDatabase概念。它使用SQL来操纵客户端数据库的API,这些API是异步的,规范中使用的方言是SQLlite。悲剧正是产生于此,WebSQLDatabase规范页面有着这样的声明。,翻译一下:WebSQLDatabase曾经在W3C推荐规范上,但规范工作已经停止了。目前已经陷入了一个僵局:目前的所有实现都是基于同一个SQL后端(SQLite),但是我们需要更多的独立实现来完成标准化。也就是说这是一个废弃的标准了,虽然部分浏览器已经实现,但。,但是我们学一下也没什么坏处,而且能和现在W3C力推的IndexedDB做比较。不过Chrome的控制台真心好用啊,神马cookie、LocalStorage、SessionStorage、WebSQL、IndexedDB、ApplicationCache等html5新增内容看的一清二楚,免去了很多调试代码工作。,WebSQLDatabase实际上已经被废弃,而HTML5的支持的本地存储实际上变成了WebStorage(LocalStorage和SessionStorage)与IndexedDB。WebStorage使用简单字符串键值对在本地存储数据,方便灵活,但是对于大量结构化数据存储力不从心。IndexedDB是为了能够在客户端存储大量的结构化数据,并且使用索引高效检索的API。,2IndexedDB,1数据库的相关概念2判断浏览器是否支持IndexedDB3创建和打开数据库4创建对象存储空间ObjectStore5创建索引6事务7游标,1数据库的相关概念,1数据库2数据库管理系统3数据库系统4NoSQL数据库,1数据库,数据库(Database,DB),简单地讲就是存放数据的仓库。不过,数据库不是数据的简单堆积,而是以一定的方式保存在计算机存储设备上的相互关联的数据的集合。也就是说,数据库中的数据并不是相互孤立的,数据和数据之间是有关联的。,2数据库管理系统,数据库管理系统(DatabaseManagementSystem,DBMS)是一种系统软件,介于应用程序和操作系统之间,用于帮助我们管理输入到计算机中的大量数据。如用于创建数据库,向数据库中存储数据,修改数据库中的数据,从数据库中提取信息等。,一个数据库管理系统应具备如下功能,(1)数据定义功能。可以定义数据库的结构,定义数据库中数据之间的联系,定义对数据库中数据的各种约束等。(2)数据操纵功能:可以实现对数据库中数据的添加、删除、修改,可以对数据库进行备份和恢复等。(3)数据查询功能:可以以各种方式提供灵活的查询功能,使用户可以方便地使用数据库中的数据。(4)数据控制功能:可以完成对数据库中数据的安全性控制、完整性控制、多用户环境下的并发控制等多方面的控制。(5)数据库通信功能:在分布式数据库或提供网络操作功能的数据库中还必须提供数据库的通信功能。,数据库管理系统在计算机系统中的地位,3数据库系统,数据库系统(DatabaseSystem,DBS)是指在计算机系统中引入数据库的系统,除了相关的硬件之外,数据库系统还包括数据库、数据库管理系统、应用系统、数据库管理员和用户。可以看出,数据库、数据库管理系统和数据库系统是3个不同的概念,数据库强调的是数据,数据库管理系统是系统软件,而数据库系统强调的是系统。,4NoSQL数据库,NoSQL是新一代的数据库,NoSQL有non-relational和NotOnlySQL的意思,具有非关系型、高效、分布式、开放源代码等特点。对于已经熟悉SQLServer等关系型数据库的读者而言,接受NoSQL数据库还需要有一个过程。,Nam为什么要提出NoSQL的概念呢?,因为传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型(社交网络)的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题。例如,对数据库高并发读写的需求、对海量数据的高效率存储和访问的需求、对数据库的高可扩展性和高可用性的需求等。所以,关系数据库在很多情况下显得不太合适了。NoSQL是非关系型数据存储的广义定义,它打破了关系型数据库的垄断局面。NoSQL数据存储不需要固定的表结构,通常也不存在连接操作。在大数据存取上具备关系型数据库无法比拟的性能优势。NoSQL的概念在2009年初得到了广泛认同。,2判断浏览器是否支持IndexedDB,使用window.indexedDB属性可以判断浏览器是否支持IndexedDB数据库。当前,IndexedDB的规范尚未最终定稿,不同的浏览器厂商还是使用浏览器前缀实现IndexedDBAPI。基于Gecko内核的浏览器使用moz前缀,基于WebKit内核的浏览器使用webkit前缀。如果还希望使用window.indexedDB来判断浏览器是否支持IndexedDB数据库,则可以做下面的处理:window.indexedDB=window.indexedDB|window.mozIndexedDB|window.webkitIndexedDB,【例14】,在网页中定义一个按钮,单击此按钮时,会检测浏览器是否支持IndexedDB数据库。定义按钮的代码如下:检测浏览器是否支持IndexedDB数据库,check()函数,functioncheck()window.indexedDB=window.indexedDB|window.mozIndexedDB|window.webkitIndexedDBif(window.indexedDB)alert(您的浏览器支持IndexedDB数据库。);elsealert(您的浏览器不支持IndexedDB数据库。);,3创建和打开数据库,window.indexedDB对象只有一个open方法,用于打开指定的数据库,语法如下:request对象=window.indexedDB.open(数据库名,数据库版本号)如果指定的数据库名存在,则打开它;否则创建数据库。request对象用于处理用户对数据库的操作请求。可以通过它定义操作成功和失败的处理函数。,request.onerror,通过request.onerror可以指定操作失败的处理函数,方法如下:request.onerror=function(event)/错误处理可以通过event.target.errorCode获取错误号。,提示,浏览器通常不希望恶意网站随意使用IndexedDB数据库来存储数据,因此当Web应用程序第一次使用IndexedDB数据库时会询问用户是否允许访问。而且多数浏览器在隐私模式下不允许使用IndexedDB数据库。,request.onsuccess,通过request.onsuccess可以指定操作成功的处理函数,方法如下:request.onerror=function(event)/成功处理request.result是执行指定操作的结果,例如,执行打开数据库的操作后,通过request.result可以获得打开数据库的实例。通过数据库实例可以访问数据库。,创建IndexedDB数据库MyTestDatabase,vardbvarrequest=indexedDB.open(MyTestDatabase)request.onerror=function(event)alert(错误号:+event.target.errorCode)request.onsuccess=function(event)db=request.result,4创建对象存储空间ObjectStore,IndexedDB不是关系型数据库,它使用对象存储空间(ObjectStore)来存储数据。一个数据库中可以包含多个对象存储空间,对象存储空间使用键值对的形式来存储数据,即每个数据都由一组键和一组值组成键类似关系型数据库中表的字段。例如下面的代码表示一条员工数据:id:110,name:李明,age:35,email:liming,IndexedDB数据库提供键的选项,createObjectStore()方法,使用数据库实例对象的createObjectStore()方法可以创建对象存储空间,方法如下:ObjectStore对象=数据库实例对象.createObjectStore(对象存储空间名,提供键的选项)例如,创建一个对象存储空间employees,指定keyPath选项为id(即主键为id),代码如下:varobjectStore=db.createObjectStore(employees,keyPath:id),createObjectStore()方法,数据库实例对象.objectStoreNames中包含数据库中所有的对象存储空间名称,在创建对象存储空间之前,可以使用objectStoreNames.Contains()方法判断对象存储空间名称是否已经存在,例如:if(!db.objectStoreNames.contains(employees)varobjectStore=db.createObjectStore(employees,keyPath:id);,onupgradeneeded事件,通常在onupgradeneeded事件的处理函数中执行改变数据库结构的操作(包括创建对象存储空间)。onupgradeneeded事件在下列情况下被触发:数据库第一次被打开时;打开数据库时指定的版本号高于当前被持久化的数据库版本号。,【例15】,在IndexedDB数据库MyTestDatabase中创建对象存储空间employees。定义一个“创建对象存储空间”按钮,代码如下:创建对象存储空间,create()方法,varrequest;functioncreate()request=indexedDB.open(MyTestDatabase1);request.onerror=function(event)alert(错误号:+event.target.errorCode);request.onupgradeneeded=function(event)vardb=request.result;if(!db.objectStoreNames.contains(employees)varobjectStore=db.createObjectStore(employees,keyPath:id);,【例16】,显示在IndexedDB数据库MyTestDatabase中包含的对象存储空间信息。定义一个“获取对象存储空间信息”按钮,代码如下:获取对象存储空间信息,getinfo()方法,varrequest;functiongetinfo()window.indexedDB=window.indexedDB|window.mozIndexedDB|window.webkitIndexedDBif(window.indexedDB)request=window.indexedDB.open(MyTestDatabase1);request.onerror=function(event)alert(错误号:+event.target.errorCode);request.onsuccess=function(event)vardb=request.result;,getinfo()方法,document.getElementById(info).innerHTML=数据库MyTestDatabase共有+db.objectStoreNames.length.toString()+个对象存储空间;for(vari=0;i对象存储空间名:+db.objectStoreNamesi;elsealert(您的浏览器不支持IndexedDB数据库。);,div元素info,程序从db.objectStoreNames数组中获取对象存储空间信息,并将其显示在div元素info中。div元素info的定义代码如下:,获取对象存储空间信息,5创建索引,可以通过调用ObjectStore对象.createIndex()方法在对象存储空间中创建索引,方法如下:var索引对象=ObjectStore对象.createIndex(索引名,创建索引的列(即keyPath),索引选项);,例如,ObjectStore指向对象存储空间employees,下面的语句可以在对象存储空间employees的列email上创建一个唯一索引email。objectStore.createIndex(email,email,unique:true),【例17】,varrequest;functioncreate()request=indexedDB.open(MyTestDatabase);request.onerror=function(event)alert(错误号:+event.target.errorCode);request.onupgradeneeded=function(event)vardb=request.result;if(!db.objectStoreNames.contains(employees)varobjectStore=db.createObjectStore(employees,keyPath:id);objectStore.createIndex(email,email,unique:true);,提示,因为数据库MyTestDatabase已经存在,为了触发onupgradeneeded事件,可以在open方法中使用数据库版本号参数。,6事务,事务是包含一组数据库操作的逻辑工作单元。在事务中包含的数据库操作是不可分割的整体,要么一起被执行,要么回滚到执行事务之前的状态。,1transaction()方法,调用transaction()方法可以定义一个事务,方法如下事务对象=数据库实例.transaction(事务操作的对象存储空间名,事务模式)事务模式包括如下3种情况:IDBTransaction.READ_ONLY,默认值,只读模式,也可以使用readonly;IDBTransaction.READ_WRITE,可读写模式,也可以使用readwrite;IDBTransaction.VERSION_CHANGE,版本升级模式。,事务对象支持下面3种事件,error,当事务中出现错误时触发,默认的处理方式为回滚事务;abort,当事务被终止时触发;complete,当事务中的所有操作请求都被处理完成时触发。,下面的代码演示如何定义和使用事务,vartransaction=db.transaction(employees,readwrite);/当所有的数据都被增加到数据库时执行一些操作transaction.oncomplete=function(event)alert(Alldone!)transaction.onerror=function(event)/不要忘记进行错误处理!/定义事务的操作,从事务中获得相关的对象存储空间对象,var对象存储空间对象=transaction.objectStore(对象存储空间名),2插入数据,通过对象存储空间对象.add()方法可以向对象存储空间中插入数据,方法如下:varrequest对象=对象存储空间对象.add(键1:值1,键2:值2,键n:值n),【例18】,定义一个“插入数据”按钮,代码如下:插入数据,insert()方法,varrequest;functioninsert()request=indexedDB.open(MyTestDatabase);request.onerror=function(event)alert(错误号:+event.target.errorCode);request.onsuccess=function(event)vardata=id:110,name:李明,age:35,email:liming;,insert()方法,vardb=request.result;vartrans=db.transaction(employees,IDBTransaction.READ_WRITE);varstore=trans.objectStore(employees);varrequest1=store.add(data);request1.onsuccess=function(event)alert(成功插入数据,id=+event.target.result);,2查询数据,通过对象存储空间对象.get()方法可以从对象存储空间中获取数据,方法如下:varrequest对象=对象存储空间对象.get(keypath键值)在得到的request对象的sccess事件的处理函数中,获取查询的数据,方法如下:request.onsuccess=function(event)/event.target.result就是获取的数据,【例19】,定义一个“获取数据”按钮,代码如下:获取数据,get()方法,varrequest;functionget()request=indexedDB.open(MyTestDatabase);request.onerror=function(event)alert(错误号:+event.target.errorCode);request.onsuccess=function(event)vardb=request.result;vartrans=db.transaction(employees,IDBTransaction.READ_WRITE);varstore=trans.objectStore(employees);varrequest1=store.get(110);,get()方法,request1.onsuccess=function(event)document.getElementById(info).innerHTML=id=110的记录=name:++age:+event.target.result.age+emaii:+event.target.result.email;,div元素info的定义代码,获取id=110的记录,3删除数据,通过对象存储空间对象.delete()方法可以删除对象存储空间中的数据,方法如下:varrequest对象=对象存储空间对象.delete(keypath键值),【例20】,定义一个“插入数据”按钮,代码如下:删除数据,deletedata()方法,varrequest;functiondeletedata()request=indexedDB.open(MyTestDatabase);request.onerror=function(event)alert(错误号:+event.target.errorCode);request.onsuccess=function(event)vardb=request.result;,deletedata()方法,vartrans=db.transaction(employees,IDBTransaction.READ_WRITE);varstore=trans.objectStore(employees);varrequest1=store.delete(110);request1.onsuccess=function(event)alert(成功删除数据);,7游标,通过对象存储空间对象.get()方法只能根据keypath键值从对象存储空间中获取数据,如果要获取对象存储空间中的一组数据,就需要使用游标。游标从字面来理解就是游动的光标。用数据库语言来描述,游标是映射在结果集中一行数据上的位置实体,有了游标,用户就可以访问结果集中的任意一行数据了。将游标放置到某行后,即可对该行数据进行操作,最常见的操作是提取当前行数据。,【例21】,为了演示游标的作用,在对象存储空间employees中插入一组数据。定义一个“插入数据”按钮,代码如下:插入数据,insert()方法,插入数据varrequest;functioninsert()request=indexedDB.open(MyTestDatabase);request.onerror=function(event)alert(错误号:+event.target.errorCode);request.onsuccess=function(event)vardata=id:110,name:Tom,age:25,email:tom,id:210,name:John,age:26,email:john,id:310,name:Alice,age:27,email:alice,id:410,name:Mike,age:28,email:mike,id:510,name:Sophia,age:29,email:sophia;,接上,vardb=request.result;vartrans=db.transaction(employees,IDBTransaction.READ_WRITE);varstore=trans.objectStore(employees);/删除可能的垃圾数据store.delete(110);store.delete(210);store.delete(310);store.delete(410);store.delete(510);for(variindata)varrequest1=store.add(datai);request1.onsuccess=function(event)alert(成功插入数据,id=+event.target.result);,1遍历对象存储空间中的数据,可以通过调用ObjectStore对象.openCursor()方法在对象存储空间中打开游标,方法如下:varrequest对象=ObjectStore对象.openCursor();在request对象的onsuccess()处理函数中可以通过event.target.result得到游标对象,代码如下:request.onsuccess=function(event)varcursor=event.target.result/游标对象,使用下面的方法可以访问游标对象中的数据,cursor.key,得到游标中的Keypath值;cursor.value.键名,得到游标中指定键的值。打开游标后,游标指向对象存储空间中的第一条数据。调用cursor.continue()方法可以将游标移动到下一条记录,并触发request对象的success事件。因此,在request对象的onsuccess()处理函数中调用cursor.continue()方法就可以遍历打开的对象存储空间中的数据,【例22】,使用游标遍历对象存储空间employees中的数据。定义一个“查询数据”按钮,代码如下:查询数据,query()方法,varrequest;functionquery()request=indexedDB.open(MyTestDatabase);request.onerror=function(event)alert(错误号:+event.target.errorCode);request.onsuccess=function(event)vardb=request.result;vartrans=db.transaction(employees,IDBTransaction.READ_WRITE);,query()方法,varstore=trans.objectStore(employees);varrequest1=store.openCursor();request1.onsuccess=function(event)varcursor=event.target.result;if(cursor)document.getElementById(info).innerHTML+=id:+cursor.key+;name:++;age:+cursor.value.age+;email:+cursor.value.email+;cursor.continue();elsealert(查询完成);,使用游标遍历对象存储空间employees中的数据,2指定查询数据的范围,如果在打开游标时不希望遍历对象存储空间中的所有数据,也可以在openCursor()方法中指定一个查询范围,方法如下:varrequest对象=ObjectStore对象.openCursor(查询范围对象);,(1)匹配等于指定键值的记录,使用IDBKeyRange.only()方法可以指定查询范围为指定键值的记录,方法如下:查询范围对象=IDBKeyRange.only(指定键值),(2)匹配小于指定键值的记录,使用IDBKeyRange.lowerBound()方
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025浙江舟山市普陀区妇幼健康服务中心招聘编外人员1人考试模拟试题及答案解析
- 2025云南黄金集团第二次招聘工作人员8人笔试备考题库及答案解析
- 2025安徽合肥凯欣教育集团招聘2人考试参考题库附答案解析
- 2025云南楚雄州武定县插甸学校教师招考13人流动考试备考试题及答案解析
- 2025浙江绍兴市人防工程质量安全和技术服务中心编外用工招聘1人笔试参考题库附答案解析
- 2025贵州贵阳市某机关工作人员招聘笔试参考题库附答案解析
- 2025浙江金华市金西丰子恺学校(汤溪中学委托管理)招聘储备教师4人考试参考题库附答案解析
- 2025安徽长丰县北城世纪城学校临聘教师招聘24人笔试模拟试题及答案解析
- 甘南事业单位2025年招聘笔试参考题库附答案解析
- 2025年秋宣恩县城区学校公开选聘71名县内在编教师考试参考题库附答案解析
- 临床中医护理课件教学
- 数学-“问题解决策略:转化”教案 2024-2025学年北师大版七年级数学下册
- 征收房屋转让协议书
- 锅炉使用单位安全员考试试题
- 上海世博轴及地下综合体工程施工组织设计
- 液化天然气码头设计规范JTS 165-5-2021
- TFSI 098-2022 《氨基硅油》发布稿
- 2025年高考物理二轮复习:11个模块知识讲义
- 胖东来面试题及答案
- 2024初级注册安全工程师笔试真题含答案
- 海宁市食品农产品检验检测中心改建项目环评报告
评论
0/150
提交评论