一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第19天,点击查看活动详情。
写在前面👀
承接上文,Mybatis 快速入门(四)🚩
今天主要讲讲Mybatis的动态修改、批量删除和注解实现CRUD
一、动态修改
0️⃣需求
根据id修改人物信息,没有传入参数的字段要求保留之前的数据。
- 这个需求可以用update-set和if标签来完成
1️⃣update-set 语法
- 在 Mybatis 中,update 语句可以使用 set 标签动态更新列。set 标签可以为 SQL 语句动态的添加 set 关键字,剔除追加到条件末尾多余的逗号。
<update id="" >
UPDATE 表名
<set>
<if test="判断条件"> SQL语句, </if>
<if test="判断条件"> SQL语句, </if>
</set>
WHERE 条件
</update>
2️⃣编写接口方法
/**
* 7.动态修改数据
* @param op
*/
void update(Op op);
3️⃣编写映射文件
<!--动态修改数据-->
<update id="update">
update tb_op
<set>
<if test="name != null and name != '' ">
name=#{name},
</if>
<if test="gender != null and gender != '' ">
gender=#{gender},
</if>
<if test="devilFruit != null and devilFruit != '' ">
devil_fruit=#{devilFruit},
</if>
<if test="reward != null and reward != '' ">
reward=#{reward},
</if>
<if test="identity != null and identity != '' ">
identity=#{identity},
</if>
</set>
where id=#{id};
</update>
4️⃣编写测试方法
@Test
/**
* 7.动态修改数据
*/
public void testUpdate() {
//修改id为1的姓名和果实
Integer id = 1;
String name = "草帽小子";
String devilFruit = "橡胶果实";
//7.1创建Op对象
Op op = new Op();
//7.2调用方法封装对象
op.setId(id);
op.setName(name);
op.setDevilFruit(devilFruit);
//7.3执行方法
opMapper.update(op);
//7.4释放资源
sqlSession.close();
}
- 演示结果如下👇
二、删除单行数据
0️⃣需求
根据id删除数据
- 这个需求可以使用delete标签实现
1️⃣delete 语法
- delete 标签用于定义 delete 语句,执行删除操作。当 MyBatis 执行完一条删除语句后,会返回一个整数,表示受影响的数据库记录的行数。
<delete id="">
SQL语句
</delete>
2️⃣编写接口方法
/**
* 8.删除单行数据
* @param id
* @return int 受影响行数
*/
int deleteByIdInt(int id);
3️⃣编写映射文件
<!-- 删除单行数据-->
<delete id="deleteByIdInt">
<if test="id != null and id != ''">
delete from tb_op
where id = #{id};
</if>
</delete>
4️⃣编写测试方法
/**
* 8.删除单行数据
*/
@Test
public void testDeleteByIdInt(){
//删除id为22的数据
int id =22;
//8.1执行方法、
int count = opMapper.deleteByIdInt(id);
//8.2返回受影响行数
System.out.println("受影响行数:"+count);
//8.3释放资源
sqlSession.close();
}
- 演示结果如下👇
三、批量删除数据
0️⃣需求
选择多个id进行删除数据
- 这个需求的 SQL 语句中含有 in 条件,需要迭代条件集合来生成,可以使用
foreach标签 来实现 SQL 条件的迭代
1️⃣foreach 语法
<foreach item="item" index="index" collection="list|array|map key" open="(" separator="," close=")">
参数值
</foreach>
a.item
- 本次迭代获取到的元素的别名
b.index
- 指定一个名字,表示在迭代过程中每次迭代到的位置
c.collection
- 传入的是单参数且参数类型是一个 List,collection 属性值为 list
- 传入的是单参数且参数类型是一个 array 数组,collection 的属性值为 array
- 传入的参数是多个,需要把它们封装成一个 Map,当然单参数也可以封装成 Map。Map 的 key 是参数名,collection 属性值是传入的 List 或 array 对象在自己封装的 Map 中的 key。
d.open
- 开始符号,如 in 集合 以
(开始
e.separator
- 分隔符,如 in 集合 以
,分隔 foreach标签不会错误地添加多余的分隔符。也就是最后一次迭代不会加分隔符
f.close
- 结束符号,如 in 集合 以
)结束
2️⃣编写接口方法
/**
* 9.批量删除数据
* @param ids
* @return 返回删除的记录数
*/
int deleteByIds(int[] ids);
3️⃣编写映射文件
<!-- 批量删除数据-->
<delete id="deleteByIds">
delete
from tb_op
where id in
<foreach collection="array" item="id" open="(" separator="," close=")">
#{id}
</foreach>
;
</delete>
4️⃣编写测试方法
/**
* 9.批量删除数据
*/
@Test
public void testDeleteByIds(){
//删除id为22、24、26的数据
int[] ids = {22,24,26};
//9.1执行方法、
int count = opMapper.deleteByIds(ids);
//9.2返回删除的记录数
System.out.println("受影响行数:"+count);
//9.3释放资源
sqlSession.close();
}
- 演示结果如下👇
四、注解实现基本CRUD
实现一些简单的功能和SQL语句,使用注解开发会比配置文件开发更加方便
总结:简单SQL用注解,动态SQL用映射文件
1️⃣MyBatis常用注解
- 注解可以直接写在接口方法的上边
| 注解 | 说明 |
|---|---|
| @Insert | 实现新增 |
| @Delete | 实现删除 |
| @Update | 实现更新 |
| @Select | 实现查询 |
| @Result | 实现结果集封装 |
| @Results | 可以与@Result 一起使用,封装多个结果集 |
| @ResultMap | 引用xml映射文件中的结果集 |
| @Options 注解 | 获取自增主键 |
2️⃣示例
/**
* 1.查询所有数据
*
* @return
*/
@Select("select * from tb_op;")
@ResultMap("OpResultMap")
List<Op> searchAll();
/**
* 2.删除单行数据
*
* @param id
* @return int 受影响行数
*/
@Delete("delete from tb_op where id=#{id}")
int deleteByIdInt(Integer id);
/**
* 3.添加数据并返回主键
*
* @param op
* @return void
*/
@Insert("insert into tb_op (name, gender, devil_fruit, reward, identity)" +
" values (#{name}, #{gender}, #{devilFruit}, #{reward}, #{identity});")
@Options(useGeneratedKeys = true, keyProperty = "id")
void addAll(Op op);
/**
* 4.修改姓名
*
* @param op
*/
@Update("update tb_op set name = #{name} where id=#{id}")
void updateName(Op op);
五、MyBatis事务
- SqlSessionFactory的接口中,有一个获取SqlSession的重载方法
openSession(boolean var1) - var1默认是false,表示手动提交事务;若设置为true,则自动提交事务
- SqlSession接口中的**commit( )**代表提交事务,**rollback( )**代表回滚事务
写在后面🍻
感谢观看啦✨
有什么不足,欢迎指出哦💖
掘金的运营同学审核辛苦了💗