insert
@Test
public void addUser(){
User user = new User();
user.setName("lucy");
user.setAge(30);
user.setEmail("lucy@qq.com");
int insert = userMapper.insert(user);
System.out.println(insert);
}
常见的主键的生成策略:
- 自动增长:auto_increment,分库分表需要关注上一张表数据
- UUID:每次随机生成一个唯一的值,排序不方便
- Redis生成ID:不依赖数据库,灵活方便,性能优于数据库
- mybatis-plus雪花策略:
在主键上添加注解:@TableId(type = IdType.AUTO)
AUTO(0), //自动增长
NONE(1), //输入
INPUT(2), //需要输入
ID_WORKER(3), //雪花策略生成19位整数
UUID(4), //随机唯一值
ID_WORKER_STR(5); //雪花策略生成19位字符串
mybatis-plus配置主键生成策略:
update
@Test
public void updateUser(){
User user = new User();
user.setId(2L);
user.setAge(120);
int i = userMapper.updateById(user);
System.out.println(i);
}
自动填充:
不需要set属性,使用mybatis-plus实现数据添加
在需要填充的属性上加入注解:
package com.minghao.entity;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
// @TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private String email;
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
}
实现类MetaObjectHandler
package com.minghao.handler;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
//添加时执行
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("createTime", new Date(), metaObject);
this.setFieldValByName("updateTime", new Date(), metaObject);
}
//修改时执行
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime", new Date(), metaObject);
}
}
乐观锁
主要解决丢失更新问题。
不考虑事务隔离,读数据会产生3中问题:
脏读、不可重复读、幻读
写问题会产生丢失更新问题。
乐观锁通过版本号实现,
- 添加private int version属性,并在其上面加入@Version
- 在配置类中配置乐观锁bean
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor(){
return new OptimisticLockerInterceptor();
}
- 在handler中配置乐观锁添加时的默认值
this.setFieldValByName("version", 1, metaObject);
select
多个ID同时查询
@Test
public void testSelectByIds(){
List<User> users = userMapper.selectBatchIds(Arrays.asList(1L, 2L, 3L));
for (User user : users) {
System.out.println(user);
}
}
分页
在配置类中配置分页插件
//分页插件
@Bean
public PaginationInterceptor paginationInterceptor(){
return new PaginationInterceptor();
}
创建Page对象,通过selectPage查询
@Test
public void testPage(){
//创建page对象
Page<User> page = new Page<>(1,3);
//调用分页查询方法
//page里就会存储查询对象
userMapper.selectPage(page,null);
//page.getCurrent()获取当前页
System.out.println(page.getCurrent());
//每页数据的list集合
System.out.println(page.getRecords());
//每页显示记录数
System.out.println(page.getSize());
//总记录数
System.out.println(page.getTotal());
//总页数
System.out.println(page.getPages());
//是否有下一页
System.out.println(page.hasNext());
//是否有上一页
System.out.println(page.hasPrevious());
}
delete
@Test
public void deleteById(){
int i = userMapper.deleteById(1457285538125049857L);
System.out.println(i);
}
@Test
public void deleteByIds(){
int i = userMapper.deleteBatchIds(Arrays.asList(2L, 3L));
System.out.println(i);
}
逻辑删除:
- 数据库和实体类中添加属性,在属性上添加注解@TableLogic
- 在handler中配置插入时默认值为0
this.setFieldValByName("deleted", 0, metaObject);
- 配置逻辑删除插件
//逻辑删除插件
@Bean
public ISqlInjector sqlInjector(){
return new LogicSqlInjector();
}
性能分析插件
- 在application.properties中配置当前项目环境
spring.profiles.active=dev
- 在配置类中添加性能分析插件
/**
* SQL 执行性能分析插件
* 开发环境使用,线上不推荐。 maxTime 指的是 sql 最大执行时长
* 三种环境:dev开发、test测试、prod生产
*/
@Bean
@Profile({"dev","test"})// 设置 dev test 环境开启
public PerformanceInterceptor performanceInterceptor() {
PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
performanceInterceptor.setMaxTime(100);//ms,超过此处设置的ms则sql不执行
performanceInterceptor.setFormat(true);
return performanceInterceptor;
}