版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第10章MyBatis框架的使用了解DAO層設(shè)計(jì)的基礎(chǔ)知識(shí)了解MyBatis框架的基礎(chǔ)知識(shí)掌握MyBatis框架中核心對(duì)象的使用方法正確編寫MyBatis框架的配置文件正確編寫MyBatis框架的映射文件掌握MyBatis框架的常用注解學(xué)習(xí)目標(biāo)MVC模式中,JDBC技術(shù)本應(yīng)屬于模型層(M層)范疇,但由于JDBC技術(shù)相對(duì)獨(dú)立,從軟件的可重用性、可維護(hù)性出發(fā),應(yīng)該把JDBC技術(shù)從模型層剝離,設(shè)立DAO層(DataAccessObject)與Service層,主要思想是封裝JDBC,所封裝的類主要有兩種功能:一是連接管理器,負(fù)責(zé)連接資源的獲得和釋放;二是負(fù)責(zé)管理數(shù)據(jù)庫常用事務(wù)處理的類,包括增、刪、改、查等操作。10.1DAO層技術(shù)簡介在DAO層的具體設(shè)計(jì)過程中,一種設(shè)計(jì)思路是針對(duì)每個(gè)數(shù)據(jù)庫表設(shè)計(jì)一個(gè)服務(wù)類,如針對(duì)user表設(shè)計(jì)一個(gè)實(shí)現(xiàn)增、刪、改、查等操作的類(DaoUser類),這種設(shè)計(jì)存在與數(shù)據(jù)庫耦合性強(qiáng)、可重用性不強(qiáng)等缺點(diǎn),換一張表,就要重新設(shè)計(jì)與該表對(duì)應(yīng)的DAO類。另一種設(shè)計(jì)思路不針對(duì)具體的數(shù)據(jù)庫表,目標(biāo)對(duì)象是整個(gè)數(shù)據(jù)庫,對(duì)數(shù)據(jù)庫進(jìn)行操作,以SQL語句作為業(yè)務(wù)邏輯層到DAO層進(jìn)行參數(shù)傳遞。MyBatis框架出現(xiàn)后,不需要直接使用JDBC來操作數(shù)據(jù)庫了。在DAO層中設(shè)計(jì)了接口,面向接口與抽象的編程是有利于系統(tǒng)的維護(hù)和擴(kuò)展,將接口與實(shí)現(xiàn)相分離。10.1DAO層技術(shù)簡介MyBatis是GoogleCode的一個(gè)開源項(xiàng)目,是一個(gè)支持普通SQL語句、存儲(chǔ)過程和高級(jí)映射的持久層框架。MyBatis使用簡單的XML或注解進(jìn)行配置,將原生類型、接口(Dao接口)和POJO映射成數(shù)據(jù)庫記錄。MyBatis要解決的核心問題就是對(duì)象-關(guān)系映射(Object/RelationMapping,ORM)10.2MyBatis框架概述MyBatis框架是對(duì)象-關(guān)系映射的一種實(shí)現(xiàn),是一種用來解決面向?qū)ο蟪绦蛟O(shè)計(jì)與數(shù)據(jù)庫之間不匹配問題的技術(shù),它通過描述Java對(duì)象與數(shù)據(jù)庫表之間的映射關(guān)系,自動(dòng)將Java應(yīng)用程序中的對(duì)象持久化到關(guān)系數(shù)據(jù)庫的表中。ORM解決的主要問題是對(duì)象關(guān)系的映射。域模型和關(guān)系模型都建立在概念模型的基礎(chǔ)上。域模型是面向?qū)ο蟮?,而關(guān)系模型是面向關(guān)系的。一般情況下,一個(gè)持久化類和一個(gè)表對(duì)應(yīng),類的每個(gè)實(shí)例對(duì)應(yīng)表中的一條記錄,類的每個(gè)屬性對(duì)應(yīng)表的每個(gè)字段。ORM的工作原理如圖所示:10.2.1ORM與MyBatisMybatis框架在GitHub上有多種下載版本。以版本mybatis-3.5.11為例,下載該版本后,需要將其中的mybatis-3.5.11.jar文件復(fù)制到工程的lib目錄下,同時(shí)不能忘記添加MySQL的數(shù)據(jù)庫驅(qū)動(dòng)程序。MyBatis技術(shù)網(wǎng)站,為開發(fā)者提供了最新的MyBatis相關(guān)技術(shù)文檔,同時(shí)提供了學(xué)習(xí)MyBatis框架所需的一些基本知識(shí)。10.2.2MyBatis框架的開發(fā)環(huán)境搭建讀取MyBatis的配置文件。加載映射文件。構(gòu)造會(huì)話工廠。創(chuàng)建會(huì)話對(duì)象SqlSession。創(chuàng)建執(zhí)行器。封裝SQL信息。輸入?yún)?shù)映射。輸出結(jié)果映射。10.3MyBatis框架的工作原理sqlSession對(duì)象是MyBatis框架的關(guān)鍵對(duì)象,是執(zhí)行持久化操作的對(duì)象,類似于JDBC中的Connection接口。它是應(yīng)用程序與持久層之間執(zhí)行交互操作的一個(gè)單線程對(duì)象,也是MyBatis框架執(zhí)行持久化操作的關(guān)鍵對(duì)象。sqlSession對(duì)象包含數(shù)據(jù)庫中所有執(zhí)行SQL操作的方法,對(duì)JDBC操作數(shù)據(jù)庫的方法進(jìn)行了封裝,可以用SqlSession實(shí)例來直接執(zhí)行被映射的SQL語句。常用的方法如表:方法定義方法描述<T>TselectOne(Stringstatement,Objectparameter)查詢方法,查詢結(jié)果是一個(gè)泛型對(duì)象或?yàn)閚ull<E>List<E>selectList(Stringstatement,Objectparameter)查詢方法,查詢結(jié)果可以是0到多個(gè)泛型對(duì)象的集合,也可以為null<K,V>Map<K,V>selectMap(Stringstatement,Objectparameter,StringmapKey)查詢方法,查詢結(jié)果是一個(gè)Map集合intinsert(Stringstatement,Objectparameter)更新方法,執(zhí)行插入表中記錄操作intupdate(Stringstatement,Objectparameter)更新方法,執(zhí)行更新表中記錄操作intdelete(Stringstatement,Objectparameter)更新方法,執(zhí)行刪除表中記錄操作voidcommit()事務(wù)提交voidrollback()事務(wù)回滾voidclose()關(guān)閉sqlSession對(duì)象<T>TgetMapper(Class<T>type)獲取映射器類接口,通過使用映射器類執(zhí)行映射語句ConnectiongetConnection()獲取數(shù)據(jù)庫連接對(duì)象的方法10.4.1MyBatis框架的配置文件
MyBatis框架的配置文件是MyBatis框架的必備文件,包含了影響MyBatis框架行為的設(shè)置信息和屬性信息。配置文檔的頂層結(jié)構(gòu)如下,各個(gè)元素的次序不能顛倒。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>元素是一個(gè)配置屬性的元素,該元素通常用于將內(nèi)部的配置外在化,即通過外部的配置文件動(dòng)態(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)使用本地文件絕對(duì)路徑引入映射文件的方式如下。<mappers><mapperurl="file://e:/com/mapper/UserInfo.xml"/></mappers>(3)使用接口類引入映射文件的方式如下。<mappers><mapperclass="com/mapper/UserInfoMapper"/></mappers>(4)使用包名引入映射文件的方式如下。<mappers><packagename="com.mapper"/></mappers>映射器是MyBatis框架最復(fù)雜且最重要的部分,它由一個(gè)接口與一個(gè)XML映射文件(或者注解)組成。10.5.1常用元素在映射文件中,<mapper>元素是映射文件的根元素,其他元素都是它的子元素,這些子元素如表10-2所示。10.5XML映射文件元素名稱描述備注selectSQL查詢語句可自定義參數(shù),返回結(jié)果集insert插入語句執(zhí)行后返回一個(gè)整數(shù),代表插入記錄數(shù)update更新語句執(zhí)行后返回一個(gè)整數(shù),代表更新記錄數(shù)delete刪除語句執(zhí)行后返回一個(gè)整數(shù),代表刪除記錄數(shù)sql定義一個(gè)SQL片段這個(gè)SQL片段可以在映射文件的其他地方引用resultMap定義查詢結(jié)果集這個(gè)結(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)識(shí)符,在其他地方可以通過id引用或執(zhí)行指定的SQL語句parameterType將會(huì)傳入當(dāng)前語句的參數(shù)類的完全限定名或別名。resultType從SQL語句中返回的類的完全限定名或別名。如果返回的是集合,那么應(yīng)該指定集合中包含的類型,而不是集合本身。resultMap外部resultMap的命名引用flushCache將其設(shè)置為true后,清空本地緩存和二級(jí)緩存,默認(rèn)值為falseuserCache將其設(shè)置為true后,本條查詢語句的結(jié)果被二級(jí)緩存緩存起來,默認(rèn)值為truetimeout設(shè)置等待數(shù)據(jù)庫返回請求結(jié)果的時(shí)間,單位為秒fetchSize設(shè)定查詢結(jié)果返回的行數(shù)statementType可以取值STATEMENT、PREPARED或CALLABLE。resultSetType可以取值為FORWARD_ONLY(游標(biāo)允許向前訪問)、SCROLL_SENSITIVE(雙向流動(dòng),但不及時(shí)更新)、SCROLL_INSENSITIVE(雙向流動(dòng),并及時(shí)跟蹤數(shù)據(jù)庫的更新)、DEFAULT(依賴驅(qū)動(dòng))resultSets適合多個(gè)結(jié)果集的情況,它將列出執(zhí)行后返回的結(jié)果集中每個(gè)結(jié)果集的名稱,名稱之間用逗號(hào)分隔3.<insert>元素<insert>元素用于映射插入語句,在執(zhí)行完映射語句后會(huì)返回一個(gè)整數(shù),表示插入記錄數(shù)。<insert>元素的屬性及功能如表10-4所示。屬性描述id命名空間中的唯一標(biāo)識(shí)符,可用來代表指定的SQL語句parameterType將要傳入語句的參數(shù)的完全限定類名或別名。statementType可以取值STATEMENT、PREPARED或CALLABLE。userGeneratedKeys讓MyBatis框架使用JDBC的getGeneratedKeys()方法取出數(shù)據(jù)庫內(nèi)部生成的主鍵(僅對(duì)<insert>元素和<update>元素有用),如MySQL、SQLServer等關(guān)系型數(shù)據(jù)庫管理系統(tǒng)的自動(dòng)遞增字段,默認(rèn)值為falsekeyProperty唯一標(biāo)記一個(gè)屬性(僅對(duì)<insert>元素和<update>元素有用),MyBatis框架會(huì)通過getGeneratedKeys()方法的返回值或者通過insert語句的selectKey子元素設(shè)置其鍵值,默認(rèn)值為未設(shè)置(unset)。如果我們希望得到多個(gè)生成的列,那么也可以通過逗號(hào)分隔屬性名稱列表keyColumn通過生成的鍵值設(shè)置表中的列名(僅對(duì)<insert>元素和<update>元素有用),這個(gè)設(shè)置僅在某些數(shù)據(jù)庫(如PostgreSQL)中是必須的,當(dāng)主鍵列不是表中的第一列時(shí)需要設(shè)置。如果我們希望使用多個(gè)生成的列,那么也可以通過逗號(hào)分隔屬性名稱列表4.<update>元素和<delete>元素<update>元素和<delete>元素的使用相對(duì)比較簡單,它們的屬性配置也基本相同。在映射文件中使用這兩個(gè)元素完成更新和刪除的示例如下。<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代碼片段,可以包含在其他語句中,也可以(在加載時(shí))被靜態(tài)地設(shè)置參數(shù)。在不同的包含語句中可以設(shè)置不同的值到參數(shù)占位符上,舉例如下。<sqlid="userColumns">${alias}.id,${alias}.username,${alias}.password</sql>這個(gè)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框架對(duì)查詢的結(jié)果具備一定的自動(dòng)識(shí)別功能,如果查詢的結(jié)果是一個(gè)集合,那么它會(huì)將結(jié)果自動(dòng)映射為一個(gè)List或一個(gè)Map,如以下SQL查詢語句片段。在如以下SQL查詢語句片段。<selectid="selectAllUser"resultType="org.po.User"> select*fromUser</select>這個(gè)查詢的結(jié)果可能為空,也可能為多個(gè)結(jié)果的集合,雖然在此我們給出的是resultType=“User”,但實(shí)際上返回的結(jié)果是一個(gè)List<User>的泛型。
一般實(shí)體類的屬性和數(shù)據(jù)表的列名都是一一對(duì)應(yīng)的,但難免有不對(duì)應(yīng)的情況,這時(shí)就需要配置<resultMap>元素,使得實(shí)體類的屬性和數(shù)據(jù)表的列名能夠?qū)?yīng)起來,讓MyBatis框架完成封裝。
另一種情況就是多表關(guān)聯(lián)操作。此時(shí)多表關(guān)聯(lián)查詢的結(jié)果集會(huì)非常復(fù)雜,包含多個(gè)表的字段和表達(dá)式,此時(shí)只能用<resultMap>元素在外部重新定義一個(gè)結(jié)果映射。這種情況在第10章給于描述。10.6結(jié)果映射<result>元素通過<resultMap>元素定義一個(gè)結(jié)果集,<resultMap>元素的結(jié)構(gòu)如下:<resultMapid=“唯一標(biāo)識(shí)”type=“pojo對(duì)象類型"><idcolumn="表的主鍵字段"jdbcType="字段類型"property="pojo對(duì)象的主鍵屬性”/><resultcolumn="表字段"jdbcType="字段類型"property="pojo對(duì)象屬性"/><associationproperty="pojo的一個(gè)對(duì)象屬性"javaType="pojo關(guān)聯(lián)的pojo對(duì)象"><idcolumn="關(guān)聯(lián)pojo對(duì)象對(duì)應(yīng)表的主鍵字段"jdbcType="字段類型"property="關(guān)聯(lián)pojo對(duì)象的唯一標(biāo)識(shí)屬性"/><resultcolumn="表的字段"jdbcType="字段類型"property="關(guān)聯(lián)pojo對(duì)象的屬性"/></association><collectionproperty="pojo對(duì)象的集合屬性"ofType="集合中的pojo對(duì)象><idcolumn="集合中pojo對(duì)象對(duì)應(yīng)的表的主鍵字段"jdbcType="字段類型”property="集合中pojo對(duì)象的唯一標(biāo)識(shí)屬性”/><resultcolumn="任意表的字段"jdbcType="字段類型"property="集合中pojo對(duì)象的屬性"/></collection></resultMap>示例:表department(dept_id,dept_name),編號(hào)列dept_id為int型的主鍵,名稱列dept_name為varchar(20),針對(duì)表department編寫映射文件,返回結(jié)果用<resultMap>元素定義一個(gè)結(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ù)類型對(duì)應(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。對(duì)應(yīng)<SelectKey>標(biāo)簽的XML元素statement為要執(zhí)行的SQL字符串?dāng)?shù)組;keyProperty為更新的參數(shù)對(duì)象的屬性值;resultType為keyProperty的Java類型;before屬性指明SQL語句在插入語句之前還是之后執(zhí)行,值為true或false@Results設(shè)置結(jié)果集合。對(duì)應(yīng)<resultMap>標(biāo)簽的XML元素value為@Result注解的數(shù)組@Result在實(shí)體類屬性和數(shù)據(jù)表字段之間建立的結(jié)果映射。對(duì)應(yīng)<result>標(biāo)簽的XML元素包括id、column、property、javaType、jdbcType、typeHandler、one、many屬性。@One復(fù)雜類型的單獨(dú)屬性值映射。對(duì)應(yīng)<association>標(biāo)簽select為已映射語句(映射器方法)的完全限定名,可以加載合適類型的實(shí)例@Many復(fù)雜類型的集合屬性映射。對(duì)應(yīng)<collection>標(biāo)簽select為映射器方法的完全限定名,可以加載一組合適類型的實(shí)例@Options映射語句的屬性,該注解提供額外的配置選項(xiàng),它們通常在映射語句上作為屬性出現(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”)時(shí),SQL語句中的參數(shù)應(yīng)該被命名為#{person}例10-5利用注解實(shí)現(xiàn)userinfo表的CRUD。(1)創(chuàng)建實(shí)體類。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è)計(jì)思想,將MyBatis框架技術(shù)應(yīng)用于數(shù)據(jù)持久化設(shè)計(jì)中。主要包括MyBatis框架概述、MyBatis框架的工作原理、MyBatis框架的配置與映射開發(fā),以及XML映射文件、結(jié)果映射<result>元素、MyBatis框架的注解開發(fā)。在本章的學(xué)習(xí)中,讀者應(yīng)仔細(xì)體會(huì)DAO分層設(shè)計(jì)思想的精髓。
10.5本章小結(jié)實(shí)驗(yàn)要求:(1)創(chuàng)建數(shù)據(jù)庫studb,創(chuàng)建Student表,字段有編號(hào)(id、Integer類型、主鍵、自動(dòng)增長)、學(xué)號(hào)(stu_no,varchar
(12)類型)、姓名(stu_name,varchar
(20)類型),年齡(age,Integer類型)。(2)創(chuàng)建針對(duì)Student表的PO類和映射文件,在映射文件中利用<insert>、<delete>、<update>和<select>4個(gè)元素實(shí)現(xiàn)表的增、刪、改、查操作。(3)創(chuàng)建jUnit測試類,分別測試映射文件中4個(gè)元素對(duì)應(yīng)的SQL語句,完成該表的增、刪、改、查操作。操作步驟提示:(1)創(chuàng)建一個(gè)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í)驗(yàn)設(shè)計(jì)第11章SSM整合應(yīng)用案例了解系統(tǒng)架構(gòu)和項(xiàng)目組織結(jié)構(gòu)掌握Maven項(xiàng)目管理工具的使用熟悉系統(tǒng)環(huán)境搭建與配置文件管理掌握SSM框架整合方式掌握登錄模板與客戶管理模塊的編寫調(diào)試掌握圖片文件的上傳與顯示學(xué)習(xí)目標(biāo)在本章,我們將通過Maven進(jìn)行配置管理,綜合前面各章所學(xué)知識(shí),使用Spring、SpringMVC、MyBatis、MySQL、JSP、JSTL等技術(shù)來設(shè)計(jì)一個(gè)簡易的客戶管理系統(tǒng),整合SSM框架,實(shí)現(xiàn)系統(tǒng)登錄與客戶信息管理的功能。11.1系統(tǒng)概述設(shè)計(jì)一個(gè)簡易的客戶管理系統(tǒng),系統(tǒng)要求合法的用戶登錄后進(jìn)行訪問,主要包含客戶管理模塊和客戶類別管理模塊。功能模塊如圖所示:11.1.1系統(tǒng)功能設(shè)計(jì)在MySQL中設(shè)計(jì)一個(gè)名為crmdb的數(shù)據(jù)庫,并創(chuàng)建Customer表、Type表和User表,這3張表的表結(jié)構(gòu)分別如表11-1、表11-2和表11-3所示。11.1.2數(shù)據(jù)庫設(shè)計(jì)字段名類型長度是否為空說明idint11否指自動(dòng)編號(hào),為主鍵numberint11是指客戶編號(hào)namevarchar20是指客戶名稱gendervarchar2是指性別ageint11是指年齡phonevarchar20是指聯(lián)系電話filenamevarchar50是指照片文件名稱type_idint11是指客戶類別編號(hào)表11-1Customer表字段名類型長度是否為空說明idint11否指自動(dòng)編號(hào),為主鍵namevarchar20是指客戶類別名稱numberint11是指客戶類別編號(hào)rateDecimal10是指折扣率,保留兩位小數(shù)字段名類型長度是否為空說明userIdint11否指用戶編號(hào),為主鍵usernamevarchar20是指用戶名passwordvarchar20是指密碼roleint11是指角色statusbit1是指狀態(tài),其中值為1表示正常狀態(tài),值為0表示禁用狀態(tài)表11-3User表表11-2Type表數(shù)據(jù)庫設(shè)計(jì)完成后,可以根據(jù)數(shù)據(jù)庫表建立對(duì)應(yīng)的實(shí)體類。在面向?qū)ο蟮脑O(shè)計(jì)中,建立Customer類與Type類之間的多對(duì)一關(guān)系,是在“多”的一方(Customer)加入“一”的一方(Type)的屬性關(guān)聯(lián)。11.1.3實(shí)體類設(shè)計(jì)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就是一個(gè)包含了項(xiàng)目對(duì)象模型(ProjectObjectModel,POM)的軟件項(xiàng)目管理工具,可以通過配置描述信息來管理項(xiàng)目的構(gòu)建、創(chuàng)建報(bào)告和文檔。該工具可以幫助程序員從煩瑣的項(xiàng)目配置工作中解放出來,輕松地進(jìn)行工程構(gòu)建、jar包管理、代碼編譯,自動(dòng)運(yùn)行單元測試、打包、生成報(bào)表,甚至還能部署項(xiàng)目、生成Web站點(diǎn)。11.2項(xiàng)目構(gòu)建工具M(jìn)aven與SSM項(xiàng)目創(chuàng)建1.下載Maven從官網(wǎng)上下載最新版本的Maven,以Maven3.9.0版本為例,下載完成后,將壓縮包解壓到計(jì)算機(jī)某一目錄下。2.在IDEA中配置Maven在IDEA中配置Maven非常簡單。首先打開IDEA,在菜單欄中單擊“File”選項(xiàng);其次單擊“Settings”選項(xiàng),彈出一個(gè)設(shè)置窗口,在窗口的左側(cè)樹形菜單中選擇“Build,Execution,Deployment”→“BuildTools”→“Maven”選項(xiàng),這時(shí)會(huì)出現(xiàn)如圖11-3所示的Maven配置區(qū)域。單擊“Mavenhomepath”右側(cè)的“...”按鈕,打開文件選擇器。在文件選擇器中,選擇本機(jī)的Maven安裝目錄,這時(shí)Usersettingsfile和Localrepository的值會(huì)自動(dòng)關(guān)聯(lián)本機(jī)Maven的配置文件和在配置文件中指定的本地倉庫。3.設(shè)置Maven參數(shù)詳見“settings.xml”文件11.2.1Maven的使用在IDEA中新建項(xiàng)目,在窗口的左側(cè)列表先選擇“Maven”選項(xiàng)11.2.2利用Maven創(chuàng)建SSM項(xiàng)目2.輸入項(xiàng)目的Name和選擇保存位置Location,設(shè)置Maven項(xiàng)目的GroupId、ArtifactId和Version,其他可以保持默認(rèn)設(shè)置。這里將Name設(shè)置為crmPrj,單擊“Next”按鈕。11.2.2利用Maven創(chuàng)建SSM項(xiàng)目3.窗口切換到設(shè)置Maven本地倉庫的界面,如圖11-6所示,因?yàn)樵谥耙呀?jīng)實(shí)現(xiàn)了在IDEA中集成Maven,所以在此不需要做修改,單擊“Finish”按鈕完成Module的創(chuàng)建。11.2.2利用Maven創(chuàng)建SSM項(xiàng)目4.創(chuàng)建Maven項(xiàng)目后,雖然在main目錄下有存放Web資源的webapp目錄,但沒有存放Java文件和配置文件的目錄。這時(shí)需要將java和resources目錄設(shè)置為存放Java代碼和配置文件的根目錄。右擊java目錄,選擇“MakeDirectoryas”→“SourcesRoot”,即可設(shè)置該目錄為代碼根目錄。根據(jù)以上操作將resources目錄設(shè)置為“ResourcesRoot”,即設(shè)置該目錄為源代碼配置文件的根目錄.11.2.2利用Maven創(chuàng)建SSM項(xiàng)目項(xiàng)目創(chuàng)建完成后,需要在pom.xml文件中配置SSM的依賴。11.2.3配置SSM依賴pom.xml文件是Maven的核心文件,由該文件實(shí)現(xiàn)項(xiàng)目構(gòu)建與項(xiàng)目管理等任務(wù)。用戶根據(jù)pom.xml文件指定的目錄結(jié)構(gòu),定義項(xiàng)目需要的各類組件及其他信息,Maven根據(jù)pom.xml文件中的內(nèi)容,自動(dòng)下載依賴庫(包),并導(dǎo)入到項(xiàng)目中,從而完成項(xiàng)目的構(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è)計(jì)合適的Java包結(jié)構(gòu),其次使用配置文件整合SSM。11.3SSM框架整合使用三層架構(gòu)模式對(duì)Java包的結(jié)構(gòu)進(jìn)行設(shè)計(jì)。在com.ssm包下創(chuàng)建子包,包的名稱如表11-4所示。11.3.1項(xiàng)目結(jié)構(gòu)包名描述entity封裝各實(shí)體類controller控制器包,即SpringMVC類存放的位置service業(yè)務(wù)邏輯接口包,對(duì)一個(gè)或多個(gè)DAO層進(jìn)行再次封裝service.impl業(yè)務(wù)邏輯實(shí)現(xiàn)類包,調(diào)用DAO層的操作,封裝成一個(gè)服務(wù)dao數(shù)據(jù)庫訪問接口包,即MyBatis接口存放的位置interceptor自定義攔截器util工具包,處理日志項(xiàng)目使用Maven工具管理,統(tǒng)一項(xiàng)目目錄,使不同IDEA創(chuàng)建的Maven項(xiàng)目可以通用。將SSM項(xiàng)目涉及的多個(gè)配置文件統(tǒng)一放到resources文件夾下,描述如表11-5所示,結(jié)構(gòu)如圖11-9所示。11.3.1項(xiàng)目結(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項(xiàng)目結(jié)構(gòu)1.web.xml文件是JavaWeb項(xiàng)目的核心配置文件,主要包括以下3個(gè)配置。(1)配置Spring框架的監(jiān)聽器ContenxtLoaderListener,自動(dòng)裝配ApplicationContext,啟動(dòng)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è)計(jì)的方式。(1)使用SqlSession提供的insert()、update()、delete()、select()等方法訪問數(shù)據(jù)庫。(2)使用Mapper方式訪問數(shù)據(jù)庫,即將DAO層接口搭建在XML映射文件或注解中書寫SQL語句。
盡管MyBatis3提供了基于注解的配置,但定義在XML映射文件中的Mapper方式更為靈活。
在使用MyBatis框架的Mapper方式時(shí)一般會(huì)使用Java接口和XML映射來實(shí)現(xiàn)。因?yàn)橄噍^于定義在Java方法之上的注解,XML映射文件和Java文件可以做到更徹底的解耦合。11.4MyBatis框架整合軟件設(shè)計(jì)中注重模塊的高內(nèi)聚、低耦合,而MyBatisMapper技術(shù)解決的正是Java與SQL耦合在一起的問題。通過XML映射文件和Java文件的分開設(shè)計(jì),消除了大量模板型代碼。但是正是因?yàn)镴ava代碼和SQL語句分離了,SQL語句就無法再像在Java環(huán)境下使用String類提供的方法一樣進(jìn)行靈活的拼接、截取等操作,從而引發(fā)參數(shù)傳遞、關(guān)聯(lián)關(guān)系、動(dòng)態(tài)語句等問題。11.4.1解耦合MyBatis參數(shù)一般分為4種:單個(gè)基本類型參數(shù)、多個(gè)基本類型參數(shù)、單個(gè)JavaBean類型參數(shù)和多個(gè)混合類型參數(shù)。1.單個(gè)基本類型參數(shù)若傳遞的是單個(gè)基本類型參數(shù),則在映射文件中可以隨意命名參數(shù)。因?yàn)橹挥幸粋€(gè)參效,在MyBatis框架內(nèi)部處理時(shí)不會(huì)關(guān)心參數(shù)名稱。2.多個(gè)基本類型參數(shù)若傳遞的是多個(gè)基本類型參數(shù),則XML映射文件中要使用#{0}、#{1}、#{2}等數(shù)字索引形式(注意索引從0開始),或#{param1}、#{param2}、#{param3}等的param索引形式(注意索引從1開始)。3.單個(gè)JavaBean類型參數(shù)以JavaBean充當(dāng)參數(shù)的一般是實(shí)體類,這類參數(shù)也被稱為實(shí)體類型參數(shù)。在XML映射文件中接收參數(shù)可以直接將其在POJO類中的屬性名作為參數(shù)名。4.多個(gè)混合類型參數(shù)多個(gè)混合類型參數(shù)可能是多個(gè)JavaBean類型參數(shù),也可能是JavaBean類型參數(shù)和基本類型參數(shù)的混合,這時(shí)只能通過對(duì)Java方法加@Param注解的方式,為XML映射文件中的參數(shù)命名。5.#占位符以上使用#{}作為參數(shù)的占位符,類似于JDBC的PrepareStatementr的?占位符。若參數(shù)值是字符串類型,則會(huì)自動(dòng)拼接前后的單引號(hào)。還會(huì)在賦值時(shí)進(jìn)行轉(zhuǎn)義操作,有效防止SQL注入。11.4.2參數(shù)傳遞MyBatis
框架的關(guān)聯(lián)關(guān)系也被稱為高級(jí)結(jié)果映射,本質(zhì)上來說是多個(gè)表的聯(lián)合查詢過程。當(dāng)實(shí)體與實(shí)體之間存在多對(duì)一、一對(duì)多、多對(duì)多三種關(guān)系時(shí),MyBatis
框架提供了多種方法將查詢結(jié)果組裝到實(shí)體對(duì)象中。1.多對(duì)一以Customer類和Type類為例,由于Customer類中有一個(gè)Type類型的屬性,則它和Type類構(gòu)成了多對(duì)一的關(guān)系。當(dāng)在CustomerDao類中設(shè)計(jì)search()方法時(shí),要查詢所有的customer對(duì)象和每個(gè)對(duì)象包含的type對(duì)象,這時(shí)可以使用別名或者定義ResultMap()方法。2.一對(duì)多對(duì)于一對(duì)多的情況,MyBatis框架提供了<resultMap>標(biāo)簽搭配<collection>標(biāo)簽的解決方案。3.多對(duì)多多對(duì)多關(guān)系在面向?qū)ο蟮膶?shí)體中,就是在各方都有對(duì)方泛型的集合,從任意一方來看對(duì)方都是一對(duì)多的關(guān)系。11.4.3關(guān)聯(lián)關(guān)系動(dòng)態(tài)SQL標(biāo)簽是MyBatis框架的一大特色,通過使用動(dòng)態(tài)SQL標(biāo)簽可以完成一些較復(fù)雜的操作并簡化開發(fā)。動(dòng)態(tài)SQL標(biāo)簽主要包括以下標(biāo)簽。if:用來進(jìn)行簡單的條件判斷。choose:相當(dāng)于Java語言中的switch,與JSTL中的choose類似。trim:對(duì)包含的內(nèi)容加上prefix或suffix,即前綴或后綴。where:簡化SQL語句中where條件的判斷。set:用于設(shè)置更新的字段。foreach:一般在構(gòu)建子查詢的SQL語句時(shí)使用。11.4.4動(dòng)態(tài)SQL標(biāo)簽完成映射文件設(shè)計(jì)之后,進(jìn)行CustomerDao和TypeDao兩個(gè)接口模塊的開發(fā)。下面給出文件列表,內(nèi)容詳見代碼文件。CustomerDao.java文件CustomerDao.xml文件TypeDao.java文件TypeDao.xml文件11.4.5DAO層設(shè)計(jì)11.5.1DIIoC(InversionofControl,控制反轉(zhuǎn))和DI(DependencyInjection,依賴注入)其實(shí)解決的是同一個(gè)問題,即使用Spring框架來管理接口對(duì)應(yīng)的實(shí)現(xiàn)類,并為聲明的接口類型變量生成和裝配對(duì)象,避免使用new語句創(chuàng)建對(duì)象和使用大量的set語句為對(duì)象屬性賦值。在Spring框架中使用XML配置方式或使用注解方式實(shí)現(xiàn)DI。其實(shí)現(xiàn)原理是當(dāng)加載Spring框架時(shí),解析XML映射文件或掃描包(找到以@Component、@Controller、@Service和@Repository注解的類),通過“反射機(jī)制”生成對(duì)象,將類型或名稱作為Key放到Map容器中。在使用時(shí),要根據(jù)類型(Type)或名稱(Name)到容器中搜索,將找到的對(duì)象實(shí)例通過構(gòu)造方法和Setter方法賦值,或者直接給@Autowired注解標(biāo)注的屬性賦值。11.5Spring整合1.5.2AOPAOP是面向切面編程,能夠讓我們在不影響原有功能的前提下,為軟件橫向擴(kuò)展功能,如日志、事務(wù)等。Spring框架當(dāng)前的AOP是由動(dòng)態(tài)代理機(jī)制實(shí)現(xiàn)的,具體是使用JDK自帶的動(dòng)態(tài)代理類或CGLib庫提供的動(dòng)態(tài)代理工具實(shí)現(xiàn)的。使用SpringAOP實(shí)現(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框架對(duì)DAO層的支持主要體現(xiàn)在集成持久層框架上。使用Spring框架可以配置數(shù)據(jù)源,參見之前的applicationContext.xml文件。首先通過<beanid="dataSource">配置一個(gè)使用DBCP數(shù)據(jù)庫連接池的數(shù)據(jù)源;其次使用<beanid="sqlSessionFactory">標(biāo)簽配置MyBatis框架的SqISessionFactory,并指定數(shù)據(jù)源和Mapper映射文件的存放路徑;最后指定MyBatis框架的Mapper類所在的位置,即DAO層的完整路徑。以上步驟可將MyBatis框架和Spring框架集成,由Spring框架管理生成的sqlSession對(duì)象并負(fù)責(zé)提交工作。Spring框架對(duì)Service層的支持主要體現(xiàn)在事務(wù)管理上,在applicationContext.xml代碼中,使用<beanid="transactionManager">標(biāo)簽來定義一個(gè)事務(wù)管理器,并通過<tx:method>標(biāo)簽設(shè)計(jì)具體的事務(wù),標(biāo)簽中的name屬性指定生效的方法,propagation屬性確定事務(wù)傳播策略。11.5.3對(duì)DAO層和Service層支持在Service層中,調(diào)用一個(gè)或多個(gè)DAO層中的功能點(diǎn)組合成為業(yè)務(wù)邏輯,需要調(diào)度多個(gè)DAO層的方法進(jìn)行事務(wù)控制,因此需要在applicationContext.xml文件中對(duì)方法配置事務(wù)。CustomerService接口的代碼如下。publicinterfaceCustomerService
{ List<Customer>search(Customercondition); CustomersearchById(Integerid);
booleanadd(Customercus);
booleanupdate(Customercus);
booleandelete(Integerid);}CustomerServiceImpl實(shí)現(xiàn)類的代碼如下。@ServicepublicclassCustomerServiceImplimplementsCustomerService
{ @Autowired
CustomerDao
cusDao; @Override publicList<Customer>search(Customercondition){ List<Customer>list=cusDao.search(condition); returnlist; }//其他方法略}11.5.4Service層設(shè)計(jì)SpringMVC是基于Servlet封裝的用于實(shí)現(xiàn)MVC控制的框架,實(shí)現(xiàn)前端和服務(wù)器端的交互。SpringMVC通過提供DispatcherServlet的Servlet作為網(wǎng)站入口,所有請求都會(huì)經(jīng)過DispatcherServlet進(jìn)行分發(fā)和指派,將具體的URL請求映射到Controller層的方法并進(jìn)行調(diào)用。其配置請參見11.3.2節(jié)中web.xml文件的配置。11.6
SpringMVC使用使用SpringMVC提供的@RequestMapping注解可以將一個(gè)URL映射到一個(gè)類或一個(gè)方法,其在內(nèi)部使用反射機(jī)制來實(shí)現(xiàn)。以下代碼可以讓前端發(fā)來的“cus/search”路徑請求調(diào)用CustomerController類中的search()方法。@Controller@RequestMapping("cus")//一級(jí)映射publicclassCustomerController
{@RequestMapping("search")//二級(jí)映射publicModelAndvViewsearch(){
ModelAndViewmv=newModelAndView("cus/show"); //其他代碼略}}@RequestMapping注解還有一個(gè)method屬性,可以指定HTTP請求方式,取值是枚舉類型RequestMethod。該枚舉類型包含HTTP協(xié)議請求方式的所有取值:GET、HEAD、POST、PUT、PATCH、DELETE、OPTIONS、TRACE。11.6.1
URL映射在實(shí)際使用SpringMVC接收多個(gè)參數(shù)的過程中,我們習(xí)慣使用JavaBean參數(shù)接收數(shù)據(jù)。比如在add()方法中可以改成使用JavaBean接收參數(shù),只要確保前端傳來的參數(shù)名和JavaBean中的屬性名一致,SpringMVC便可以根據(jù)方法參數(shù)類型,組裝對(duì)應(yīng)類型的對(duì)象,并根據(jù)前端傳來的數(shù)據(jù)對(duì)該對(duì)象進(jìn)行屬性的賦值。當(dāng)這一系列的SpringMVC內(nèi)部操作完成后,該對(duì)象就已經(jīng)完成裝配,可以直接傳遞給Service層的方法調(diào)用,這樣就消除了創(chuàng)建對(duì)象和設(shè)置對(duì)象各個(gè)屬性值的模板型代碼,代碼如下。@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àn)g覽器響應(yīng)一個(gè)302狀態(tài)碼,在響應(yīng)header(頭部文件信息)的Location屬性上指定要重新定向的URL,此時(shí)瀏覽器會(huì)自動(dòng)發(fā)起一個(gè)新的請求訪問新的URL,瀏覽器地址發(fā)生變化。在Servlet中,使用response.sendRedirect("search")語句可以重定向到某個(gè)新的路徑下,而SpringMVC是在方法的返回值上使用“redirect:路徑名”方式實(shí)現(xiàn)重定向的,代碼如下。 return"redirect:search";。11.6.3轉(zhuǎn)發(fā)、重定向、響應(yīng)JSON3.響應(yīng)JSON若想要SpringMVC響應(yīng)一個(gè)字符串,則只須在該方法上使用@ResponseBody注解,這樣就標(biāo)注了這個(gè)方法返回的字符串不再是要轉(zhuǎn)發(fā)的JSP文件的名稱,而是要響應(yīng)給瀏覽器的字符串內(nèi)容。@ResponseBodypublicStringhello(){ return"Hello!";}SpringMVC集成了Jackson,可以方便地返回JSON數(shù)據(jù)。當(dāng)方法的返回類型是JavaBean或集合時(shí),@ResponseBody注解會(huì)調(diào)用Jackson,將對(duì)象轉(zhuǎn)換為JSON。@ResponseBodypublicList<Customer>query(){ List<Customer>list=cusService.search(); returnlist;}11.6.3轉(zhuǎn)發(fā)、重定向、響應(yīng)JSON以CustomerController類為例,設(shè)計(jì)增、刪、改、查的方法,圖片文件上傳方法,以及顯示新增頁面、修改頁面的方法,并將訪問的URL請求映射到各個(gè)方法,示例代碼如下。11.6.4Controller的設(shè)計(jì)@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è)計(jì)@RequestMapping("add")
publicStringadd(Customeremp,@RequestParam("photo")MultipartFilephoto,HttpServletRequestrequest){
if(!photo.isEmpty()){
try{
//使用UUID給圖片重命名,并去掉四個(gè)“-”
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();
//以絕對(duì)路徑保存重命名后的圖片
photo.transferTo(newFile(dir+"/"+name+"."+ext));
//把圖片儲(chǔ)存路徑保存到數(shù)據(jù)庫
emp.setFilename("upload/"+name+"."+ext);
}catch(Exceptionex){
ex.printStackTrace();
}
booleanflag=customerService.add(emp);
return"redirect:search";
}11.6.4Controller的設(shè)計(jì)@RequestMapping(value="update
publicStringupdate(Customercus,@RequestParam("photo")MultipartFilephoto,HttpServletRequestrequest){
if(!photo.isEmpty()){
try{
//使用UUID給圖片重命名,并去掉四個(gè)“-”
Stringname=UUID.randomUUID().toString().replaceAll("-","");
//獲取文件擴(kuò)展名
Stringext=FilenameUtils.getExtension(photo.getOriginalFilename());
//設(shè)置圖片上傳路徑
Stringdir=request.getSession().getServletContext().getRealPath("/upload/");
//以絕對(duì)路徑保存重命名后的圖片
photo.transferTo(newFile(dir+"/"+name+"."+ext));
//把圖片儲(chǔ)存路徑保存到數(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)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度企業(yè)間技術(shù)合作合同
- 觸電事故應(yīng)急響應(yīng)措施
- 2024年建筑裝修工程斷橋鋁窗戶安裝合同
- 2024天津裝修工程合同糾紛解決協(xié)議
- 2024年度版權(quán)調(diào)解合同正規(guī)標(biāo)(04版)
- 2024年建筑工程分包合作與環(huán)保安全協(xié)議
- 2024年度企業(yè)形象宣傳合同
- 滬教版五年級(jí)上冊數(shù)學(xué)期中試題
- 2024年建筑外墻裝修及防水合同
- 2024年工程安全監(jiān)管與服務(wù)合同
- 企業(yè)如何利用新媒體做好宣傳工作課件
- 如何培養(yǎng)孩子的自信心課件
- 中醫(yī)藥膳學(xué)全套課件
- 頸脊髓損傷-匯總課件
- 齒輪故障診斷完美課課件
- 2023年中國鹽業(yè)集團(tuán)有限公司校園招聘筆試題庫及答案解析
- 大班社會(huì)《特殊的車輛》課件
- 野生動(dòng)物保護(hù)知識(shí)講座課件
- 早教托育園招商加盟商業(yè)計(jì)劃書
- 光色變奏-色彩基礎(chǔ)知識(shí)與應(yīng)用課件-高中美術(shù)人美版(2019)選修繪畫
- 前列腺癌的放化療護(hù)理
評(píng)論
0/150
提交評(píng)論