一、简介
(一)快速入门
- 创建SpringBoot项目,创建时不勾选MyBatis坐标。
- 添加MyBatisPlus坐标(可以再加上druid坐标)
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
- 修改
.yml
文件 - 创建
BookDao
,直接继承BaseMapper<实体类名>
,数据层就算写完了,自动实现基本的CRUD。
@Mapper
public interface BookDao extends BaseMapper<Book> {
}
(二)概述
MyBatisPlus是基于MyBatis框架基础上开发的增强工具,效果是简化开发、提高效率。
MyBatisPlus的开发方式有很多种:
二、标准数据层开发
lombok
:快速制作实体类
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<!-- 不需要参与打包,不设置也没问题 -->
<scope>provided</scope>
</dependency>
实体类中:使用注解代替原方法
@Getter
@Setter
@NoArgsConstructor //无参构造
@AllArgsConstructor //全部带参构造
@ToString
@EqualsAndHashCode
public class Book {
private Integer id;
private String name;
private String type;
private String description;
}
或者:@Data
代替了上面所有的方法(但不包括构造方法)
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Book {
private Integer id;
private String name;
private String type;
private String description;
}
(一)分页功能
三、DQL控制
(一)条件查询方式
//方式一:按条件查询
QueryWrapper<Book> qw = new QueryWrapper<Book>();
//小于less than
qw.lt("id", 3); //表示,id小于3的数据
//大于greater than
qw.gt("id", 5);
//等于equal
qw.eq("id", 3);
//如果是and的多条件,可以用链式编程
qw.lt("id", 10).gt("id", 5);
//如果是or的多条件,可以用链式编程,如小于5或者大于10
qw.lt("id", 5).gt("id", 10);
List<Book> bookList = bookDao.selectList(qw);
System.out.println(bookList);
//方式二:lambda格式按条件查询
QueryWrapper<Book> qw2 = new QueryWrapper<>();
qw2.lambda().lt(Book::getId, 3); //加上lambda()方法
List<Book> bookList1 = bookDao.selectList(qw2);
System.out.println(bookList1);
//方式三:lambda格式条件查询,常用方式
LambdaQueryWrapper<Book> qw3 = new LambdaQueryWrapper<>();
qw3.lt(Book::getId, 3); //对象直接用的lambda生成,不用加lambda()
List<Book> bookList2 = bookDao.selectList(qw3);
System.out.println(bookList2);
总结:lt小于,gt大于,le小于等于,ge大于等于,eq等于,between介于,.likeLeft(表示%王),.likeRight(王%)
更多查询条件
(1)Null值处理
条件查询对null判定
场景:在搜索一个商品价格时,可能会指定100~500,也可能只指定>100,这时就需要动态调整语句(相当于动态SQL)
(二)查询投影
查询投影:设置查询完成之后的结果长什么样(结果展示的样式)。
/**
* 查询投影
*/
@Test
void testSelectProjection() {
//方式一:Lambda
LambdaQueryWrapper<Book> lqw = new LambdaQueryWrapper<>();
//select()方法就是设置查询投影的,下面是查询结果只显示id和name,相当于select id,name from table;
lqw.select(Book::getId, Book::getName);
List<Book> bookList1 = bookDao.selectList(lqw);
System.out.println(bookList1);
//方式二:不使用Lambda,一般用这种形式
QueryWrapper<Book> bqw = new QueryWrapper<>();
//不是lambda,就直接写字符串
bqw.select("id", "name", "type");
List<Book> bookList2 = bookDao.selectList(bqw);
System.out.println(bookList2);
}
处理SQL语句中Count(*)和GroupBy的问题。
/**
* 分组问题,只能使用条件查询,不能使用Lambda查询
*/
@Test
void testSelectByGroup() {
QueryWrapper<Book> bqw = new QueryWrapper<>();
bqw.select("count(*) as count", "type");
bqw.groupBy("type");
//查询就不能用List,要用Maps
List<Map<String, Object>> maps = bookDao.selectMaps(bqw);
System.out.println(maps);
}
(三)字段映射与表名映射
问题一:表明中的字段名和实体类中的属性名不一致
问题二:实体类的有一个属性,而表中没这字段(不需要存在表里),如何在查询时忽略这个属性。
问题三:实体类有一个password属性,在查询时不希望查到这个字段
问题四:表名和实体类名不一致,如何对应
四、DML控制
(一)Insert
(1)id生成策略控制
对于IdType,可以在yml做全局配置,这样一个项目中的多个实体类就不用每个都去配置。
全局配置的内容还有很多
视频讲解,在最末尾
(二)Delete
多数据操作:比如淘宝全选购物车。
删除:userDao.deleteBatchIds(Collection<E>)
,传入一个包含id的集合
多条查询:userDao.selectBatchIds(Collection<E>)
,和删除一样