JavaWeb及其框架技術(shù) 課件 第10、11章 MyBatis框架的使用、SSM整合應(yīng)用案例_第1頁
JavaWeb及其框架技術(shù) 課件 第10、11章 MyBatis框架的使用、SSM整合應(yīng)用案例_第2頁
JavaWeb及其框架技術(shù) 課件 第10、11章 MyBatis框架的使用、SSM整合應(yīng)用案例_第3頁
JavaWeb及其框架技術(shù) 課件 第10、11章 MyBatis框架的使用、SSM整合應(yīng)用案例_第4頁
JavaWeb及其框架技術(shù) 課件 第10、11章 MyBatis框架的使用、SSM整合應(yīng)用案例_第5頁
已閱讀5頁,還剩72頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第10章MyBatis框架的使用了解DAO層設(shè)計的基礎(chǔ)知識了解MyBatis框架的基礎(chǔ)知識掌握MyBatis框架中核心對象的使用方法正確編寫MyBatis框架的配置文件正確編寫MyBatis框架的映射文件掌握MyBatis框架的常用注解學(xué)習(xí)目標(biāo)MVC模式中,JDBC技術(shù)本應(yīng)屬于模型層(M層)范疇,但由于JDBC技術(shù)相對獨立,從軟件的可重用性、可維護(hù)性出發(fā),應(yīng)該把JDBC技術(shù)從模型層剝離,設(shè)立DAO層(DataAccessObject)與Service層,主要思想是封裝JDBC,所封裝的類主要有兩種功能:一是連接管理器,負(fù)責(zé)連接資源的獲得和釋放;二是負(fù)責(zé)管理數(shù)據(jù)庫常用事務(wù)處理的類,包括增、刪、改、查等操作。10.1DAO層技術(shù)簡介在DAO層的具體設(shè)計過程中,一種設(shè)計思路是針對每個數(shù)據(jù)庫表設(shè)計一個服務(wù)類,如針對user表設(shè)計一個實現(xiàn)增、刪、改、查等操作的類(DaoUser類),這種設(shè)計存在與數(shù)據(jù)庫耦合性強(qiáng)、可重用性不強(qiáng)等缺點,換一張表,就要重新設(shè)計與該表對應(yīng)的DAO類。另一種設(shè)計思路不針對具體的數(shù)據(jù)庫表,目標(biāo)對象是整個數(shù)據(jù)庫,對數(shù)據(jù)庫進(jìn)行操作,以SQL語句作為業(yè)務(wù)邏輯層到DAO層進(jìn)行參數(shù)傳遞。MyBatis框架出現(xiàn)后,不需要直接使用JDBC來操作數(shù)據(jù)庫了。在DAO層中設(shè)計了接口,面向接口與抽象的編程是有利于系統(tǒng)的維護(hù)和擴(kuò)展,將接口與實現(xiàn)相分離。10.1DAO層技術(shù)簡介MyBatis是GoogleCode的一個開源項目,是一個支持普通SQL語句、存儲過程和高級映射的持久層框架。MyBatis使用簡單的XML或注解進(jìn)行配置,將原生類型、接口(Dao接口)和POJO映射成數(shù)據(jù)庫記錄。MyBatis要解決的核心問題就是對象-關(guān)系映射(Object/RelationMapping,ORM)10.2MyBatis框架概述MyBatis框架是對象-關(guān)系映射的一種實現(xiàn),是一種用來解決面向?qū)ο蟪绦蛟O(shè)計與數(shù)據(jù)庫之間不匹配問題的技術(shù),它通過描述Java對象與數(shù)據(jù)庫表之間的映射關(guān)系,自動將Java應(yīng)用程序中的對象持久化到關(guān)系數(shù)據(jù)庫的表中。ORM解決的主要問題是對象關(guān)系的映射。域模型和關(guān)系模型都建立在概念模型的基礎(chǔ)上。域模型是面向?qū)ο蟮?,而關(guān)系模型是面向關(guān)系的。一般情況下,一個持久化類和一個表對應(yīng),類的每個實例對應(yīng)表中的一條記錄,類的每個屬性對應(yīng)表的每個字段。ORM的工作原理如圖所示:10.2.1ORM與MyBatisMybatis框架在GitHub上有多種下載版本。以版本mybatis-3.5.11為例,下載該版本后,需要將其中的mybatis-3.5.11.jar文件復(fù)制到工程的lib目錄下,同時不能忘記添加MySQL的數(shù)據(jù)庫驅(qū)動程序。MyBatis技術(shù)網(wǎng)站,為開發(fā)者提供了最新的MyBatis相關(guān)技術(shù)文檔,同時提供了學(xué)習(xí)MyBatis框架所需的一些基本知識。10.2.2MyBatis框架的開發(fā)環(huán)境搭建讀取MyBatis的配置文件。加載映射文件。構(gòu)造會話工廠。創(chuàng)建會話對象SqlSession。創(chuàng)建執(zhí)行器。封裝SQL信息。輸入?yún)?shù)映射。輸出結(jié)果映射。10.3MyBatis框架的工作原理sqlSession對象是MyBatis框架的關(guān)鍵對象,是執(zhí)行持久化操作的對象,類似于JDBC中的Connection接口。它是應(yīng)用程序與持久層之間執(zhí)行交互操作的一個單線程對象,也是MyBatis框架執(zhí)行持久化操作的關(guān)鍵對象。sqlSession對象包含數(shù)據(jù)庫中所有執(zhí)行SQL操作的方法,對JDBC操作數(shù)據(jù)庫的方法進(jìn)行了封裝,可以用SqlSession實例來直接執(zhí)行被映射的SQL語句。常用的方法如表:方法定義方法描述<T>TselectOne(Stringstatement,Objectparameter)查詢方法,查詢結(jié)果是一個泛型對象或為null<E>List<E>selectList(Stringstatement,Objectparameter)查詢方法,查詢結(jié)果可以是0到多個泛型對象的集合,也可以為null<K,V>Map<K,V>selectMap(Stringstatement,Objectparameter,StringmapKey)查詢方法,查詢結(jié)果是一個Map集合intinsert(Stringstatement,Objectparameter)更新方法,執(zhí)行插入表中記錄操作intupdate(Stringstatement,Objectparameter)更新方法,執(zhí)行更新表中記錄操作intdelete(Stringstatement,Objectparameter)更新方法,執(zhí)行刪除表中記錄操作voidcommit()事務(wù)提交voidrollback()事務(wù)回滾voidclose()關(guān)閉sqlSession對象<T>TgetMapper(Class<T>type)獲取映射器類接口,通過使用映射器類執(zhí)行映射語句ConnectiongetConnection()獲取數(shù)據(jù)庫連接對象的方法10.4.1MyBatis框架的配置文件

