注解 | MyBatis-PlusMyBatis-Plus 官方文档https://baomidou.com/pages/223848/#tablename
1.关于@TableName的使用
假设我们不加@TableName("tbl_employee")的话,那么数据库中的表名和类名相同的话,那么是ok的,如果不同,为我们就必须加上@TableName这个注解。
2.关于@TableId的使用
这是一个主键注解,用在实体类主键字段上
如果我们不加@TableId注解的话,mp 会自动识别pojo类中名为id的属性,如果名字叫id就会当做是主键,
全局生成策略有几种,我们最常用的就是自增长的类型的
除了在每个实体类上的id属性字段上加上@TableId
还有一种方式:
就是将id属性字段上加上@TableId去掉
之后再核心配置文件中加入以下:
3.@TableField注解的使用
当实体类属性名和数据库中标的字段名不一致的情况下,使用该注解可以设置对应的映射关系。
@TableName("sys_user")
public class User {
@TableId
private Long id;
@TableField("nickname")
private String name;
private Integer age;
private String email;
}
如果有一个字段不是表中的字段
可以使用:
@TableField(exist = false)
private String genderName;
1.在配置类中加入分页插件,不加分页插件的话,分页无法使用
// 最新版
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
2.在Service中使用
@Test
public void queryPage(){
IPage page = new Page(1,5);
IPage descIPage = descService.page(page);
System.out.println("一共多少页?"+descIPage.getPages());
System.out.println("当前第几页?"+descIPage.getCurrent());
System.out.println("一共多少条数据?"+descIPage.getTotal());
System.out.println("一页多少条数据?"+descIPage.getSize());
System.out.println(descIPage.getRecords());
}
ps:
IPage selectPageVo(IPage> page, Integer state);
// or (class MyPage extends Ipage{ private Integer state; })
MyPage selectPageVo(MyPage page);
// or
List selectPageVo(IPage page, Integer state);
如果返回类型是 IPage 则入参的 IPage 不能为null,因为 返回的IPage == 入参的IPage; 如果想临时不分页,可以在初始化IPage时size参数传 <0 的值;
如果返回类型是 List 则入参的 IPage 可以为 null(为 null 则不分页),但需要你手动 入参的IPage.setRecords(返回的 List);
如果 xml 需要从 page 里取值,需要page.属性
获取
在学习MP的过程中,之前我们进行数据库操作的时候最多是用map进行对等条件的筛选
那么怎么进行更复杂的筛选呢?比如条件筛选模糊匹配等等?那么就是用条件构造器
@Test
public void queryWrapper(){
QueryWrapper wrapper = new QueryWrapper<>();
QueryWrapper eq = wrapper.select("id", "name_desc").eq("name_desc", "小兔");
List list = descService.list(eq);
System.out.println(list);
}
注意:此处的map-underscore-to-camel-case: true这个属性需要设置成true
不设置成true也可以
写成如下:
@Test
public void queryWrapper(){
QueryWrapper wrapper = new QueryWrapper<>();
QueryWrapper eq = wrapper.select("id", "name_desc as nameDesc").eq("name_desc", "小兔");
List list = descService.list(eq);
System.out.println(list);
}
between
@Test
public void queryWrapperBetween(){
QueryWrapper wrapper = new QueryWrapper<>();
QueryWrapper eq = wrapper.between("id",2L,10L);
List list = descService.list(eq);
System.out.println(list);
}
updateWrapper
@Test
public void updateWrapper01(){
UpdateWrapper wrapper = new UpdateWrapper<>();
wrapper.set("name_desc","小兔子")/*.eq("id","2")*/
/*.in("id","3","4","5");*/
.between("id",9L,15L);
boolean update = descService.update(wrapper);
System.out.println(update);
}
lambda方式
LambdaQueryWrapper
// 以上都是硬编码方式,不想用硬编码的方式,那就使用lambda表达式的方式
@Test
public void queryWrapperLambada(){
QueryWrapper wrapper = new QueryWrapper<>();
LambdaQueryWrapper eq = wrapper.lambda().select(Desc::getId,Desc::getNameDesc).eq(Desc::getId, 2L);
Desc one = descService.getOne(eq);
System.out.println(one);
}
LambdaUpdateWrapper
@Test
public void updateWrapperLambada(){
UpdateWrapper wrapper = new UpdateWrapper<>();
wrapper.lambda().set(Desc::getNameDesc,"小兔子乖乖")
.between(Desc::getId,12L,15L);
boolean update = descService.update(wrapper);
System.out.println(update);
}
未完待续...