MySQL數據類型及MyBatis在事務中獲取主鍵ID

最近在做自動分派功能,以下是我遇到的一些問題,記錄一下。

MySQL的數據類型

在該功能中需要涉及到幾張表,但是數據類型需要確定,然而看到的種類太多了QVQ,不知所措,所以我介紹一下MYSQL的一些數據類型。

數據類型 存儲空間 範圍
bigint 8 個字節 從-2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型數據(所有數字)
int 4 個字節 從 -2^31 (-2,147,483,648) 到 2^31 - 1 (2,147,483,647) 的整型數據(所有數字)
smallint 2 個字節 從 -2^15 (-32,768) 到 2^15 - 1 (32,767) 的整型數據
tinyint 1 字節 從 0 到 255 的整型數據

在這裏插入圖片描述
可以看到數據類型可以指定它是否爲無符號類型。如果是無符號類型。tinyint範圍就是-128到127。
如果指定了數據類型的長度。例如:指定了 int 型數值顯示的寬度,如果字段數據類型是 int(4),則:當顯示數值 10 時,在左邊要補上 “00”;當顯示數值 100 是,在左邊要補上“0”;當顯示數值 1000000 時,已經超過了指定寬度“(4)”,因此按原樣輸出。和數字位數也無關係 int(3)、int(4)、int(8) 在磁盤上都是佔用 4 btyes 的存儲空間。

MyBatis開啓事務後如何獲取插入後的主鍵ID

   <!-- 配置數據源 -->
	<bean id="dataSource"
		class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
		<property name="url" value="jdbc:mysql://localhost:3306/test"></property>
		<property name="username" value="yy"></property>
		<property name="password" value="yx"></property>
	</bean>
	
	<!--定義事務管理器(聲明式的事務) -->
	<bean id="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
 
	<!-- 開啓事務註解@Transactional支持 -->
	<tx:annotation-driven transaction-manager="transactionManager" />

當然我們也可以直接編程式直接使用DataSourceTransactionManager。

如何獲取主鍵ID呢?

<insert id="saveDistributionRule" parameterType="com.jd.pop.vender.settled.shop.apply.adminseller.domain.DistributionRule" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO distribution_rule (
        id               ,
        category_id      ,
        assessment_type  ,
        brand_status     ,
        pin              ,
        status           ,
        created          ,
        modified
        ) VALUES (
        #{id}            ,
        #{categoryId}    ,
        #{assessmentType},
        #{brandStatus}   ,
        #{pin}           ,
        #{status}        ,
        now()            ,
        now()
        )
    </insert>

加上useGeneratedKeys=“true”,並讓keyProperty等於你的對象主鍵ID,那麼在調用方法後,Mybatis會將自增id值放到對象所對應得那個屬性中。

原理(個人猜測):
首先網上百度到的

innodb的auto_increament的計數器記錄的當前值是保存在存內 存中的,並不是存在於磁盤上,當mysql
server處於運行的時候,這個計數值只會隨着insert改增長,不會隨着delete而減少。

在執行mapper方法時,Mybatis會直接去從自增計數器裏頭去數讓後讓自增計數器++,並塞到我們的參數對象中。在測試時,開啓事務後,執行insert方法,然後拋出uncheck異常,發現每次插入自增id都在增加,即使沒有插入成功。所以我認爲是先從MySQL去取自增值的。

MySQL獲取前幾個小時數據

自動派單中,需要定時去跑一個任務,這個任務需要獲取當前時間前2個小時的單子,來進行處理。(不同時間獲取的不同小時的單子,反正和獲取前2小時單子類似)
可以先看下W3C MySQL手冊
Date函數
在這裏插入圖片描述
爲了獲取以小時爲單位的單子,那麼我們需要使用NOW函數。
可以從圖上看到DATE_SUB()函數作用:從日期減去指定的時間間隔。
DATE_SUB()函數語法:

DATE_SUB(date,INTERVAL expr type)

date參數爲我們的NOW函數,type可以爲年、月、日、時等。
測試一下
在這裏插入圖片描述
獲取前18個小時的數據(當前時間爲11點,昨天17點有一條,則間隔爲18小時,如果圖中18改爲17則查不出來)
在這裏插入圖片描述

參考文章
https://blog.csdn.net/shuke_zheng/article/details/78979343

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章