一、基础入门(springboot整合MybatisPlus入门程序)
- 1.创建springboot模块,配置基础信息,模块使用的技术及仅选择MySql
- 2.pom文件手动添加起步依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.16</version>
</dependency>
- 3.制作实体类与表结构,类名与表名要对应,属性名与字段名要对应
- 4.设置jdbc参数
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatisplus_db?serverTimezone=UTC
username: root
password: root
- 5.dao层定义数据接口,继承BaseMapper
@Mapper
public interface UserDao extends BaseMapper<User> {
}
- 6.测试类中注入dao接口,测试功能
@SpringBootTest
public class Mybatisplus01QuickstartApplicationTests {
@Autowired
private UserDao userDao;
@Test
void testGetAll() {
List<User> userList = userDao.selectList(null);
System.out.println(userList);
}
}
二、标准数据层开发(CRUD操作)

图片.png
package com.itheima;
import com.itheima.dao.UserDao;
import com.itheima.domain.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
class Mybatisplus01QuickstartApplicationTests {
@Autowired
private UserDao userDao;
@Test
void testSave() {
User user = new User();
user.setName("黑马程序员");
user.setPassword("itheima");
user.setAge(12);
user.setTel("4006184000");
userDao.insert(user);
}
@Test
void testDelete() {
userDao.deleteById(1401856123725713409L);
}
@Test
void testUpdate() {
User user = new User();
user.setId(1L);
user.setName("Tom888");
user.setPassword("tom888");
userDao.updateById(user);
}
@Test
void testGetById() {
User user = userDao.selectById(2L);
System.out.println(user);
}
@Test
void testGetAll() {
List<User> userList = userDao.selectList(null);
System.out.println(userList);
}
}
三、Lombok插件介绍
- 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;
}
四、分页功能
- 设置分页拦截器作为Spring管理的bean
package com.example.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MybatisPlusConfig {
/**
* 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除)
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
- 执行分页查询
//分页查询
@Test
void testSelectPage(){
//1 创建IPage分页对象,设置分页参数
IPage<User> page=new Page<>(1,3);
//2 执行分页查询
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());
}
五、条件查询
条件查询方式
- 方式一:按条件查询
//方式一:按条件查询
QueryWrapper<User> qw=new QueryWrapper<>();
qw.lt("age", 18);
List<User> userList = userDao.selectList(qw);
System.out.println(userList);
- 方式二:lambda格式按条件查询
//方式二:lambda格式按条件查询
QueryWrapper<User> qw = new QueryWrapper<User>();
qw.lambda().lt(User::getAge, 10);
List<User> userList = userDao.selectList(qw);
System.out.println(userList);
- 方式三:lambda格式按条件查询(推荐)
//方式三:lambda格式按条件查询
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
lqw.lt(User::getAge, 10);
List<User> userList = userDao.selectList(lqw);
System.out.println(userList);
其他条件控制
//组合条件
@Test
void find4(){
//10-30岁
LambdaQueryWrapper<User> lqw=new LambdaQueryWrapper<>();
lqw.lt(User::getAge,"30").gt(User::getAge,"10");
List<User> users = userDao.selectList(lqw);
System.out.println(users);
}
@Test
void find5(){
//小于10 大于30
LambdaQueryWrapper<User> lqw=new LambdaQueryWrapper<>();
lqw.lt(User::getAge,"10").or().gt(User::getAge,"30");
List<User> users = userDao.selectList(lqw);
System.out.println(users);
}
//null值处理
@Test
void find6(){
Integer maxAge=null;
Integer minAge=10;
LambdaQueryWrapper<User> lqw=new LambdaQueryWrapper<>();
/*lqw.gt(minAge!=null,User::getAge,minAge);
lqw.lt(maxAge!=null,User::getAge,maxAge);*/
lqw.lt(maxAge!=null,User::getAge,maxAge).gt(minAge!=null,User::getAge,minAge);
List<User> users = userDao.selectList(lqw);
System.out.println(users);
}
//查询字段 未定义的属性 分组 分页
@Test
void find7(){
//按id 姓名字段查询数据
QueryWrapper<User> qw=new QueryWrapper<>();
qw.select("id","user_name");
List<User> users = userDao.selectList(qw);
System.out.println(users);
}
@Test
void find8(){
//以姓名分组 并统计个数
QueryWrapper<User> qw=new QueryWrapper<>();
qw.select("count(*) as count,name ").groupBy("name");
// qw.groupBy("tel");
List<Map<String, Object>> maps = userDao.selectMaps(qw);
System.out.println(maps);
}
//查询条件
@Test
void find9(){
LambdaQueryWrapper<User> lqw=new LambdaQueryWrapper<>();
//模拟登录功能 查询name为snake password为123456的用户
lqw.eq(User::getUserName,"snake").eq(User::getPassword,"123456");
User user = userDao.selectOne(lqw);
System.out.println(user);
}
@Test
void find10(){
//按年龄区间查询
LambdaQueryWrapper<User> lqw=new LambdaQueryWrapper<>();
lqw.between(User::getAge,10,20);
List<User> users = userDao.selectList(lqw);
System.out.println(users);
}
@Test
void find11(){
//模糊查询 查询姓名以j开头的数据
LambdaQueryWrapper<User> lqw=new LambdaQueryWrapper<>();
lqw.likeRight(User::getUserName,"j");
List<User> users = userDao.selectList(lqw);
System.out.println(users);
}
@Test
void find12(){
//分组查询聚合函数
QueryWrapper<User> qw=new QueryWrapper<>();
qw.select("count(*) as 个数,tel").groupBy("tel");
List<Map<String, Object>> maps = userDao.selectMaps(qw);
System.out.println(maps);
}
//课后作业
@Test
void work(){
//查询用户年龄大于50岁的或者用户名以“j”为开头的,按照年龄降序排列,查询第2页,每页3条。 的用户列表信息
IPage<User> page=new Page<>(1,3);
LambdaQueryWrapper<User> lqw=new LambdaQueryWrapper<>();
lqw.likeRight(User::getUserName,"j").orderByDesc(User::getAge).gt(User::getAge,"10");
IPage<User> selectPage = userDao.selectPage(page, lqw);
System.out.println(selectPage.getRecords());
}
六、字段映射与表名映射
- 表字段与编码属性设计不同步
在模型类属性上方,使用@TableField属性注解,通过value属性,设置当前属性对应的数据库表中的字段关系。
图片.png - 编码中添加了数据库中未定义的属性
在模型类属性上方,使用@TableField注解,通过exist属性,设置属性在数据库表字段中是否存在,默认为true。此属性无法与value合并使用。
图片.png - 表名与编码开发设计不同步
在模型类上方,使用@TableName注解,通过value属性,设置当前类对应的数据库表名称。
图片.png
@Data
@TableName("tbl_user")
public class User {
/*
id为Long类型,因为数据库中id为bigint类型,
并且mybatis有自己的一套id生成方案,生成出来的id必须是Long类型
*/
private Long id;
private String name;
@TableField(value = "pwd",select = false)
private String password;
private Integer age;
private String tel;
@TableField(exist = false) //表示online字段不参与CRUD操作
private Boolean online;
}


