@Test
void insertTest() {
User user = new User();
user.setName("元元");
user.setAge(19);
user.setEmail("[email protected]");
int insert = userMapper.insert(user); // 帮我们自动生成 id
System.out.println(insert); // 受影响的行数
System.out.println(user); // 发现id会自动回填
}
设置主键用到的注解 @TableId(type = IdType.AUTO)
@Data
public class User {
// 对应数据库中的主键
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private int age;
private String email;
@TableField(fill = FieldFill.INSERT) // 插入时
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE) // 更新时
private Date updateTime;
}
设置主键可以用哪些
AUTO(0), // 数据库 id 自增
NONE(1), // 未设置主键、
INPUT(2), // 手动输入
ID_WORKER(3),// 默认的全局唯一 id
UUID(4), // 全局唯一id uuid
ID_WORKER_STR(5) // 字符串表示法
// updateById 更新方法
@Test
void updateById() {
User user = new User();
user.setId(1456219805576073217l);
user.setName("更新");
int i = userMapper.updateById(user);
System.out.println(i);
}
updateById() 中传入的是一个对象而不是一个 id 串
例如:在表中自动插入和更新时间
首先需要在 pojo 层添加字段属性@TableField
@Data
//@AllArgsConstructor
//@NoArgsConstructor
public class User {
// 对应数据库中的主键
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private int age;
private String email;
@TableField(fill = FieldFill.INSERT) // 插入时
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE) // 更新时
private Date updateTime;
}
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
// 插入时的填充策略
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill....");
// setFieldValByName 的三个参数分别是 字段名,字段值,metaObject
this.setFieldValByName("createTime", new Date(), metaObject);
this.setFieldValByName("updateTime", new Date(), metaObject);
}
// 更新时的填充策略
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill....");
this.setFieldValByName("updateTime", new Date(), metaObject);
}
}
这样就可以实现在插入或更新时自动插入或更新 “创建时间字段和更新时间字段” 的时间了!
数据库增加 version 字段
实体类中添加对应的字段并在该字段上添加乐观锁注解@Version
@Version
private Integer version;
编写配置类作为mybatis-plus的配置类
这里可以将主启动类的扫描mapper包的注解放在mybati-plus配置雷中
@MapperScan("com.example.demo1.mapper") // 扫描 mapper 文件
@EnableTransactionManagement // 自动管理事务
@Configuration // 配置类注解
public class MyBatisPlusConfig {
// 注册乐观锁插件
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return mybatisPlusInterceptor;
}
}
至此乐观锁配置完毕
乐观锁的测试
// 测试乐观锁
// ======》 成功的情况
@Test
void lockVersionSuccess() {
User user = userMapper.selectById(1456227126960230406l);
user.setName("测试乐观锁success");
userMapper.updateById(user);
}
// =======》 失败的情况
@Test
void lockVersionDefault() {
// 模拟多线程情况下 user1 没有执行完毕的时候被 user2 插队先执行
// 如果没有乐观锁的情况下,Name 字段更新后的值应该是 “乐观测试1”
// 有乐观锁的情况下, Name 字段更新后的值是 “乐观测试2”
User user1 = userMapper.selectById(1456227126960230406l);
user1.setName("测试乐观锁1");
User user2 = userMapper.selectById(1456227126960230406l);
user2.setName("测试乐观锁2");
userMapper.updateById(user2);
userMapper.updateById(user1);
}
查询该表全部记录
// 查询单表全部记录
@Test
void selectListTest() {
// 查询全部用户
List<User> users = userMapper.selectList(null);
users.forEach(System.out::println);
}
根据 id 查询单条数据======> 放入的参数是一个 id
// 测试单条查询
@Test
void selectByIdTest() {
User user = userMapper.selectById(1456219805576073217l);
System.out.println(user);
}
根据 id 列表进行批量查询 ====> 放入的参数是一个 id 列表
// 测试批量查询
@Test
void selectBatchIdsTest() {
List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));
System.out.println(users);
}
根据 map 中的条件进行查询======> 放入的参数是一个 HashMap
// 测试条件查询 ==》 使用 map 的方法
@Test
void selectByMapTest() {
HashMap<String, Object> map = new HashMap<>();
map.put("name","更新");
map.put("age",18);
List<User> users = userMapper.selectByMap(map);
System.out.println(users);
}
首选配置类中添加分页插件配置====> 和乐观锁等配置在一起即可
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
//乐观锁
mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
//分页配置
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return mybatisPlusInterceptor;
}
测试分页查询
// 测试分页查询
@Test
void selectPageTest() {
// Page 的参数 1 为当前页 Page 的参数 2 为页面大小
Page<User> page = new Page<>(1,3);
Page<User> userPage = userMapper.selectPage(page, null);
userPage.getRecords().forEach(System.out::println);
// getTotal() 获取总数
System.out.println(userPage.getTotal());
}
分页查询中Page中的方法
// 测试根据 id 删除
@Test
void deleteByIdTest() {
userMapper.deleteById(1456227126960230401l);
}
// 测试根据 id 列表批量删除
@Test
void deleteBatchIdsTest() {
userMapper.deleteBatchIds(Arrays.asList(123l,1456219805576073217l));
}
// 测试按 map 条件删除
@Test
void deleteByMapTest() {
HashMap<String, Object> map = new HashMap<>();
map.put("name","元元");
map.put("age",20);
userMapper.deleteByMap(map);
}
逻辑删除(软删除)
实体类上对应的软删除标记字段上增加软删除注解 @TableLogic
@TableLogic
private Integer deleted;
yml 配置
mybatis-plus:
# 配置日志
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 配置逻辑删除(软删除)
global-config:
db-config:
logic-delete-value: 1 # 已删除的标记
logic-not-delete-value: 0 # 未删除的标记
例如:查询 name 和 email 不为空且 age 大于18 岁
@Test
void test1() {
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.isNotNull("name").isNotNull("email").ge("age",19);
userMapper.selectList(wrapper).forEach(System.out::println);
}
具体使用官网很详细
https://mp.baomidou.com/guide/wrapper.html#abstractwrapper