SSM搭建手冊

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

 loginXmlConfigController 中的一個方法名

註解控制器的規則

參數類型

在處理HTTP請求時,AnnotationMethodHandlerAdapter組件負責調用指定的請求處理方法。它能夠根據方法的參數列表不一樣,生成對應類型的參數,進而調用請求處理方法。

對於控制器中方法,Spring支持如下參數類型:

HttpServletRequestHttpServletResponse以及HttpSession

@RequestParam註解

任意JavaBean對象

Model與ModelAndView或Map  

返回類型

返回值被交由ViewResolver組件進行解析,將其解析爲最終轉發的JSP頁面URL

 

重定向及轉發

return "forward:xxxURL";

return "redirect:xxxURL";

注意:若是使用轉發或重定向的話,返回路徑不會通過視圖解析器的解析,須要手動添加。

ModelAndView類型

Spring MVC 內置類,包含ModelView兩個對象,分別用於封裝數據和轉發視圖。

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.xmlMapper共同文件,須要另外加載映射。

複製代碼
<?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.HashMapresultType="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容器提供的數據源,也可使用第三方數據源。

相關文章
相關標籤/搜索