1、快速开始1.1、现有一张 User 表,其表结构如下
id | name | age | emali |
---|---|---|---|
1 | Jone | 18 | test1@baomidou.com |
2 | Jack | 20 | test2@baomidou.com |
3 | Tom | 28 | test3@baomidou.com |
4 | Sandy | 21 | test4@baomidou.com |
5 | Billie | 24 | test5@baomidou.com |
- 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, 'test1@baomidou.com',0),(2, 'Jack', 20, 'test2@baomidou.com',0),(3, 'Tom', 28, 'test3@baomidou.com',0),(4, 'Sandy', 21, 'test4@baomidou.com',0),(5, 'Billie', 24, 'test5@baomidou.com',0);
1.2、引入依赖
- mybatis-plus-boot-starter
org.springframework.boot spring-boot-starter-web com.baomidou mybatis-plus-boot-starter 3.5.2 mysql mysql-connector-java runtime com.alibaba druid-spring-boot-starter 1.2.11 org.springframework.boot spring-boot-starter-test test junit junit test
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;@Repositorypublic interface UserMapper extends BaseMapper {}
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;@SpringBootTestclass MybatisPlusApplicationTests { @Autowired private UserMapper userMapper; @Test public void testSelect() { System.out.println(("----- selectAll method test ------")); userMapper.insert(new User( "古力娜扎", 18, "test1@baomidou.com")); List 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 {}
- 注意 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 */@Servicepublic class UserServiceImpl extends ServiceImpl 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;@SpringBootTestclass MybatisPlusApplicationTests { @Autowired private UserServiceImpl userService; @Test void contextLoads() { Collection userList = new ArrayList(); userList.add(new User("hhh", 18, "test1@baomidou.com")); userList.add(new User("sss", 18, "test1@baomidou.com")); userList.add(new User("ddd", 18, "test1@baomidou.com")); userService.saveBatch(userList); System.out.println(userService.list()); }}
3、Service CURD3.1、save
// 插入一条记录(选择字段,策略插入)boolean save(T entity);// 插入(批量)boolean saveBatch(Collection entityList);// 插入(批量)boolean saveBatch(Collection entityList, int batchSize);
3.2、saveOrUpdate
// TableId 注解存在更新记录,否插入一条记录boolean saveOrUpdate(T entity);// 根据updateWrapper尝试更新,否继续执行saveOrUpdate(T)方法boolean saveOrUpdate(T entity, Wrapper updateWrapper);// 批量修改插入boolean saveOrUpdateBatch(Collection entityList);// 批量修改插入boolean saveOrUpdateBatch(Collection entityList, int batchSize);
3.3、remove
// 根据 entity 条件,删除记录boolean remove(Wrapper queryWrapper);// 根据 ID 删除boolean removeById(Serializable id);// 根据 columnMap 条件,删除记录boolean removeByMap(Map columnMap);// 删除(根据ID 批量删除)boolean removeByIds(Collection idList);
3.4、update
// 根据 UpdateWrapper 条件,更新记录 需要设置sqlsetboolean update(Wrapper updateWrapper);// 根据 whereWrapper 条件,更新记录boolean update(T updateEntity, Wrapper whereWrapper);// 根据 ID 选择修改boolean updateById(T entity);// 根据ID 批量更新boolean updateBatchById(Collection entityList);// 根据ID 批量更新boolean updateBatchById(Collection entityList, int batchSize);
3.5、get
// 根据 ID 查询T getById(Serializable id);// 根据 Wrapper,查询一条记录。结果集,如果是多个会抛出异常,随机取一条加上限制条件 wrapper.last("LIMIT 1")T getOne(Wrapper queryWrapper);// 根据 Wrapper,查询一条记录T getOne(Wrapper queryWrapper, boolean throwEx);// 根据 Wrapper,查询一条记录Map getMap(Wrapper queryWrapper);// 根据 Wrapper,查询一条记录 V getObj(Wrapper queryWrapper, Function mapper);
3.6、List
// 查询所有List list();// 查询列表List list(Wrapper queryWrapper);// 查询(根据ID 批量查询)Collection listByIds(Collection idList);// 查询(根据 columnMap 条件)Collection listByMap(Map columnMap);// 查询所有列表List<Map> listMaps();// 查询列表List<Map> listMaps(Wrapper queryWrapper);// 查询全部记录List
3.7、page
// 无条件分页查询IPage page(IPage page);// 条件分页查询IPage page(IPage page, Wrapper queryWrapper);// 无条件分页查询IPage<Map> pageMaps(IPage page);// 条件分页查询IPage<Map> pageMaps(IPage page, Wrapper 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 */@Configurationpublic 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 page = new Page(99999, 20); final Page voteRecordPage = voteRecordMapper.selectPage(page, null); voteRecordPage.getRecords().forEach(System.out::println); System.out.println(System.currentTimeMillis() -l); }