Java框架-SpringMVC統一異常處理、ssm框架整合

1. SpringMVC中異常處理

1.1 各層處理異常原則即實現方法

1.1.1 各層處理異常原則

dao:不處理,拋異常;

service:不處理,拋異常;

controller/servlet:必須處理,否則錯誤信息將直接在瀏覽器顯示給用戶看。

1.1.2 異常處理實現方法

  • 方法1:控制層的方法中寫try…catch。異常處理信息一多,控制層方法就會十分冗餘,而且每個控制器都有可能有異常,即每個控制器都要寫;
  • 方法2:使用異常過濾器,攔截所有請求。在過濾器中對異常進行處理;
  • 方法3:使用框架自帶的異常處理機制。

1.2 異常處理

  • 使用異常處理器統一對dao、service、controller的異常進行處理
  • SpringMVC提供了HandlerExceptionResolver異常處理器接口

1.3 SpringMVC異常處理實現

1.3.1 環境準備

1.3.1.1 創建項目、添加依賴
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.azure</groupId>
    <artifactId>day57projects_SpringMVC_ssm</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!--spring核心包-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>
        <!--springmvc支持包-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>
        <!--servlet支持包-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.0</version>
        </dependency>
        <!--日誌包-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        
    </dependencies>
</project>
1.3.1.2 springMVC.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--1.開啓註解掃描-->
    <context:component-scan base-package="com.azure"></context:component-scan>
    <!--2.開啓視圖解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/pages/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>
    <!--3.開啓mvc註解-->
    <mvc:annotation-driven></mvc:annotation-driven>
    <!--4.放行資源-->
    <mvc:resources mapping="/pages/**" location="/pages/"></mvc:resources>
    <mvc:resources mapping="/js/**" location="/pages/"></mvc:resources>

</beans>
1.3.1.3 web.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns="http://java.sun.com/xml/ns/javaee"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   version="2.5">

   <!--設置springMVC前端控制器-->
   <servlet>
      <servlet-name>dispatcherServlet</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <!--指定加載的配置文件路徑-->
      <init-param>
         <param-name>contextConfigLocation</param-name>
         <param-value>classpath:springMVC.xml</param-value>
      </init-param>
      <load-on-startup>1</load-on-startup>
   </servlet>
   <!--設置攔截規則-->
   <servlet-mapping>
      <servlet-name>dispatcherServlet</servlet-name>
      <url-pattern>/</url-pattern>
   </servlet-mapping>
</web-app>

1.3.2 控制類模擬異常

@Controller
public class ExpController {

    /**
     * 模擬異常
     */
    @RequestMapping("/save")
    public String save(){
        int i = 1/0;
        return "success";
    }
}

1.3.3 使用方法1手動捕獲異常

1.3.3.1 error.jsp頁面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>error</title>
</head>
<body>
<h4>出錯啦~系統繁忙~</h4>
</body>
</html>
1.3.3.2 控制類調整
@Controller
public class ExpController {

    /**
     * 模擬異常
     */
    @RequestMapping("/save")
    public String save(ModelMap modelMap){
        try {
            int i = 1/0;
        } catch (Exception e) {
            e.printStackTrace();
            //將異常信息發送給error.jsp頁面,error頁面獲取並顯示錯誤信息
            modelMap.addAttribute("errorMsg","出錯啦~系統繁忙~");
            return "error";
        }
        return "success";
    }
}
1.3.3.3 總結
  • 每個請求方法都要寫異常代碼,都要手動捕獲異常處理,效率低。

1.3.4 使用方法3自定義異常處理器

  • 使用SpringMVC提供的異常處理接口(HandlerExceptionResolver)實現類
1.3.4.1 設置自定義異常處理器
public class CustomerExceptionResolver implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
        //1.打印異常信息
        e.printStackTrace();
        //2.保存異常信息並跳轉到錯誤頁面
        ModelAndView mv = new ModelAndView();
        mv.addObject("errorMsg", "出錯啦~系統繁忙~");
        mv.setViewName("error");
        return mv;
    }
}
1.3.4.2 springMVC.xml配置異常處理器
  • 除了在springMVC.xml配置,也可以在自定義異常處理器類上使用@Component註解創建對象
