1 入门案例
2 MyBatisPlus简介
3 标准数据层开发
3.1 CRUD开发
@SpringBootTest
class MpApplicationTests {
@Autowired
private BookDao bookDao;
@Test
void testSave(){
Book book = new Book();
book.setName("黑马程序员");
book.setDescription("hahah");
book.setType("计算机");
book.setId(6);
bookDao.insert(book);
}
@Test
void testDelete(){
bookDao.deleteById(6);
}
@Test
void testUpdate(){
Book book = new Book();
book.setId(1);
book.setName("haha");
bookDao.updateById(book);
}
@Test
void testSelect() {
System.out.println(bookDao.selectById(1));
}
}
3.2 Lombok使用
省去实体类的get、set、toString方法
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
@Data
public class Book implements Serializable {
private Integer id;
private String type;
private String name;
private String description;
}
3.3 分页功能
3.3.1 设置分页拦截器作为Spring管理的Bean
@Configuration
public class MpConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
//1.定义Mp拦截器
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
//2.添加具体的拦截器
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return mybatisPlusInterceptor;
}
}
3.3.2 编写分页查询代码
@Test
void testGetByPage(){
//current当前页,size条数
Page<Book> bookPage = new Page<>(2,2);
bookDao.selectPage(bookPage,null);
System.out.println("当前页码值:"+bookPage.getCurrent());
System.out.println("每页显示数:"+bookPage.getSize());
System.out.println("一共多少页:"+bookPage.getPages());
System.out.println("一共多少条:"+bookPage.getTotal());
System.out.println("数据:"+bookPage.getRecords());
}
3.4 mp日志开启(application.properties文件中)
#开启mp日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
4 DQL编程控制
4.1 日志设置
日志信息太多,添加.xml文件过滤:
去除 Spring和MybatisPlus启动动画,在application.properties文件中添加:
#取消spring的图片
spring.main.banner-mode=off
#取消mybatisplus的图片
mybatis-plus.global-config.banner=false
4.2 条件查询---组合查询条件
@Test
void textGetAll(){
//方式一:按条件查询
// QueryWrapper<Book> qw = new QueryWrapper<>();
// qw.lt("id",3);
// System.out.println(bookDao.selectList(qw));
//方式二:Lambda格式按条件查询
// QueryWrapper<Book> qw = new QueryWrapper<>();
// qw.lambda().lt(Book::getId,3);
// System.out.println(bookDao.selectList(qw));
//方式三:Lambda格式按条件查询
LambdaQueryWrapper<Book> blqw = new LambdaQueryWrapper<>();
//(3,5]
// blqw.le(Book::getId,5).gt(Book::getId,3);
//(0,2)或(3,5)
blqw.gt(Book::getId,3).or().lt(Book::getId,2);
System.out.println(bookDao.selectList(blqw));
}
4.3 条件查询---null处理
在平常查询过程中,客户对某些条件并未设置,即查询条件不完整
模拟代码:
BookQuery bookQuery = new BookQuery();
bookQuery.setId(1);
// bookQuery.setId(4);
LambdaQueryWrapper<Book> blqw = new LambdaQueryWrapper<>();
blqw.lt(Book::getId,bookQuery.getId2());
blqw.gt(Book::getId,bookQuery.getId());
System.out.println(bookDao.selectList(blqw));
产生结果:错误查询
修改:基于条件查询
blqw.lt(null != bookQuery.getId2(),Book::getId,bookQuery.getId2());
blqw.gt(null != bookQuery.getId(),Book::getId,bookQuery.getId());
4.4 查询投影
4.4.1 查询部分字段
只查询部分字段,其他字段显示为空:
//查询投影
LambdaQueryWrapper<Book> blqw = new LambdaQueryWrapper<>();
blqw.select(Book::getId,Book::getName,Book::getType);
System.out.println(bookDao.selectList(blqw));
4.4.2 统计数据
QueryWrapper<Book> blqw = new QueryWrapper<>();
blqw.select("count(*) as count");
System.out.println(bookDao.selectMaps(blqw));
4.4.3 分组查询
QueryWrapper<Book> blqw = new QueryWrapper<>();
blqw.select("count(*) as count,type");
blqw.groupBy("type");
System.out.println(bookDao.selectMaps(blqw));
4.5 查询条件(查阅文档)
例子:
// //条件查询
// LambdaQueryWrapper<Book> lqw = new LambdaQueryWrapper<>();
// // =
// lqw.eq(Book::getName,"数字媒体").eq(Book::getType,"数字媒体");
//
// Book book = bookDao.selectOne(lqw);
// System.out.println(book);
//范围查询
// LambdaQueryWrapper<Book> lqw = new LambdaQueryWrapper<>();
// // 范围查询 lt le gt ge eq between
// lqw.between(Book::getId,2,5);
// System.out.println(bookDao.selectList(lqw));
//模糊查询
LambdaQueryWrapper<Book> lqw = new LambdaQueryWrapper<>();
//like ''% likeLeft %''
lqw.like(Book::getName,"数");
System.out.println(bookDao.selectList(lqw));
4.6 字段映射与表名映射
4.6.1 问题一:表字段与编码属性设置不同步
4.6.2 问题二:编码中添加了数据库中未定义的属性
4.6.3 问题三:采用默认查询开放了更多的字段查看权限
4.6.4 问题四:表名开发与编码开发设计不同步
5 DML编程控制
5.2 Insert
5.2.1 id生成策略
不同的表应用不同的策略:
5.2.2 全局配置
5.3 Delete
5.3.1 多记录操作
deleteBatchIds()方法:
void testDelete2(){
ArrayList<Integer> ids = new ArrayList<>();
ids.add(7);
ids.add(8);
ids.add(9);
bookDao.deleteBatchIds(ids);
}
selectBatchids()方法:
void testSelect2(){
ArrayList<Integer> ids = new ArrayList<>();
ids.add(1);
ids.add(2);
ids.add(3);
System.out.println(bookDao.selectBatchIds(ids));
}
5.3.2 逻辑删除
表面上删除数据,实际还保留:
流程:
利用全局配置简化:
5.4 乐观锁
6 快速开发
代码生成器(略)