SSM框架開發web項目系列(五) Spring集成MyBatis

来源:https://www.cnblogs.com/young-z/archive/2018/01/08/8242518.html
-Advertisement-
Play Games

前言 在前面的MyBatis部分內容中,我們已經可以獨立的基於MyBatis構建一個資料庫訪問層應用,但是在實際的項目開發中,我們的程式不會這麼簡單,層次也更加複雜,除了這裡說到的持久層,還有業務邏輯層、視圖層等等,隨著代碼量和需求複雜度逐漸增長,對象的創建、管理以及層與層之間的耦合度等等問題隨之而 ...


  前言

  在前面的MyBatis部分內容中,我們已經可以獨立的基於MyBatis構建一個資料庫訪問層應用,但是在實際的項目開發中,我們的程式不會這麼簡單,層次也更加複雜,除了這裡說到的持久層,還有業務邏輯層、視圖層等等,隨著代碼量和需求複雜度逐漸增長,對象的創建、管理以及層與層之間的耦合度等等問題隨之而來。Spring是目前比較流行的框架,它解決了諸多例如層次之間松耦合、幫助管理對象等問題。如果是有準備學習MyBatis的人,應該或多或少都學習過或者瞭解過Spring了,本篇要通過Spring集成MyBatis,首先要對Spring核心的概念IOC和AOP有個基本認識。

  首先回顧下IOC,控制反轉(Inversion of Control,英文縮寫為IOC),前面講到的層與層之間的耦合問題在Spring中,即通過控制反轉解決的,那麼控制具體是控制什麼,反轉是怎樣反轉?我們在學習初期,創建對象用到最多的往往就是new語句,如果需要一個Person類的實例對象,我們就可以通過 Person p = new Person(); 獲取我們想要的,進一步引申,在我們的開發中,如果業務邏輯Service層需要一個持久層Dao的實例,那麼我們也可以在這個Service中直接new一個Dao實例,這樣就相當於是我們自己在控制這個對象的創建和管理等等,但實際上項目中引入Spring後,我們無需自己去創建對象,而是交由Spring創建和管理,控制反轉具體來看,應該是控制對象的創建、管理等等,這些職責的反轉,原來是我們的職責,現在反轉到了Spring容器那邊管理。另外說道IOC,往往還伴隨著一個DI(Dependency Injection)依賴註入的概念,前面為什麼要在一個層的類中創建(獲取)另一個類對象,是因為類與類之間的依賴,如果由我們主動在類中創建對象,會使得項目高耦合,靈活度大大降低。而通過依賴註入可以讓我們輕鬆獲取由容器創建和管理的對象,而不需要在程式中硬編碼創建對象,從而達到解耦程式。依賴註入,基於Java反射,是控制反轉的一種具體實現方式。

  AOP(Aspect Oriented Programming)面向切麵編程,使用到Java中代理模式,是對面向對象編程的一種補充,而不是競爭或衝突,例如我們看待一段web項目訪問過程,首先訪問模塊A,隨之系統會記錄訪問日誌,然後訪問模塊B,系統也會隨之記錄訪問日誌,以面向對象的思維來看,從前到後,這是兩段完整的過程,每段過程中又包括我們的訪問和系統的日誌記錄兩種操作。但是換到這裡的切麵思維,我們每訪問一個模塊,系統都會隨之有記錄訪問日誌,把這個記錄日誌的動作以切麵抽取並封裝起來,可以減少系統的重覆代碼,降低模塊之間的耦合度,提高系統的可操作性和可維護性。常見應用有例如事務管理、日誌管理、安全控制等等。

  Spring集成MyBatis

  既然Spring容器能幫助我們創建和管理對象,那麼在這裡,不同於前面的獨立MyBatis程式,我們可以把那些獲取對象的過程按照Spring的方式做些修改。首先來回顧下前面我們做MyBatis單獨測試的方法代碼,示例如下:

@Test
    public void testCore() throws IOException {
        //直接實例SqlSessionFactoryBuilder對象
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        //MyBatis配置文件路徑
        String path = "mybatis-config.xml";
        //通過路徑獲取輸入流
        Reader reader = Resources.getResourceAsReader(path);
        //通過reader構建sessionFactory
        SqlSessionFactory sessionFactory = builder.build(reader);
        //獲取SqlSession對象
        SqlSession sqlSession = sessionFactory.openSession();
        //獲取Mapper實例
        DeptMapper mapper = sqlSession.getMapper(DeptMapper.class);
        
        Dept dept = mapper.selectById(10001);
        Company company = dept.getCompany();        //所屬公司
        List<Emp> empList = dept.getEmpList();        //員工集合
        System.out.println(dept);
    }

  這裡的SqlSessionFactory、SqlSession、Mapper實例等對象都是由我們手動去自己創建,下麵正文開始通過Spring集成方式,我們可以免除這些創建對象的代碼。

  資料庫環境MySql,工具Navicat for MySQL,創建一張Person表如下所示,並填入幾條測試數據

  新建Maven項目,可以是普通Jar項目,簡單選quickstart那個,工程結構如下所示:

POM依賴可參考SSM框架開發web項目系列(一) 環境搭建篇

  實體類Person

package com.mmm.pojo;

public class Person {
    private Integer id;            //主鍵
    private String name;        //姓名
    private String gender;        //性別
    private Integer age;        //年齡
    private String ifIT;        //是否從事IT行業
    
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public String getIfIT() {
        return ifIT;
    }
    public void setIfIT(String ifIT) {
        this.ifIT = ifIT;
    }
    @Override
    public String toString() {
        return "Person [id=" + id + ", name=" + name + ", gender=" + gender
                + ", age=" + age + ", ifIT=" + ifIT + "]";
    }
    
}

  mybatis-config.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>
    <!-- 這裡可以定義類的別名,在mapper.xml文件中應用會方便很多 -->
    <typeAliases>
        <typeAlias alias="psn" type="com.mmm.pojo.Person" />
    </typeAliases
              
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • OCS(online charging system,線上計費系統)在進行雲化改造的過程中,從實用主義角度出發,微服務架構並不是我們的目標。雖然我們也對系統進行了容器化改造(Docker),並根據業務進程的功能將系統分成了好幾類的容器,但這一切多是出於對系統中的某些處理節點進行動態擴縮容的需要,跟微... ...
  • JDBC連接資料庫五步驟: 一、載入驅動 Class.forName(“com.mysql.jdbc.Driver”); 二、建立連接 Connection conn = DriverManager.getConnection(“jdbc:mysql://localhost:8080/資料庫名”,” ...
  • 公司創立之初,一個web服務和一個資料庫實例即可滿足戶需求。隨著業務量的增長,性能問題就會越來越突出。架構於是變成了多個web服務,和一個讀寫分離的資料庫群( 主多從),這種架構或許也能 撐上千萬的用戶。但隨著進一步發展,會發現業務複雜度越來越高 ,耦合也比較嚴重,而且資料庫也成了性能瓶頸。這時就不 ...
  • 匿名對象: 是指創建對象的時候,只有創建對象的語句,卻沒有把對象地址值賦給某個變數 創建一個普通對象: Person p = new Person(); 創建一個匿名對象: new Person(); 註意: 1.匿名對象只能使用一次 2.匿名對象可以作為參數傳遞 3.匿名對象可以當作方法的返回值 ...
  • 今天線上有個NullPointerException 的異常,我翻了一下代碼,拋異常的竟然是switch語句 我有種不祥的預感,本地做了實驗 結果是 Java的switch如果傳入null值,會拋出 java.lang.NullPointerException 的異常 看下麵的代碼,不要指望會跳到d ...
  • 本文講解瞭如果通過Spring boot來實現前後端的交互,首先演示了傳統的數據交互方式,然後重點講解如何設計一個Restful的API,並通過Spring boot來實現相關的API。 ...
  • 窗外下著小雨,作為單身程式員的我逛著逛著發現一篇好東西,來自知乎 你都用 Python 來做什麼?的第一個高亮答案。 到上面去看了看,地址都是明文的,得,趕緊開始吧。 下載流式文件,requests庫中請求的stream設為True就可以啦,文檔在此。 先找一個視頻地址試驗一下: 遭遇當頭一棒: 這 ...
  • 轉到Java以後發現一個很妖的事情,為啥有些方法後邊有個 throws XXXXException 比如下麵的代碼 這個是.NET沒有的一個語法,受查異常 這是摘自《Java核心技術》的解釋,我感覺很明確了 Java語言規範將派生於Error類和RuntimeException類的所有異常稱為非受查 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...