<!--5.配置異常處理器-->
<bean class="com.azure._01exception.CustomerExceptionResolver">
1.3.4.3 測試控制類
@Controller
public class HERController {
    /**
     * 模擬異常
     */
    @RequestMapping("/saved")
    public String saved(ModelMap modelMap) {
        int i = 1 / 0;
        return "success";
    }
}

2. SpringMVC中的攔截器

2.1 攔截器的作用

  • SpringMVC的處理器攔截類似於 的處理器攔截類似於Servlet開發中的過濾器Filter,用於對處理器進行預處理和後處理。
  • 攔截器鏈:多個攔截器按一定的順序連接成鏈,訪問被攔截方法或字段時,按定義的順序調用攔截器

2.1.1 攔截器與過濾器的異同

相同點:

  1. 都可以對請求進行攔截:過濾器攔截所有請求、攔截器只攔截控制器請求;
  2. 請求處理前可以做一些前期操作,在請求處理完畢後,也可以做後續的操作。

區別:

  1. 過濾器是servlet規範中的一部分,任何java web工程都可以使用;而攔截器只能在SpringMVC框架的工程內使用。
  2. 過濾器可以通過在url-pattern屬性中配置/*實現攔截所有訪問請求;而攔截器只會攔截訪問控制器方法的請求,不會對網頁資源(html、jsp等)進行攔截。
  3. 過濾器應用範圍更廣,攔截器只應用在SpringMVC項目。

2.2 自定義攔截器使用

2.2.1 編寫控制器

@Controller
public class HIDemoController {
    //構造函數
    public HIDemo1Controller(){
        System.out.println("1.實例UserController");
    }

    @RequestMapping("/interceptor")
    public ModelAndView testInterceptor(){  //存入數據並跳轉頁面
        System.out.println("4.執行控制器的testInterceptor方法");
        ModelAndView mv = new ModelAndView();
        mv.addObject("username", "JoJo");
        mv.setViewName("success");
        return mv;
    }
}

2.2.2 編寫攔截器類實現HandlerInterceptor接口

  • 除了在springMVC.xml配置,也可以在自定義異常處理器類上使用@Component註解創建對象
public class HandlerInterceptor1 implements HandlerInterceptor {

    //構造函數
    public HandlerInterceptor1(){
        System.out.println("2.實例攔截器1號");
    }

    /**
     * 編寫請求攔截方法,包含業務邏輯控制校驗代碼
     *  返回值爲true:放行,進入攔截器鏈的下一個攔截器,如果是最後一個,則執行控制器的方法
     *  返回值爲false:不放行,請求不被處理
     */

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("3.攔截器1號的preHandle方法已執行");
        return true;
    }

    /**
     * 編寫響應攔截方法,在請求處理完返回響應前調用
     */
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("5.攔截器1號的postHandle方法已執行");
    }

    /**
     * 編輯資源清理方法,在preHandle返回true就會被調用
     */
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("6.攔截器1號的afterCompletion方法已執行");
    }
}

2.2.3 springMVC.xml配置攔截器

<?xml version="1.0" encoding="UTF-8"?>
<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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--1.開啓註解掃描-->
    <context:component-scan base-package="com.azure"></context:component-scan>
    <!--2.開啓視圖解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/pages/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>
    <!--3.開啓mvc註解-->
    <mvc:annotation-driven></mvc:annotation-driven>

    <!--4.放行資源
    <mvc:resources mapping="/pages/**" location="/pages/"></mvc:resources>
    <mvc:resources mapping="/js/**" location="/pages/"></mvc:resources>-->

    <!--5.配置異常處理器
    <bean class="com.azure._01exception.CustomerExceptionResolver"></bean>-->

    <!--使用SpringMVC自定義異常處理器-->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**" /><!-- 用於指定對攔截的 url -->
            <!-- <mvc:exclude-mapping path=""/>用於指定排除的 url-->
            <bean class="com.azure._02Interceptor.HandlerInterceptor1"></bean>
        </mvc:interceptor>
    </mvc:interceptors>
