1、快速開始 1.1、現有一張 User 表,其表結構如下 | id | name | age | emali | | | | | | | 1 | Jone | 18 | [email protected] | | 2 | Jack | 20 | [email protected] | | 3 ...
1、快速開始
1.1、現有一張 User 表,其表結構如下
id | name | age | emali |
---|---|---|---|
1 | Jone | 18 | [email protected] |
2 | Jack | 20 | [email protected] |
3 | Tom | 28 | [email protected] |
4 | Sandy | 21 | [email protected] |
5 | Billie | 24 | [email protected] |
- SQL語句
DROP TABLE IF EXISTS user;
CREATE TABLE `user` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主鍵ID',
`name` varchar(30) DEFAULT NULL COMMENT '姓名',
`age` int DEFAULT NULL COMMENT '年齡',
`email` varchar(50) DEFAULT NULL COMMENT '郵箱',
`is_deleted` int NOT NULL DEFAULT '0' COMMENT '邏輯刪除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
DELETE FROM user;
INSERT INTO user (id, name, age, email,is_deleted) VALUES
(1, 'Jone', 18, '[email protected]',0),
(2, 'Jack', 20, '[email protected]',0),
(3, 'Tom', 28, '[email protected]',0),
(4, 'Sandy', 21, '[email protected]',0),
(5, 'Billie', 24, '[email protected]',0);
1.2、引入依賴
- mybatis-plus-boot-starter
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.11</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
1.3、配置資料庫連接,開啟控制台SQL語句輸出
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://114.67.111.175:3306/test
username: wq
password: 123456
#開啟控制台日誌
mybatis-plus:
configuration:
#控制台列印sql語句方便調試sql語句執行錯誤
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
#這個不在控制台列印查詢結果,但是在log4j2中列印
#log-impl: org.apache.ibatis.logging.log4j2.Log4j2Impl
- 在 Spring Boot 啟動類中添加 @MapperScan 註解,掃描 Mapper 文件夾:
@SpringBootApplication
@MapperScan("com.wanqi.mybatisplus.mapper")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
1.4、編碼
- 實體類User
package com.wanqi.mybatisplus.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
@TableName("user") //指定表名
public class User {
//type = IdType.AUTO自增欄位需要修改資料庫主鍵為自增
//value指定對應主鍵欄位名,type指定id生成策略(預設策略為雪花演算法)
@TableId(value = "id", type = IdType.AUTO)
private Long id;
//value資料庫欄位值
@TableField(value = "name")
private String name;
private Integer age;
private String email;
private Integer isDeleted;
public User(Long id, String name, Integer age, String email) {
this.id = id;
this.name = name;
this.age = age;
this.email = email;
}
public User(String name, Integer age, String email) {
this.name = name;
this.age = age;
this.email = email;
}
public User() {
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Integer getIsDeleted() {
return isDeleted;
}
public void setIsDeleted(Integer isDeleted) {
this.isDeleted = isDeleted;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", email='" + email + '\'' +
", isDeleted=" + isDeleted +
'}';
}
}
- 編寫 Mapper 包下的 UserMapper介面
import com.wanqi.mybatisplus.pojo.User;
import org.springframework.stereotype.Repository;
@Repository
public interface UserMapper extends BaseMapper<User> {
}
1.5、測試使用
package com.wanqi.mybatisplus;
import com.wanqi.mybatisplus.mapper.UserMapper;
import com.wanqi.mybatisplus.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.ArrayList;
import java.util.Collection;
import java.util.List;
@SpringBootTest
class MybatisPlusApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
public void testSelect() {
System.out.println(("----- selectAll method test ------"));
userMapper.insert(new User( "古力娜扎", 18, "[email protected]"));
List<User> userList = userMapper.selectList(null);
userList.forEach(System.out::println);
}
}
2、批量操作
2.1、增加Service 層代碼
package com.wanqi.mybatisplus.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.wanqi.mybatisplus.pojo.User;
/**
* @Description TODO
* @Version 1.0.0
* @Date 2022/9/1
* @Author wandaren
*/
public interface UserService extends IService<User> {
}
- 註意 UserServiceImpl 必須要繼承 MP 框架中的 ServiceImpl,不然要重寫很多方法。
package com.wanqi.mybatisplus.service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.wanqi.mybatisplus.mapper.UserMapper;
import com.wanqi.mybatisplus.pojo.User;
import org.springframework.stereotype.Service;
/**
* @Description TODO
* @Version 1.0.0
* @Date 2022/9/1
* @Author wandaren
*/
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User>
implements UserService{
}
2.2、測試使用
package com.wanqi.mybatisplus;
import com.wanqi.mybatisplus.mapper.UserMapper;
import com.wanqi.mybatisplus.pojo.User;
import com.wanqi.mybatisplus.service.UserServiceImpl;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
@SpringBootTest
class MybatisPlusApplicationTests {
@Autowired
private UserServiceImpl userService;
@Test
void contextLoads() {
Collection<User> userList = new ArrayList<>();
userList.add(new User("hhh", 18, "[email protected]"));
userList.add(new User("sss", 18, "[email protected]"));
userList.add(new User("ddd", 18, "[email protected]"));
userService.saveBatch(userList);
System.out.println(userService.list());
}
}
3、Service CURD
3.1、save
// 插入一條記錄(選擇欄位,策略插入)
boolean save(T entity);
// 插入(批量)
boolean saveBatch(Collection<T> entityList);
// 插入(批量)
boolean saveBatch(Collection<T> entityList, int batchSize);
3.2、saveOrUpdate
// TableId 註解存在更新記錄,否插入一條記錄
boolean saveOrUpdate(T entity);
// 根據updateWrapper嘗試更新,否繼續執行saveOrUpdate(T)方法
boolean saveOrUpdate(T entity, Wrapper<T> updateWrapper);
// 批量修改插入
boolean saveOrUpdateBatch(Collection<T> entityList);
// 批量修改插入
boolean saveOrUpdateBatch(Collection<T> entityList, int batchSize);
3.3、remove
// 根據 entity 條件,刪除記錄
boolean remove(Wrapper<T> queryWrapper);
// 根據 ID 刪除
boolean removeById(Serializable id);
// 根據 columnMap 條件,刪除記錄
boolean removeByMap(Map<String, Object> columnMap);
// 刪除(根據ID 批量刪除)
boolean removeByIds(Collection<? extends Serializable> idList);
3.4、update
// 根據 UpdateWrapper 條件,更新記錄 需要設置sqlset
boolean update(Wrapper<T> updateWrapper);
// 根據 whereWrapper 條件,更新記錄
boolean update(T updateEntity, Wrapper<T> whereWrapper);
// 根據 ID 選擇修改
boolean updateById(T entity);
// 根據ID 批量更新
boolean updateBatchById(Collection<T> entityList);
// 根據ID 批量更新
boolean updateBatchById(Collection<T> entityList, int batchSize);
3.5、get
// 根據 ID 查詢
T getById(Serializable id);
// 根據 Wrapper,查詢一條記錄。結果集,如果是多個會拋出異常,隨機取一條加上限制條件 wrapper.last("LIMIT 1")
T getOne(Wrapper<T> queryWrapper);
// 根據 Wrapper,查詢一條記錄
T getOne(Wrapper<T> queryWrapper, boolean throwEx);
// 根據 Wrapper,查詢一條記錄
Map<String, Object> getMap(Wrapper<T> queryWrapper);
// 根據 Wrapper,查詢一條記錄
<V> V getObj(Wrapper<T> queryWrapper, Function<? super Object, V> mapper);
3.6、List
// 查詢所有
List<T> list();
// 查詢列表
List<T> list(Wrapper<T> queryWrapper);
// 查詢(根據ID 批量查詢)
Collection<T> listByIds(Collection<? extends Serializable> idList);
// 查詢(根據 columnMap 條件)
Collection<T> listByMap(Map<String, Object> columnMap);
// 查詢所有列表
List<Map<String, Object>> listMaps();
// 查詢列表
List<Map<String, Object>> listMaps(Wrapper<T> queryWrapper);
// 查詢全部記錄
List<Object> listObjs();
// 查詢全部記錄
<V> List<V> listObjs(Function<? super Object, V> mapper);
// 根據 Wrapper 條件,查詢全部記錄
List<Object> listObjs(Wrapper<T> queryWrapper);
// 根據 Wrapper 條件,查詢全部記錄
<V> List<V> listObjs(Wrapper<T> queryWrapper, Function<? super Object, V> mapper);
3.7、page
// 無條件分頁查詢
IPage<T> page(IPage<T> page);
// 條件分頁查詢
IPage<T> page(IPage<T> page, Wrapper<T> queryWrapper);
// 無條件分頁查詢
IPage<Map<String, Object>> pageMaps(IPage<T> page);
// 條件分頁查詢
IPage<Map<String, Object>> pageMaps(IPage<T> page, Wrapper<T> queryWrapper);
4、邏輯刪除
- 方式一:使用註解TableLogic
// value邏輯未刪除值,delval邏輯刪除值
@TableLogic(value = "0", delval = "1")
private Integer isDeleted;
- 方式二:使用全局配置
mybatis-plus:
global-config:
db-config:
logic-delete-field: isDeleted # 全局邏輯刪除的實體欄位名
logic-delete-value: 1 # 邏輯已刪除值(預設為 1)
logic-not-delete-value: 0 # 邏輯未刪除值(預設為 0)
5、分頁
- 配置
package com.wanqi.mybatisplus.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;
/**
* @Description TODO
* @Version 1.0.0
* @Date 2022/9/24
* @Author wandaren
*/
@Configuration
public class CustomMyBatisPlusConfig {
/**
* 分頁插件,一緩和二緩遵循mybatis的規則
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
// 設置請求的頁面大於最大頁後操作, true調回到首頁,false 繼續請求 預設false
// paginationInnerInterceptor.setOverflow(false);
// 設置最大單頁限制數量,預設 500 條,-1 不受限制
// paginationInnerInterceptor.setMaxLimit(500L);
interceptor.addInnerInterceptor(paginationInnerInterceptor);
return interceptor;
}
}
- 測試
@Test
void page() {
long l = System.currentTimeMillis();
Page<VoteRecord> page = new Page<>(99999, 20);
final Page<VoteRecord> voteRecordPage = voteRecordMapper.selectPage(page, null);
voteRecordPage.getRecords().forEach(System.out::println);
System.out.println(System.currentTimeMillis() -l);
}