MyBatis框架的配置文件是MyBatis框架的必備文件,包含了影響MyBatis框架行為的設(shè)置信息和屬性信息。配置文檔的頂層結(jié)構(gòu)如下,各個元素的次序不能顛倒。10.4MyBatis框架的配置與映射開發(fā)<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEconfigurationPUBLIC"-////DTDConfig3.0//EN""/dtd/mybatis-3-config.dtd"><configuration> <properties/> <settings/> <typeAliases/> <typeHandlers/> <plugins/> <environments/> <environment> <transactionManager/> <datasource/> </environment> </environments> <databaseIdProvider/> <mappers/></configuration>例10-1配置文件的示例10.4.2配置文件中的常用元素1.<properties>元素

<properties>元素是一個配置屬性的元素,該元素通常用于將內(nèi)部的配置外在化,即通過外部的配置文件動態(tài)地替換內(nèi)部定義的屬性。例如,數(shù)據(jù)庫的連接等常用屬性,就可以通過典型的Java屬性文件中的配置來替換。例10-2

演示perties配置文件的使用(1)在src目錄下創(chuàng)建名為perties的配置文件(2)在MyBatis配置文件mybatis-config.xml中通過<properties>元素的resource屬性引入perties文件。(3)由于有了perties屬性文件的導(dǎo)入,所以可修改配置文件中連接數(shù)據(jù)庫的信息。2.<mappers>元素在配置文件中,<mappers>元素用于指定映射文件的位置。MyBatis框架提供了4種引入映射文件的方式。(1)使用類路徑引入映射文件的方式如下。<mappers><mapperresource="com/mapper/UserInfo.xml"/></mappers>(2)使用本地文件絕對路徑引入映射文件的方式如下。<mappers><mapperurl="file://e:/com/mapper/UserInfo.xml"/></mappers>(3)使用接口類引入映射文件的方式如下。<mappers><mapperclass="com/mapper/UserInfoMapper"/></mappers>(4)使用包名引入映射文件的方式如下。<mappers><packagename="com.mapper"/></mappers>映射器是MyBatis框架最復(fù)雜且最重要的部分,它由一個接口與一個XML映射文件(或者注解)組成。10.5.1常用元素在映射文件中,<mapper>元素是映射文件的根元素,其他元素都是它的子元素,這些子元素如表10-2所示。10.5XML映射文件元素名稱描述備注selectSQL查詢語句可自定義參數(shù),返回結(jié)果集insert插入語句執(zhí)行后返回一個整數(shù),代表插入記錄數(shù)update更新語句執(zhí)行后返回一個整數(shù),代表更新記錄數(shù)delete刪除語句執(zhí)行后返回一個整數(shù),代表刪除記錄數(shù)sql定義一個SQL片段這個SQL片段可以在映射文件的其他地方引用resultMap定義查詢結(jié)果集這個結(jié)果集一般用于關(guān)聯(lián)操作中cache給定命名空間的緩存配置—Cache-ref引用已定義的緩存配置—2.<select>元素<select>元素是MyBatis框架中最常用的元素之一,它可以幫助我們從數(shù)據(jù)庫中讀取數(shù)據(jù),在多數(shù)應(yīng)用中,查詢比修改要頻繁和復(fù)雜。<select>元素的常用屬性如表10-3所示。屬性說明id命名空間中唯一的標(biāo)識符,在其他地方可以通過id引用或執(zhí)行指定的SQL語句parameterType將會傳入當(dāng)前語句的參數(shù)類的完全限定名或別名。resultType從SQL語句中返回的類的完全限定名或別名。如果返回的是集合,那么應(yīng)該指定集合中包含的類型,而不是集合本身。resultMap外部resultMap的命名引用flushCache將其設(shè)置為true后,清空本地緩存和二級緩存,默認(rèn)值為falseuserCache將其設(shè)置為true后,本條查詢語句的結(jié)果被二級緩存緩存起來,默認(rèn)值為truetimeout設(shè)置等待數(shù)據(jù)庫返回請求結(jié)果的時間,單位為秒fetchSize設(shè)定查詢結(jié)果返回的行數(shù)statementType可以取值STATEMENT、PREPARED或CALLABLE。resultSetType可以取值為FORWARD_ONLY(游標(biāo)允許向前訪問)、SCROLL_SENSITIVE(雙向流動,但不及時更新)、SCROLL_INSENSITIVE(雙向流動,并及時跟蹤數(shù)據(jù)庫的更新)、DEFAULT(依賴驅(qū)動)resultSets適合多個結(jié)果集的情況,它將列出執(zhí)行后返回的結(jié)果集中每個結(jié)果集的名稱,名稱之間用逗號分隔3.<insert>元素<insert>元素用于映射插入語句,在執(zhí)行完映射語句后會返回一個整數(shù),表示插入記錄數(shù)。<insert>元素的屬性及功能如表10-4所示。屬性描述id命名空間中的唯一標(biāo)識符,可用來代表指定的SQL語句parameterType將要傳入語句的參數(shù)的完全限定類名或別名。statementType可以取值STATEMENT、PREPARED或CALLABLE。userGeneratedKeys讓MyBatis框架使用JDBC的getGeneratedKeys()方法取出數(shù)據(jù)庫內(nèi)部生成的主鍵(僅對<insert>元素和<update>元素有用),如MySQL、SQLServer等關(guān)系型數(shù)據(jù)庫管理系統(tǒng)的自動遞增字段,默認(rèn)值為falsekeyProperty唯一標(biāo)記一個屬性(僅對<insert>元素和<update>元素有用),MyBatis框架會通過getGeneratedKeys()方法的返回值或者通過insert語句的selectKey子元素設(shè)置其鍵值,默認(rèn)值為未設(shè)置(unset)。如果我們希望得到多個生成的列,那么也可以通過逗號分隔屬性名稱列表keyColumn通過生成的鍵值設(shè)置表中的列名(僅對<insert>元素和<update>元素有用),這個設(shè)置僅在某些數(shù)據(jù)庫(如PostgreSQL)中是必須的,當(dāng)主鍵列不是表中的第一列時需要設(shè)置。如果我們希望使用多個生成的列,那么也可以通過逗號分隔屬性名稱列表4.<update>元素和<delete>元素<update>元素和<delete>元素的使用相對比較簡單,它們的屬性配置也基本相同。在映射文件中使用這兩個元素完成更新和刪除的示例如下。<updateid="modifyUser"parameterType="org.po.UserInfo"> updateuserinfosetusername=#{userName},password=#{password},role=#{role}, status=#{status}whereuserid=#{userId}</update><deleteid="removeUser"parameterType="Integer"> deletefromuserinfowhereuserid=#{userId}</delete>5.<sql>元素<sql>元素可以被用來定義可重用的SQL代碼片段,可以包含在其他語句中,也可以(在加載時)被靜態(tài)地設(shè)置參數(shù)。在不同的包含語句中可以設(shè)置不同的值到參數(shù)占位符上,舉例如下。<sqlid="userColumns">${alias}.id,${alias}.username,${alias}.password</sql>這個SQL片段可以被包含在其他語句中,舉例如下。<selectid="selectUsers"resultType="map">select<includerefid="userColumns"><propertyname="alias"value="t1"/></include><includerefid="userColumns"><propertyname="alias"value="t2"/></include>fromtable1t1crossjointable2t2</select>如果映射文件中經(jīng)常有重復(fù)的SQL片段,那么采用<sql>元素可避免編寫重復(fù)的代碼,提高代碼的可重用率

