前面有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)