本篇将带你快速学会在SpringBoot工程下,实现MaBatis对数据的增删改查功能。
一、环境准备
创建SpringBoot工程,数据库表 tb_user,实体类User,以及引入Mybatis相关依赖(创建springboot工程时已经引入),配置Mybatis(数据库连接信息),这些工作我们在 springboot整合 mybatis 的时候就已经完成,如果有不清楚的可以回看上一篇文章。
注意在创建工程,引入Mybatis相关依赖的时候也把 lombok勾选上。
在做数据的增删改查前,先来查询一下数据库 db1下的 tb_user表,一共四条数据,如下。方便后面测试后进行查看验证。
二、删除
需求:根据id删除用户数据,如删除 id为4的用户数据。
1、编写SQL
定义接口方法,在 UserMapper接口下添加删除方法
// 根据id删除用户数据,参数占位符动态获取用户id
@Delete("delete from tb_user where id = #{id}")
public void delete(Integer id);
2、测试运行
在 springboot整合单元测试的类中,编写测试方法进行测试。
@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就会有提示
#指定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不需要插入,其余字段都需要插入
insert into tb_user(username,name,age,gender) values ('Tom',汤姆,22,'男')
2)定义接口方法,在 UserMapper接口下添加新增方法
注:将多个参数封装到一个 user对象中,这样在调用 insert方法时就不用传递多个参数,而只需要传递user对象即可(该对象即为我们的实体类对象)。直接通过对象中的属性值来实现动态获取
// 新增员工
@Insert("insert into tb_user(username,name,age,gender) values (#{username},#{name},#{age},#{gender})")
public void insert(User user);
2、测试运行
在 springboot整合单元测试的类中,编写测试方法进行测试。
@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属性
// 新增用户
@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.根据id查询用户,用于修改前的回显
@Select("select * from tb_user where id = #{id}")
public User getById(Integer id);
1.2 测试运行
在 springboot整合单元测试的类中,编写测试方法进行测试。
// 根据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对象中,直接通过对象中的属性值来实现动态获取。
// 修改用户
// 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整合单元测试的类中,编写测试方法进行测试。
// 根据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对象。
需要根据条件查询的字段,来指定方法中的形参
// 根据条件查询用户,这里采用了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整合单元测试的类中,编写测试方法进行测试。
// 根据条件查询用户
@Test
public void testList(){
List<User> userList = userMapper.list("张", "男");
System.out.println(userList);
}
喜欢就点击上方关注我们吧!