MybatisPlus的CRUD操作
前面有MyBatis-Plus的快速入门的文章,接下来就基于原有代码进行CRUD操作
Insert 插入
编写插入代码:
@Test
void testInsert(){
User user = new User();
user.setAge(12);
user.setName("Jone");
user.setEmail("286573@qq.com");
// 这里我们没有设置id,
int result = userMapper.insert(user);
// 打印出受影响的行数
System.out.println(result);
}
运行结果:

这里我们发现,我们在添加的时候没有设置Id,但是会给我们自动生成一个全局唯一的Id,这种主键生成的策略即
默认ID_WORKER全局唯一id
又叫做雪花算法:
snowflake是Twitter开源的分布式ID生成算法,结果是一个Long型的ID,其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生4096个ID),最后还有一个符号位,永远是0,可以保证几乎全球唯一!
主键自增策略
1、实体类字段上 @TableId(type = IdType.AUTO)
2、数据库Id字段一定要设置自增才可以
继续运行进行测试:

发现id的确为自动增长
源码解释
public enum IdType{
AUTO(0), // 数据库Id自增
NONE(1), // 未设置主键
INPUT(2), // 手动输入
ID_WORKER(3), // 默认的全局唯一Id
UUID(4), //全局唯一Id uuid
ID_WORKER_STR(5); // ID_WORKER 的字符串表示法
}
Update操作
// 修改Id为1的信息
User user = new User();
user.setAge(2);
user.setId(1L);
user.setName("Jone_new");
user.setEmail("286573@qq.com");
int result = userMapper.updateById(user);
System.out.println(result);
结果:
==> Preparing: UPDATE user SET name=?, age=?, email=? WHERE id=?
==> Parameters: Jone_new(String), 2(Integer), 286573@qq.com(String), 1(Long)
<== Updates: 1
- 注意:在修改的过程中,如果有不需要改动的值,则不进行赋值即可,跟我们所学习的动态sql一个道理。
Select操作
// 根据Id查询
User user = userMapper.selectById(1L);
System.out.println(user);
// 查询多个id
List<User> users1 = userMapper.selectBatchIds(Arrays.asList(1L, 2L, 3L));
users1.forEach(System.out::println);
// 查询所有
List<User> users = userMapper.selectList(null);
条件查询方法:
HashMap<String,Object> map = new HashMap<>();
map.put("name","Tom");
// 当然,我们这里也可以添加多个条件
List<User> users2 = userMapper.selectByMap(map);
运行结果:
==> Preparing: SELECT id,name,age,email FROM user WHERE name = ?
==> Parameters: Tom(String)
<== Columns: id, name, age, email
<== Row: 3, Tom, 28, test3@baomidou.com
<== Total: 1
分页查询:
1、新建一个配置类
@Configuration
public class MyBatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return mybatisPlusInterceptor;
}
}
2、直接使用Page对象即可
测试代码:
void testPage(){
// 参数1: 当前页
// 参数2: 每页显示多少
Page<User> page = new Page<>(3, 2);
userMapper.selectPage(page, null);
page.getRecords().forEach(System.out::println);
}
结果:
==> Preparing: SELECT id,name,age,email FROM user LIMIT ?,?
==> Parameters: 4(Long), 2(Long)
<== Columns: id, name, age, email
<== Row: 5, Billie, 24, test5@baomidou.com
<== Row: 1505528963727278084, Jone, 12, 286573@qq.com
<== Total: 2
Delete 操作
1、根据id删除
// 根据Id删除
userMapper.deleteById(1L);
// 批量删除
userMapper.deleteBatchIds(Arrays.asList(1L,2L));
// 条件删除
HashMap<String,Object> map = new HashMap<>();
map.put("name","Tom");
userMapper.deleteByMap(map);
物理删除:从数据库中真实删除 del = 0;
逻辑删除:就是我们并不是真正的删除,只是改变它某个字段的值。del = 1
测试:
1、数据库中添加一个字段

2、实体类添加属性
@TableLogic
private Integer del;
3、配置逻辑删除
mybatis-plus:
global-config:
db-config:
logic-delete-value: 1
logic-not-delete-value: 0
测试:
userMapper.deleteById(1L);
结果:
==> Preparing: UPDATE user SET delete=1 WHERE id=? AND delete=0
==> Parameters: 1(Long)
走的其实是修改过程。
- 注意:当我们查询的时候,自动过滤掉del = 1的数据,也就是查询不到
测试:
List<User> users = userMapper.selectList(null);
users.forEach(System.out::println);
结果:
User(id=2, del=0, name=Jack, age=20, email=test2@baomidou.com)
User(id=3, del=0, name=Tom, age=28, email=test3@baomidou.com)
User(id=4, del=0, name=Sandy, age=21, email=test4@baomidou.com)
User(id=5, del=0, name=Billie, age=24, email=test5@baomidou.com)
User(id=1505528963727278084, del=0, name=Jone, age=12, email=286573@qq.com)

浙公网安备 33010602011771号