MyBatis框架對查詢的結(jié)果具備一定的自動識別功能,如果查詢的結(jié)果是一個集合,那么它會將結(jié)果自動映射為一個List或一個Map,如以下SQL查詢語句片段。在如以下SQL查詢語句片段。<selectid="selectAllUser"resultType="org.po.User"> select*fromUser</select>這個查詢的結(jié)果可能為空,也可能為多個結(jié)果的集合,雖然在此我們給出的是resultType=“User”,但實際上返回的結(jié)果是一個List<User>的泛型。

一般實體類的屬性和數(shù)據(jù)表的列名都是一一對應(yīng)的,但難免有不對應(yīng)的情況,這時就需要配置<resultMap>元素,使得實體類的屬性和數(shù)據(jù)表的列名能夠?qū)?yīng)起來,讓MyBatis框架完成封裝。

另一種情況就是多表關(guān)聯(lián)操作。此時多表關(guān)聯(lián)查詢的結(jié)果集會非常復(fù)雜,包含多個表的字段和表達(dá)式,此時只能用<resultMap>元素在外部重新定義一個結(jié)果映射。這種情況在第10章給于描述。10.6結(jié)果映射<result>元素通過<resultMap>元素定義一個結(jié)果集,<resultMap>元素的結(jié)構(gòu)如下:<resultMapid=“唯一標(biāo)識”type=“pojo對象類型"><idcolumn="表的主鍵字段"jdbcType="字段類型"property="pojo對象的主鍵屬性”/><resultcolumn="表字段"jdbcType="字段類型"property="pojo對象屬性"/><associationproperty="pojo的一個對象屬性"javaType="pojo關(guān)聯(lián)的pojo對象"><idcolumn="關(guān)聯(lián)pojo對象對應(yīng)表的主鍵字段"jdbcType="字段類型"property="關(guān)聯(lián)pojo對象的唯一標(biāo)識屬性"/><resultcolumn="表的字段"jdbcType="字段類型"property="關(guān)聯(lián)pojo對象的屬性"/></association><collectionproperty="pojo對象的集合屬性"ofType="集合中的pojo對象><idcolumn="集合中pojo對象對應(yīng)的表的主鍵字段"jdbcType="字段類型”property="集合中pojo對象的唯一標(biāo)識屬性”/><resultcolumn="任意表的字段"jdbcType="字段類型"property="集合中pojo對象的屬性"/></collection></resultMap>示例:表department(dept_id,dept_name),編號列dept_id為int型的主鍵,名稱列dept_name為varchar(20),針對表department編寫映射文件,返回結(jié)果用<resultMap>元素定義一個結(jié)果映射。Department類定義:publicclassDepartment{ privateintid; privateStringname; //Getter方法與Setter方法略}創(chuàng)建映射文件DepartmentMapper.xml,文件內(nèi)容如下。<?xmlversion="1.0"encoding="UTF-8"?><mappernamespace="mapper.DepartmentMapper"> <resultMaptype="po.Department"id="deptResultMap"> <idproperty="id"column="dept_id"/> <resultproperty="name"column="dept_name"/> </resultMap> <selectid="selectAllDept"resultMap="deptResultMap"> select*fromdepartment </select></mapper>除了使用xml映射文件配置,還可以使用注解的配置方式。常用注解如下表:10.7MyBatis框架的注解開發(fā)注解返回值的數(shù)據(jù)類型對應(yīng)的SQL語句備注@InsertInteger(int)、Long和BooleanINSERTINTOtb_user(column1,column2,column3,...)VALUES(value1,value2,value3,...)—@SelectInteger(int)、Long和自定義類型的BeanSELECT*FROMtable_name返回值不能為Boolean類型的值@UpdateInteger(int)、Long和

BooleanUPDATEtb_userSETcolumn1=value1,column2=value2,..WHEREsome_column=some_value—@DeleteInteger(int)、Long和

