1.mp对数据库crud(mybatis的增强,简化开发) mp依赖包括mybatis不要重复引入
继承BaseMapper自动生成
//写配置文件可以生成mybatis执行的日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
userMapper.selectList(null);
userMapper.insert(user); //mp自动生成主键, mp的主键生成策略常用 ASSINGN_ID自动生成19位的id,AUTO自动增长
//不常用的ASSIGN_UUID生成uuid INPUT手动设置id,NONE不生成id
//在实体类指定
@TabledId(type=IdType.ASSIGN_ID) //默认值 ,使用雪花策略 64bit=1bit正负+41bit时间戳毫秒+10bit机器id(5bit是数据中心+5bit是集群id 可部署在1024个节点上)+12bit毫秒内的流水号
//生成自增长的,并且不会hash碰撞
private Long id;
//修改
userMapper.updateById(user);//必须要有id,都是返回影响行数
//自动填充开始和更新时间,在数据库创建字段create_time和update_time和在实体类增加字段
//实体类写上
@TableField(fill =Field.INSERT)
private Date createTime;
@TableField(fill =Field.INSERT_UPDATE)
private Date updateTime;
//需要实现接口,设置填充的操作 MetaObjectHandler和insertFill和updateFill
//下面 是完整代码
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("create_time",new Date(),metaObject);
this.setFieldValByName("update_time",new Date(),metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("update_time",new Date(),metaObject);
}
}
2.mp实现乐观锁? 解决多线程丢失更新问题(两个线程同时开启事务,会导致更新数据丢失)(需要加一个version,更新一次+1,其他事务需要先比较版本号后更新)
1.表加版本号version,实体类加属性
@Version
private Integer version;
2.创建配置类 配置乐观锁插件即可生效
@Configuration
@MapperScan("com.example.mpproject.mapper")
public class MpConfig {
/**
* 乐观锁插件
*/
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
System.out.println("乐观锁插件");
return new OptimisticLockerInterceptor();
}
}
//测试
@SpringBootTest
class MpprojectApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
void test01() {
List<User> users = userMapper.selectList(null);
System.out.println(users);
}
@Test
void test02() {
User user = new User();
user.setAge(10);
user.setName("aaa");
int users = userMapper.insert(user);
System.out.println(users);
}
@Test
void test03() {
//注意模拟乐观锁的效果需要先查询到再修改才能看到效果,创建对象单独更新没有效果(认为是一个线程)
User user1 = userMapper.selectById(1671111003225481227L);
user1.setName("bbb");
int users = userMapper.updateById(user1);
System.out.println(users);
}
}
3.多id批量查询和map条件查询
userMapper.selectBatchIds(Arrays.asList(1,2,3));
//了解即可
map.put("name","jack");
userMapper.selectByMap(map);
//分页查询,常见,需要配置插件
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
//分页代码
Page<User> page=new Page(1,3);
Page<User> userPage= userMapper.selectPage(page,null);
.getRecords();//表的所有数据
.getPages();//总页数
.getCurrent();//当前页
.getTotal();//表总记录数
.hasNext();//有无下一页
.hasPrevious();//有无上一页
@Test
void test04() {
// List users = userMapper.selectBatchIds(Arrays.asList(1,2, 3));
// System.out.println(users);
// HashMap map = new HashMap<>();
// map.put("NAME","Jone");
// List users1 = userMapper.selectByMap(map);
// System.out.println(users1);
Page<User> page = new Page(1, 4);
Page<User> userPage = userMapper.selectPage(page, null);
log.info("-----分页--------");
System.out.println(userPage.getRecords());
System.out.println("current:"+userPage.getCurrent());
System.out.println("size:"+userPage.getSize());
System.out.println("pages:"+userPage.getPages());
System.out.println("hasPrevious:"+userPage.hasPrevious());
System.out.println("hasNext:"+userPage.hasNext());
System.out.println("total:"+userPage.getTotal());
}
4.删除(不用插件)
//根据id删除
int rows= userMapper.deleteById(1L);
//批量删除
userMapper.deleteBatchIds(Arrays.asList(1,2,3));
//!!!逻辑删除(假的,加个字段0没有删除/1已删除)!!!重点(物理删除 真正删除表的数据)
表加 deleted
@TableLogic
@TableField(fill =Fieldill.INSERT)
private Integer deleted;
//!!!查询时自动加 where deleted=0;
5.条件查询
QueryWrapper<User> wrapper= new QueryWrapper<>();
wrapper.ge("age",21);//大于等于, ge,gt,le,lt
.eq("name","jams");
.between("age",24,28);//包括24和28,notBetween
//模糊查询
.like("name","张");//自动两边的% ,有leftLike(%张) 和rightLike(张%)代表%的位置 [%代表一个或多个,不包括0哦!!!]
//降序和升序
.orderByDesc("id");
@Test
void test07() {
QueryWrapper queryWrapper = new QueryWrapper();
// queryWrapper.eq("age",24);
//
// User user = userMapper.selectOne(queryWrapper);
// System.out.println(user);
// queryWrapper.ge("age",10);
// queryWrapper.between("age",10,21);
// queryWrapper.like("name","aaa");
// queryWrapper.likeRight("name","bb");
// queryWrapper.orderByAsc("id");
queryWrapper.orderByDesc("id");
List list = userMapper.selectList(queryWrapper);
System.out.println(list);
}