此部分为开发中用到的mp实用操作
1.分页查询
1.配置mp拦截器和分页插件(两个注解)
@Configuration
public class MyBatisConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
//1.创建拦截器
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
//2.创建分页插件
PaginationInnerInterceptor page = new PaginationInnerInterceptor(DbType.MYSQL);
//3.添加分页插件
mybatisPlusInterceptor.addInnerInterceptor(page);
//4.返回
return mybatisPlusInterceptor;
}
}
2.service层调用
(1)封装Page对象,page和size
(2)构造条件构造器(如果有条件查询)
(3)给page对象设置order规则
(4)调用selectPage,处理返回结果
@Override
public PageResult pageQuery(EmployeePageQueryDTO employeePageQueryDTO) {
//1.构造分页器
Page<Employee> page = Page.of(employeePageQueryDTO.getPage(), employeePageQueryDTO.getPageSize());
//2.构造查询条件
LambdaQueryWrapper<Employee> wrapper = new LambdaQueryWrapper<>();
if (StringUtils.isNotBlank(employeePageQueryDTO.getName())) {
wrapper.like(Employee::getUsername, employeePageQueryDTO.getName());
}
//3.查询
Page<Employee> p = baseMapper.selectPage(page, wrapper);
//4.返回分页查询封装结果
return new PageResult().builder()
.total(p.getTotal())
.records(p.getRecords())
.build();
}
2.条件构造器
LamdaQueryWrapper中通过 User::getId 类反射的方式获取 数据库中的列名 来避免硬编码
3.自定义SQL
sql语句中复杂的where条件由service中的mp自动创建,将wrapper传入到mapper层,mp会将wrapper自动拼接到自定义的sql语句中
注:mapper层方法参数中wrapper需要使用@Param注解声明"ew"
以下部分为ssm课程中的mp笔记
一.快速开发
1.mp开发
(1)创建项目导入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.16</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
(2)配置文件
设置连接数据库参数
spring:
profiles:
active: dev
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/db1
username: root
password: "123456"
main:
banner-mode: off
# 开启mp的日志(输出到控制台)
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
banner: false
(3)创建pojo实体类
(4)数据层接口
@Mapper
public interface BookService extends BaseMapper<Book> {
}
注:
1.mapper注解
2.继承basemapper,泛型为实体类
(5)test测试
2.创建实体类注解工具---Lombok
(1)导入依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
(2)添加@Data注解
注:
该注解只提供无参构造方法,且手写有参构造后会覆盖无参(同默认情况),可以添加
@NoArgsConstructor
@AllArgsConstructor
来实现 有/无参构造方法
3.标准CRUD开发
4.分页查询
(1)配置mp拦截器和分页拦截器(加两个注解)
@Configuration
public class mpconfig {
@Bean
public MybatisPlusInterceptor getceptor(){
MybatisPlusInterceptor mp=new MybatisPlusInterceptor();
mp.addInnerInterceptor(new PaginationInnerInterceptor());
return mp;
}
}
(2)测试分页查询
@Test
void getPage(){
//IPage对象封装了分页操作相关的数据
IPage page = new Page(2,3);//当前页码数,每页数据数量
bookService.selectPage(page,null);
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());
}
附:开启mp日志---yml文件配置
二.DQL
1.条件查询
//方式一:按条件查询
QueryWrapper qw = new QueryWrapper();
qw.lt("age",18);
List<User> userList = userDao.selectList(qw);
//方式二:lambda格式按条件查询
QueryWrapper<User> qw = new QueryWrapper<User>();
qw.lambda().lt(User::getAge, 10);
List<User> userList = userDao.selectList(qw);
//方式三:lambda格式按条件查询
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
lqw.lt(User::getAge, 10);
List<User> userList = userDao.selectList(lqw);
//并且与或者关系
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
//并且关系:链式编程
lqw.lt(User::getAge, 30).gt(User::getAge, 10);
//或者关系:.or().
lqw.lt(User::getAge, 10).or().gt(User::getAge, 30);
List<User> userList = userDao.selectList(lqw);
System.out.println(userList);
2.条件查询null值的判定处理
第一位添加一个判断参数
//模拟页面传递过来的查询数据
UserQuery uq = new UserQuery();
uq.setAge(10);
uq.setAge2(30);
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
//先判定第一个参数是否为true,如果为true连接当前条件
lqw.lt(null != uq.getAge2(), User::getAge, uq.getAge2());
lqw.gt(null != uq.getAge(), User::getAge, uq.getAge());
3.查询投影
对查询出来的结果作处理:指定字段,分组,计数等
(1)查询结果包含模型类中部分属性
//查询投影
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
//方式1--指定列
lqw.select(User::getId,User::getName,User::getAge);
QueryWrapper<User> lqw = new QueryWrapper<User>();
//方式2--指定列
lqw.select("id","name","age","tel");
List<User> userList = userDao.selectList(lqw);
System.out.println(userList);
(2)查询结果包含模型类未定义属性
QueryWrapper<User> lqw = new QueryWrapper<User>();
lqw.select("count(*) as count, tel");
lqw.groupBy("tel");
List<Map<String, Object>> userList = userDao.selectMaps(lqw);
System.out.println(userList);
4.查询条件
(1)取值查询
//条件查询
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
//等同于=
lqw.eq(User::getName, "Jerry").eq(User::getPassword, "jerry");
User loginUser = userDao.selectOne(lqw);
System.out.println(loginUser);
(2)范围匹配
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
//范围查询 lt le gt ge eq between
lqw.between(User::getAge, 10, 30);
List<User> userList = userDao.selectList(lqw);
System.out.println(userList);
(3)模糊匹配
@Test
void testGetLike() {
LambdaQueryWrapper<Book> lqw = new LambdaQueryWrapper<>();
//查找书名S开头
//lqw.like(Book::getName,"S");
//查找%论(left代表%位置)
lqw.likeLeft(Book::getType, "论");
List<Book> books = bookDao.selectList(lqw);
System.out.println(books);
}
5.映射匹配兼容性
(1)pojo类名和数据库名不同
@TableName("tbl_book")
(2)pojo属性和数据库字段名不同
@TableField(value = "...")
(3)pojo类中有数据库字段名没有的属性导致查询封装报错
(比如User的Online属性,数据库中不存在)
@TableField(exist = false)
(4)查询时隐藏某个属性名(隐私处理)
(比如从数据库查出pwd需要隐藏)
@TableField(select = false)
三.DML
1.主键生成策略控制
(1)pojo类中--@TableID(typ= ..)
(2)yml文件设定全局配置
# mp日志
mybatis-plus:
global-config:
db-config:
# 设置id自增策略
id-type: assign_id
# 设置数据库表名前缀
table-prefix: tbl_
2.多条删除
userDao.deleteBatchIds(list);