</beans>
  • 注意,如果攔截器使用@Component註解,那麼在springMVC.xml中就不用<bean...HandlerInterceptor1"></bean>,而是使用<ref bean="handlerInterceptor1"/>

2.3 多攔截器使用

2.3.1 新增一個攔截器2

@Component
public class HandlerInterceptor2 implements HandlerInterceptor {

    //構造函數
    public HandlerInterceptor2(){
        System.out.println("實例攔截器2號");
    }

    /**
     * 編寫請求攔截方法,包含業務邏輯控制校驗代碼
     *  返回值爲true:放行,進入攔截器鏈的下一個攔截器,如果是最後一個,則執行控制器的方法
     *  返回值爲false:不放行,請求不被處理
     */

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("攔截器2號的preHandle方法已執行");
        return true;
    }

    /**
     * 編寫響應攔截方法,在請求處理完返回響應前調用
     */
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("攔截器2號的postHandle方法已執行");
    }

    /**
     * 編輯資源清理方法,在preHandle返回true就會被調用
     */
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("攔截器2號的afterCompletion方法已執行");
    }
}

2.3.2 springMVC.xml配置攔截器2

<!--使用SpringMVC自定義異常處理器-->
<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**" /><!-- 用於指定對攔截的 url -->
        <!-- <mvc:exclude-mapping path=""/>用於指定排除的 url-->
        <bean class="com.azure._02Interceptor.HandlerInterceptor1"></bean>
    </mvc:interceptor>
    <!--配置第二個攔截器-->
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <ref bean="handlerInterceptor2"></ref>
    </mvc:interceptor>
</mvc:interceptors>

2.3.3 運行結果

2.3.3.1 服務器啓動

在這裏插入圖片描述

2.3.3.2 請求訪問

在這裏插入圖片描述

3. SSM整合(重點*3)

3.1 整合原則

  • xml和註解組合使用

  • 配置方式的選擇:

    1. Spring:自己編寫的類使用註解,jar包的類用xml,事務用xml;
    2. SpringMVC:控制器配置用註解,使用xml有:掃描包、視圖解析器開啓、註解支持開啓、靜態資源不過濾等;
    3. mybatis:SqlMapConfig.xml整合到spring配置文件中,接口映射使用註解配置
  • Spring整合Mybatis關鍵點:把Mybatis的SqlSessionFactory對象的創建交給Spring管理。

3.2 整合步驟

  1. 構建單獨Spring環境
  2. 構建單獨SpringMVC環境
  3. Spring與SpringMVC整合
  4. 構建單獨Mybatis環境
  5. Spring整合Mybatis
  6. ssm 整合,頁面,測試
  • 爲確保整合成功,每步都會單獨測試檢查是否有誤

3.3 構建Spring環境

3.3.1 創建項目,添加依賴

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.azure</groupId>
    <artifactId>day57projects_SSM</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <dependencies>
        <!--spring核心支持包-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>
        <!--aspectj支持包-->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.9</version>
        </dependency>
        <!--springmvc支持包-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>
        <!--spring事務支持包-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>
        <!--spring Jdbc支持-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>
        <!--spring整合mybatis-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.1</version>
        </dependency>

        <!--spring的junit支持包-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <!--數據庫驅動-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.30</version>
        </dependency>
        <!--druid-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.10</version>
        </dependency>
        <!--mybatis支持包-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
        </dependency>
        <!--servlet\jsp支持包-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.0</version>
        </dependency>
        <!--jstl支持包-->
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <!--日誌包-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
    </dependencies>
</project>

3.3.2 spring配置文件

  • 創建applicationContext.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <!--1.開啓service層註解掃描,避免與其他層的註解掃描重合-->
    <context:component-scan base-package="com.azure.service"></context:component-scan>