BooleanDELETEFROMtb_userWHEREsome_column=some_value—MyBatis框架的其他注解如下表10.7MyBatis框架的注解開發(fā)注解作用屬性描述@SelectKey返回新插入記錄的lD。對應(yīng)<SelectKey>標(biāo)簽的XML元素statement為要執(zhí)行的SQL字符串?dāng)?shù)組;keyProperty為更新的參數(shù)對象的屬性值;resultType為keyProperty的Java類型;before屬性指明SQL語句在插入語句之前還是之后執(zhí)行,值為true或false@Results設(shè)置結(jié)果集合。對應(yīng)<resultMap>標(biāo)簽的XML元素value為@Result注解的數(shù)組@Result在實體類屬性和數(shù)據(jù)表字段之間建立的結(jié)果映射。對應(yīng)<result>標(biāo)簽的XML元素包括id、column、property、javaType、jdbcType、typeHandler、one、many屬性。@One復(fù)雜類型的單獨屬性值映射。對應(yīng)<association>標(biāo)簽select為已映射語句(映射器方法)的完全限定名,可以加載合適類型的實例@Many復(fù)雜類型的集合屬性映射。對應(yīng)<collection>標(biāo)簽select為映射器方法的完全限定名,可以加載一組合適類型的實例@Options映射語句的屬性,該注解提供額外的配置選項,它們通常在映射語句上作為屬性出現(xiàn)useCache=true;flushCache=false;resultSetType=FORWARD_ONLY;statementType=PREPARED;fetchSize=-1;timeout=-1;useGeneratedKeys=false;keyProperty=“id”@Param方法參數(shù)使用默認(rèn)的順序命名方式。如#{1}、#{2}等使用@Param(“person”)時,SQL語句中的參數(shù)應(yīng)該被命名為#{person}例10-5利用注解實現(xiàn)userinfo表的CRUD。(1)創(chuàng)建實體類。publicclassUserInfo{ privateintuserId; privateStringuserName; privateStringpassword; privateintrole; privatebooleanstatus;//Getter方法與Setter方法略}(2)創(chuàng)建UserInfo接口。publicinterfaceUserInfoMapper{ //添加記錄 @Insert("insertintouserinfo(username,password,role,status)values(#{userName},#{password},#{role},#{status})") @Options(useGeneratedKeys=true,keyProperty="userId") intaddUserInfo(UserInfouser); 10.7MyBatis框架的注解開發(fā)//根據(jù)ID刪除記錄@Delete("deletefromuserinfowhereuserid=#{userId}")intremoveUser(@Param("userId")IntegeruserId);//根據(jù)ID更新記錄@Update("updateuserinfosetusername=#{userName},password=#{password},role=#{role},status=#{status}whereuserid=#{userId}")intmodifyUser(UserInfouser);//根據(jù)ID查詢記錄@Select("select*fromuserinfowhereuserid=#{userId}")//userinfo表中字段與UserInfo類中的屬性映射@Results({@Result(id=true,column="userId",property="userId"),@Result(column="username",property="userName")})UserInfo

selectUserInfoById(Integerid);//查詢表中的所有記錄@Select("select*fromUserInfo")List<UserInfo>selectAllUserInfo();10.7MyBatis框架的注解開發(fā)(3)在mybatis-config.xml文件中填寫如下配置。<mappers> <mapperclass="mapper.UserInfoMapper"/><mappers>(4)添加如下測試用例。publicclassUserInfoTest{ //查詢表中所有user @Test

voidselectAllUserTest(){

SqlSession

sqlSession=null;

sqlSession=MybatisUtils.getSession();

UserMapper

userMapper=sqlSession.getMapper(UserMapper.class); List<UserInfo>users=userMapper.selectAllUserInfo();

System.out.println(users); }//測試插入方法,刪除方法,修改方法,根據(jù)ID查詢信息todo10.7MyBatis框架的注解開發(fā)本章結(jié)合DAO層的設(shè)計思想,將MyBatis框架技術(shù)應(yīng)用于數(shù)據(jù)持久化設(shè)計中。主要包括MyBatis框架概述、MyBatis框架的工作原理、MyBatis框架的配置與映射開發(fā),以及XML映射文件、結(jié)果映射<result>元素、MyBatis框架的注解開發(fā)。在本章的學(xué)習(xí)中,讀者應(yīng)仔細(xì)體會DAO分層設(shè)計思想的精髓。

