本篇将带你快速学会在SpringBoot工程下,实现MaBatis对数据的增删改查功能。

一、环境准备

创建SpringBoot工程,数据库表 tb_user,实体类User,以及引入Mybatis相关依赖(创建springboot工程时已经引入),配置Mybatis(数据库连接信息),这些工作我们在 springboot整合 mybatis 的时候就已经完成,如果有不清楚的可以回看上一篇文章。

注意在创建工程,引入Mybatis相关依赖的时候也把 lombok勾选上。


在做数据的增删改查前,先来查询一下数据库 db1下的 tb_user表,一共四条数据,如下。方便后面测试后进行查看验证。

二、删除

需求:根据id删除用户数据,如删除 id为4的用户数据。

1、编写SQL

定义接口方法,在 UserMapper接口下添加删除方法

1
2
3
// 根据id删除用户数据,参数占位符动态获取用户id
@Delete("delete from tb_user where id = #{id}")
public void delete(Integer id);

2、测试运行

在 springboot整合单元测试的类中,编写测试方法进行测试。

1
2
3
4
5
6
7
@Autowired // 自动装配注入
private UserMapper userMapper;

@Test
public void testDelete(){
userMapper.delete(4);
}

因为使用的是 void方法,所以运行结束后,控制台没有返回数据。直接刷新或再次查询一下 tb_user表,发现成功删除 id为4的用户数据。

注1:该删除方法也可以有返回值,其返回值为此次操作影响的记录数。只不过这里我们用了 void定义后无返回值。

注2:如果mapper接口方法形参只有一个普通类型的参数,#{…}里面的属性名可以随便写,如: #{id}、#{value}。

3、预编译SQL

3.1 配置日志

在application.properties中,配置mybatis的日志,并指定输出到控制台。

输入mybatislog就会有提示

1
2
#指定mybatis输出日志的位置,输出控制台
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

配置完成后再次启动测试,成功输出日志信息,即预编译SQL

3.2 预编译SQL好处

1)性能更高

2)更安全(防止SQL注入)

SQL注入是通过操作输入的数据来修改事先定义好的SQL语句,以达到执行代码对服务器进行攻击的方法。

关于SQL注入,之前的文章有介绍过,这里不再赘述。

三、增加

需求:往 tb_user表中插入一条用户数据。

1、编写SQL

1)首先对sql语句进行分析,由于设置了主键 id为自增,故 id不需要插入,其余字段都需要插入

1
insert into tb_user(username,name,age,gender) values ('Tom',汤姆,22,'男')

2)定义接口方法,在 UserMapper接口下添加新增方法

注:将多个参数封装到一个 user对象中,这样在调用 insert方法时就不用传递多个参数,而只需要传递user对象即可(该对象即为我们的实体类对象)。直接通过对象中的属性值来实现动态获取

1
2
3
// 新增员工
@Insert("insert into tb_user(username,name,age,gender) values (#{username},#{name},#{age},#{gender})")
public void insert(User user);

2、测试运行

在 springboot整合单元测试的类中,编写测试方法进行测试。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Autowired
private UserMapper userMapper;

@Test
public void testInsert(){
// 构造用户对象
User user = new User();
user.setUsername("Tom");
user.setName("汤姆");
user.setAge((short) 22);
user.setGender("男");
// 执行新增用户信息操作
userMapper.insert(user);
}

运行后控制台输出的结果如下

返回数据库查询 tb_user表,发现新增用户成功

3、主键返回功能实现

3.1 背景

在数据添加成功后,需要获取插入数据库数据的主键。

如: 在点餐系统业务中,添加套餐数据时,还需要维护套餐菜品关系表数据。具体两步如下:
1.先保存套餐信息,并获取套餐ID。
2.然后再保存套餐菜品关联信息(需要记录套餐ID、菜品ID)

3.2 实现

需要在接口方法上添加如下注解

注:该注解会自动将生成的主键值,赋值给emp对象的id属性

1
2
3
4
// 新增用户
@Options(keyProperty = "id",useGeneratedKeys = true) // 添加注解,实现主键返回
@Insert("insert into tb_user(username,name,age,gender) values (#{username},#{name},#{age},#{gender})")
public void insert(User user);

3.3 测试

修改测试方法里面的测试数据,重新启动运行,控制台成功输出返回的主键值。

再返回数据库查询 tb_user表,发现多了一条新增的 id为8的用户信息。

四、修改

在实际的业务中,点击修改按钮一般都会弹出一个表单,并显示可以修改的数据,如下

所以修改数据,要完成如下两个需求

需求1:根据 id查询数据用于回显。
需求2:根据 id修改数据。

1、数据回显

根据id查询用户,用于修改前的回显

1.1 编写SQL

定义接口方法,在 UserMapper接口下添加查询方法

注:该方法有返回值,由于查询返回的是一条数据,所以直接将查询返回的结果封装到一个 user对象中,而不是封装到 List集合。

1
2
3
4
// 修改用户
// 1.根据id查询用户,用于修改前的回显
@Select("select * from tb_user where id = #{id}")
public User getById(Integer id);

1.2 测试运行

在 springboot整合单元测试的类中,编写测试方法进行测试。

1
2
3
4
5
6
// 根据id查询用户
@Test
public void testGetById(){
User user=userMapper.getById(8);
System.out.println(user);
}

运行后控制台输出的结果如下,成功返回 id为8的用户数据。

1.3 注意事项

1、实体类属性名和数据库表查询返回的字段名一致,mybatis会自动封装。
2、如果实体类属性名和数据库表查询返回的字段名不一致,不能自动封装。


解决方法如下:

推荐使用最后一种方式

2、修改数据

经过上一步,将查询的数据回显出来后,就需要对其进行修改。

1.1 编写SQL

定义接口方法,在 UserMapper接口下添加修改方法

注:同样参考新增的方法,将多个参数封装到一个 user对象中,直接通过对象中的属性值来实现动态获取。

1
2
3
4
// 修改用户
// 2.更新用户(根据id修改数据)
@Update("update tb_user set username = #{username},name = #{name},age = #{age},gender = #{gender} where id= #{id}")
public void update(User user);

1.2 测试运行

在 springboot整合单元测试的类中,编写测试方法进行测试。

1
2
3
4
5
6
7
8
9
10
11
12
// 根据id修改用户
@Test
public void testUpdate(){
// 构造用户对象
User user = new User();
user.setUsername("Tom2");
user.setName("汤姆2");
user.setAge((short) 22);
user.setGender("男");
// 执行更新用户信息操作
userMapper.update(user);
}

运行后控制台输出的结果如下,说明已成功修改。

五、查询

1、条件查询

如查询用户姓名包含”张”的男性用户(采用 like模糊匹配)

1.1 编写SQL

定义接口方法,在 UserMapper接口下添加新增方法

注:根据条件查询,查询的结果可能不止一条,所以要封装到一个 List集合中,集合的泛型就是我们的 user对象。

需要根据条件查询的字段,来指定方法中的形参

1
2
3
// 根据条件查询用户,这里采用了concat方法
@Select("select * from tb_user where name like concat('%',#{name},'%') and gender = #{gender}")
public List<User> list(String name,String gender);

1.2 测试运行

在 springboot整合单元测试的类中,编写测试方法进行测试。

1
2
3
4
5
6
// 根据条件查询用户
@Test
public void testList(){
List<User> userList = userMapper.list("张", "男");
System.out.println(userList);
}