</beans>

3.3.3 創建實體類

public class Account {
    private int accountId;
    private int uid;
    private double money;
    ...
}

3.3.4 service層

3.3.4.1 service層接口
public interface IAccountService {
    /*實現查詢功能*/
    List<Account> findAll();
}
3.3.4.2 service接口實現類
@Service
public class AccountServiceImpl implements IAccountService {
    @Override
    public List<Account> findAll() {
        System.out.println("測試。。。調用service的findAll查詢全部賬戶");
        return null;
    }
}

3.3.5 測試類

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")   //指定容器類
public class TestDemo01 {
    //注入service
    @Autowired
    private IAccountService accountService;

    @Test
    public void find(){
        accountService.findAll();
    }
}

3.4 構建單獨SpringMVC環境

3.4.1 配置web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns="http://java.sun.com/xml/ns/javaee"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   version="2.5">

   <!--1.配置前端控制器-->
   <servlet>
      <servlet-name>DispatcherServlet</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <!--加載springMVC配置文件-->
      <init-param>
         <param-name>contextConfigLocation</param-name>
         <param-value>classpath:springMVC.xml</param-value>
      </init-param>
      <load-on-startup>1</load-on-startup>
   </servlet>
   <!--2.配置攔截規則-->
   <servlet-mapping>
      <servlet-name>DispatcherServlet</servlet-name>
      <url-pattern>/</url-pattern>
   </servlet-mapping>

</web-app>

3.4.2 配置springMVC.xml

<?xml version="1.0" encoding="UTF-8"?>
<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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--1.開啓controller註解掃描-->
    <context:component-scan base-package="com.azure.controller"/>
    <!--2.配置視圖解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/pages/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>
    <!--3.開啓註解支持-->
    <mvc:annotation-driven></mvc:annotation-driven>

</beans>

3.4.3 控制類

@Controller
public class AccountController {

    @RequestMapping("/findAll")
    public ModelAndView findAll(HttpServletRequest request) {
        ModelAndView mv = new ModelAndView();
        mv.addObject("name", "JoJo");
        mv.setViewName("success");
        return mv;
    }
}

3.4.4 測試頁面

  • 增加success.jsp頁面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>success</title>
</head>
<body>
success~~
</body>
</html>

3.5 Spring整合SpringMVC

  • 思路:
    • 1、SpringMVC負責controller層,需要注入service
    • 2、在web.xml中加載applicationContext.xml配置

3.5.1 控制器類注入service

@Controller
@RequestMapping("/account")     //設置第一級目錄,方便區分findAll方法
public class AccountController {

    //注入service
    @Autowired
    private IAccountService accountService;

    @RequestMapping("/findAll")
    public ModelAndView findAll(HttpServletRequest request) {
        List<Account> list = accountService.findAll();
        ModelAndView mv = new ModelAndView();
        mv.addObject("list", list);
        mv.setViewName("success");
        return mv;
    }
}

3.5.2 在web.xml配置ServletContext的監聽器加載applicationContext.xml

  • 服務器啓動的時候會創建ServletContext,通過監聽ServletContext,在創建ServletContext時加載配置,就能實現服務器啓動後加載配置。
<!--0.配置ServletContext監聽器,在服務器啓動時加載配置文件-->
<listener>
   <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--配置全局參數,監聽器會讀取參數對應的配置文件-->
<context-param>
   <param-name>contextConfigLocation</param-name>
   <param-value>classpath:applicationContext.xml</param-value>
</context-param>

3.6 配置單獨mybatis環境

3.6.1 配置sqlMapConfig.xml

<?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>
    <!--加載數據庫配置文件-->
    <properties resource="jdbc.properties"/>
    <!--配置數據庫連接池-->
    <environments default="mysql">
        <environment id="mysql">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--配置映射文件-->
    <mappers>
        <package name="com.azure.dao"></package>
    </mappers>
</configuration>

3.6.2 dao層

