Spring6 對 集成MyBatis 開發運用(附有詳細的操作步驟)

来源:https://www.cnblogs.com/TheMagicalRainbowSea/p/18211700
-Advertisement-
Play Games

1. Spring6 對 集成MyBatis 開發運用(附有詳細的操作步驟) @目錄1. Spring6 對 集成MyBatis 開發運用(附有詳細的操作步驟)每博一文案2. 大概的實現步驟概述3. 詳細實現操作步驟4. Spring配置文件的 import,導入外部xml 配置5. 總結:6. 最 ...


1. Spring6 對 集成MyBatis 開發運用(附有詳細的操作步驟)

@

目錄


每博一文案

理想主義的花
終將盛開在浪漫主義的土壤里
我的熱情
永遠不會熄滅在現實主義的平凡里
我們終將上岸,陽光萬里

2. 大概的實現步驟概述

  1. 第一步:準備資料庫表
  • 使用t_act表(賬戶表)

  1. 第二步:IDEA中創建一個模塊,並引入依賴
      • spring-context
      • spring-jdbc
      • mysql驅動
      • mybatis
      • mybatis-spring:mybatis提供的與spring框架集成的依賴
      • 德魯伊連接池
      • junit
  1. 第三步:基於三層架構實現,所以提前創建好所有的包
      • com.powernode.bank.mapper
      • com.powernode.bank.service
      • com.powernode.bank.service.impl
      • com.powernode.bank.pojo
  1. 第四步:編寫pojo
  • Account,屬性私有化,提供公開的setter getter和toString。

  1. 第五步:編寫mapper介面
  • AccountMapper介面,定義方法

  1. 第六步:編寫mapper配置文件
  • 在配置文件中配置命名空間,以及每一個方法對應的sql。

  1. 第七步:編寫service介面和service介面實現類
      • AccountService
      • AccountServiceImpl
  1. 第八步:編寫jdbc.properties配置文件
  • 資料庫連接池相關信息

  1. 第九步:編寫mybatis-config.xml配置文件
      • 該文件可以沒有,大部分的配置可以轉移到spring配置文件中。
      • 如果遇到mybatis相關的系統級配置,還是需要這個文件。
  1. 第十步:編寫spring.xml配置文件
      • 組件掃描
      • 引入外部的屬性文件
      • 數據源
      • SqlSessionFactoryBean配置
        • 註入mybatis核心配置文件路徑
        • 指定別名包
        • 註入數據源
      • Mapper掃描配置器
        • 指定掃描的包
      • 事務管理器DataSourceTransactionManager
        • 註入數據源
      • 啟用事務註解
        • 註入事務管理器
  1. 第十一步:編寫測試程式,並添加事務,進行測試

3. 詳細實現操作步驟

具體實現內容:我們運用 Spring6 和 MyBatis 實現一個轉賬操作(該轉賬操作,進行一個事務上的控制,運用 MyBatis 執行 SQL 語句)。

  1. 第一步:準備資料庫表
  • 使用t_act表(賬戶表)

連接資料庫的工具有很多,這裡我們可以使用IDEA工具自帶的 DataBase 插件。可以根據下圖提示自行配置:

一般是在 IDEA 的左邊,DataBase

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

如下是 t_act 的表結構

在這裡插入圖片描述

如下是 t_act 的表數據內容:

在這裡插入圖片描述

  1. 第二步:IDEA中創建一個模塊,並引入依賴
      • spring-context
      • spring-jdbc
      • mysql驅動
      • mybatis
      • mybatis-spring:mybatis提供的與spring框架集成的依賴
      • 德魯伊連接池
      • junit

我們先在pom.xml 配置文件當中導入相關的 jar 包信息:

在這裡插入圖片描述

<?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.rainbowsea</groupId>
    <artifactId>spring6-016-mybaits</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>
    <!--倉庫-->
    <repositories>
        <!--spring里程碑版本的倉庫-->
        <repository>
            <id>repository.spring.milestone</id>
            <name>Spring Milestone Repository</name>
            <url>https://repo.spring.io/milestone</url>
        </repository>
    </repositories>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>6.0.0-M2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>6.0.0-M2</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.30</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.11</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.7</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.13</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>
  1. 第三步:基於三層架構實現,所以提前創建好所有的包
      • com.powernode.bank.mapper
      • com.powernode.bank.service
      • com.powernode.bank.service.impl
      • com.powernode.bank.pojo

