mybatis-plus批量删除_在线教育项目(一)Mybatisplus学习

本文详细介绍了如何使用Mybatis-Plus进行数据库操作,包括增删改查、主键生成、自动填充、乐观锁和性能测试。重点讲解了物理和逻辑删除,如deleteById、deleteBatchIds以及逻辑删除的实现方式。此外,还涵盖了分页查询、复杂条件查询以及主键生成策略等内容。
摘要由CSDN通过智能技术生成

本文介绍了使用Mybatisplus进行数据库表的增删改查、主键生成、自动填充、乐观锁、性能测试知识,仅作入门学习,供项目使用。更多参考官方文档:https://mp.baomidou.com/guide/

环境准备

创建SpringBoot项目

1 导入依赖

<dependencies>        <dependency>            <groupId>org.springframework.bootgroupId>            <artifactId>spring-boot-starterartifactId>        dependency>        <dependency>            <groupId>org.springframework.bootgroupId>            <artifactId>spring-boot-starter-testartifactId>            <scope>testscope>            <exclusions>                <exclusion>                    <groupId>org.junit.vintagegroupId>                    <artifactId>junit-vintage-engineartifactId>                exclusion>            exclusions>        dependency>        <dependency>            <groupId>com.baomidougroupId>            <artifactId>mybatis-plus-boot-starterartifactId>            <version>3.0.5version>        dependency>        <dependency>            <groupId>mysqlgroupId>            <artifactId>mysql-connector-javaartifactId>        dependency>        <dependency>            <groupId>org.projectlombokgroupId>            <artifactId>lombokartifactId>        dependency>    dependencies>    <build>        <plugins>            <plugin>                <groupId>org.springframework.bootgroupId>                <artifactId>spring-boot-maven-pluginartifactId>            plugin>        plugins>    build>

2 新建数据库表

