SpringBoot 集成 MybatisPlus 三——增加、修改、删除

2023-10-30 22:38:29 浏览数 (1)

1 插入记录

1.1 以普通方式插入记录

向 User 表中插入一条记录。

创建一个 User 对象,调用 insert() 方法,即可实现向数据表中插入数据

代码语言:java复制
@Test
public void addUserTest(){
    User user = new User();
    user.setUsername("韩梅梅");
    user.setGendar("女");
    user.setRemark("大堂经理");
    int insert = userMapper.insert(user);
    System.out.println(insert);
}

执行后,可以在控制台中看到 MybatisPlus 向数据库发送的 SQL 语句如下:

==> Preparing: INSERT INTO user ( id, username, gendar, remark ) VALUES ( ?, ?, ?, ? )

==> Parameters: -154062847(Integer), 韩梅梅(String), 女(String), 大堂经理(String)

<== Updates: 1

因为没有对 ID 属性进行指定,程序随机生成了一条内容,这显然不是我们所期望的,可以在执行程序时设置该字段内容。

代码语言:java复制
@Test
public void addUserTest(){
    User user = new User();
    user.setId(7);
    user.setUsername("韩梅梅");
    user.setGendar("女");
    user.setRemark("大堂经理");
    int insert = userMapper.insert(user);
    System.out.println(insert);
}

数据入库后效果如下:

那么,如果id为主键,一般为自增序列,要如何插入呢?

1.2 以字段自增方式插入记录

1.2.1 修改数据表

原数据表创建语句为:

CREATE TABLE User (

id INT NOT NULL,

username VARCHAR(50) NULL DEFAULT NULL,

gendar CHAR(2) NULL DEFAULT NULL,

remark VARCHAR(50) NULL DEFAULT NULL

);

在数据表中添加 ID 字段为主键,并且将该字段设置为自动增长:

ALTER TABLE user ADD PRIMARY KEY(id);

ALTER TABLE user modify id INT(11) AUTO_INCREMENT;

1.2.2 修改实体类

修改实体类属性 id 的注解,使用 @TableId 标识出id字段为主键,并且将该字段设置为自动增长 IdType.AUTO

修改后的 User 类如下:

代码语言:java复制
package com.test.pojo;

import com.baomidou.mybatisplus.annotation.*;

@TableName(value = "user")
public class User {
    @TableId(value = "id", type = IdType.AUTO)
    Integer id;
    String username;
    String gendar;
    String remark;

    @TableField(value = "COUNT(*)", insertStrategy = FieldStrategy.NEVER, updateStrategy = FieldStrategy.NEVER)
    Integer count;

    public Integer getGen() {
        return count;
    }

    public void setGen(Integer gen) {
        this.count = gen;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getGendar() {
        return gendar;
    }

    public void setGendar(String gendar) {
        this.gendar = gendar;
    }

    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }

