笔记:
* 依赖MybatisPlus 3.5.5
* 自动映射:
a) 表名和实体类的映射 -> t_stu 表 Student 实体类:
1.当表名和实体类名不一样的时候再实体类类名上加上@TableName注解@TableName("t_stu")
2.也可以在配置文件中配置数据库表名的前缀,配置之后只要类名称与表名一致就无需@TableName注解
mybatis-plus.global-config.db-config.table-prefix: tb_
b) 字段名和实体类属性名(不是变量名,属性名是get/set方法中的setStuName中的StuName)的映射
c) 字段名下划线命名方式和实体类属性小驼峰命名方式映射:
mybatis-plus.configuration.map-underscore-to-camel-case: true
d) 字段映射:
1.字段名称与实体类属性名称不一致时,使用@TableField注解指定字段的名称即可完成封装@TableField(value= "XXX")
2.字段失效,不希望该属性被查询,隐藏这个字段@TableField(select= false)
e) 视图属性:
有些字段不需要数据库存储,但需要展示,实体类中有这个有这个属性但数据库中不存在,叫视图属性。@TableField(exist = false)
* 查询:(条件构造器、等值查询、范围查询、判断为空、包含查询、分组查询、聚合查询、排序查询、
func查询、逻辑查询、自定义条件查询、last查询、exists查询、字段查询)
1.条件构造器介绍(自己看源码):Wrapper、AbstractWrapper、AbstractLambdaWrapper、QueryWrapper、LambdaQueryWrapper:
a) Wrapper
抽象类、子类是AbstractWrapper
b) AbstractWrapper
抽象类、子类是AbstractLambdaWrapper、QueryWrapper
c) AbstractLambdaWrapper
抽象类、子类是LambdaQueryWrapper
d) QueryWrapper(重点掌握)
继承于AbstractWrapper,非抽象类,字符串方式表示字段,创建该类对象。继承AbstractWrapper
e) LambdaQueryWrapper(重点掌握)
继承于AbstractLambdaWrapper,非抽象类,方法引用方式表示字段,创建该类对象
2.等值(eq)/不等值(ne)查询:
a) 单个等值条件查询:
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.eq("stu_name", "张三");
LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper();
lambdaQueryWrapper.eq(Student::getStuName, "张三");
* 如果传递参数的值为null,将不作为查询条件(当参数不为null的时候作为查询条件)
lambdaQueryWrapper.eq("param" != null, Student::getStuName, null);
b) 多个条件查询,再加一个eq(),或者使用allEq(Map)或者allEq(Map, false),后者设置false表示为null的字段舍弃,不进行查询。
c) 范围查询:
大于(gt): lambdaQueryWrapper.gt(Student::getStuAge, 18);
大于等于(ge): lambdaQueryWrapper.ge(Student::getStuAge, 18);
小于(lt): lambdaQueryWrapper.lt(Student::getStuAge, 18);
小于等于(le): lambdaQueryWrapper.le(Student::getStuAge, 18);
范围之间(between): lambdaQueryWrapper.between(Student::getStuAge, 18, 50);
不在范围之间(notBetween): lambdaQueryWrapper.notBetween(Student::getStuAge, 18, 50);
d) 模糊查询:
like/notLike/likeLeft/likeRight/notLikeLeft/notLikeRight等
lambdaQueryWrapper.like(Student::getStuName, "张");
.......
e) 判空查询:
isNull/isNotNull
lambdaQueryWrapper.isNull(Student::getStuName, "张");
.....
f) 包含查询: in/notIn/inSql
in/notIn:
ArrayList arrayList = new ArrayList<>();
Collections.addAll(arrayList, 18,50,12);
lambdaQueryWrapper.in(Student::getStuAge, arrayList);
lambdaQueryWrapper.notIn(Student::getStuAge, arrayList);
inSql: notInSql 反之
ArrayList arrayList = new ArrayList<>();
Collections.addAll(arrayList, "18,50,13");
demo1:
lambdaQueryWrapper.inSql(Student::getStuAge, arrayList);
demo2: 还可以传sql语句查询的结果
lambdaQueryWrapper.inSql(Student::getStuAge, "select stu_age from t_stu where stu_age > 20");
g) 分组查询:
假设数据库的分组语句:select stu_sex,count(*) as sex_count from t_stu group by stu_sex;
QueryWrapper queryWrapper = new QueryWrapper();
// 指定分组的字段
queryWrapper.groupBy("stu_sex");
// 展示的字段
queryWrapper.select("stu_sex,count(*) as sex_count");
// 查询结果
List
分页
1.创建一个拦截器。给sql语句增加一个拦截器,然后把分页语句/参数拼接上去
a) 创建mybatisPlus配置文件MybatisPlusConfig,在配置文件中添加分页插件
// 官网 https://baomidou.com/pages/97710a/#%E6%94%AF%E6%8C%81%E7%9A%84%E6%95%B0%E6%8D%AE%E5%BA%93
/**
* 添加分页插件
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));//如果配置多个插件,切记分页最后添加
//interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); 如果有多数据源可以不配具体类型 否则都建议配上具体的DbType
return interceptor;
}
b) 测试:方式一
LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>();
// 指定一个分页对象,包含对象的分页信息 IPage
// long current 当前页, long size 每页显示条数
// Page 是 IPage的接口实现类
IPage studentPage = new Page<>(1, 3);
// 执行查询
IPage iPage = studentMapper.selectPage(studentPage, lambdaQueryWrapper);
// 获取分页查询的信息
System.out.println("当前页: " + iPage.getCurrent());
System.out.println("每页显示的条数: " + iPage.getSize());
System.out.println("总条数: " + iPage.getTotal());
System.out.println("总页数: " + iPage.getPages());
// 接受查询的结果
List records = iPage.getRecords();
records.forEach(i -> System.out.println(i));
c) 测试:方式二
1. Mapper层:
// 自定义Sql查询
IPage selectByStuName(IPage page, String stuName);
2. XML:
3.运行:
@Test
void test02() {
IPage studentPage = new Page<>(1,5);
IPage iPage = studentMapper.selectByStudentName(studentPage, "安妮");
List students = iPage.getRecords();
students.forEach(i -> System.out.println(i));
}