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属性的对象。
@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腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!