在這裡插入圖片描述
在這裡插入圖片描述

  1. 第四步:編寫pojo
  • Account,屬性私有化,提供公開的setter getter和toString。

在這裡插入圖片描述

  1. 第五步:編寫mapper介面
  • AccountMapper介面,定義方法

在這裡插入圖片描述

package com.rainbowsea.bank.mapper;

import com.rainbowsea.bank.pojo.Account;

import java.util.List;

// 該介面的實現類不需要寫,是mybatis通過動態代理機制生成的實現類
public interface AccountMapper {

    // 這就是DAO,只要編寫CRUD方法即可

    /**
     * 新增賬戶
     * @param account
     * @return
     */
    int insert(Account account);


    /**
     * 根據賬戶刪除賬戶
     * @param actno
     * @return
     */
    int deleteByActno(String actno);


    /**
     * 根據賬戶更新
     * @param account
     * @return
     */
    int update(Account account);


    /**
     * 根據賬戶查詢賬戶
     * @param actno
     * @return
     */
    Account selectByActno(String actno);


    /**
     * 查詢所有的賬戶
     * @return
     */
    List<Account> selectAll();

}

  1. 第六步:編寫mapper配置文件
  • 在配置文件中配置命名空間,以及每一個方法對應的sql。

一定要註意,按照下圖提示創建這個目錄。註意是 斜杠(因為是創建目錄) 不是點兒。在resources目錄下新建。並且要和Mapper介面包對應上。因為只有這樣,MyBatis 才會進行動態代理這個介面。

同時:如果介面叫做AccountMapper,配置文件必須是 AccountMapper.xml,名稱要保持一致。

總結兩點:就是路徑位置要保持一致,對應的名稱也要保持一致。尾碼名不同。

在這裡插入圖片描述

在這裡插入圖片描述

同時在 AccountMapper.xml 當中編寫 SQL 語句內容。

在這裡插入圖片描述

