Mybatis源碼剖析---第一講

Mybatis源碼剖析

基礎環境搭建
  1. JDK8
    在這里插入圖片描述

  2. Maven3.6.3(別的版本也可以…)
    在這里插入圖片描述

  3. MySQL 8.0.28 --> MySQL 8
    在這里插入圖片描述

  4. Mybatis 3.4.6
    在這里插入圖片描述

  5. 準備jar,準備數據庫數據
    把依賴導入pom.xml

    <properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target></properties><dependencies><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency><!--   <dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.6</version></dependency>--><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.8.1</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.5</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.6</version></dependency><!--<dependency><groupId>org.javassist</groupId><artifactId>javassist</artifactId><version>3.27.0-GA</version></dependency><dependency><groupId>ognl</groupId><artifactId>ognl</artifactId><version>3.2.18</version></dependency>--><dependency><groupId>org.mybatis.caches</groupId><artifactId>mybatis-ehcache</artifactId><version>1.0.3</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.25</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.25</version></dependency><dependency><groupId>org.mybatis.caches</groupId><artifactId>mybatis-redis</artifactId><version>1.0.0-beta2</version></dependency><dependency><groupId>com.github.jsqlparser</groupId><artifactId>jsqlparser</artifactId><version>3.1</version></dependency></dependencies><build></build>

數據庫中放置倆張表

