Mybatis 快速入门(五)🌄

218 阅读4分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 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();
}
  • 演示结果如下👇

image-20220421140101508

二、删除单行数据

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();
}
  • 演示结果如下👇

image-20220421150036153

三、批量删除数据

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
  1. 传入的是单参数且参数类型是一个 List,collection 属性值为 list
  2. 传入的是单参数且参数类型是一个 array 数组,collection 的属性值为 array
  3. 传入的参数是多个,需要把它们封装成一个 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();
}
  • 演示结果如下👇

image-20220421155706467

四、注解实现基本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( )**代表回滚事务

写在后面🍻

感谢观看啦✨
有什么不足,欢迎指出哦💖
掘金的运营同学审核辛苦了💗