10.5本章小結(jié)實驗要求:(1)創(chuàng)建數(shù)據(jù)庫studb,創(chuàng)建Student表,字段有編號(id、Integer類型、主鍵、自動增長)、學(xué)號(stu_no,varchar

(12)類型)、姓名(stu_name,varchar

(20)類型),年齡(age,Integer類型)。(2)創(chuàng)建針對Student表的PO類和映射文件,在映射文件中利用<insert>、<delete>、<update>和<select>4個元素實現(xiàn)表的增、刪、改、查操作。(3)創(chuàng)建jUnit測試類,分別測試映射文件中4個元素對應(yīng)的SQL語句,完成該表的增、刪、改、查操作。操作步驟提示:(1)創(chuàng)建一個Web工程,添加所需的jar包,規(guī)劃包的結(jié)構(gòu);(2)導(dǎo)入mybatis框架的jar包;(3)創(chuàng)建屬性文件perties,存放數(shù)據(jù)連接信息;(4)在src目錄下創(chuàng)建MyBatis框架的配置文件mybatis-config.xml;(5)在PO包中創(chuàng)建Student類;(6)創(chuàng)建mapper包,在mapper包中創(chuàng)建StudentMapper.xml映射文件;(7)創(chuàng)建utils包,在utils包中創(chuàng)建工具類MybatisUtils;(8)創(chuàng)建test包,在test包中創(chuàng)建jUnit測試類StudentTest,并添加相應(yīng)的測試方法。10.6習(xí)題與實驗設(shè)計第11章SSM整合應(yīng)用案例了解系統(tǒng)架構(gòu)和項目組織結(jié)構(gòu)掌握Maven項目管理工具的使用熟悉系統(tǒng)環(huán)境搭建與配置文件管理掌握SSM框架整合方式掌握登錄模板與客戶管理模塊的編寫調(diào)試掌握圖片文件的上傳與顯示學(xué)習(xí)目標(biāo)在本章,我們將通過Maven進(jìn)行配置管理,綜合前面各章所學(xué)知識,使用Spring、SpringMVC、MyBatis、MySQL、JSP、JSTL等技術(shù)來設(shè)計一個簡易的客戶管理系統(tǒng),整合SSM框架,實現(xiàn)系統(tǒng)登錄與客戶信息管理的功能。11.1系統(tǒng)概述設(shè)計一個簡易的客戶管理系統(tǒng),系統(tǒng)要求合法的用戶登錄后進(jìn)行訪問,主要包含客戶管理模塊和客戶類別管理模塊。功能模塊如圖所示:11.1.1系統(tǒng)功能設(shè)計在MySQL中設(shè)計一個名為crmdb的數(shù)據(jù)庫,并創(chuàng)建Customer表、Type表和User表,這3張表的表結(jié)構(gòu)分別如表11-1、表11-2和表11-3所示。11.1.2數(shù)據(jù)庫設(shè)計字段名類型長度是否為空說明idint11否指自動編號,為主鍵numberint11是指客戶編號namevarchar20是指客戶名稱gendervarchar2是指性別ageint11是指年齡phonevarchar20是指聯(lián)系電話filenamevarchar50是指照片文件名稱type_idint11是指客戶類別編號表11-1Customer表字段名類型長度是否為空說明idint11否指自動編號,為主鍵namevarchar20是指客戶類別名稱numberint11是指客戶類別編號rateDecimal10是指折扣率,保留兩位小數(shù)字段名類型長度是否為空說明userIdint11否指用戶編號,為主鍵usernamevarchar20是指用戶名passwordvarchar20是指密碼roleint11是指角色statusbit1是指狀態(tài),其中值為1表示正常狀態(tài),值為0表示禁用狀態(tài)表11-3User表表11-2Type表數(shù)據(jù)庫設(shè)計完成后,可以根據(jù)數(shù)據(jù)庫表建立對應(yīng)的實體類。在面向?qū)ο蟮脑O(shè)計中,建立Customer類與Type類之間的多對一關(guān)系,是在“多”的一方(Customer)加入“一”的一方(Type)的屬性關(guān)聯(lián)。11.1.3實體類設(shè)計publicclassCustomer{ privateIntegerid; privateIntegernumber; privateStringname; privateStringgender; privateIntegerage; privateStringfilename; privateStringphone; privateTypetype; //省略Getter方法與Setter方法}publicclassType{privateIntegerid;privateStringname;privateIntegernumber;privateDoublerate;//省略Getter方法與Setter方法}publicclassUser{ privateintuserId; privateStringuserName; privateStringpassword; privateintrole; privatebooleanstatus; //省略Getter方法與Setter方法}Maven就是一個包含了項目對象模型(ProjectObjectModel,POM)的軟件項目管理工具,可以通過配置描述信息來管理項目的構(gòu)建、創(chuàng)建報告和文檔。該工具可以幫助程序員從煩瑣的項目配置工作中解放出來,輕松地進(jìn)行工程構(gòu)建、jar包管理、代碼編譯,自動運(yùn)行單元測試、打包、生成報表,甚至還能部署項目、生成Web站點。11.2項目構(gòu)建工具M(jìn)aven與SSM項目創(chuàng)建1.下載Maven從官網(wǎng)上下載最新版本的Maven,以Maven3.9.0版本為例,下載完成后,將壓縮包解壓到計算機(jī)某一目錄下。2.在IDEA中配置Maven在IDEA中配置Maven非常簡單。首先打開IDEA,在菜單欄中單擊“File”選項;其次單擊“Settings”選項,彈出一個設(shè)置窗口,在窗口的左側(cè)樹形菜單中選擇“Build,Execution,Deployment”→“BuildTools”→“Maven”選項,這時會出現(xiàn)如圖11-3所示的Maven配置區(qū)域。單擊“Mavenhomepath”右側(cè)的“...”按鈕,打開文件選擇器。在文件選擇器中,選擇本機(jī)的Maven安裝目錄,這時Usersettingsfile和Localrepository的值會自動關(guān)聯(lián)本機(jī)Maven的配置文件和在配置文件中指定的本地倉庫。3.設(shè)置Maven參數(shù)詳見“settings.xml”文件11.2.1Maven的使用在IDEA中新建項目,在窗口的左側(cè)列表先選擇“Maven”選項11.2.2利用Maven創(chuàng)建SSM項目2.輸入項目的Name和選擇保存位置Location,設(shè)置Maven項目的GroupId、ArtifactId和Version,其他可以保持默認(rèn)設(shè)置。這里將Name設(shè)置為crmPrj,單擊“Next”按鈕。11.2.2利用Maven創(chuàng)建SSM項目3.窗口切換到設(shè)置Maven本地倉庫的界面,如圖11-6所示,因為在之前已經(jīng)實現(xiàn)了在IDEA中集成Maven,所以在此不需要做修改,單擊“Finish”按鈕完成Module的創(chuàng)建。11.2.2利用Maven創(chuàng)建SSM項目4.創(chuàng)建Maven項目后,雖然在main目錄下有存放Web資源的webapp目錄,但沒有存放Java文件和配置文件的目錄。這時需要將java和resources目錄設(shè)置為存放Java代碼和配置文件的根目錄。右擊java目錄,選擇“MakeDirectoryas”→“SourcesRoot”,即可設(shè)置該目錄為代碼根目錄。根據(jù)以上操作將resources目錄設(shè)置為“ResourcesRoot”,即設(shè)置該目錄為源代碼配置文件的根目錄.11.2.2利用Maven創(chuàng)建SSM項目項目創(chuàng)建完成后,需要在pom.xml文件中配置SSM的依賴。11.2.3配置SSM依賴pom.xml文件是Maven的核心文件,由該文件實現(xiàn)項目構(gòu)建與項目管理等任務(wù)。用戶根據(jù)pom.xml文件指定的目錄結(jié)構(gòu),定義項目需要的各類組件及其他信息,Maven根據(jù)pom.xml文件中的內(nèi)容,自動下載依賴庫(包),并導(dǎo)入到項目中,從而完成項目的構(gòu)建。pom.xml文件結(jié)構(gòu)詳見代碼文件。例10-1配置文件的示例在SSM框架中,SpringMVC負(fù)責(zé)Controller層,MyBatis框架負(fù)責(zé)數(shù)據(jù)持久層,Spring框架負(fù)責(zé)使用DI和AOP解耦合、集成DAO層。要讓它們協(xié)調(diào)工作,首先需要設(shè)計合適的Java包結(jié)構(gòu),其次使用配置文件整合SSM。11.3SSM框架整合使用三層架構(gòu)模式對Java包的結(jié)構(gòu)進(jìn)行設(shè)計。在com.ssm包下創(chuàng)建子包,包的名稱如表11-4所示。11.3.1項目結(jié)構(gòu)包名描述entity封裝各實體類controller控制器包,即SpringMVC類存放的位置service業(yè)務(wù)邏輯接口包,對一個或多個DAO層進(jìn)行再次封裝service.impl業(yè)務(wù)邏輯實現(xiàn)類包,調(diào)用DAO層的操作,封裝成一個服務(wù)dao數(shù)據(jù)庫訪問接口包,即MyBatis接口存放的位置interceptor自定義攔截器util工具包,處理日志項目使用Maven工具管理,統(tǒng)一項目目錄,使不同IDEA創(chuàng)建的Maven項目可以通用。將SSM項目涉及的多個配置文件統(tǒng)一放到resources文件夾下,描述如表11-5所示,結(jié)構(gòu)如圖11-9所示。11.3.1項目結(jié)構(gòu)文件/文件夾描述mapper文件夾用于存放MyBatis映射文件applicationContext.xmlSpring核心配置文件perties數(shù)據(jù)庫鏈接信息配置文件springmvc.xmlSpringMVC配置文件webapp文件夾存放Web資源,如HTML(HtyperTextMarkupLanguage,超文本標(biāo)記語言)、CSS(CascadingStyleSheet,層疊樣式表)、JavaScript等靜態(tài)文件及JSP文件。在MVC架構(gòu)思想下,由于所有請求都要經(jīng)過控制器才能轉(zhuǎn)發(fā)到視圖,因此JSP文件一般要放到WFB-INF文件夾下,這樣可防止他人通過瀏覽器直接訪問,webapp文件夾的目錄結(jié)構(gòu)如圖。11.3.1項目結(jié)構(gòu)1.web.xml文件是JavaWeb項目的核心配置文件,主要包括以下3個配置。(1)配置Spring框架的監(jiān)聽器ContenxtLoaderListener,自動裝配ApplicationContext,啟動SpringIoC容器。(2)配置SpringMVC前端總控制器,處理URL請求與映射。(3)配置由SpringMVC提供的防止中文亂碼的過濾器。web.xml文件的主要內(nèi)容詳見代碼文件。2.perties文件,數(shù)據(jù)庫的配置,詳見代碼文件。3.springmvc.xml文件主要配置和掃描使用@Controller注解的類、配置視圖解析器和文件上傳解析器等,詳見代碼文件。4.applicationContext.xml文件是Spring框架的配置文件,詳見代碼文件。11.3.2編寫配置文件MyBatis框架提供了兩種DAO層設(shè)計的方式。(1)使用SqlSession提供的insert()、update()、delete()、select()等方法訪問數(shù)據(jù)庫。(2)使用Mapper方式訪問數(shù)據(jù)庫,即將DAO層接口搭建在XML映射文件或注解中書寫SQL語句。

盡管MyBatis3提供了基于注解的配置,但定義在XML映射文件中的Mapper方式更為靈活。

在使用MyBatis框架的Mapper方式時一般會使用Java接口和XML映射來實現(xiàn)。因為相較于定義在Java方法之上的注解,XML映射文件和Java文件可以做到更徹底的解耦合。11.4MyBatis框架整合軟件設(shè)計中注重模塊的高內(nèi)聚、低耦合,而MyBatisMapper技術(shù)解決的正是Java與SQL耦合在一起的問題。通過XML映射文件和Java文件的分開設(shè)計,消除了大量模板型代碼。但是正是因為Java代碼和SQL語句分離了,SQL語句就無法再像在Java環(huán)境下使用String類提供的方法一樣進(jìn)行靈活的拼接、截取等操作,從而引發(fā)參數(shù)傳遞、關(guān)聯(lián)關(guān)系、動態(tài)語句等問題。11.4.1解耦合MyBatis參數(shù)一般分為4種:單個基本類型參數(shù)、多個基本類型參數(shù)、單個JavaBean類型參數(shù)和多個混合類型參數(shù)。1.單個基本類型參數(shù)若傳遞的是單個基本類型參數(shù),則在映射文件中可以隨意命名參數(shù)。因為只有一個參效,在MyBatis框架內(nèi)部處理時不會關(guān)心參數(shù)名稱。2.多個基本類型參數(shù)若傳遞的是多個基本類型參數(shù),則XML映射文件中要使用#{0}、#{1}、#{2}等數(shù)字索引形式(注意索引從0開始),或#{param1}、#{param2}、#{param3}等的param索引形式(注意索引從1開始)。3.單個JavaBean類型參數(shù)以JavaBean充當(dāng)參數(shù)的一般是實體類,這類參數(shù)也被稱為實體類型參數(shù)。在XML映射文件中接收參數(shù)可以直接將其在POJO類中的屬性名作為參數(shù)名。4.多個混合類型參數(shù)多個混合類型參數(shù)可能是多個JavaBean類型參數(shù),也可能是JavaBean類型參數(shù)和基本類型參數(shù)的混合,這時只能通過對Java方法加@Param注解的方式,為XML映射文件中的參數(shù)命名。5.#占位符以上使用#{}作為參數(shù)的占位符,類似于JDBC的PrepareStatementr的?占位符。若參數(shù)值是字符串類型,則會自動拼接前后的單引號。還會在賦值時進(jìn)行轉(zhuǎn)義操作,有效防止SQL注入。11.4.2參數(shù)傳遞MyBatis

框架的關(guān)聯(lián)關(guān)系也被稱為高級結(jié)果映射,本質(zhì)上來說是多個表的聯(lián)合查詢過程。當(dāng)實體與實體之間存在多對一、一對多、多對多三種關(guān)系時,MyBatis

框架提供了多種方法將查詢結(jié)果組裝到實體對象中。1.多對一以Customer類和Type類為例,由于Customer類中有一個Type類型的屬性,則它和Type類構(gòu)成了多對一的關(guān)系。當(dāng)在CustomerDao類中設(shè)計search()方法時,要查詢所有的customer對象和每個對象包含的type對象,這時可以使用別名或者定義ResultMap()方法。2.一對多對于一對多的情況,MyBatis框架提供了<resultMap>標(biāo)簽搭配<collection>標(biāo)簽的解決方案。3.多對多多對多關(guān)系在面向?qū)ο蟮膶嶓w中,就是在各方都有對方泛型的集合,從任意一方來看對方都是一對多的關(guān)系。11.4.3關(guān)聯(lián)關(guān)系動態(tài)SQL標(biāo)簽是MyBatis框架的一大特色,通過使用動態(tài)SQL標(biāo)簽可以完成一些較復(fù)雜的操作并簡化開發(fā)。動態(tài)SQL標(biāo)簽主要包括以下標(biāo)簽。if:用來進(jìn)行簡單的條件判斷。choose:相當(dāng)于Java語言中的switch,與JSTL中的choose類似。trim:對包含的內(nèi)容加上prefix或suffix,即前綴或后綴。where:簡化SQL語句中where條件的判斷。set:用于設(shè)置更新的字段。foreach:一般在構(gòu)建子查詢的SQL語句時使用。11.4.4動態(tài)SQL標(biāo)簽完成映射文件設(shè)計之后,進(jìn)行CustomerDao和TypeDao兩個接口模塊的開發(fā)。下面給出文件列表,內(nèi)容詳見代碼文件。CustomerDao.java文件CustomerDao.xml文件TypeDao.java文件TypeDao.xml文件11.4.5DAO層設(shè)計11.5.1DIIoC(InversionofControl,控制反轉(zhuǎn))和DI(DependencyInjection,依賴注入)其實解決的是同一個問題,即使用Spring框架來管理接口對應(yīng)的實現(xiàn)類,并為聲明的接口類型變量生成和裝配對象,避免使用new語句創(chuàng)建對象和使用大量的set語句為對象屬性賦值。在Spring框架中使用XML配置方式或使用注解方式實現(xiàn)DI。其實現(xiàn)原理是當(dāng)加載Spring框架時,解析XML映射文件或掃描包(找到以@Component、@Controller、@Service和@Repository注解的類),通過“反射機(jī)制”生成對象,將類型或名稱作為Key放到Map容器中。在使用時,要根據(jù)類型(Type)或名稱(Name)到容器中搜索,將找到的對象實例通過構(gòu)造方法和Setter方法賦值,或者直接給@Autowired注解標(biāo)注的屬性賦值。11.5Spring整合1.5.2AOPAOP是面向切面編程,能夠讓我們在不影響原有功能的前提下,為軟件橫向擴(kuò)展功能,如日志、事務(wù)等。Spring框架當(dāng)前的AOP是由動態(tài)代理機(jī)制實現(xiàn)的,具體是使用JDK自帶的動態(tài)代理類或CGLib庫提供的動態(tài)代理工具實現(xiàn)的。使用SpringAOP實現(xiàn)日志程序,先要確保在applicationContext.xml文件中添加一行配置:<aop:aspecti-autoproxy></aop:aspectj-autoproxy>,即啟用@AspectJ注解。@Component@AspectpublicclassLogPrint