CREATE TABLE `t_user` (`id` int DEFAULT NULL,`name` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

往里面加入數據
在這里插入圖片描述

CREATE TABLE `t_account` (`id` int DEFAULT NULL,`accountNo` varchar(255) DEFAULT NULL,`balance` double DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

往里面加入數據
在這里插入圖片描述
2. 準備配置文件
a. 基本配置文件 mybatis-config.xml

  1. 數據源的設置 environments
  2. 類型別名
  3. mapper文件的注冊
<?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><!-- <settings><setting name="cacheEnabled" value="true"/></settings>--><typeAliases><typeAlias type="com.baizhiedu.entity.User" alias="User"/><typeAlias type="com.baizhiedu.entity.Account" alias="Account"/></typeAliases><!--    <plugins>-->
<!--        &lt;!&ndash;<plugin interceptor="com.baizhiedu.plugins.MyMybatisInterceptor">-->
<!--            <property name="test" value="111111"/>-->
<!--        </plugin>&ndash;&gt;-->
<!--        &lt;!&ndash;<plugin interceptor="com.baizhiedu.plugins.MyMybatisInterceptor2"/>&ndash;&gt;-->
<!--        &lt;!&ndash;<plugin interceptor="com.baizhiedu.plugins.MyMybatisInterceptor3"/>&ndash;&gt;-->
<!--      &lt;!&ndash;  <plugin interceptor="com.baizhiedu.plugins.PageHelperInterceptor1">-->
<!--            <property name="queryMethodPrefix" value="query"/>-->
<!--            <property name="queryMethodSuffix" value="ByPage"/>-->
<!--        </plugin>&ndash;&gt;-->
<!--&lt;!&ndash;        <plugin interceptor="com.baizhiedu.plugins.LockInterceptor"/>&ndash;&gt;-->
<!--    </plugins>--><environments default="default"><environment id="default"><transactionManager type="JDBC"></transactionManager><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"></property><property name="url" value="jdbc:mysql://localhost:3306/suns?useSSL=false"></property><property name="username" value="root"></property><property name="password" value="123xxx"></property></dataSource></environment><!--    <environment id="oracle"><transactionManager type="JDBC"></transactionManager><dataSource type="POOLED"><property name="driver" value="oracle.jdbc.OracleDriver"></property><property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"></property><property name="username" value="hr"/><property name="password" value="hr"/></dataSource></environment>--></environments><mappers><!--<package name=""--><mapper resource="UserDAOMapper.xml"/><mapper resource="AccountDAOMapper.xml"/></mappers></configuration>

-默認IDEA配置,MySQL環境搭建大家都懂,略過,不會的可以關注私聊評論-

Mybatis回顧

1. Mybatis做什么?

Mybatis是一個ORM類型框架,解決的數據庫訪問和操作的問題,對現有JDBC技術的封裝。

2. 核心代碼分析

首先看看項目結構
在這里插入圖片描述
interface

public interface AccountDAO {public void save(Account account);
}
public interface UserDAO {//public void save(User user); //SqlSession.insert()public void save(User user);public List<User> queryAllUsersByPage();//SqlSesson.select()public User queryUserById(@Param("id") Integer id);public void update(User user);}

entity

package com.baizhiedu.entity;import java.io.Serializable;public class Account implements Serializable {private Integer id;private String accountNo;private double balance;public Account() {System.out.println("---------account----------");}public Account(Integer id, String accountNo, double balance) {this.id = id;this.accountNo = accountNo;this.balance = balance;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getAccountNo() {return accountNo;}public void setAccountNo(String accountNo) {this.accountNo = accountNo;}public double getBalance() {return balance;}public void setBalance(double balance) {this.balance = balance;}@Overridepublic String toString() {return "Account{" +"id=" + id +", accountNo='" + accountNo + '\'' +", balance=" + balance +'}';}
}
package com.baizhiedu.entity;import java.io.Serializable;public class User implements Serializable {private Integer id;private String name;private Integer version;public User() {
}public User(Integer id, String name) {this.id = id;this.name = name;}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 Integer getVersion() {return version;}public void setVersion(Integer version) {this.version = version;}@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +'}';}
}

現在讓我們測試一下是否可以查到數據

import com.baizhiedu.dao.UserDAO;
import com.baizhiedu.entity.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;import java.io.IOException;
import java.io.InputStream;public class TestMybatis {// 方式一@Testpublic void test1() throws IOException {InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();UserDAO userDAO = sqlSession.getMapper(UserDAO.class);User user = userDAO.queryUserById(4);System.out.println(user);}// 方式二@Testpublic void test2() throws IOException {InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();// UserDAO userDAO = sqlSession.getMapper(UserDAO.class);// User user = userDAO.queryUserById(4);//System.out.println( "類型是" + sqlSession.selectOne("com.baizhiedu.dao.UserDAO.queryUserById", 4).getClass());User user = (User)sqlSession.selectOne("com.baizhiedu.dao.UserDAO.queryUserById", 4);System.out.println(user);}}

在這里插入圖片描述
測試類中,哪一種方法好?

功能 :兩種方式功能等價
實現效果: 都有耦合性,更改sql字段,倆者都需要更改
那種方式好:第一種方式好 表達概念更清晰 ,第一種封裝定義類型,第二種字符串不能表示類型,就好比 String name = "張三"new User().getName()第一個可以表示人,也可以表示狗,但第二個表示人清晰可見
第一種開發,本質上就是對第二種開發的封裝。(代理設計模式)后續再聊

Mybatis核心對象

大家先看這張圖有個印像

對于我們來講。我們在對mybatis進行定義或者進行初步接觸的過程當中,我們一直且反復都在強調的一個概念是什么呢?就是mybatis
它是一個JDBC的封裝。它是通過什么來進行的封裝?它是通過sqlsession這個對象。來進行的封裝。那封裝的是什么呢?那既然封裝的是JDBC,那JDBC無外乎也就會涉及到這么幾個核心的類型,一個是connection。一個是statement,一個是resultset。所以在這塊兒呢,我們自然而然的就會得到這樣一個信息,就是mybits這個框架。

通過sqlsession封裝了JDBC。那封裝了JDBC的連接connection。封裝了statement,當然這個statement就包括我們所說的三種statement,一種是最普通的statement。一種是預編譯statement,一種是coablestatement,而coablestatement,它主要應用在哪呢?主要應用在存儲過程層面上。那通過這些statement與我們的數據庫進行交互,最后它的結果由result進行封裝,進而返回給我。所以circlesession它實際上應該封裝的是這些東西。那這是我們最初在接觸mybatis的時候,
給大家的一個最最基本的概念。但是如果我們仔細分析的話,你就會發現,作為mybatis來講,它其實不僅僅包括sqlsession。它還包括什么呢?它還包括sqlsession。前面的什么?他的父親,也就是他的工廠。sqlsessionfactory.它還包括什么?還包括mybatis-config.xml以及我們的mapper.xml這些東西。所以你如果僅認為它封裝了JDBC進行使用的話,那實際上理解上是沒有問題的。但是細節有很多的偏差。那它至少要包括的是四個環節。sqlsession封裝了JDBC的使用。而它還提供了sqlsession factory來創建sqlsession。那還需要我們在配置文件當中去書寫相關的配置,進而最終由sqlsession幫我們基于mapper文件。生成dao。哎,那么這一套東西才構成了mybatis,所以顯然我們曾經的分析是不到位的,是不透徹的。是有問題的。

它實際上是有兩大類核心對象的一類,我們叫做數據存儲類對象。一類我們叫做的是操作類型的對象。哎,這是整個mybatis的兩塊兒內容。那什么是數據存儲類的對象呢?它的概念是什么呢?它最為核心的概念就是在JAVA中。或者說,在虛擬機當中。對。mybatis.相關的配置信息。進行封裝。因為我們知道文件,它存了很多東西。它存了很多配置的內容,我們不可能用點兒就讀一次文件,用點兒就讀一次文件,因為什么呢?因為它會頻繁產生IO。而你要知道,作為IO來講,它是操作系統層面上的資源,它的一個創建絕不是虛擬機單獨來完成的。它一定是要虛擬機來與操作系統進行交互和交流來完成的。所以注定IO在我們的開發過程當中一定是越少越好,能復用最好。那所以我們說這些mybatis的相關的配置信息,它不可能是隨用隨讀的,它一定是一次性讀取。進而封裝在JAVA的對象當中。這是火星。能聽得明白我的意思嗎?好,那這就涉及到了兩個問題了,哪兩個問題呢?第一個問題就是它的配置信息要封裝對象,它有幾種配置信息呢?兩種一種,剛才我們說過了,叫做mybatis-config.xml,另外一種,我們叫做xxxdaomapper.xml。
由這兩個。那這兩種信息最終都要進行JAVA的封裝,那么這個mybatis-config.xml封裝成了什么呢?封裝成了一個叫做configuration的對象。那換句話說,我們可以認為configuration對象。它封裝的就是mybatis相關的內容呃。而這個xxxDaomapper.xml,它對應的是怎么進行的封裝呢?它對應的是一個叫做mappedstatement。對象的風格。當然這塊兒僅僅是一個形象上的認知。呃,那不準確。后面呢,我們還會再剖析。那所以呢,首先第一個層面上,我們就要去驗證,什么驗證我們所說的。這個configuration這個類是對mybatis.config.xml的封裝。那怎么來驗證呢?
在這里插入圖片描述

在這里插入圖片描述
這個是開啟二級緩存,我們后續會繼續剖析
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

1. 數據存儲類對象概念:在Java中(JVM)對Mybatis相關的配置信息進行封裝mybatis-config.xml ----> ConfigurationConfiguration 1. 封裝了mybatis-config.xml2. 封裝了mapper 文件  MappedStatement3. 創建Mybatis其他相關的對象 XXXDAOMapper.xml ----> MappedStatement(形象的認知,不準確)操nt對象 對應的就是 Mapper文件中的一個一個的 配置標簽 <select id. -----> MappedStatement<insert id. -----> MappedStatement 注定 一個Mybatis應用中 N個MappedStament 對象 MappedStatment ---> Configuration MappedStatment 中 封裝SQL語句 ---> BoundSql
2. 操作類對象 (SqlSession) ---> 門面 ExcutorExcutor 是Mybatis中處理功能的核心1. 增刪改update  查query2. 事務操作 提交 回滾3. 緩存相關的操作Excutor接口 (適配器模式) 操作相關都要設計成接口BatchExcutorJDBC中批處理的操作, BatchExcutor ReuseExcutor目的:復用 Statement (需要sql一樣)insert into t_user(ID,name)values(1,‘孫帥’);insert into t_user(ID,name)values(2,‘孫帥1’);SimpleExcutor常用Excutor Mybatis推薦 默認 Configuration protected ExecutorType defaultExecutorType = ExecutorType.SIMPLE;StatmentHandlerStatementHandler是Mybatis封裝了JDBC Statement,真正Mybatis進行數據庫訪問操作的核心功能:增刪改差StatementHandler接口SimpleStatementHandlerJDBC 操作 PreparedStatementHandlerCallableStatementHandler ParameterHandler目的:Mybatis參數 ---》 JDBC 相關的參數 @Param ---> #{} --- > ?ResultSetHandler目的:對JDBC中查詢結果集 ResultSet 進行封裝 TypeHandlerJava程序操作 數據庫Java類型   數據庫類型String    varcharint       numberint       int excutor和statementhandler都用到了適配器模式


在這里插入圖片描述

在這里插入圖片描述
在configuration里面,它是不是專門有這么一個內容?是來存所有的mappedstatement的。也就是configuration是可以找到誰的。是可以找到所有的mappedstatement的。那同樣按照我們剛才所關注的mappedstatement里面是不是也存了configuration啊?那也就是mappedstatement是不是也可以找到對應的configuration,因為configuration只是一個,所以它就存了一個,所以它們兩個人的關系是什么是?是雙向的關聯關系,你中有我,我中有你,我既可以通過configuration找到所有的mappedstatement。

那么當然,我也可以通過mappedstatement找到對應的configuration,這樣的話它會方便后續mybatis內部在運行的過程當中。可以去解決一些核心的問題。所以。在這兒你一定要注意,它封裝的是這些標簽,那這些標簽\的內容是和mybatis的mappedstatement一一對應的,而且哎。在一個mybatis應用當中,它可以有n個mappedstatement,并且mappedstatement.它是可以找到什么呢?
可以找到configuration。這樣我們就把mybatis當中所涉及到的所有的配置文件的數據通過。這兩個類型徹底都封裝完成了。那換句話說,日后你想要這些相關的內容,比如說mybatis-config.xml,想要所有的mappedstatement。和其他相關的對象,你用configuration就可以了,你要想獲得某一個具體的標簽,它相關的內容你是不是有map pedstatement對象就夠了?而且他們彼此是可以互相找到對方的,那你在編程的時候靈活度就更高了。這就是我們所說的在mybatis核心對象當中的第一類對象數據存儲類對象。那這也就是在整個我的這張圖里面。這塊的內容。任何一個mybatis應用都有configuration和n個mappedstatement,而每一個mappedstatement,它對應的就是一個一個的標簽至此,核心對象數據存儲這塊的內容,我就給大家分析完了。當然,這塊還是死的。就是比如說什么時候創建configuration?什么時候創建mappedstatement以及這些數據和mybatis核心的功能,它該怎么交互啊?這都是我們后續要講解的內容。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/15008.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/15008.shtml
英文地址,請注明出處:http://en.pswp.cn/web/15008.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux學習筆記:線程

Linux中的線程 什么是線程線程的使用原生線程庫創建線程線程的id線程退出等待線程join分離線程取消一個線程線程的局部存儲在c程序中使用線程使用c自己封裝一個簡易的線程庫 線程互斥(多線程)導致共享數據出錯的原因互斥鎖關鍵函數pthread_mutex_t :創建一個鎖pthread_mutex_in…

雷電預警監控系統:守護安全的重要防線

TH-LD1在自然界中&#xff0c;雷電是一種常見而強大的自然現象。它既有震撼人心的壯觀景象&#xff0c;又潛藏著巨大的安全風險。為了有效應對雷電帶來的威脅&#xff0c;雷電預警監控系統應運而生&#xff0c;成為現代社會中不可或缺的安全防護工具。 雷電預警監控系統的基本…

makefile 編寫規則

1.概念 1.1 什么是makefile Makefile 是一種文本文件&#xff0c;用于描述軟件項目的構建規則和依賴關系&#xff0c;通常用于自動化軟件構建過程。它包含了一系列規則和指令&#xff0c;告訴構建系統如何編譯和鏈接源代碼文件以生成最終的可執行文件、庫文件或者其他目標文件…

Node.js知識點以及案例總結

思考&#xff1a;為什么JavaScript可以在瀏覽器中被執行 每個瀏覽器都有JS解析引擎&#xff0c;不同的瀏覽器使用不同的JavaScript解析引擎&#xff0c;待執行的js代碼會在js解析引擎下執行 為什么JavaScript可以操作DOM和BOM 每個瀏覽器都內置了DOM、BOM這樣的API函數&#xf…

開源模型應用落地-食用指南-以最小成本博最大收獲

一、背景 時間飛逝&#xff0c;我首次撰寫的“開源大語言模型-實際應用落地”專欄已經完成了一半以上的內容。由衷感謝各位朋友的支持,希望這些內容能給正在學習的朋友們帶來一些幫助。 在這里&#xff0c;我想分享一下創作這個專欄的初心以及如何有效的&#xff0c;循序漸進的…

STM32F103C8T6 HC-SR04超聲波模塊——超聲波障礙物測距(HAl庫)

超聲波障礙物測距 一、HC-SR04超聲波模塊&#xff08;一&#xff09;什么是HC-SR04&#xff1f;&#xff08;二&#xff09;HC-SR04工作原理&#xff08;三&#xff09;如何使用HC-SR04&#xff08;四&#xff09;注意事項 二、程序編寫&#xff08;一&#xff09;CubeMX配置1.…

2024全新Langchain大模型AI應用與多智能體實戰開發

2024全新Langchain大模型AI應用與多智能體實戰開發 LangChain 就是一個 LLM 編程框架&#xff0c;你想開發一個基于 LLM 應用&#xff0c;需要什么組件它都有&#xff0c;直接使用就行&#xff1b;甚至針對常規的應用流程&#xff0c;它利用鏈(LangChain中Chain的由來)這個概念…

Facebook之魅:數字社交的體驗

在當今數字化時代&#xff0c;Facebook作為全球最大的社交平臺之一&#xff0c;承載著數十億用戶的社交需求和期待。它不僅僅是一個簡單的網站或應用程序&#xff0c;更是一個將世界各地的人們連接在一起的社交網絡&#xff0c;為用戶提供了豐富多彩、無與倫比的數字社交體驗。…

C++實現基礎二叉搜索樹(并不是AVL和紅黑樹)

本次實現的二叉搜索樹并不是AVL數和紅黑樹&#xff0c;只是了解流程和細節。 目錄 二叉搜索樹的概念K模型二叉搜索樹的實現二叉搜索樹的架構insert插入find 查找中序遍歷Inorder刪除earse替換法的思路情況一 &#xff1a;假如要刪除節點左邊是空的。在左邊時在右邊時 情況二&a…

文心智能體,零代碼構建情感表達大師智能體

前言 隨著智能體技術的突飛猛進&#xff0c;各行各業正迎來前所未有的變革與機遇。智能體&#xff0c;作為人工智能領域的重要分支&#xff0c;以其自主性、智能性和適應性&#xff0c;正逐步滲透到我們生活的每一個角落&#xff0c;成為推動社會進步和科技發展的新動力。 為了…

軟考 系統架構設計師系列知識點之雜項集萃(20)

接前一篇文章&#xff1a;軟考 系統架構設計師系列知識點之雜項集萃&#xff08;19&#xff09; 第28題 在單元測試中&#xff0c;&#xff08; &#xff09;。 A. 驅動模塊用來調用被測模塊&#xff0c;自頂向下的單元測試中不需要另外需要編寫驅動模塊 B. 樁模塊用來模擬被…

visual studio 2022 ssh 主機密鑰算法失敗問題解決

 Solution - aengusjiang 問題&#xff1a; I follow the document, then check sshd_config, uncomment“HostKey /etc/ssh/ssh_host_ecdsa_key” maybe need add the key algorithms: #HostKeyAlgorithms ssh-ed25519[Redacted][Redacted]rsa-sha2-256,rsa-sha2-512 Ho…

Redis常用命令——String篇

前面我們講解了一些 Redis 的全局命令&#xff08;Redis常用基本全局命令&#xff09;。所謂全局命令&#xff0c;就是可以匹配任意一個數據結構進行使用。但是不同的數據結構&#xff0c;也有自己的操作命令。本篇文章主要講解的是 String 的操作命令&#xff0c;希望會對你有…

ClickHouse課件

列式存儲數據庫&#xff1a;hbase clickhouse 簡介 ClickHouse入門 ClickHouse是俄羅斯的Yandex于2016年開源的列式存儲數據庫&#xff08;DBMS&#xff09;&#xff0c;使用C語言編寫&#xff0c;主要用于在線分析處理查詢&#xff08;OLAP&#xff09;&#xff0c;能夠使用…

2024年電工杯B題論文首發+問題一論文代碼分享

問題一論文代碼鏈接&#xff1a;https://pan.baidu.com/s/1kDV0DgSK3E4dv8Y6x7LExA 提取碼&#xff1a;sxjm --來自百度網盤超級會員V5的分享 基于數據分析的大學生平衡膳食食譜的優化設計及評價 摘要 大學時期不僅是學術學習和身體成長的關鍵階段&#xff0c;更是青年學生…

supermind讀寫自選股的功能來了

python custom_sector() # 返回所有板塊的dataframecustom_sector(板塊1) # 返回 板塊1 的屬性和股票custom_sector(板塊1, append, [000001.SZ]) # 增加板塊1的股票列表custom_sector(板塊1, pop, [000001.SZ]) # 移除板塊1的股票custom_sector(板塊1, remove) # 刪除板塊1zxg…

Hsql每日一題 | day03

前言 就一直向前走吧&#xff0c;沿途的花終將綻放~ 題目&#xff1a;打折日期交叉問題 如下為平臺商品促銷數據&#xff1a;字段為品牌&#xff0c;打折開始日期&#xff0c;打折結束日期 brand stt edt oppo,2021-06-05,2021-06-09 oppo,2021-06-11,2021-06-21 vivo,…

Java中流的概念細分

按流的方向分類&#xff1a; 輸入流&#xff1a;數據流向是數據源到程序&#xff08;以InputStream、Reader結尾的流&#xff09;。 輸出流&#xff1a;數據流向是程序到目的地&#xff08;以OutputStream、Writer結尾的流&#xff09;。 按處理的數據單元分類&#xff1a; 字…

PVE 虛擬機環境下刪除 local-lvm分區

1、刪除邏輯卷 lvremote pve/data 2、擴展邏輯卷 lvextend -l 100%FREE -r pve/root 3、 修改存儲目錄內容 點擊 Datacenter - Storage &#xff08;1&#xff09;刪除local-lvm分區 &#xff08;2&#xff09;編輯local分區&#xff0c;在內容一項中勾選所有可選項。

mysql 兩個不同字段的表導入數據

下面這個場景就是A表的字段和B表的字段不一樣&#xff0c;但是現在我想把b表中的數據導入到A表里面&#xff0c;下面是導入公式如下&#xff1a; 語法&#xff1a; 將SYS_ORG表中的數據導入到sys_depart&#xff0c;但是這兩個表的字段不一樣&#xff0c;在()里面填寫要新增數據…