最近在做自動分派功能,以下是我遇到的一些問題,記錄一下。
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