Spring MVC框架
Spring MVC 框架圍繞DispatcherServlet這個核心展開,DispatcherServlt是Spring MVC的總導演,總策劃,它負責截獲請求並將其分派給相應的處理器。Spring MVC框架包含註解驅動控制器,請求及響應的信息處理、視圖解析、本地化解析、上傳文件解析、異常處理以及表單標籤綁定等內容。css
Spring MVC和Struts2二者皆用於控制層的開發html
Spring MVC 屬於Spring框架的後續產品,是Spring框架中的模塊之一。前端
Spring MVC與Struts2區別
相比於Struts2框架的複雜臃腫,Spring MVC 更爲精簡java
1.Spring MVC可使用單例開發,建議使用單例開發mysql
2.性能比Sturts2好,若是使用struts2框架,建議使用JSTL標籤庫jquery
3.學習成本低,學起來很是簡單,開發控制器就像是開發Serviceweb
4.和Spring是一家的,無需整合,可直接使用IOC,DI,AOP特徵spring
Spring MVC運行原理
1.瀏覽器請求提交至DispatcherServlet前端控制器;sql
2.DispatcherServlet控制器調用DefaultAnnotationHandlerMapping,以查找與請求地址相對應的控制器;數據庫
3.DefaultAnnotationHandlerMapping找到對應的控制器及其方法,並將結果返回給DispatcherServlet;
4.DispatcherServlet將請求傳遞至AnnotationMethodHandlerAdapter組件,以適配調用控制器的方法;
5.AnnotationMethodHandlerAdapter適配調用控制器的方法,適配內容包括方法的參數列表和返回值;
6.控制器方法處理請求,並將結果返回至AnnotationMethodHandlerAdapter;
7.AnnotationMethodHandlerAdapter將返回結果封裝到ModelAndView對象,進而返回給DispatcherServlet;
ModelAndView:包含了處理結果的視圖和視圖中要使用的數據
8.DispatcherServlet基於ModelAndView對象調用ViewResolver,以查找指定的視圖;
9.ViewResolver查找並肯定視圖,並返回給DispatcherServlet;
10.DispatcherServlet調度視圖,視圖負責將結果顯示到客戶端。
Spring MVC Web應用開發步驟
1.導入Spring MVC所需庫文件(.jar文件)
spring-web-x.x.x.RELEASE.jar
spring-webmvc-x.x.x.RELEASE.jar
spring-webmvc-portlet-x.x.x.RELEASE.jar
2.在Web.xml中配置 Spring MVC 核心Servlet
Spring容器監聽
<!– 支持業務層,持久層的相關配置 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener>
統一網站字符集編碼
<!-- 統一網站字符編碼 --> <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
DispatcherServlet配置
<!-- 配置Spring MVC 核心控制器DispatcherServlet --> <servlet> <servlet-name>DispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 若是值爲大於0的整數,在Web容器啓動時當即加載並實例化(設置啓動加載級別:值越小加載級別越大) --> <load-on-startup>1</load-on-startup> </servlet> <!-- 缺省配置:不要寫/* 注意:這樣配置會攔截靜態資源(html,css,js,img...)後邊須要進行放行處理。 --> <servlet-mapping> <servlet-name>DispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
修改Spring MVC 配置文件默認位置(在DispatcherServlet中配置,在加載順序以前)
<!-- 修改SpringMVC配置文件默認位置 --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:SpringMVC配置文件名</param-value> </init-param>
3.配置Spring MVC 配置文件
缺省狀況下,Spring MVC 配置文名稱爲 <核心Servlet名稱>-servlet.xml,默認存放在WEB/INF下,能夠經過init-param來指定位置和文件名
Sping命名空間
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx " >http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> </beans> <!-- 配置包掃描 --> <context:component-scan base-package="所需掃描包" use-default-filters="false"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> <!-- 指定Spring容器對Spring MVC相關組件的註解進行註冊。至關於配置HandlerMapping和HandlerAdapter --> <mvc:annotation-driven/> <!-- 放行靜態資源(img,css...),交給默認的tomcat去處理,若是前端控制器配置的是/,這個地方必須配置 --> <mvc:default-servlet-handler/> <!-- 定義視圖解析器 此處ID能夠不指定 --> <bean id="defaultViewResolver" class='org.springframework.web.servlet.view.InternalResourceViewResolver'> <!-- 配置前綴和後綴:控制器返回的url會通過視圖解析器解析最終的url是:前綴+url+後綴 --> <property name="prefix" value="/" /> <property name="suffix" value=".jsp" /> </bean> Spring是父容器,Spring MCV 是子容器
4.編寫控制器
import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; @Controller @Scope(value="prototype") @RequestMapping("/springmvc") public class SimpleController { @RequestMapping("/test") public String test(Model model) { model.addAttribute("message", "Hello world!"); return "HelloWorld"; } }
5.編寫JSP頁面
可經過EL表達式獲取model中的屬性的對象值
Spring MVC 高級特性
Restful風格
@PathVariable
Spring MVC 能夠經過@RequestMapping 指定請求路徑,同時也支持rest風格。例如
http://localhost:8080/springmvc/user/{id}
{id} 爲佔位符。Java代碼示例以下:
@RequestMapping(「/user/{id}」)
public ModelAndView queryUserById( @PathVariable(「id」) Integer id) { //此處省略 }
使用@PathVariable 這個註解進行標識,在請求的時候,會把請求中的{id}的值直接注入到 方法的參數id中,若是在類的上面使用佔位符,一樣能夠進行注入。
一個簡單的頁面跳轉
import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; @Controller @Scope("prototype") @RequestMapping("/forward") public class SimpleForwardController { @RequestMapping("/{page}") public String forwardPage(@PathVariable("page") String page) { return page; } }
靜態資源處理
使用Rest風格的URL不但願後綴名是.do,.htm等格式,優雅的格式爲 http://localhost:8080/springmvc/test/java :java模塊
http://localhost:8080/springmvc/test/user : 用戶模塊
早期的springmvc不能很好的處理靜態資源,因此一般會以.do , .htm等形式結尾。若是在DispatcherServlet中配置url-pattern爲「/」 那麼spring默認爲處理全部請求,包括靜態資源的請求。Spring MVC會把它做爲一個普通的請求,若是找不到,則會拋出異常。Spring rest風格是3.0版本的重要特徵,因此該團隊在處理靜態資源文件的時候,作出了很是的多的努力,最終經過兩種實現方式來處理靜態資源文件。
一、<mvc:default-servlet-handler />
通常服務器包括tomcat, weblogic , jboss , jetty ,webshpare等默認servlet的名稱爲default ,若是你使用的服務器的默認值不是default,須要經過屬性default-servlet-name指定你服務器的默認值
二、 <mvc:resources />
該標籤容許靜態資源放在服務器的任何位置,包括WEB-INF, classpath下等,甚至能夠打包到jar中,經過location指定靜態資源的位置。
<mvc:resources location="/js/" mapping="/**"/>
<mvc:resources location="/images/" mapping="/iamges/**"/>
<mvc:resources location="/css/" mapping="/css/**"/>
三、<mvc:annotation-driven />
若是僅僅使用上面兩個標籤,那麼系統會找不到咱們的資源。
Json處理
Spring MVC的MappingJascksonJsonView藉助Jackson框架的ObjectMapper將模型數據轉換爲Json格式輸出。
Json視圖解析器
因爲MappingJacksonJsonView 也是一個bean,能夠經過BeanNameViewResolver進行解析,所以須要在springmvc配置文件中配置:
<!-- 默認狀況會把模型中的全部都輸出json,能夠經過renderedAttributes指定輸出的內容 --> <bean id="jsonView" class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"> <property name=「renderedAttributes」 value=「userList「 /> </bean> <!-- 須要使用bean視圖解析器 --> <bean class="org.springframework.web.servlet.view.BeanNameViewResolver" p:order="10" /> 簡單測試: @RequestMapping("getJson") public String getJson(ModelMap map){ User user = userService.getUserByUserId(1); map.put("userList", userList); map.put("jsonList1", "這是一個測試字符串"); return "jsonView" ; }
@ResponseBody註解
該註解用於將Controller的方法返回的對象,經過適當的HttpMessageConverter轉換爲指定格式後,寫入到Response對象的body數據區。
使用時機:
返回的數據不是html標籤的頁面,而是其餘某種格式的數據時(如json、xml等)使用。
防止IE下載
<!-- 防止IE下載 --> <bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> </list> </property> </bean> <bean id="mappingJackson2HttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> </list> </property> </bean> <util:list id="messageConverters"> <ref bean="mappingJackson2HttpMessageConverter"/> <ref bean="stringHttpMessageConverter"/> </util:list>
文件上傳功能
Spring MVC 提供了對文件的上傳支持,這種支持是經過即插即用的MultipartResolver實現的。Spring經過Jakarta Commons FileUpload 技術實現了一個MultipartResolver實現類:CommonsMultipartResolver。
Spring在上下文中默認是沒有配置MultipartResolver的,所以默認狀況下不能支持文件上傳的工做,若是想要使用文件上傳的工做,那麼須要先配置MultipartResolver,配置以下:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" p:defaultEncoding="UTF-8" /> <!-- 上傳臨時路徑 --> <property name="uploadTempDir" value="upload/temp"></property>
攔截器
繼承HandlerInterceptorAdapter類
實現HandlerInterceptor接口
boolean preHandler(request,response,handler) :
在請求到達handler以前,先執行這個前置處理方法,當該方法返回false,則直接返回,不會傳遞到下一個攔截器中,更不會調用處理器鏈末端的handler中,只有返回true是請求才向鏈中的下一個處理節點傳遞。
void postHandler(request,response,handler, mav)
在請求被Handler執行後,執行這個方法作後置處理
void afterCompletion(req, resp , handler , exception)
在相應已經被渲染後,執行該方法。
Springmvc配置文件以下:
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**/*"/> <mvc:exclude-mapping path="/user/login"/> <mvc:exclude-mapping path="/easyui/**"/> <mvc:exclude-mapping path="/images/**"/> <mvc:exclude-mapping path="/jquery/**"/> <mvc:exclude-mapping path="/js/**"/> <bean class=「com.r863.spring.interceptor.SessionInterceptor" /> </mvc:interceptor> </mvc:interceptors>
異常處理器
Spring MVC對異常的處理提供了一個視圖處理類:SimpleMappingExceptionResoler
<!-- 定義一個異常視圖處理器 --> <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="exceptionMappings"> <props> <!-- <prop key="異常全類名1">對應的視圖1</prop> --> <prop key="com.r863.spring.exception.MyServiceException">error</prop> <prop key="java.lang.NullPointerException">error1</prop> </props> </property> <property name="statusCodes"> <props> <prop key="error">500</prop> <prop key="error1">501</prop> </props> </property> </bean>
XML配置Spring MVC
配置文件:
<bean id="xmlConfigController" class="com.r863.spring.controller.XmlConfigController" scope="prototype"> <property name="methodNameResolver" ref="methodNameResolver" /> </bean> <bean id="methodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver"> <property name="paramName" value="action" /> </bean> <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="/xmlConfig">xmlConfigController</prop> </props> </property> </bean>
-- XmlConfigController 須要繼承 MultiActionController
訪問地址爲:http://localhost:8080/springmvc/xmlConfig?action=login
login爲 XmlConfigController 中的一個方法名
註解控制器的規則
參數類型
在處理HTTP請求時,AnnotationMethodHandlerAdapter組件負責調用指定的請求處理方法。它能夠根據方法的參數列表不一樣,生成對應類型的參數,進而調用請求處理方法。
對於控制器中方法,Spring支持如下參數類型:
HttpServletRequest與HttpServletResponse以及HttpSession
@RequestParam註解
任意JavaBean對象
Model與ModelAndView或Map
返回類型
返回值被交由ViewResolver組件進行解析,將其解析爲最終轉發的JSP頁面URL
重定向及轉發
return "forward:xxxURL";
return "redirect:xxxURL";
注意:若是使用轉發或重定向的話,返回路徑不會通過視圖解析器的解析,須要手動添加。
ModelAndView類型
Spring MVC 內置類,包含Model和View兩個對象,分別用於封裝數據和轉發視圖。
addObject(name,value);//向request做用域中設置數據
setViewName(url); //設置響應的視圖URL
String類型
Model、ModelMap、Map與void
其中Model和ModelMap均爲Spring MVC 內置類。
注意:返回視圖名稱與請求URL相同
MyBatis ORM 框架
Mybatis是世界上流行最普遍的SQL映射框架,由Clinton Begin在2002年建立,後捐獻給Apache基金會,成立了iBatis項目,該項目是O/R Mapping解決方案。2010年5月,將代碼庫遷至Google Code,並改名爲MyBatis。
MyBatis是一個能夠自定義SQL、存儲過程和高級映射的持久層框架。MyBatis摒除了大部分的JDBC代碼,手工設置參數和結果集重獲。MyBatis只使用簡單的XML和註解來配置和映射基本數據類型,接口和POJO到數據庫記錄
MyBatis框架:半自動化的ORM框架
優勢:
1、須要編寫sql語句,對sql優化和維護比較方便
2、學習成本低,學起來很是簡單
缺點:
1、開發效率不如hibernate,數據庫移植性差
2、緩存機制不是很好,須要使用第三方日誌統計:log4j
適用於:需求量變化比較頻繁的項目 例:互聯網項目...
框架Hibernate框架:全自動化的ORM框架
優勢:
1、不須要編寫SQL語句,自動生成sql
2、開發效率很是快
3、數據庫移植性好,提供了HQL語句
4、緩存機制比較好,自帶日誌統計
缺點:
1、相比於mybatis,維護性比較差,修改sql語句比較麻煩
2、性能沒有Mybatis好,學習成本高,入門門檻高
適用於:需求量變化不大的項目(中小型項目) 例:後臺管理系統,OA...
MyBatis系統架構
API接口層
提供給外部使用的接口API,開發人員經過這些本地API來操縱數據庫。
接口層接收到調用請求後,會調用數據處理層來完成具體的數據處理。
數據處理層
負責具體的SQL查找、SQL解析、SQL執行和執行結果映射處理等。
其主要目的是根據調用請求完成一次數據庫操做。
基礎支持層
負責最基礎的功能支撐,包括鏈接管理、事務管理、配置加載和緩存處理。
爲其上的數據處理層提供最基礎的支撐。
MyBatis開發步驟
1.導入MyBatis所需庫文件(jar包)
commons-logging-x.x.x.jar
mybatis-x.x.x.jar處理mybatis的核心jar
jar包能夠從 http://www.mvnrepository.com網站獲取
2.編寫MyBatis配置文件
在MyBatis應用程序中,須要提供如下配置文件:
數據庫鏈接屬性文件,例如database.properties(以Mysql數據庫爲例)
Mybatis主配置文件(XML格式),例如config.xml
數據庫鏈接資源文件
dirver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3036/數據庫名
username=root
password=1234
XML建立SqlSessionFactory
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!-- 配置別名 --> <typeAliases> <typeAlias alias="別名" type="類的徹底限定名"/> </typeAliases> <!-- 環境集 --> <environments default="development"> <!-- 環境,數據庫的鏈接 --> <environment id="development"> <!-- 事務管理器 --> <transactionManager type="JDBC"/> <!-- 數據源 --> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <mappers> <!-- 加載映射語句配置文件:XXXMapper.xml --> <mapper resource="com/mybatis/dao/XXXMapper.xml"/> </mappers> </configuration>
3.聲明實體類
MyBatis實體類與普通JavaBean無任何區別。需注意:類中屬性名應與數據庫字段名相對應。
4.聲明映射接口及映射配置
建立持久層文件:聲明映射接口
MyBatis映射接口至關於DAO,用於提供將對象映射爲數據庫關係的操做方法。
當程序運行時,MyBatis可基於該接口自動生成實現類,而無須手動編寫。但須提供與之接口對應的XML映射配置文件。
建立映射文件:mapper文件
映射配置文件一般與接口名稱一致:XXXMapper.xml。
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="XXXMapper關聯接口徹底限定名"> </mapper>
namespace
指定映射文件所對應的映射接口
#{}與${}
#{}MyBatis會對屬性自動解析
${}不可變字符串
Select
最基本寫法:
<select id="接口中對應的方法" parameterType="參數類型" resultType="返回類型"> select語句 </select>
省略參數類型:
<select id="接口中對應的方法" resultType="返回值類型"> select語句 </select>
sql
定義重用的sql語句:
<sql id="xxx_column"> 字段名,字段名 </sql> <select id="接口中對應的方法" resultType="返回值類型"> select <include refid="xxx_column"/> from xxx; </select>
分頁查詢:
Mysql分頁:
<select id="接口中對應的方法" resultType="返回值類型"> select <include refid="xxx_column"/> from xxx limit #{0},#{1} ; </select>
Oracle分頁:
<select id="接口中對應方法" parameterType="參數類型" resultType="返回值類型"> <include refid="common.header"></include> select語句 <include refid="common.footer"></include> </select>
建立base.xml的Mapper共同文件,須要另外加載映射。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="common"> <sql id="header"> select * from ( select a.* , rownum r from ( </sql> <sql id="footer"> ) a ) b where b.r > #{start} and b.r <= #{end} </sql> </mapper>
insert
Mysql插入:
<insert id="接口中對應的方法" parameterType="參數類型" useGeneratedKeys="true" keyProperty="id名"> insert into xxx(字段,字段) values(#{屬性},#{屬性}) </insert>
Oracle插入:
<insert id="接口中對應的方法" parameterType="參數類型"> insert into xxx(字段,字段) values(#{屬性},#{屬性}) <selectKey keyColumn="id" keyProperty="id名" order="BEFORE" resultType="int"> select 序列.nextval from dual </selectKey> </insert>
update
<update id="接口中對應的方法" parameterType="參數類型"> update xxx set 字段=#{屬性}, 字段=#{屬性}, 字段=#{屬性} where id=#{屬性}; 或採用佔位符 update xxx set 字段=#{1}, 字段=#{2}, 字段=#{3} where id=#{0}; </update>
parameterType可省略
delete
<delete id="接口中對應的方法" parameterType="參數類型"> delete from xxx where lid=#{屬性}; </delete>
parameterType可省略
resultMap
解決列名不匹配問題:
<!-- 定義ResultMap:解決列名不匹配的一種方式 --> <resultMap type="xxx" id="xxxMap"> <!-- property:屬性名 column:列名 --> <result property="year" column="lyear"/> </resultMap> <select id="接口中對應方法" resultMap="xxxMap"> select語句 </select>
一對多關係映射:
<resultMap type="grade" id="gradeResultMap"> <id column="id" property="id"/> <result column="className" javaType="string" property="className" /> <!– 經過collection配置集合屬性,ofType指定集合中元素的類型,id標籤配置外鍵 --> <collection property="users" ofType="user"> <id column="u_id" property="id"/> <result column="username" property="username"/> </collection> </resultMap> <select id="getGradeById" resultMap="gradeResultMap"> select g.id , g.className , u.id as u_id , u.username from t_grade g left join t_user u on g.id = u.g_id where g.id = #{id} </select>
多對一關係映射:
<resultMap type="user" id="userResultMap"> <id column="id" property="id"/> <result column="username" property="username"/> <result column="password" property="password"/> <!– 經過association配置集合屬性, javaType指定元素的類型--> <association property="grade" javaType="grade"> <id column="g_id" property="id"/> <result column="className" property="className"/> </association> </resultMap> <select id="getUserGradeByUserId" resultMap="userResultMap"> select u.id , u.username , u.password , g.id as g_id , g.className from t_user u left join t_grade g on u.g_id = g.id where u.id = #{id} </select>
5.編寫客戶端訪問代碼
從SqlSessionFactoryBuilder中build 建立SqlSessionFactory以後create獲取SqlSession回話。
public class SqlSessionFactoryUtil { private static SqlSessionFactory sqlSessionFactory; static { String resource = "config.xml"; // InputStream in = SqlSessionFactoryUtil.class.getResourceAsStream(resource); try { InputStream in = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(in); } catch (IOException e) { e.printStackTrace(); } } public static SqlSession getSession(boolean autoCommit) { return sqlSessionFactory.openSession(autoCommit); } public static void main(String[] args) { SqlSession session = SqlSessionFactoryUtil.getSession(true); LeagueMapper mapper = session.getMapper(LeagueMapper.class); } }
獲取事務的方式
可在調用增刪改操做後調用session.commit()進行事務的提交;
也可在獲取SqlSession的時候,經過sqlSessionFactory.openSession(true)。
MyBatis動態SQL
if語句
<select id="selectUsers" parameterType="java.util.HashMap「 resultType="user">
select ID , USERNAME , PASSWORD
FROM USERW WHERE 1=1
<if test="username!=null and username!=''">
and USERNAME = #{username}
</if>
<if test="password!=null and password!=''">
and PASSWORD = #{password}
</if>
</select>
choose when other 語句
<select id="selectUsers" parameterType="java.util.HashMap" resultType="user">
select ID , USERNAME , PASSWORD FROM USERW WHERE 1=1
<choose>
<when test="username!=null and username!=''">
and USERNAME = #{username}
</when>
<when test="username==null or username==''">
and USERNAME is null
</when>
<otherwise>
and 1!=1
</otherwise>
</choose>
</select>
trim, where,set語句
<select id="selectUsers" parameterType="java.util.HashMap" resultType="user">
select ID , USERNAME , PASSWORD FROM USERW
<where>
<if test="username!=null">
USERNAME = #{username}
</if>
</where>
</select>
<update id="updateUser" parameterType="java.util.HashMap">
update USERW
<set>
<if test="username!=null">
USERNAME = #{username},
</if>
<if test="password!=null">
PASSWORD = #{password},
</if>
</set>
where ID = #{id}
</update>
foreach語句
<select id="selectUsers" parameterType="java.util.HashMap" resultType="user">
select ID , USERNAME , PASSWORD FROM USERW WHERE 1=1
<choose>
<when test="username!=null and username!=''">
and USERNAME = #{username}
</when>
<when test="username==null or username==''">
and USERNAME is null
</when>
<otherwise>
and 1!=1
</otherwise>
</choose>
</select>
Spring+MyBatis整合
Spring整合ORM框架的優點
簡化編程:整合後的編程,在配置文件、API調用,以及異常處理等方面的程序有很大的簡化
簡化事務配置:整合後可以使用Spring AOP事務實現對事務的控制,程序中沒必要再編寫事務控制的代碼。
Spring-MyBatis整合結構
將MyBatis整合到Spring的優點
在MyBatis-Spring中,使用SqlSessionFactoryBean來代替SqlSessionFactoryBuilder,它直接聲明在Spring配置文件中。
Mapper實例不在須要手動編碼獲取,直接在Spring配置文件中聲明便可。
原有的數據源配置信息,被整合到Spring提供的DataSource中。
MapperFactoryBean
用於生成MyBatis Mapper子類實例的工廠類,該類內部使用了工廠方法模式。服務組件經過經過該Bean獲取Mapper實例。
MapperScannerConfigurer
用於掃描指定路徑中的映射配置文件來獲取映射信息。
SqlSessionFactoryBean
用於生產MyBatis中SqlSession的工廠類,該類內部使用了工廠方法模式。
DataSource
用於鏈接數據庫的通用組件,可以使用Web容器提供的數據源,也可使用第三方數據源。