<?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="com.rainbowsea.bank.mapper.AccountMapper">

    <insert id="insert">
        insert into t_act(actno,balance) values(#{actno}, #{balance})
    </insert>

    <delete id="deleteByActno">
        delete from t_act where actno = #{actno}
    </delete>

    <update id="update">
        update t_act set balance = #{balance} where actno = #{actno}
    </update>

    <select id="selectByActno" resultType="Account">
        select * from t_act where actno = #{actno}
    </select>

    <select id="selectAll" resultType="Account">
        select * from t_act
    </select>
</mapper>
  1. 第七步:編寫service介面和service介面實現類
      • AccountService
      • AccountServiceImpl

編寫 AccountService 業務介面,定義約束,規範,進行一個業務上的轉賬操作。

在這裡插入圖片描述

package com.rainbowsea.bank.service;

import com.rainbowsea.bank.pojo.Account;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;


public interface AccountService {
    /**
     * 開戶
     * @param account
     * @return
     */
    int save(Account account);

    /**
     * 根據賬號銷戶
     * @param actno
     * @return
     */
    int deleteByActno(String actno);

    /**
     * 修改賬戶
     * @param act
     * @return
     */
    int update(Account act);

    /**
     * 根據賬號獲取賬戶
     * @param actno
     * @return
     */
    Account getByActno(String actno);

    /**
     * 獲取所有賬戶
     * @return
     */
    List<Account> getAll();

    /**
     * 轉賬
     * @param fromActno
     * @param toActno
     * @param money
     */
    void transfer(String fromActno, String toActno, double money);
}

註意:要將編寫的service實現類納入IoC容器管理,同時註意需要開啟事務@Transactional

在這裡插入圖片描述

在這裡插入圖片描述

package com.rainbowsea.bank.service.impl;

import com.rainbowsea.bank.mapper.AccountMapper;
import com.rainbowsea.bank.pojo.Account;
import com.rainbowsea.bank.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service(value = "accountServiceImpl")
@Transactional  // 放在類中,下麵的類中的所有方法都開啟了事務
public class AccountServiceImpl implements AccountService {

    // Could not find bean with name 'org.mybatis.spring.SqlSessionFactoryBean#0
    @Autowired // 非簡單類型自動裝配
    private AccountMapper accountMapper;
    @Override
    public int save(Account account) {
        return accountMapper.insert(account);
    }

    @Override
    public int deleteByActno(String actno) {
        return accountMapper.deleteByActno(actno);
    }

    @Override
    public int update(Account act) {
        return accountMapper.update(act);
    }

    @Override
    public Account getByActno(String actno) {
        return accountMapper.selectByActno(actno);
    }

    @Override
    public List<Account> getAll() {
        return accountMapper.selectAll();
    }

    @Override
    public void transfer(String fromActno, String toActno, double money) {
        Account fromAct = accountMapper.selectByActno(fromActno);

        if(fromAct.getBalance() < money) {
            throw new RuntimeException("餘額不足");
        }

        Account toAct = accountMapper.selectByActno(toActno);

        //模擬異常
      /*  String s = null;
        s.toString();
*/
        // 記憶體上修改
        fromAct.setBalance(fromAct.getBalance() - money);
        toAct.setBalance(toAct.getBalance() + money);

        // 資料庫上修改數據內容
        int count = accountMapper.update(fromAct);
        count += accountMapper.update(toAct);

        if(count != 2) {
            throw new RuntimeException("轉賬失敗");
        }


    }
}

  1. 第八步:在 resources 的根路徑下,編寫jdbc.properties配置文件
  • 資料庫連接池相關信息,賬號,密碼,同時註意要加上 jdbc, 同時註意不要加任何的空格,同時是 放在類的根路徑(resources )下

在這裡插入圖片描述

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring6
jdbc.username=root
jdbc.password=MySQL123
  1. 第九步:編寫mybatis-config.xml配置文件
      • 該文件可以沒有,大部分的配置可以轉移到spring配置文件中。
      • 如果遇到mybatis相關的系統級配置,還是需要這個文件。
      • 放在類的根路徑(resources )下,只開啟日誌,其他配置到spring.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>
<!--    幫助我們列印mybatis的日誌信息。sql語句等-->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>

</configuration>
  1. 第十步:編寫spring.xml配置文件
      • 組件掃描
      • 引入外部的屬性文件
      • 數據源
      • SqlSessionFactoryBean配置
        • 註入mybatis核心配置文件路徑
        • 指定別名包
        • 註入數據源
      • Mapper掃描配置器
        • 指定掃描的包
      • 事務管理器DataSourceTransactionManager
        • 註入數據源
      • 啟用事務註解
        • 註入事務管理器
      • 同樣,我們還是將其防止到 類的根路徑下(resources )

註意:當你在spring.xml文件中直接寫標簽內容時,IDEA會自動給你添加命名空間

在這裡插入圖片描述

<?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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/context
                           https://www.springframework.org/schema/context/spring-context.xsd
                           http://www.springframework.org/schema/tx
                           http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!--    組件掃描,-->
    <context:component-scan base-package="com.rainbowsea.bank"></context:component-scan>
    
    <!--    引入外部的屬性配置文件-->

    <context:property-placeholder location="jdbc.properties"></context:property-placeholder>

    <!--    數據源-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${jdbc.driver}"></property>
        <property name="url" value="${jdbc.url}"></property>
        <property name="username" value="${jdbc.username}"></property>
        <property name="password" value="${jdbc.password}"></property>
    </bean>

    <!--    配置SqlSessionFactoryBean  "org.mybatis.spring.SqlSessionFactoryBean"-->
    <bean class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--        註入數據源-->
        <property name="dataSource" ref="dataSource"></property>
        <!--        指定mybatis 核心配置文件-->
        <property name="configLocation" value="mybatis-config.xml"></property>
        <!--        指定別名-->
        <property name="typeAliasesPackage" value="com.rainbowsea.bank.pojo"></property>

    </bean>

    <!--    Mapper 掃描配置器,主要掃描Mapper 介面,生成代理類-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.rainbowsea.bank.mapper"></property>
    </bean>

    <!--    事務管理器-->
    <bean id="txManger" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!--        配置數據源-->
        <property name="dataSource" ref="dataSource"></property>
    </bean>

    <!--    啟用事務註解,事務管理器-->
    <tx:annotation-driven transaction-manager="txManger"></tx:annotation-driven>
</beans>
  1. 第十一步:編寫測試程式,並添加事務,進行測試

在這裡插入圖片描述
)

在這裡插入圖片描述

