一、什么是MyBatisPlus及和MyBatisPlus的关系
MyBatis Plus是一个开源的Java持久层框架,它是在MyBatis基础上进行扩展和增强的。
MyBatis Plus提供了更简单、更便捷的API,使得使用MyBatis更加方便和高效。它可以减少开发人员的编码量,提高开发效率。因此,可以说MyBatis Plus是MyBatis的增强版或扩展版。
二、 MyBatisPlus特性
- 无侵入:只做增强不做改变,不会对现有工程产生影响
- 强大的 CRUD 操作:内置通用 Mapper,少量配置即可实现单表CRUD 操作
- 支持 Lambda:编写查询条件无需担心字段写错
- 支持主键自动生成
- 内置分页插件
三、MyBatisPlus的CRUD操作
具体代码实现功能如下:
导入所需依赖
<!-- springboot父依赖 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.5</version>
</parent>
<properties>
<!-- jdk版本 -->
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.11</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
</dependency>
<!-- 当前WEB项目需要的依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 集成Junit依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
首先创建数据库(User表)
create database if not exists mybatisplus_db character set utf8;
use mybatisplus_db;
CREATE TABLE user (
id bigint(20) primary key auto_increment,
name varchar(32) not null,
password varchar(32) not null,
age int(3) not null ,
tel varchar(32) not null
);
insert into user values(null,'tom','123456',12,'12345678910');
insert into user values(null,'jack','123456',8,'12345678910');
insert into user values(null,'jerry','123456',15,'12345678910');
insert into user values(null,'tom','123456',9,'12345678910');
insert into user values(null,'snake','123456',28,'12345678910');
insert into user values(null,'张益达','123456',22,'12345678910');
insert into user values(null,'张大炮','123456',16,'12345678910');
yml配置文件(包含连接数据库、日志控制台输出、关闭mybatisplus启动图标)
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mpdb?serverTimezone=UTC
username: root
password: root
# mybatis-plus日志控制台输出
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
banner: off # 关闭mybatisplus启动图标
db-config: #全局配置
table-prefix: tb_
id-type: assign_id
#### 根据数据库创建的实体类(该实现类以User表为例)
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor;
import javax.management.relation.Role; import java.util.List;
@Data @AllArgsConstructor @NoArgsConstructor @Builder public class User { //AUTO:根据数据库主键生成策略 @TableId(type = IdType.AUTO)//数据库ID自增 该类型请确保数据库设置了 ID自增 否则无效 private Long id; @TableId private String name; @TableField(select = false) private String password; private Integer age; @TableField(value = "telephone") private String tel; @TableField(exist = false) private List roles; }
### Mapper层(主要就是要继承BaseMapper<T>接口)
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.itheima.Mp.pojo.User; import org.apache.ibatis.annotations.Mapper;
@Mapper public interface UserMapper extends BaseMapper {}
### UserMapperTest测试类(增删改查都有不同的使用方法)
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.itheima.Mp.Mapper.UserMapper;
import com.itheima.Mp.pojo.User; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest;
import java.util.Arrays; import java.util.List;
@SpringBootTest public class UserMapperTest {
@Autowired
private UserMapper userMapper;
/**
* 增加
*/
@Test
public void insertTest() {
//插入一条数据
// User user = User.builder() // .name("张da") // .age(12) // .password("123") // .build(); //插入多条数据 for (int i = 0; i < 20; i++) { User user = User.builder() .name("张da" + i) .age(12) .password("123") .build();
int row = userMapper.insert(user);
System.out.println(row);
System.out.println(user.getId());
}
}
/**
* 删除
*/
@Test
public void deleteTest(){
int row = userMapper.deleteById(12);//根据ID删除
System.out.println(row);
row = userMapper.deleteBatchIds(Arrays.asList(13, 14, 15));//批量删除
System.out.println(row);
QueryWrapper<User> wrapper = new QueryWrapper<>();//用户实体对应数据库表user Entity 对象封装操作类
wrapper.like("name","Test"); //where name like '%Test%'
row = userMapper.delete(wrapper);//根据entity 条件,删除记录
System.out.println(row);
}
/**
* 更新
*/
@Test
public void update(){
User user = User.builder()
// .id(8L)
// .name("UPDATE")
.build();
//int row = userMapper.updateById(user);
UpdateWrapper<User> wrapper = new UpdateWrapper<>(); //Update 条件封装
wrapper.set("tel","123412341234"); // set tel = 123412341234
wrapper.eq("name","UPDATE"); //where name='UPDATE'
int row = userMapper.update(user, wrapper); //根据whereEntity 条件,更新数据
System.out.println(row);
}
```
/**
-
查询 */ @Test public void SelectTesst(){ User user = userMapper.selectById(1); //用户实体,对应数据库表 user 根据ID查询 System.out.println(user); List userList = userMapper.selectBatchIds(Arrays.asList(1, 5, 10)); userList.forEach(System.out::println);
LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>();//用户实体,对应数据库表 user 根据ID查询 lambdaQueryWrapper.eq(User::getName,"jack"); //where name ='tom' user= userMapper.selectOne(lambdaQueryWrapper); //根据entity条件,查询一条记录 System.out.println(user); Integer count = userMapper.selectCount(lambdaQueryWrapper); //根据 Wrapper 条件,查询总记录数 System.out.println(count); List users = userMapper.selectList(lambdaQueryWrapper);// 用户实体,对应数据库表user System.out.println(users); }
#### 分页查询需加拦截器
/**
- 分页查询 */ @Test public void pageTest(){ IPage ipage = new Page<>(1, 3); userMapper.selectPage(ipage,null); System.out.println(ipage); }
##### MybatisPlusConfig 拦截器类
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 {
@Bean
public MybatisPlusInterceptor interceptor(){
//mybatisplus的拦截器
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//增加分页拦截器
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return interceptor;
}
}
## LambdaQueryWrapper(AND OR 写法)
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.itheima.Mp.Mapper.UserMapper; import com.itheima.Mp.pojo.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 public class DQLTest {
@Autowired
private UserMapper userMapper;
/**
* OR
*/
@Test
public void orTest(){
LambdaQueryWrapper<User> lamvdaQueryWrapper = new LambdaQueryWrapper<>();
String name ="Test";
Integer age = 20;
lamvdaQueryWrapper
.between(age!=null,User::getAge,10,100) //BETWEEN 值1 AND 值2
.like(name!=null,User::getName,name) //LIKE '%值%'
.or()
.like(User::getPassword,"123");
//select 全字段 from user where age beween 10 and 20 and name like '%Test%' or password like '%123%'
List<User> userList = userMapper.selectList(lamvdaQueryWrapper);
for (User user : userList) {
System.out.println(user);
}
}
/**
* AND
*/
@Test
public void andTest() {
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<User>();
lambdaQueryWrapper.ge(User::getName,10); //where age >=10
lambdaQueryWrapper.lt(User::getTel,100); //age<100
//链接编程
lambdaQueryWrapper.like(User::getName,"Test") //name like '%Test%'
.likeRight(User::getTel,"13"); //tel like '13%'
List<User> userList = userMapper.selectList(lambdaQueryWrapper);
for (User user : userList) { //用户实体,对应数据库表user
System.out.println(user);
}
}
}
### 分组&排序
/**
* 排序
*/
@Test
public void groupByAndSortTest(){
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
// lambdaQueryWrapper.select(User::getPassword);
// lambdaQueryWrapper.groupBy(User::getPassword);
// List<User> userList = userMapper.selectList(lambdaQueryWrapper);
//String name = null;
String name = "Test";
lambdaQueryWrapper.orderBy(name!=null,true,User::getAge);
lambdaQueryWrapper.orderByDesc(User::getAge,User::getName); //order by age asc
List<User> userList = userMapper.selectList(lambdaQueryWrapper);
for (User user : userList) {
System.out.println(user);
}