值 |
描述 |
个人看法 |
AUTO |
数据库ID自增 |
一般情况下足矣 |
NONE |
无状态,该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT) |
很少使用 |
INPUT |
insert前自行set主键值 |
看公司需求 |
ASSIGN_ID |
分配ID(主键类型为Number(Long和Integer)或String)(since 3.3.0),使用接口IdentifierGenerator的方法nextId(默认实现类为DefaultIdentifierGenerator雪花算法) |
比下面的好 |
ASSIGN_UUID |
分配UUID,主键类型为String(since 3.3.0),使用接口IdentifierGenerator的方法nextUUID(默认default方法) |
生成32位的uuid |
UUID 性能非常高:本地生成,没有网络消耗,如果只考虑唯一性 UUID 是好的。
入数据库的性能较差。
无序。
无法预测他的生成顺序,不能生成递增有序的数字。首先分布式 id 一般都会作为主键, UUID太长,占用存储空间比较大,如果是海量数据库,就需要考虑存储量的问题。
UUID 往往是使用字符串存储,查询的效率比较低。传输数据量大,且不可读 。
索引,B+ 树索引的分裂。
既然分布式 id 是主键,主键是包含索引的,然后 mysql 的索引是通过 b+ 树来实现的,,因为 UUID 数据是无序的,每一次新的 UUID 数据的插入,为了查询的优化,都会对索引"底层的B+树进行修改,这一点不好。插入完全无序,不但会导致一些中间节点产生分裂,也会白白创造出很多不饱和的节点,这样大大降低了数据库插入的性能。
MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法)
@TableId(type = IdType.ASSIGN_ID)
private String id;
雪花算法:分布式 ID 生成器
雪花算法是由 Twitter 公布的分布式主键生成算法,它能够保证不同表的主键的不重复性,以及相同表的主键的有序性。
核心思想:
长度共64bit(一个long型)。
首先是一个符号位,1bit标识,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0。
41bit时间截(毫秒级),存储的是时间截的差值(当前时间截 - 开始时间截),结果约等于69.73年。
10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID,可以部署在1024个节点)。
12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID)。
毫秒数在高位,自增序列在低位,整个 ID 都是趋势递增的。整体上按照时间自增排序,并且整个分布式系统内不会产生 ID 碰撞,并且效率较高。
不依赖数据库等第三方系统,以服务的方式部署,稳定性更高,生成 ID 的性能也是非常高的。可以根据自身业务特性分配 bit 位,非常灵活。
依赖机器时钟,如果机器时钟回拨,会导致重复 ID 生成。
可能在单机上是递增的,但是由于涉及到分布式环境,每台机器上的时钟不可能完全同步,有时候会出现不是全局递增的情况(此缺点可以忽略,,一般分布式ID只要求趋势递增,并不会严格要求递增,90% 的需求都只要求趋势递增 )。
@Data
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private String email;
}
// 添加
@Test
public void testAdd() {
User user = new User();
user.setName("auto");
user.setAge(20);
user.setEmail("[email protected]");
int insert = userMapper.insert(user);
System.out.println(insert);
}
测试结果如下
mysql> select * from user;
+----+--------+------+--------------------+
| id | NAME | age | email |
+----+--------+------+--------------------+
| 0 | auto | 20 | [email protected] |
| 1 | Jone | 18 | [email protected] |
| 2 | Jack | 20 | [email protected] |
| 3 | Tom | 28 | [email protected] |
| 4 | Sandy | 21 | [email protected] |
| 5 | Billie | 24 | [email protected] |
+----+--------+------+--------------------+
6 rows in set (0.01 sec)
# 从默认值开始递增
a 当数据库和 Long 兼容
@Data
public class User {
// 当数据库和 Long 兼容
@TableId(type = IdType.ASSIGN_ID)
private Long id;
private String name;
private Integer age;
private String email;
}
// 添加
@Test
public void testAdd() {
User user = new User();
user.setName("ASSIGN_ID");
user.setAge(20);
user.setEmail("[email protected]");
int insert = userMapper.insert(user);
System.out.println(insert);
}
测试结果
mysql> select * from user;
+---------------------+-----------+------+--------------------+
| id | NAME | age | email |
+---------------------+-----------+------+--------------------+
| 0 | auto | 20 | [email protected] |
| 1 | Jone | 18 | [email protected] |
| 2 | Jack | 20 | [email protected] |
| 3 | Tom | 28 | [email protected] |
| 4 | Sandy | 21 | [email protected] |
| 5 | Billie | 24 | [email protected] |
| 1443154676764585985 | ASSIGN_ID | 20 | [email protected] |
+---------------------+-----------+------+--------------------+
7 rows in set (0.00 sec)
# 一共19位
b 当数据库和 String 兼容
@Data
public class User {
@TableId(type = IdType.ASSIGN_ID)
private String id;
private String name;
private Integer age;
private String email;
}
// 添加
@Test
public void testAdd() {
User user = new User();
user.setName("ASSIGN_ID");
user.setAge(20);
user.setEmail("[email protected]");
int insert = userMapper.insert(user);
System.out.println(insert);
}
测试结果
mysql> select * from user;
+---------------------+-----------+------+--------------------+
| id | NAME | age | email |
+---------------------+-----------+------+--------------------+
| 0 | auto | 20 | 1243@qq.com |
| 1 | Jone | 18 | [email protected] |
| 1443158688033337346 | ASSIGN_ID | 20 | [email protected] |
| 2 | Jack | 20 | [email protected] |
| 3 | Tom | 28 | [email protected] |
| 4 | Sandy | 21 | [email protected] |
| 5 | Billie | 24 | [email protected] |
+---------------------+-----------+------+--------------------+
7 rows in set (0.00 sec)
# 一共19位
@Data
public class User {
// 数据库必须和 String 兼容
@TableId(type = IdType.ASSIGN_UUID)
private String id;
private String name;
private Integer age;
private String email;
}
// 添加
@Test
public void testAdd() {
User user = new User();
user.setName("ASSIGN_UUID");
user.setAge(20);
user.setEmail("[email protected]");
int insert = userMapper.insert(user);
System.out.println(insert);
}
测试结果
mysql> select * from user;
+----------------------------------+-------------+------+--------------------+
| id | NAME | age | email |
+----------------------------------+-------------+------+--------------------+
| 0 | auto | 20 | [email protected] |
| 1 | Jone | 18 | [email protected] |
| 1443154676764585985 | ASSIGN_ID | 20 | [email protected] |
| 2 | Jack | 20 | [email protected] |
| 2e3f39b3f7328995f4cfbe73f67c5ae7 | ASSIGN_UUID | 20 | [email protected] |
| 3 | Tom | 28 | [email protected] |
| 4 | Sandy | 21 | [email protected] |
| 5 | Billie | 24 | [email protected] |
+----------------------------------+-------------+------+--------------------+
8 rows in set (0.00 sec)
# 一共32位
struts2中的参数封装静态参数封装什么是静态参数? 静态参数就是硬编码的,不可随意改变。 例子: 我们首先创建一个Action类,里面有两个参数,用来封装请求参数 public class User extends ActionSupport { private String username; //用户名
Responsive Web Design 响应式网页设计1、常见的布局方案固定布局:以像素作为页面的基本单位,不管设备屏幕及浏览器宽度,只设计一套尺寸;可切换的固定布局:同样以像素作为页面单位,参考主流设备尺寸,设计几套不同宽度的布局。通过识别的屏幕尺寸或浏览器宽度,选择最合适的那套宽度布局;弹性布局:以百分比作为页面的基本单位,可以适应一定范围内所有尺寸的设备屏幕及浏览器宽度,...
ABP提供了用于处理Web应用程序异常的标准模型.自动处理所有异常.如果是API/AJAX请求,会向客户端返回一个标准格式化后的错误消息. 自动隐藏内部详细错误并返回标准错误消息. 为异常消息的本地化提供一种可配置的方式. 自动为标准异常设置HTTP状态代码,并提供可配置选项,以映射自定义异常.自动处理异常当满足下面任意一个条件时,AbpExceptionFilt...
java执行Sql脚本
如题,最近遇到一些客户反馈回来的问题。截了个图过来,我一看字体完全撑大了我的LinearLayout 百思不得其解,作为一个专业的码农,我发誓这个代码肯定不是我写了,休想让我背锅。原因是用户设置了系统的字体所以导致偏好导致字体撑大,so 今天来解决一下这个问题。谷歌官方教材建议的是采用sp做文字的单位。但是在实际开发的时候回发现一个问题,比如在标题布局的时候一般都会使用40dp或者50dp和32s...
使用Delphi控制条码打印机打印条码(系列问题1) Delphi / Windows SDK/APIhttp://www.delphi2007.net/DelphiNetwork/html/delphi_20061204150648203.html使用Delphi程序控制专用条码打印机打印带有条码的卡片(卡片可以贴在商品上)。本人第一次涉及此类问题,是新手,看了相关的问题列表,没有很清楚的...
谷歌地图 街景 apiSince launching in May of 2007, Google Street View has since expanded coverage to enough cities across the world that Google now feels comfortable integrating it more deeply with their Maps...
目的:在微信小程序内实现一张中国地图,上面要写上一些全国数据,点击省 => 省地图,并请求数据,点击市区 => 跳转到市区地图这样一个功能,具体实现效果如下:思路:1.首先我们要先画一张中国地图,直接用最近版的echarts-for-weixin插件,下载完之后吧echart组件放到小程序根目录,可以看看里面的使用方法,也可以下载它的案例来看,但是里面是一个省份地图,所以...
有过好几次了,写完的博客点击下面的发表文章,没有反应,然后再写新文章,前面写的就丢了。 刚写过的没了, 写博客往往是有感而发, 刚才写的东西过一会,感觉过去了,就不想再写了,所以丢了就丢了,不会再想写了。 所以,今天早上就先到这吧,也许晚上会再想写吧。 刚才把牛肉炖了, 中午吃牛肉。 今天感觉精神比较爽,昨晚上踢了2小时的球,虽然膝盖还有点
我们都知道,业务开发涉及到数据库的SQL操作时,一定要 review 是否命中索引。否则,会走 全表扫描,如果表数据量很大时,会慢的要死。假如命中了索引呢?是不是就不会有慢查询?殊不知,我...
计算机组成原理第四章_作业_2012-13-1 (9页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!19.90 积分4.14 ROM(2K*8位,4K*4位,8K*8位) RAM(1K*4位,2K*8位,4K*8位) 系统程序区:最小4K 地址范围:0~4K-1 用户程序区:4096~16383 地址范围:4k~16K-1 解: (1) 写出对应的二进...