public interface IAccountDao {
    /**
     * 查詢功能
     */
    @Select("select * from account")    //使用註解方式實現查詢
    List<Account> findAll();
}

3.6.3 測試類

public class TestDemo02 {

    @Test
    public void findAll() throws IOException {
        InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(is);
        SqlSession session = factory.openSession();
        //創建Dao實現類
        IAccountDao accountDao = session.getMapper(IAccountDao.class);
        List<Account> list = accountDao.findAll();
        System.out.println(list);
        session.close();
        is.close();
    }
}

3.7 Spring整合mybatis

思路:

  1. 將SqlMapConfig.xml整合到applicationContext.xml中,包括
    • 加載數據庫配置文件
    • 配置數據庫連接池
  2. 增加Spring聲明式事務;
  3. 將SqlSessionFactoryBean交由Spring創建,配置SqlSessionFactoryBean
  4. 開啓dao接口掃描
  5. service注入dao

3.7.1 applicationContext.xml整合SqlMapConfig.xml

<?xml version="1.0" encoding="UTF-8"?>
<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:tx="http://www.springframework.org/schema/tx"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

    <!--1.開啓service層註解掃描,避免與其他層的註解掃描重合-->
    <context:component-scan base-package="com.azure.service"></context:component-scan>

    <!--2.加載數據庫配置文件-->
    <context:property-placeholder location="classpath:jdbc.properties"/>

    <!--3.配置數據庫連接池-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>

    <!--4.Spring整合mybatis的關鍵:配置SqlSessionFactoryBean-->
    <bean class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!--5.開啓包掃描器,掃描dao接口所在包,對包下所有dao類自動生成代理-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.azure.dao"/>
    </bean>

    <!--6.Spring聲明式事務配置-->
    <!--6.1 事務管理器-->
    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <!--6.2 事務通知規則-->
    <tx:advice id="txadvice" transaction-manager="txManager">
        <!--配置查詢的事務,事務可以有也可以沒有,只讀-->
        <tx:attributes>
            <tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
            <!--配置增刪改的事務,事務必須有,讀寫-->
            <tx:method name="*" propagation="REQUIRED" read-only="false"/>
        </tx:attributes>
    </tx:advice>
    <!--6.3 AOP切面設置-->
    <aop:config>
        <!--設置切面表達式-->
        <aop:pointcut id="pt" expression="execution(* com.azure.service.*.*(..))"></aop:pointcut>
    </aop:config>

</beans>

3.7.2 service注入dao

@Service
public class AccountServiceImpl implements IAccountService {
    //注入Dao
    @Autowired
    private IAccountDao accountDao;
    
    @Override
    public List<Account> findAll() {
        return accountDao.findAll();
    }
}

3.7.3 測試

分兩部分:

  1. 測試service在整合後是否有誤;
  2. 從controller開始走完整的流程,看最終頁面是否正常返回數據
3.7.3.1 service測試
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")   //指定容器類
public class TestDemo03 {
    //注入service
    @Autowired
    private IAccountService accountService;

    @Test
    public void find(){
        List<Account> accounts = accountService.findAll();
        System.out.println(accounts);
    }
}
3.7.3.2 啓動服務器測試
  • 配置返回的頁面,將獲取的結果打印

success.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>success</title>
</head>
<body>
<h3>查詢所有賬戶</h3>
<h3>success~~</h3>
<table border="1px" cellpadding="3px" cellspacing="0" style="color: gold">
    <tbody>
    <tr>
        <th>序號</th>
        <th>賬號編號</th>
        <th>用戶編號</th>
        <th>賬戶餘額</th>
    </tr>
    <%--遍歷結果獲取每個元素並打印--%>
    <%--varStatus相當於遍歷的i--%>
    <c:forEach var="account" items="${list}" varStatus="num">
        <tr>
            <td>${num.count}</td>
            <td>${account.accountId}</td>
            <td>${account.uid}</td>
            <td>${account.money}</td>
        </tr>
    </c:forEach>
    </tbody>
</table>
</body>
</html>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章