{@Before("execution(*com.ssm.service.impl.*.*(..))")publicvoidmethodBegin(JoinPoint

joinPoint){

System.out.println("方法開始了");}@After("execution(*com.ssm.service.impl.*.*(..))")publicvoidmethodEnd(){

System.out.println("方法結(jié)束了");}}11.5Spring整合Spring框架對DAO層的支持主要體現(xiàn)在集成持久層框架上。使用Spring框架可以配置數(shù)據(jù)源,參見之前的applicationContext.xml文件。首先通過<beanid="dataSource">配置一個使用DBCP數(shù)據(jù)庫連接池的數(shù)據(jù)源;其次使用<beanid="sqlSessionFactory">標(biāo)簽配置MyBatis框架的SqISessionFactory,并指定數(shù)據(jù)源和Mapper映射文件的存放路徑;最后指定MyBatis框架的Mapper類所在的位置,即DAO層的完整路徑。以上步驟可將MyBatis框架和Spring框架集成,由Spring框架管理生成的sqlSession對象并負(fù)責(zé)提交工作。Spring框架對Service層的支持主要體現(xiàn)在事務(wù)管理上,在applicationContext.xml代碼中,使用<beanid="transactionManager">標(biāo)簽來定義一個事務(wù)管理器,并通過<tx:method>標(biāo)簽設(shè)計具體的事務(wù),標(biāo)簽中的name屬性指定生效的方法,propagation屬性確定事務(wù)傳播策略。11.5.3對DAO層和Service層支持在Service層中,調(diào)用一個或多個DAO層中的功能點組合成為業(yè)務(wù)邏輯,需要調(diào)度多個DAO層的方法進(jìn)行事務(wù)控制,因此需要在applicationContext.xml文件中對方法配置事務(wù)。CustomerService接口的代碼如下。publicinterfaceCustomerService

