3.MyBatis Plus CRUD深入学习
3.1 Insert 插入操作
第一步:编写测试代码
@Test
void testInsert() {
User user = new User();
user.setName("xuan");
user.setAge(20);
user.setEmail("1870136088@qq.com");
int i = userMapper.insert(user);
System.out.println(i); //影响行数
}
第二步:查看运行结果
- 由于我们并没有编写id 我们可以通过日志看看生成id的情况
- 发现它生成id并不是自增情况 可能是采用某种生成主键id的策略 接下来就分析研究下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3Tu0vElz-1595380158292)(C:\Users\l\AppData\Roaming\Typora\typora-user-images\image-20200721115034474.png)]
第三步:研究下id生成策略(自增、uuid、雪花算法(分布式)、redis、zookeeper)
博客地址https://www.cnblogs.com/haoxinyue/p/5208136.html
里面基本讲述了上述id生成策略
3.1.1 id生成器之雪花算法
当然由于我们上面的id生成策略是雪花算法,所以我们接下来就主要分析雪花算法
什么是雪花算法?
-
snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID),最后还有一个符号位,永远是0。
-
snowflake算法可以根据自身项目的需要进行一定的修改。比如估算未来的数据中心个数,每个数据中心的机器数以及统一毫秒可以能的并发数来调整在算法中所需要的bit数。
优点:
1)不依赖于数据库,灵活方便,且性能优于数据库。
2)ID按照时间在单机上是递增的。
缺点:
1)在单机上是递增的,但是由于涉及到分布式环境,每台机器上的时钟不可能完全同步,也许有时候也会出现不是全局递增的情况。
3.1.2 主键策略
第四步:研究不同的主键策略
- 首先实体类代码以及@TableId注解
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
@TableId(type= IdType.ID_WORKER)
private Long id;
private String name;
private Integer age;
private String email;
}
- IdType是一个枚举类型
值 | 描述 |
---|---|
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方法) |
ID_WORKER | 分布式全局唯一ID 长整型类型(please use ASSIGN_ID ) |
UUID | 32位UUID字符串(please use ASSIGN_UUID ) |
ID_WORKER_STR | 分布式全局唯一ID 字符串类型(please use ASSIGN_ID ) |
源码如下
package com.baomidou.mybatisplus.annotation;
public enum IdType {
AUTO(0), //数据库id自增
NONE(1), //未设置主键
INPUT(2), //手动输入
ASSIGN_ID(3), //分配ID (主键类型为number或string)
ASSIGN_UUID(4), //分配UUID (主键类型为 string)
/** @deprecated */
@Deprecated
ID_WORKER(3), //默认的全局id
/** @deprecated */
@Deprecated
ID_WORKER_STR(3), //字符串表示
/** @deprecated */
@Deprecated
UUID(4); //全局唯一id
private final int key;
private IdType(int key) {
this.key = key;
}
public int getKey() {
return this.key;
}
}
-
@TableId(type= IdType.ID_WORKER) ID_WORKER作为默认的主键策略
-
AUTO枚举类型测试:
- 首先需要将sqlyog的自增勾上
- 其次@TableId(type= IdType.AUTO)类型设置问auto
- 运行之前的测试代码 测试结果如下(明显就是自增 每次自增1)
3.2 Update更新操作
第一步:代码实现来测试一下
- 这里需要注意的是updateById这个方法传参数是User对象
@Test
void testUpdate() {
User user = new User();
user.setId(5L);
user.setName("yingge");
user.setAge(20);
user.setEmail("111111@qq.com");
int i = userMapper.updateById(user);
System.out.println(i); //影响行数
}
- 测试结果(发现更新成功)
其实主要是想体现mybatis-plus动态拼接sql操作(mybatis本身就有)
3.3 Select查询操作
查询一个、多个用户、map条件查询测试 分页查询直接就整合到分页插件里面去了
@Test
void testSelect() {
//查询一个用户
User user = userMapper.selectById(2L);
System.out.println(user);
//查询多个用户
List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));
for (User user1 : users) {
System.out.println(user1);
}
//map条件查询
Map<String,Object> map=new HashMap<>();
map.put("name","xuan");
List<User> userList = userMapper.selectByMap(map);
userList.forEach(System.out::println);
}
3.4 Delete删除操作
下面主要讲一下Mybatisplus中删除方法,具体的测试其实是与插入相对的很简单 逻辑删除下面单独学习
-
** * 根据 ID 删除 * * @param id 主键ID */ int deleteById(Serializable id); /** * 根据 columnMap 条件,删除记录 * * @param columnMap 表字段 map 对象 */ int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap); /** * 根据 entity 条件,删除记录 * * @param wrapper 实体对象封装操作类(可以为 null) */ int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper); /** * 删除(根据ID 批量删除) * * @param idList 主键ID列表(不能为 null 以及 empty) */ int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);