    @Override
    public String toString() {
        return "User{"  
                "id="   id  
                ", username='"   username   '''  
                ", gendar='"   gendar   '''  
                ", remark='"   remark   '''  
                ", count="   count  
                '}';
    }
}

1.2.3 插入数据

代码语言:java复制
@Test
public void addUserTest(){
    User user = new User();
    user.setUsername("李磊");
    user.setGendar("男");
    user.setRemark("英语老师");
    int insert = userMapper.insert(user);
    System.out.println(insert);
}

在控制台中看到 MybatisPlus 向数据库发送的 SQL 语句中,不再有ID字段了:

==> Preparing: INSERT INTO user ( username, gendar, remark ) VALUES ( ?, ?, ? )

==> Parameters: 李磊(String), 男(String), 英语老师(String)

<== Updates: 1

插入后数据表中,新记录的ID自动设置为8:

2 修改记录

2.1 根据ID修改

调用 updateById() 方法修改记录,方法中必须传入带有ID属性的对象。

代码语言:java复制
@Test
public void updateUserById(){
    User user = new User();
    user.setId(8);
    user.setRemark("美术老师");
    int insert = userMapper.updateById(user);
    System.out.println(insert);
}

这种方式可对指定id的记录进行修改,因此,只能修改一条记录。

2.2 根据筛选条件修改

当需要按照指定条件筛选,并对筛选后的记录进行批量修改时,就要考虑这种使用方式。

需要先创建一个 UpdateWrapper 对象,需要修改的内容可以使用 set() 方法进行设置,筛选条件和查询时类似。

注意: 在 set() 方法及 UpdateWrapper 中引用的字符串,都是数据表中的列名,而不是实体类的属性名。

比如:对 remark 字段中包含“人员”信息的,将其 remark 修改为 “职能部门人员”:

代码语言:java复制
@Test
public void updateUserTest(){
    User user = new User();
    UpdateWrapper<User> wrapper = new UpdateWrapper<>();
    wrapper.set("remark", "职能部门人员");
    wrapper.like("remark", "人员");
    int insert = userMapper.update(new User(), wrapper);
    System.out.println(insert);
}

在控制台可以看到执行的SQL语句如下:

==> Preparing: UPDATE user SET remark=? WHERE (remark LIKE ?)

==> Parameters: 职能部门人员(String), %人员%(String)

<== Updates: 4

执行后数据内容变化如下:

3 删除记录

3.1 根据ID删除

调用 deleteById() 方法,传入仅设置了id属性的对象,此方法可删除一条记录。

删除 id 为 -154062847 的记录:

代码语言:java复制
@Test
public void deleteUserById(){
    User user = new User();
    user.setId(-154062847);
    int res = userMapper.deleteById(user);
    System.out.println(res);
}

==> Preparing: DELETE FROM user WHERE id=?

==> Parameters: -154062847(Integer)

<== Updates: 1

使用对象的方式来删除记录,需要创建对象,还是有些麻烦,也可以省去对象的创建,直接根据id来删除。

代码语言:java复制
@Test
public void deleteUserById(){
    int res = userMapper.deleteById(1);
    System.out.println(res);
}

3.2 根据ID列表删除

如果想要根据多个ID批量删除,可以调用 deleteBatchIds(),传入集合类对象,在集合类中设置想要批量删除的id集合。

删除 id 分别为 1,2 的记录:

代码语言:java复制
@Test
public void deleteUserByIds(){
    List<Integer> ids = new ArrayList<>();
    ids.add(1);
    ids.add(2);
    int res = userMapper.deleteBatchIds(ids);
    System.out.println(res);
}

==> Preparing: DELETE FROM user WHERE id IN ( ? , ? )

==> Parameters: 1(Integer), 2(Integer)

<== Updates: 2

3.3 根据指定字段内容删除

将指定字段及对应内容,放入到 Map 中,调用 deleteByMap() 方法,删除对应记录。

需要注意的是,Map 中所有字段都为“且”的关系。Map 对象中键,都是数据表中的列名,不是实体类的对象名。

删除 username 为 “lisi” 并且 remark 为 “大堂经理” 的记录:

代码语言:java复制
@Test
public void deleteUserByMap(){
    Map<String, Object> map = new HashMap<>();
    map.put("username", "lisi");
    map.put("remark", "大堂经理");
    int res = userMapper.deleteByMap(map);
    System.out.println(res);
}

==> Preparing: DELETE FROM user WHERE remark = ? AND username = ?

==> Parameters: 大堂经理(String), lisi(String)

<== Updates: 0

通过这种方式可以删除满足条件的单条记录或批量记录。

3.4 根据查询结果删除

调用 delete() 方法,并传入 QueryWrapper 对象,在 QueryWrapper 对象中如同查询一样,将查询出的记录进行删除。

删除 remark 中包含了 “职能” 字符串的所有记录:

代码语言:java复制
@Test
public void deleteUserByWrapper(){
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper.like("remark", "职能");
    int res = userMapper.delete(wrapper);
    System.out.println(res);
}

==> Preparing: DELETE FROM user WHERE (remark LIKE ?)

==> Parameters: %职能%(String)

<== Updates: 3

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

0 人点赞