{ List<Customer>search(Customercondition); CustomersearchById(Integerid);

booleanadd(Customercus);

booleanupdate(Customercus);

booleandelete(Integerid);}CustomerServiceImpl實現(xiàn)類的代碼如下。@ServicepublicclassCustomerServiceImplimplementsCustomerService

{ @Autowired

CustomerDao

cusDao; @Override publicList<Customer>search(Customercondition){ List<Customer>list=cusDao.search(condition); returnlist; }//其他方法略}11.5.4Service層設(shè)計SpringMVC是基于Servlet封裝的用于實現(xiàn)MVC控制的框架,實現(xiàn)前端和服務(wù)器端的交互。SpringMVC通過提供DispatcherServlet的Servlet作為網(wǎng)站入口,所有請求都會經(jīng)過DispatcherServlet進(jìn)行分發(fā)和指派,將具體的URL請求映射到Controller層的方法并進(jìn)行調(diào)用。其配置請參見11.3.2節(jié)中web.xml文件的配置。11.6

SpringMVC使用使用SpringMVC提供的@RequestMapping注解可以將一個URL映射到一個類或一個方法,其在內(nèi)部使用反射機(jī)制來實現(xiàn)。以下代碼可以讓前端發(fā)來的“cus/search”路徑請求調(diào)用CustomerController類中的search()方法。@Controller@RequestMapping("cus")//一級映射publicclassCustomerController

{@RequestMapping("search")//二級映射publicModelAndvViewsearch(){

ModelAndViewmv=newModelAndView("cus/show"); //其他代碼略}}@RequestMapping注解還有一個method屬性,可以指定HTTP請求方式,取值是枚舉類型RequestMethod。該枚舉類型包含HTTP協(xié)議請求方式的所有取值:GET、HEAD、POST、PUT、PATCH、DELETE、OPTIONS、TRACE。11.6.1

URL映射在實際使用SpringMVC接收多個參數(shù)的過程中,我們習(xí)慣使用JavaBean參數(shù)接收數(shù)據(jù)。比如在add()方法中可以改成使用JavaBean接收參數(shù),只要確保前端傳來的參數(shù)名和JavaBean中的屬性名一致,SpringMVC便可以根據(jù)方法參數(shù)類型,組裝對應(yīng)類型的對象,并根據(jù)前端傳來的數(shù)據(jù)對該對象進(jìn)行屬性的賦值。當(dāng)這一系列的SpringMVC內(nèi)部操作完成后,該對象就已經(jīng)完成裝配,可以直接傳遞給Service層的方法調(diào)用,這樣就消除了創(chuàng)建對象和設(shè)置對象各個屬性值的模板型代碼,代碼如下。@RequestMapping("add")publicStringadd(Customercus){

booleanflag=cusservice.add(cus); //其他代碼略}11.6.2接收參數(shù)1.轉(zhuǎn)發(fā)使用SpringMVC進(jìn)行視圖轉(zhuǎn)發(fā),則要先配置視圖解析器。SpringMVC支持多種視圖解析器,可以參見11.3.2節(jié)的springmvc.xml文件,其中<beanid=“viewResolver”>標(biāo)簽配置了JSTLView視圖解析器,該解析器可以解析JSP和JSTL。若要找到視圖,則可以使用默認(rèn)方法名、返回字符串視圖名和ModelAndView的方法。11.6.3轉(zhuǎn)發(fā)、重定向、響應(yīng)JSON//默認(rèn)方式:視圖名為“showAdd”@RequestMapping("showAdd")publicvoidshowAdd(){}//返回字符串視圖名“add”@RequestMapping("showAdd")publicStringshowAdd(){return"add";}//ModelAndView方法返回視圖名“add”@RequestMapping("showAdd")publicModelAndview

showAdd(){

ModelAndviewmv=newModelAndView("add"); List<Type>typeList=typeService.search();

mv.addobject("typeList",typeList); returnmv;}2.重定向重定向是向瀏覽器響應(yīng)一個302狀態(tài)碼,在響應(yīng)header(頭部文件信息)的Location屬性上指定要重新定向的URL,此時瀏覽器會自動發(fā)起一個新的請求訪問新的URL,瀏覽器地址發(fā)生變化。在Servlet中,使用response.sendRedirect("search")語句可以重定向到某個新的路徑下,而SpringMVC是在方法的返回值上使用“redirect:路徑名”方式實現(xiàn)重定向的,代碼如下。 return"redirect:search";。11.6.3轉(zhuǎn)發(fā)、重定向、響應(yīng)JSON3.響應(yīng)JSON若想要SpringMVC響應(yīng)一個字符串,則只須在該方法上使用@ResponseBody注解,這樣就標(biāo)注了這個方法返回的字符串不再是要轉(zhuǎn)發(fā)的JSP文件的名稱,而是要響應(yīng)給瀏覽器的字符串內(nèi)容。@ResponseBodypublicStringhello(){ return"Hello!";}SpringMVC集成了Jackson,可以方便地返回JSON數(shù)據(jù)。當(dāng)方法的返回類型是JavaBean或集合時,@ResponseBody注解會調(diào)用Jackson,將對象轉(zhuǎn)換為JSON。@ResponseBodypublicList<Customer>query(){ List<Customer>list=cusService.search(); returnlist;}11.6.3轉(zhuǎn)發(fā)、重定向、響應(yīng)JSON以CustomerController類為例,設(shè)計增、刪、改、查的方法,圖片文件上傳方法,以及顯示新增頁面、修改頁面的方法,并將訪問的URL請求映射到各個方法,示例代碼如下。11.6.4Controller的設(shè)計@Controller

@RequestMapping("cus")//父路徑

publicclassCustomerController{

@Autowired

CustomerServicecustomerService;

@Autowired

TypeServicetypeService;

@RequestMapping("search")

publicModelAndViewsearch(Customercondition){

ModelAndViewmv=newModelAndView("cus/show");

List<Customer>list=customerService.search(condition);

List<Type>typeList=typeService.search();

mv.addObject("list",list);

mv.addObject("typeList",typeList);

mv.addObject("c",condition);

System.out.println("cc1");

returnmv;

}11.6.4Controller的設(shè)計@RequestMapping("add")

publicStringadd(Customeremp,@RequestParam("photo")MultipartFilephoto,HttpServletRequestrequest){

if(!photo.isEmpty()){

try{

//使用UUID給圖片重命名,并去掉四個“-”

Stringname=UUID.randomUUID().toString().replaceAll("-","");

//獲取文件擴(kuò)展名

Stringext=FilenameUtils.getExtension(photo.getOriginalFilename());

//設(shè)置圖片上傳路徑

Stringdir=request.getSession().getServletContext().getRealPath("/upload/");

Filefilepath=newFile(dir);

if(!filepath.exists())filepath.mkdirs();

//以絕對路徑保存重命名后的圖片

photo.transferTo(newFile(dir+"/"+name+"."+ext));

//把圖片儲存路徑保存到數(shù)據(jù)庫

emp.setFilename("upload/"+name+"."+ext);

}catch(Exceptionex){

ex.printStackTrace();

}

booleanflag=customerService.add(emp);

return"redirect:search";

}11.6.4Controller的設(shè)計@RequestMapping(value="update

publicStringupdate(Customercus,@RequestParam("photo")MultipartFilephoto,HttpServletRequestrequest){

if(!photo.isEmpty()){

try{

//使用UUID給圖片重命名,并去掉四個“-”

Stringname=UUID.randomUUID().toString().replaceAll("-","");

//獲取文件擴(kuò)展名

Stringext=FilenameUtils.getExtension(photo.getOriginalFilename());

//設(shè)置圖片上傳路徑

Stringdir=request.getSession().getServletContext().getRealPath("/upload/");

//以絕對路徑保存重命名后的圖片

photo.transferTo(newFile(dir+"/"+name+"."+ext));

//把圖片儲存路徑保存到數(shù)據(jù)庫

cus.setFilename("upload/"+name+"."+ext);

}catch(Exceptionex){

ex.printStackTrace();

}

}

booleanflag=customerService.update(cus);

return"redirect:search";

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論