Lombok,一个Java类库,提供了一组注解,简化POJO实体类开发
免去getter/setter/toString的书写
org.projectlombok lombok 1.18.12 provided
@Data
@TableName(value = "tb_user")
public class User {private int id;private String name;private String password;private int age;private String tel;
}
@Test
void testGetAll() {List users = userDao.selectList(null);users.forEach(System.out::println);
}
@Test
void testGetById() {User user = userDao.selectById(1);System.out.println(user);
}
@Test
void testDeleteById() {userDao.deleteById(2);
}
@Test
void testUpdateById() {User user = new User();user.setId(1);user.setName("jihua");userDao.updateById(user);//只修改提供的字段,不提供的不会修改为NULL
}
@Configuration
public class MybatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {//1.定义MybatisPlus拦截器MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();//2.添加具体拦截器mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());return mybatisPlusInterceptor;}
}
@Test
void testGetByPage() {IPage page = new Page(1,2);userDao.selectPage(page,null);System.out.println("当前页码值:"+page.getCurrent());System.out.println("每页显示数:"+page.getSize());System.out.println("一共多少页:"+page.getPages());System.out.println("一共多少条数据:"+page.getTotal());System.out.println("数据:"+page.getRecords());
}
# 开启日志,输出到控制台
mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
//格式一:常规格式
@Test
void testWrapperGet1(){QueryWrapper qw = new QueryWrapper();//查询年龄大于等于18,小于60岁的用户qw.lt("age",60);qw.ge("age",18);List users = userDao.selectList(qw);users.forEach(System.out::println);
}
//格式二:链式编程格式
@Test
void testWrapperGet2(){QueryWrapper qw = new QueryWrapper();//查询年龄大于等于18,小于60岁的用户qw.lt("age",60).ge("age",18);List users = userDao.selectList(qw);users.forEach(System.out::println);
}
//格式三:lambda格式(推荐)
@Test
void testWrapperGet3(){QueryWrapper qw = new QueryWrapper();//查询年龄大于等于18,小于60岁的用户qw.lambda().lt(User::getAge,60).ge(User::getAge,18);List users = userDao.selectList(qw);users.forEach(System.out::println);
}
//格式四:lambda格式
@Test
void testWrapperGet4(){LambdaQueryWrapper lqw = new LambdaQueryWrapper();//查询年龄大于等于18,小于60岁的用户lqw.lt(User::getAge,60).ge(User::getAge,18);List users = userDao.selectList(lqw);users.forEach(System.out::println);
}
//条件查询——组合条件and
@Test
void testWrapperAnd(){LambdaQueryWrapper lqw= new LambdaQueryWrapper();//查询年龄大于等于18,小于60岁的用户lqw.lt(User::getAge,60).ge(User::getAge,18);List users = userDao.selectList(lqw);users.forEach(System.out::println);
}
//条件查询——组合条件or
@Test
void testWrapperOr(){LambdaQueryWrapper lqw= new LambdaQueryWrapper();//查询年龄小于等于18,或大于60岁的用户lqw.gt(User::getAge,60).or().le(User::getAge,18);List users = userDao.selectList(lqw);users.forEach(System.out::println);
}
@Test
void testWrapperNull() {UserQuery user = new UserQuery();user.setAge(18);//下限//user.setAge2(40);//上限LambdaQueryWrapper lqw = new LambdaQueryWrapper<>();if(null != user.getAge()){lqw.gt(User::getAge,user.getAge());}if(null!=user.getAge2()){lqw.lt(User::getAge,user.getAge2());}List users = userDao.selectList(lqw);users.forEach(System.out::println);
}
@Test
void testWrapperNull() {UserQuery user = new UserQuery();user.setAge(18);//下限//user.setAge2(40);//上限LambdaQueryWrapper lqw = new LambdaQueryWrapper<>();lqw.gt(null != user.getAge(),User::getAge,user.getAge()).lt(null!=user.getAge2(),User::getAge,user.getAge2());List users = userDao.selectList(lqw);users.forEach(System.out::println);
}
//查询投影——常规
@Test
void testSelect() {QueryWrapper qw = new QueryWrapper<>();qw.select("name", "age", "tel");List users = userDao.selectList(qw);users.forEach(System.out::println);
}
//查询投影——lambda
@Test
void testSelectLambda() {LambdaQueryWrapper lqw = new LambdaQueryWrapper<>();lqw.select(User::getName, User::getAge, User::getTel);List users = userDao.selectList(lqw);users.forEach(System.out::println);
}
LambdaQueryWrapper lqw = new LambdaQueryWrapper();
lqw.eq(User::getName, userQuery.getName()).eq(User::getPassword, userQuery.getPassword());
User loginUser = userDao.selectOne(lqw);
System.out.println(loginuser);
LambdaQueryWrapper lqw = new LambdaQueryWrapper();
//方案一:设定上限下限
lqw.le(User::getAge, userQuery.getAge()).ge(User::getAge, userQuery.getAge2());
//方案二:设定范围
lqw.between(User::getAge, userQuery.getAge( ), userQuery.getAge2( ));List userList = userDao.selectList(lqw);
System.out.println(userList);
LambdaQuerywrapper fqw = new LambdaQuerywrapper();
lqw.likeLeft(User::getTel, userQuery.getTel());
List userList = userDao.selectList(lqw);
System.out.println(userList);
like(name, "R")
:%R%likeLeft(name, "R")
:R%likeRight(name, "R")
:%Rcount(*)
进行统计查询时,查询应该使用 selectMaps()
//分组统计查询
@Test
void testSelectGroup() {QueryWrapper qw = new QueryWrapper<>();qw.select("count(*) as 人数", "age");qw.groupBy("age");List
@TableName("tbl_user")//将实体类与表名映射
public class User {private Long id;@TableField(value="pwd")//将实体类的属性和表的列名对应private String name;@TableField(select = false)//设置属性不参与查询 private string password;private Integer age;private String tel;@TableField(exist = false)//设置属性在表中是否存在private Integer online;
}
名称:@TableField
类型:属性注解
位置:模型类属性定义上方
作用:设置当前属性对应的数据库表中的字段关系
范例:
public class User {private Long id;@TableField(value="pwd")//将实体类的属性和表的列名对应private String name;@TableField(select = false)//设置属性不参与查询 private string password;private Integer age;private String tel;@TableField(exist = false)//设置属性在表中是否存在private Integer online;
}
相关属性
名称:@TableName
类型:类注解
位置:模型类定义上方
作用:设置当前类对应与数据库表关系
范例:
@TableName("tbl_user")//将实体类与表名映射
public class User {...
}
相关属性
名称:@TableId
类型:属性注解
位置:模型类中用于表示主键的属性定义上方
作用:设置当前类中主键属性的生成策略
范例:
public class User {@TableId(type = IdType.AUTO)private Long id;
}
相关属性
IdType
枚举值在application.yml中
mybatis-plus:global-config:db-config:#配置id生成策略id-type: auto#配置表名前缀(即表名在实体类名称前面加的前缀)table-prefix: tbl_
List ids= Arrays.asList(new Long[ ]{2,3});
userDao.deleteBatchIds(ids);
List ids= Arrays.asList(new Long[]{2,3});
List userList = userDao.selectBatchIds(ids);
步骤:
数据库表中添加逻辑删除标记字段
实体类中添加对应字段,并设定当前字段为逻辑删除标记字段
public class User {private Long id;@TableLogic(value = "0", delval = "1")//配置逻辑删除,0为未删除,1为已删除private Integer deleted;
}
也可以在配置(application.yml)中做全局逻辑删除配置
mybatis-plus:global-config:db-config:#配置逻辑删除字段名logic-delete-field: deleted#配置未删除时的值logic-not-delete-value: 0#配置已删除的值logic-delete-value: 1
一旦开启逻辑删除功能后,delete语句都将变为update语句(不是delete而是updata他的deleted值为1 )
查询操作也会自动加上条件where deleted = 0
要想查询全部属性需要自己编写SQL语句进行查询
数据库表中添加锁标记字段version,在操作数据时先查询出当前version,执行操作时将查询到的version与当前表中的version进行对比(防止数据被其他线程修改过),在执行操作后将version+1
数据库表中添加锁标记字段version
实体类中添加对应字段,并设定当前字段为逻辑删除标记字段
public class User {private Long id;@Versionprivate Integer version;
}
配置乐观锁拦截器实现锁机制对应的动态SQL语句拼装
@Configuration
public class MybatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {//1.定义MybatisPlus拦截器MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();//2.添加乐观锁拦截器mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());return mybatisPlusInterceptor;}
}
使用乐观锁机制在修改前必须先获取到对应数据的verion方可正常进行
@Test
void testUpdate(){//先查询数据,获取到version数据User user = userDao.selectById(1L);User user1 = userDao.selectById(1L);//执行数据修改操作//操作一user.setName("Tom and Jerry");userDao.updateById(user);//操作二user1.setName("6666");userDao.updateById(user1);
}//此时操作二将不会执行成功
执行修改前先执行查询语句:
SELECT id,name,age,tel,deleted,version FROM tbl_user WHERE id=?
执行修改时使用version字段作为乐观锁检查依据
UPDATE tbl_user SET name=?, age=?, tel=?, version=? WHERE id=? AND version=?