package com.rainbowsea.spring6.test;

import com.rainbowsea.bank.service.AccountService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringMybatisTest {

    @Test
    public void testSpringMybatis() {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring6.xml");
        // AccountService.class 左右兩邊保持一致性
        AccountService accountService = applicationContext.getBean("accountServiceImpl", AccountService.class);
        try {
            accountService.transfer("act-001","act-002",10000);
            System.out.println("轉賬成功");
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

    }
}

沒有異常,看是否能轉賬成功

在這裡插入圖片描述

模擬異常,看是否,能夠進行正常的事務回滾

在這裡插入圖片描述

運行測試:

在這裡插入圖片描述

在這裡插入圖片描述


4. Spring配置文件的 import,導入外部xml 配置

如果 spring 配置文件有多個,可以在 spring 的核心配置文件中使用 import 進行引入,我們可以將組件掃描單獨定義到一個配置文件中,如下:我們將一個《組件掃描》,定義到一個單獨的名為common.xml的配置文件當中去,並導入,引入到 spring 的配置文件當中使用。如下:

在這裡插入圖片描述

使用<import> 標簽進行一個導入

在這裡插入圖片描述

<!--    在Spring 的核心配置文件中引入其他的子 spring 配置文件-->
    <import resource="common.xml"></import>

把模擬異常去了,測試,是否能夠轉賬成功。如下:

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

註意:在實際開發中,service 單獨配置到一個文件中,dao單獨配置到一個文件中,然後在核心配置文件中引入,養成好習慣。

5. 總結:

  1. Spring6 對集成MyBatis 開發:這裡總的來說是十步,完成的。

  2. 一定要註意,按照下圖提示創建這個目錄。註意是 斜杠(因為是創建目錄) 不是點兒。在resources目錄下新建。並且要和Mapper介面包對應上。因為只有這樣,MyBatis 才會進行動態代理這個介面。

    同時:如果介面叫做AccountMapper,配置文件必須是 AccountMapper.xml,名稱要保持一致。

    總結兩點:就是路徑位置要保持一致,對應的名稱也要保持一致。尾碼名不同。

  3. Spring 當中使用<import> 標簽導入外部xml 配置。

6. 最後:

“在這個最後的篇章中,我要表達我對每一位讀者的感激之情。你們的關註和回覆是我創作的動力源泉,我從你們身上吸取了無盡的靈感與勇氣。我會將你們的鼓勵留在心底,繼續在其他的領域奮鬥。感謝你們,我們總會在某個時刻再次相遇。”

在這裡插入圖片描述


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 應用中的信息傳遞是為了實現各種功能和交互。信息傳遞可以幫助用戶和應用之間進行有效的溝通和交流。通過信息傳遞,應用可以向用戶傳遞重要的消息、通知和提示,以提供及時的反饋和指導。同時,用戶也可以通過信息傳遞嚮應用發送指令、請求和反饋,以實現個性化的需求和操作。 信息傳遞還可以幫助應用之間實現數 ...
  • Symbol 引用 iconfont icon圖標庫 Symbol 引用 這是一種全新的使用方式,應該說這才是未來的主流,也是平臺目前推薦的用法。相關介紹可以參考這篇文章 這種用法其實是做了一個 SVG 的集合,與另外兩種相比具有如下特點: 支持多色圖標了,不再受單色限制。 通過一些技巧,支持像字體 ...
  • XML中的字元串數據類型表示字元序列,包括換行、回車和製表符。處理器不修改值。`normalizedString`去除這些特殊字元,`token`則進一步移除前導和尾隨空格及多餘空格。字元串類型可使用枚舉、長度等限制。`date`和`dateTime`數據類型表示日期和時間,`duration`表示... ...
  • 一、是什麼 HMR全稱 Hot Module Replacement,可以理解為模塊熱替換,指在應用程式運行過程中,替換、添加、刪除模塊,而無需重新刷新整個應用 例如,我們在應用運行過程中修改了某個模塊,通過自動刷新會導致整個應用的整體刷新,那頁面中的狀態信息都會丟失 如果使用的是 HMR,就可以實 ...
  • theme: nico 寫在前面 主頁有更多其他篇章的方法,歡迎訪問查看。 本篇我們介紹radash中對象相關方法的使用和源碼解析。 assign:遞歸合併兩個對象 使用說明 功能說明:類似於 JavaScript 的 Object.assign 方法,用於將 override 對象的屬性和值複製到 ...
  • title: Vue 3 組件基礎與模板語法詳解 date: 2024/5/24 16:31:13 updated: 2024/5/24 16:31:13 categories: 前端開發 tags: Vue3特性 CompositionAPI Teleport Suspense Vue3安裝 組件 ...
  • 貪吃蛇作為一款極其經典且廣受歡迎的小游戲,是早期 Windows 電腦和功能手機(特別是諾基亞手機)流行度極高的小游戲,是當時功能手機時代最具代表性的游戲之一。游戲的基本規則和目標十分簡單,但卻極具吸引力,讓人欲罷不能。本博文我們用 Python 編寫屬於自己的貪吃蛇游戲,一起來體驗一下編程的樂趣與... ...
  • 當開發與Linux環境下MySQL資料庫交互的Java應用程式時,理解MySQL中的大小寫敏感性可以避免潛在的錯誤和問題。本指南深入探討了MySQL中的大小寫敏感設置,比較了5.7和8.0版本,併為Java開發者提供了最佳實踐。 1 理解MySQL中的大小寫敏感性 預設情況下,MySQL在Windo ...
一周排行
    -Advertisement-
    Play Games
  • 一個自定義WPF窗體的解決方案,借鑒了呂毅老師的WPF製作高性能的透明背景的異形視窗一文,併在此基礎上增加了滑鼠穿透的功能。可以使得透明窗體的滑鼠事件穿透到下層,在下層窗體中響應。 ...
  • 在C#中使用RabbitMQ做個簡單的發送郵件小項目 前言 好久沒有做項目了,這次做一個發送郵件的小項目。發郵件是一個比較耗時的操作,之前在我的個人博客裡面回覆評論和友鏈申請是會通過發送郵件來通知對方的,不過當時只是簡單的進行了非同步操作。 那麼這次來使用RabbitMQ去統一發送郵件,我的想法是通過 ...
  • 當你使用Edge等瀏覽器或系統軟體播放媒體時,Windows控制中心就會出現相應的媒體信息以及控制播放的功能,如圖。 SMTC (SystemMediaTransportControls) 是一個Windows App SDK (舊為UWP) 中提供的一個API,用於與系統媒體交互。接入SMTC的好 ...
  • 最近在微軟商店,官方上架了新款Win11風格的WPF版UI框架【WPF Gallery Preview 1.0.0.0】,這款應用引入了前沿的Fluent Design UI設計,為用戶帶來全新的視覺體驗。 ...
  • 1.簡單使用實例 1.1 添加log4net.dll的引用。 在NuGet程式包中搜索log4net並添加,此次我所用版本為2.0.17。如下圖: 1.2 添加配置文件 右鍵項目,添加新建項,搜索選擇應用程式配置文件,命名為log4net.config,步驟如下圖: 1.2.1 log4net.co ...
  • 之前也分享過 Swashbuckle.AspNetCore 的使用,不過版本比較老了,本次演示用的示例版本為 .net core 8.0,從安裝使用開始,到根據命名空間分組顯示,十分的有用 ...
  • 在 Visual Studio 中,至少可以創建三種不同類型的類庫: 類庫(.NET Framework) 類庫(.NET 標準) 類庫 (.NET Core) 雖然第一種是我們多年來一直在使用的,但一直感到困惑的一個主要問題是何時使用 .NET Standard 和 .NET Core 類庫類型。 ...
  • WPF的按鈕提供了Template模板,可以通過修改Template模板中的內容對按鈕的樣式進行自定義。結合資源字典,可以將自定義資源在xaml視窗、自定義控制項或者整個App當中調用 ...
  • 實現了一個支持長短按得按鈕組件,單擊可以觸發Click事件,長按可以觸發LongPressed事件,長按鬆開時觸發LongClick事件。還可以和自定義外觀相結合,實現自定義的按鈕外形。 ...
  • 一、WTM是什麼 WalkingTec.Mvvm框架(簡稱WTM)最早開發與2013年,基於Asp.net MVC3 和 最早的Entity Framework, 當初主要是為瞭解決公司內部開發效率低,代碼風格不統一的問題。2017年9月,將代碼移植到了.Net Core上,併進行了深度優化和重構, ...