mybatisplus复习(黑马)
Posted 姜小白程序
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatisplus复习(黑马)相关的知识,希望对你有一定的参考价值。
学习目标
能够基于MyBatisPlus完成标准Dao开发
能够掌握MyBatisPlus的条件查询
能够掌握MyBatisPlus的字段映射与表名映射
能够掌握id生成策略控制
能够理解代码生成器的相关配置
一、MyBatisPlus简介
MyBatisPlus(简称MP)是基于MyBatis框架基础上开发的增强型工具,旨在简化开发、提高效率
开发方式
基于MyBatis使用MyBatisPlus
基于Spring使用MyBatisPlus
基于SpringBoot使用MyBatisPlus
1. 入门案例
①:创建新模块,选择Spring初始化,并配置模块相关基础信息
②:选择当前模块需要使用的技术集(仅保留JDBC)
③:手动添加MyBatisPlus起步依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--添加mybatisplus的依赖 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.16</version>
</dependency>
注意事项1:由于mp并未被收录到idea的系统内置配置,无法直接选择加入
注意事项2:如果使用Druid数据源,需要导入对应坐标
④:制作实体类与表结构
(类名与表名对应,属性名与字段名对应)
新建一个数据库mybatisplyus
⑤:设置Jdbc参数(application.yml)
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatisplus?serverTimezone=UTC
username: root
password: 123456
⑥:定义数据接口,继承BaseMapper
//使用mp,dao的写法,只需要继承一个父亲接口就可以BaseMapper,还要注意加上泛型
@Mapper
public interface UserDao extends BaseMapper<User>
⑦:测试类中注入dao接口,测试功能
查询所有
@SpringBootTest
public class TestUserDao
@Autowired
private UserDao userDao;
//查询所有
@Test
void testFindAll()
List<User> list = userDao.selectList(null);
System.out.println("list=" +list);
2. MyBatisPlus概述
问题导入
通过入门案例制作,MyBatisPlus的优点有哪些?
2.1 MyBatis介绍
MyBatisPlus(简称MP)是基于MyBatis框架基础上开发的增强型工具,旨在简化开发、提高效率
2.2 MyBatisPlus特性
无侵入:只做增强不做改变,不会对现有工程产生影响
强大的 CRUD 操作:内置通用 Mapper,少量配置即可实现单表CRUD 操作
支持 Lambda:编写查询条件无需担心字段写错
支持主键自动生成
内置分页插件
……
二、标准数据层开发
1. MyBatisPlus的CRUD操作
下面用MP进行CURD
1.1添加
// 新增
@Test
void testAdd()
User user = new User();
user.setName("黑马程序员");
user.setPassword("itheima");
user.setAge(12);
user.setTel("4006184000");
int row = userDao.insert(user);
System.out.println("row = " + row);
1.2 删除
这里面因为刚才不小心多增加一个相同内容 所以这里面删除的话id就用雪花
//删除
@Test
void testDelete()
// int row = userDao.deleteById(3);
int row = userDao.deleteById(1631599267871215618L);
System.out.println("row = " + row);
我们现在把另一个也删除了
1.3 修改
//修改
@Test
void testUpdate()
//1.先查询数据
User user = userDao.selectById(2);
user.setPassword("777");
//2.修改
int row = userDao.updateById(user);
System.out.println("row = " + row);
1.4 查询单个
//查询单个
@Test
void testFindById()
User user = userDao.selectById(2);
System.out.println("user = " + user);
2. Lombok插件介绍
问题导入
有什么简单的办法可以自动生成实体类的GET、SET方法?
Lombok,一个Java类库,提供了一组注解,简化POJO实体类开发。
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
常用注解:==@Data==,为当前实体类在编译期设置对应的get/set方法,无参/无参构造方法,toString方法,hashCode方法,equals方法等
package com.itheima.domain;
import lombok.*;
/*
1 生成getter和setter方法:@Getter、@Setter
生成toString方法:@ToString
生成equals和hashcode方法:@EqualsAndHashCode
2 统一成以上所有:@Data
3 生成空参构造: @NoArgsConstructor
生成全参构造: @AllArgsConstructor
4 lombok还给我们提供了builder的方式创建对象,好处就是可以链式编程。 @Builder【扩展】
*/
@Data
public class User
private Long id;
private String name;
private String password;
private Integer age;
private String tel;
3. MyBatisPlus分页功能
问题导入
思考一下Mybatis分页插件是如何用的?
3.1 分页功能接口
3.2 MyBatisPlus分页使用
①:执行分页查询
Ipage 接口
用MP后 是有一个selectPage() 方法 然后这个方法传进去一个对象page 这里面就已经包装了查第几页 每页查第多少条
//分面查询
@Test
void testFindPage()
/** @param current 当前页
* @param size 每页显示条数*/
//1 创建IPage分页对象,设置分页参数 当前页为第一页 每页显示条数为2条
//IPage<User> page =new Page<>(1,2);
//1 创建IPage分页对象,设置分页参数 当前页为第二页 每页显示条数为2条
IPage<User> page =new Page<>(2,2);
//2 执行分页查询
IPage<User> iPage = userDao.selectPage(page, null);
//3 获取分页结果
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());
②:设置分页拦截器作为Spring管理的bean
@Configuration
public class MybatisPlusConfig
/*配置分页拦截器,需要打上@Bean的注解,暴露给spring使用*/
@Bean
public MybatisPlusInterceptor mpi()
//1 创建MybatisPlus拦截器对象
MybatisPlusInterceptor mpi =new MybatisPlusInterceptor();
//2 添加分页拦截器
mpi.addInnerInterceptor(new PaginationInnerInterceptor());
//返回MyBatisplus的拦截器对象
return mpi;
重新运行发现 这回正常了
3.3 开启MyBatisPlus日志
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatisplus?serverTimezone=UTC
username: root
password: 123456
# 开启mp的日志(输出到控制台)
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
3.4 解决日志打印过多问题
3.4.1 取消初始化spring日志打印
做法:在resources下新建一个logback.xml文件,名称固定,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
</configuration>
关于logback参考播客:https://www.jianshu.com/p/75f9d11ae011
3.4.2 取消SpringBoot启动banner图标
spring:
main:
banner-mode: off # 关闭SpringBoot启动图标(banner)
3.4.3 取消MybatisPlus启动banner图标
# mybatis-plus日志控制台输出
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
banner: off # 关闭mybatisplus启动图标
三、DQL编程控制
环境准备
依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--添加mybatisplus的依赖 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.16</version>
</dependency>
从demo1复制依赖 yml dao bean
测试类test.TestUserDao
1. 条件查询方式
MyBatisPlus将书写复杂的SQL查询条件进行了封装,使用编程的形式完成查询条件的组合
1.1 条件查询
无条件全查
@SpringBootTest
public class TestUserDao
@Autowired
private UserDao userDao;
@Test
public void findByCondition()
//查询年龄大于等于18岁 小于65岁的用户
//1.构建条件对象
QueryWrapper<User> qw =new QueryWrapper<>();
//1.1 添加条件
//2.执行查询
List<User> list = userDao.selectList(qw);
System.out.println("list = " + list);
1.1.1 方式一:按条件查询
@SpringBootTest
public class TestUserDao
@Autowired
private UserDao userDao;
@Test
public void findByCondition()
//查询年龄大于等于18岁 小于65岁的用户
//1.构建条件对象
QueryWrapper<User> qw =new QueryWrapper<>();
//1.1 添加条件
qw.ge("age",18);
qw.lt("age",65);
//2.执行查询
List<User> list = userDao.selectList(qw);
System.out.println("list = " + list);
链式写法
`@SpringBootTest
public class TestUserDao
@Autowired
private UserDao userDao;
@Test
public void findByCondition()
//查询年龄大于等于18岁 小于65岁的用户
//1.构建条件对象
QueryWrapper<User> qw =new QueryWrapper<>();
//1.1 添加条件
//常规
// qw.ge("age",18);
// qw.lt("age",65);
//链式写法
qw.ge("age",18).lt("age",65);
//2.执行查询
List<User> list = userDao.selectList(qw);
System.out.println("list = " + list);
1.1.2 方式二:lambda格式按条件查询
//使用条件查询[使得lambda格式按条件查询]
@Test
public void findByCondition02()
//查询年龄大于等于18岁 小于65岁的用户
//1.构建条件对象
QueryWrapper<User> qw =new QueryWrapper<>();
//1.1 添加条件
//常规
qw.lambda().ge(User::getAge,18).lt(User::getAge,65);
//2.执行查询
List<User> list = userDao.selectList(qw);
System.out.println("list = " + list);
1.1.3 方式三:lambda格式按条件查询(推荐)
//使用条件查询[使得lambda格式按条件查询(推荐)]
@Test
public void findByCondition03()
//查询年龄大于等于18岁 小于65岁的用户
//1.构建条件对象
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
//1.1 添加条件
//使用方法引用定位列的名字,可以很好的防止手动写列名,引发的一些问题。
//常规
lqw.ge(User::getAge,18);
lqw.lt(User::getAge,65);
//2.执行查询
List<User> list = userDao.selectList(lqw);
System.out.println("list = " + list);
1.2 组合条件
1.2.1 并且关系(and)
以上是关于mybatisplus复习(黑马)的主要内容,如果未能解决你的问题,请参考以下文章
黑马程序员SSM框架教程_Spring+SpringMVC+MyBatisPlus笔记(自学用,持续更新)
黑马Java笔记+踩坑汇总JavaSE+JavaWeb+SSM+SpringBoot+瑞吉外卖+SpringCloud/SpringCloudAlibaba+黑马旅游+谷粒商城