CREATE TABLE user( id BIGINT(20) NOT NULL COMMENT '主键ID', name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名', age INT(11) NULL DEFAULT NULL COMMENT '年龄', email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱', PRIMARY KEY (id) );
INSERT INTO user (id, name, age, email) VALUES(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');

3 编写application.properties配置文件

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driverspring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?&characterEncoding=utf8&serverTimezone=GMT%2B8serverTimezone=GMT%2B8spring.datasource.username=rootspring.datasource.password=root#mybatis日志mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

4 安装lombok插件(可选)

0ab625ba9ab765e4def9f03ee5605746.png

5 创建包entity编写User实体类

@Datapublic class User {    private Long id;    private String name;    private Integer age;    private String email;}

6 创建包mapper编写Mapper 接口

@Repositorypublic interface UserMapper extends BaseMapper<User> {}

7 创建config包编写myConfig配置类,将6中的mapper包引入

@MapperScan("com.zhu.mpdemo.mapper")@Configurationpublic class mpConfig {}

准备完毕!开始入门!

1 增加insert

@Testpublic void addUser() {    User user = new User();    user.setName("跳跳");    user.setAge(28);    user.setEmail("200@qq.com");    int insert = userMapper.insert(user);    System.out.println(insert);}

2 删除delete

物理删除:真实删除,将对应数据从数据库中删除,之后查询不到此条被删除。

按照Id删除deleteById

//按Id删除@Testpublic void deleteUser() {    int i = userMapper.deleteById(7L);    System.out.println(i);}

93b81c88be9f32b17acbc4b6ede0ed9d.png

按照Id批量删除deleteBatchIds

//按Id批量删除@Testpublic void deleteBatchUser() {    int i = userMapper.deleteBatchIds(Arrays.asList(6L, 8L, 4L));    System.out.println(i);}

6f91fd6f84f50d5b92676abb17537ebe.png

按照Map批量删除deleteByMap

//按Map条件删除@Testpublic void deleteByMap() {    HashMapmap = new HashMap<>();    map.put("name","Tom");    map.put("age",28);    int i = userMapper.deleteByMap(map);    System.out.println(i);}

103934a590d8469cd3cbbbb46569d235.png

逻辑删除

将对应数据中代表是否被删除字段状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录。

数据库表添加字段version,设置默认值为0,0表示保留,1表示删除

7bfca0a2f5a95f43ee4d6dffea0617e2.png

也可以在application.properties自定义代表逻辑删除的值,MybatisPlus3.0.5版本默认0表示保留,1表示删除。

mybatis-plus.global-config.db-config.logic-delete-value=1mybatis-plus.global-config.db-config.logic-not-delete-value=0

myconfig配置文件添加逻辑删除插件

//逻辑删除插件@Beanpublic ISqlInjector sqlInjector() {    return new LogicSqlInjector();}

实体类添加@TableLogic注解

@TableLogicprivate Integer deleted;
//逻辑删除@Testpublic void logicDelete() {    int i = userMapper.deleteById(9L);    System.out.println(i);}

实际执行的是UPDATE

4406192ec74c3deb6fcddc3a718ba835.png

ebd32aaa46bc20bd4f83765bf534a825.png

再次查询,逻辑删除的记录还在表中,但已查不到

07e1e2b530092735bbba5291342bdd7b.png

3 更新updateById

@Testpublic void updateUser() {    User user = new User();    user.setId(7L);    user.setAge(28);    user.setEmail("111@qq.com");    int i = userMapper.updateById(user);    System.out.println(i);}

4 查询select

查询所有selectList

@Testpublic void selectList() {    List users = userMapper.selectList(null);    for (User user : users) {        System.out.println(user);    }}

fdf9716de7457f14646b49aad2ade445.png

f72851228bf13c4110e30f087de9a58e.png

按照Id查询selectById

@Testpublic void selectById() {    User user = userMapper.selectById(1L);    System.out.println(user);}

e2e071d3192c2e1b282f75f59ee3b08b.png

按照Id批量查询selectBatchIds

//批量查询@Testpublic void testSelectBatchIds() {    List users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));    for (User user : users) {        System.out.println(user);    }}

a13576dc1c63d387b1be1efc117a6bab.png

分页查询selectPage

myconfig中添加分页插件

//分页插件@Beanpublic PaginationInterceptor paginationInterceptor() {    return new PaginationInterceptor();}
//分页查询@Testpublic void testSelectPage() {    //页数,记录数    Page page = new Page<>(1, 5);    userMapper.selectPage(page, null);        //查询到的记录        System.out.println("查询到的记录");        List records = page.getRecords();        for (User record : records) {            System.out.println(record);        }            //当前页    System.out.println("当前页:"+page.getCurrent());    //总页数    System.out.println("总页数:"+page.getPages());    //每页显示的记录数    System.out.println("每页显示的记录数:"+page.getSize());    //总记录数    System.out.println("总记录数:"+page.getTotal());    //当前页是否有下一页    System.out.println("当前页是否有下一页:"+page.hasNext());    //当前页是否有上一页    System.out.println("当前页是否有上一页:"+page.hasPrevious());}

459f89330a4684a892387222743f58fa.png

复杂条件查询

对于联表查询,还是需要Mybatis中XML来操作。

63a9072fb595d48610f0d46467313492.png

常用的是QueryWrapper类,其中的方法如下:

e84a6a55ceb9ad88e8c55a20f102e0e1.png

ge

@Testpublic void testQueryWrapper() {    QueryWrapper queryWrapper = new QueryWrapper<>();    //查询所有age>=24   queryWrapper.ge("age", 24);    List users = userMapper.selectList(queryWrapper);    for (User user : users) {        System.out.println(user);    }

d38d22b83d57500ff39d17978ab6e43f.png

between

@Testpublic void testQueryWrapper() {    QueryWrapper queryWrapper = new QueryWrapper<>();    //查询20到25之间      queryWrapper.between("age",20,25);    List users = userMapper.selectList(queryWrapper);    for (User user : users) {        System.out.println(user);    }

207c77c9928287d5a8eeca5be024747b.png

模糊查询

@Testpublic void testQueryWrapper() {    QueryWrapper queryWrapper = new QueryWrapper<>();      queryWrapper.like("name","大");    List users = userMapper.selectList(queryWrapper);    for (User user : users) {        System.out.println(user);    }

fc4c5e247f756acdfaede09f06c88619.png

查询指定列

@Testpublic void testQueryWrapper() {    QueryWrapper queryWrapper = new QueryWrapper<>();         queryWrapper.select("id", "name", "age");    List users = userMapper.selectList(queryWrapper);    for (User user : users) {        System.out.println(user);    }

46498ada2a265fcb6b4a06bdf3cb8035.png

5 Mybatis-Plus3.0.5主键生成策略

30befee47106b5ec291b2716feca7a71.png

public enum IdType {    AUTO(0),      //数据库ID自增    NONE(1),      //表示该类型未设置主键类型    INPUT(2),        //用户输入ID    ID_WORKER(3),    //数值类型全局唯一ID,内容为空自动填充(默认配置)    UUID(4),      //全局唯一ID,内容为空自动填充    ID_WORKER_STR(5);  //字符串全局唯一ID}

可以在数据库设置主键自增或者在Id添加注解

@TableId(type = IdType.AUTO)private Long id;

6 自动填充

一些数据每次都使用相同的方式填充,例如记录的创建时间,更新时间等,可以使用MyBatis Plus的自动填充功能,完成这些字段的赋值工作。


数据库表中添加自动填充字段在User表中添加datetime类型的新的字段 create_time、update_time

@TableField(fill = FieldFill.INSERT)private Date createTime;@TableField(fill = FieldFill.INSERT_UPDATE)private Date updateTime;

创建handler包编写MyMetaObjectHandler类

@Componentpublic class MyMetaObjectHandler implements MetaObjectHandler {    @Override    public void insertFill(MetaObject metaObject) {        this.setFieldValByName("createTime",new Date(),metaObject);        this.setFieldValByName("updateTime",new Date(),metaObject);    }    @Override    public void updateFill(MetaObject metaObject) {        this.setFieldValByName("updateTime",new Date(),metaObject);    }}
@Testpublic void updateUser() {    User user = new User();    user.setId(9L);    user.setAge(28);    user.setEmail("111@qq.com");    int i = userMapper.updateById(user);    System.out.println(i);}

e58f3fbbb504dd26d4573f63c680a2b1.png

7 乐观锁

当要更新一条记录的时候,希望这条记录没有被别人更新,也就是说实现线程安全的数据更新乐观锁实现方式。

取出记录时,获取当前version更新时,带上这个version执行更新时, set version = newVersion where version = oldVersion如果version不对,就更新失败。

表中添加version列

@Versionprivate Integer version;

myconfig中添加乐观锁插件

//乐观锁插件@Beanpublic OptimisticLockerInterceptor optimisticLockerInterceptor() {    return new OptimisticLockerInterceptor();}
@Testpublic void addUser1() {    //测试乐观锁,先查再改    User user = userMapper.selectById(8L);    user.setAge(3);    userMapper.updateById(user);}

9f3b316670f3ae84ef06ca0a765dacd1.png

8 性能测试

myconfig配置文件中配置

@Bean@Profile({"dev", "test"})// 设置 dev test 环境开启public PerformanceInterceptor performanceInterceptor() {    PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();    performanceInterceptor.setMaxTime(500);//ms,超过此处设置的ms则sql不执行    performanceInterceptor.setFormat(true);    return performanceInterceptor;}

其中,参数含义

maxTime:SQL 执行最大时长,超过自动停止运行,有助于发现问题。format:SQL是否格式化,默认false。

SQL格式化使结构更加清晰规范。

在application.properties中配置环境

#环境设置:dev、test、prodspring.profiles.active=dev

随便执行一条语句测试,在maxTime范围内,可以执行,否则不执行。

c5d666b8d6f0f4f236226f956eddb072.png

性能测试可以识别出需要优化的sql语句。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值