MVN--06

一、新增(Insert)操作

1. 普通新增

① Mapper 接口

java

运行

复制代码
void add(Brand brand);
  • 参数:除主键 id 外的所有业务字段
  • 返回值:void(也可返回受影响行数 int
② XML 映射文件

xml

复制代码
<insert id="add">
    insert into tb_brand (brand_name, company_name, ordered, description, status)
    values (#{brandName},#{companyName},#{ordered},#{description},#{status});
</insert>
③ MyBatis 事务说明
  • openSession():默认开启手动事务,增删改后必须调用 sqlSession.commit() 手动提交
  • openSession(true):设置为自动提交事务(关闭事务管理)

2. 主键返回(自增主键场景)

适用场景

添加订单后,需要获取订单主键 id,用于插入关联的订单项数据。

① XML 映射文件

xml

复制代码
<insert id="addOrder" useGeneratedKeys="true" keyProperty="id">
    insert into tb_order (payment, payment_type, status)
    values (#{payment},#{paymentType},#{status});
</insert>
  • useGeneratedKeys="true":开启自增主键获取
  • keyProperty="id":将数据库生成的主键值,回写到实体类的 id 属性中
② 关联操作示例

xml

复制代码
<insert id="addOrderItem">
    insert into tb_order_item (goods_name, goods_price, count, order_id)
    values (#{goodsName},#{goodsPrice},#{count},#{orderId});
</insert>
  • 执行 addOrder 后,实体类 Orderid 已被赋值,可直接用于 addOrderItemorderId 参数

二、删除(Delete)操作

1. 单条删除(按 ID 删除)

① Mapper 接口

java

运行

复制代码
void deleteById(int id);
  • 参数:要删除的记录主键 id
  • 返回值:void(也可返回受影响行数 int
② XML 映射文件

xml

复制代码
<delete id="deleteById">
    delete from tb_brand where id = #{id}
</delete>

2. 批量删除(按 ID 数组删除)

① Mapper 接口

java

运行

复制代码
void deleteByIds(@Param("ids") int[] ids);
  • 参数:int[] ids 要删除的 ID 数组,@Param 注解用于指定参数在 Map 中的 key
  • 返回值:void
② MyBatis 参数封装规则

MyBatis 会将数组 / 集合参数自动封装为 Map

  • 默认 key:array(数组)/ list(List 集合)
  • 可通过 @Param("ids") 自定义 key 名称,提升代码可读性
③ XML 映射文件(foreach 标签实现)

xml

复制代码
<delete id="deleteByIds">
    delete from tb_brand
    where id in
    <foreach collection="ids" item="id" separator="," open="(" close=")">
        #{id}
    </foreach>
</delete>
  • collection:对应 @Param 指定的 key(无注解时写 array/list
  • item:遍历的单个元素别名
  • separator:元素间分隔符
  • open/close:包裹整个遍历结果的前后符号

三、修改(Update)操作

1. 全字段修改

① Mapper 接口

java

运行

复制代码
void update(Brand brand);
  • 参数:包含所有字段的实体对象(含 id
  • 返回值:void(也可返回受影响行数 int
② XML 映射文件

xml

复制代码
<update id="update">
    update tb_brand
    set brand_name = #{brandName},
        company_name = #{companyName},
        ordered = #{ordered},
        description = #{description},
        status = #{status}
    where id = #{id};
</update>
  • 特点:无论字段是否为空,都会强制更新所有字段

2. 动态字段修改(按需更新)

① Mapper 接口

java

运行

复制代码
void update(Brand brand);
  • 接口与全字段修改一致,仅需修改 XML 映射文件
② XML 映射文件(if + set 标签实现)

xml

复制代码
<update id="update">
    update tb_brand
    <set>
        <if test="brandName != null and brandName != ''">
            brand_name = #{brandName},
        </if>
        <if test="companyName != null and companyName != ''">
            company_name = #{companyName},
        </if>
        <if test="ordered != null">
            ordered = #{ordered},
        </if>
        <if test="description != null and description != ''">
            description = #{description},
        </if>
        <if test="status != null">
            status = #{status},
        </if>
    </set>
    where id = #{id};
</update>
  • <if> 标签:判断字段是否非空,非空才拼接更新语句
  • <set> 标签:自动去除末尾多余的逗号,避免 SQL 语法错误
  • 特点:仅更新传入的非空字段,适合部分字段修改的场景
相关推荐
这个DBA有点耶36 分钟前
分布式数据库到底该不该上?从判断标准到架构选型的实战思考
数据库·架构·dba
01_ice1 小时前
MySQL库和表的操作
数据库·mysql
布莱克6052 小时前
数据库索引分类:数据结构、物理存储与逻辑角度详解
数据结构·数据库
SelectDB2 小时前
DeepSeek Harness 接入 Litefuse:完善 Agent 可观测与评估能力
数据库
这个DBA有点耶3 小时前
从库延迟的“二次放大”效应:一次大事务,拖垮整个读写分离
数据库·mysql·架构
LearnYard3 小时前
自然语言驱动的数据图表生成:几款工具功能对比实践
数据库·百度·powerpoint
一个有温度的技术博主4 小时前
MySQL 三大日志协同机制:redo log、undo log 与 binlog 的联合运作
数据库·mysql·oracle
ltl4 小时前
ClickHouse 与 DuckDB 选型:不是同一类列存
数据库
ltl4 小时前
RocksDB WAL 与 WriteBatch:持久化与原子批写
数据库
ltl4 小时前
流批一体与增量视图:Materialize、RisingWave 与 DBSP
数据库