最近在做自动分派功能,以下是我遇到的一些问题,记录一下。
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