MySQL数据类型及MyBatis在事务中获取主键ID

最近在做自动分派功能,以下是我遇到的一些问题,记录一下。

MySQL的数据类型

在该功能中需要涉及到几张表,但是数据类型需要确定,然而看到的种类太多了QVQ,不知所措,所以我介绍一下MYSQL的一些数据类型。

数据类型存储空间范围
bigint8 个字节从-2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据(所有数字)
int4 个字节从 -2^31 (-2,147,483,648) 到 2^31 - 1 (2,147,483,647) 的整型数据(所有数字)
smallint2 个字节从 -2^15 (-32,768) 到 2^15 - 1 (32,767) 的整型数据
tinyint1 字节从 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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值