16. Mybatis 插入操作-insert

本文深入解析MyBatis中的insert标签用法,包括常用属性、返回值处理及实例演示,帮助开发者掌握如何高效地执行数据库插入操作。

1. insert 标签

insert 标签是用于定义插入语句的.

1.1 常用属性

insert 有几个常用的属性:

  • id: sql 片段在命名空间内的唯一标识. 和mapper 中方法名保持一致
  • useGeneratedKeys: 是否回填自动生成的主键
  • keyProperty: 主键回填到哪个属性
  • keyColumn: 主键回填的字段名, 可省略
  • parameterType: 参数类型, 通常都可以省略.
  • flushCache: 是否刷新(清空)一级缓存和二级缓存, 默认为true. 笔者尝试设置为false,并不生效. 所以使用默认即可.
  • timeout: sql 执行超时时间, 默认未设置, 由数据库驱动决定.
  • statementType: 执行sql时使用的statement类型, 默认为PREPARED. 可选值为:STATEMENT,PREPARED 或 CALLABLE 的一个
<insert
  id="insertAuthor"
  parameterType="domain.blog.Author"
  flushCache="true"
  statementType="PREPARED"
  keyProperty=""
  keyColumn=""
  useGeneratedKeys=""
  timeout="20">
  
</insert>

1.2 返回值

  • 我们知道, jdbc 执行插入语句时, 返回的是sql 执行影响的记录条数. Mybatis 可将此返回结果自动封装为int , long, boolean 以及其对应的包装类型.
  • 对于不同的返回类型, sql 片段的写法是完全一致的

Mapper中方法定义:

// 返回值为空
void insert(Employee emp);

// 返回值为布尔类型
boolean insert(Employee emp);

// 返回值为删除的条数
long insert(Employee emp);

sql 片段:

<insert id="save" useGeneratedKeys="true" keyProperty="id">
    insert into t_employee values (null, #{name}, #{sex}, #{age}, #{entryDate})
</insert>

2. insert 标签举例

2.1 sql 片段

<!-- 新增 -->
<insert id="save" useGeneratedKeys="true" keyProperty="id">
    insert into t_employee(id, name, sex, age, entryDate) values (null, #{name}, #{sex}, #{age}, #{entryDate})
</insert>

<!-- mysql 批量新增 -->
<insert id="batchSave" useGeneratedKeys="true" keyProperty="id">
    insert into t_employee(id, name, sex, age, entryDate)
    values
    <foreach collection="list" separator="," item="emp">
        (null, #{emp.name}, #{emp.sex}, #{emp.age}, #{emp.entryDate})
    </foreach>
</insert>

2.2 mapper 文件

public interface EmployeeMapper {

    // 保存
    boolean save(EmployeePO employeePO);

    // 批量保存
    long batchSave(List<EmployeePO> employeePOList);
    
}

2.3 测试类

// 测试保存方法
@Test
public void save(){

    EmployeeMapper employeeMapper = SqlSessionUtil.getMapper(EmployeeMapper.class, true);

    for (int i = 1; i <= 10; i++) {
        EmployeePO employeePO = new EmployeePO("lisa_" + i, 20, "W", LocalDate.of(2018, 05, i));

        boolean flag = employeeMapper.save(employeePO);

        // 校验是否保存成功
        Assert.assertEquals(true, flag);

        // 校验是否回填id
        Assert.assertNotNull(employeePO.getId());
    }
}

// 测试批量保存
@Test
public void batchSave(){

    EmployeeMapper employeeMapper = SqlSessionUtil.getMapper(EmployeeMapper.class, true);

    List<EmployeePO> empList = new ArrayList<>();
    empList.add(new EmployeePO("lisi_01", 26, "M", LocalDate.now()));
    empList.add(new EmployeePO("lisi_02", 26, "M", LocalDate.now()));
    empList.add(new EmployeePO("lisi_03", 26, "M", LocalDate.now()));

    long num = employeeMapper.batchSave(empList);

    Assert.assertEquals(3L, num);

}
在配置 `mybatis-plus.global-config.db-config.logic-delete-value=1` 和 `mybatis-plus.global-config.db-config.logic-not-delete-value=0` 后,执行 `INSERT INTO sys_role` 语句出现 `Field 'is_delete' doesn't have a default value` 错误,通常是因为数据库表中的 `is_delete` 字段没有设置默认值,而插入数据时又没有为该字段显式赋值。以下是几种可能的解决方案: ### 1. 在数据库表中为 `is_delete` 字段设置默认值 可以通过 SQL 语句来修改表结构,为 `is_delete` 字段设置默认值为逻辑未删除值(这里是 0)。示例 SQL 如下: ```sql ALTER TABLE sys_role MODIFY COLUMN is_delete TINYINT DEFAULT 0; ``` ### 2.插入数据时显式指定 `is_delete` 字段的值 在执行 `INSERT` 语句时,明确为 `is_delete` 字段赋值为逻辑未删除值(0)。示例 SQL 如下: ```sql INSERT INTO sys_role (column1, column2, is_delete) VALUES ('value1', 'value2', 0); ``` ### 3. 在实体类中为逻辑删除字段设置默认值 如果使用 MyBatis-Plus 进行数据插入操作,可以在实体类中为逻辑删除字段设置默认值。示例代码如下: ```java import com.baomidou.mybatisplus.annotation.TableLogic; import lombok.Data; @Data public class SysRole { private Long id; private String roleName; // 设置逻辑删除字段的默认值 @TableLogic private Integer isDelete = 0; } ``` ### 4. 检查实体类和数据库表字段映射 确保实体类中的逻辑删除字段名与数据库表中的字段名一致,并且使用了 `@TableLogic` 注解。示例代码如下: ```java import com.baomidou.mybatisplus.annotation.TableLogic; import lombok.Data; @Data public class SysRole { private Long id; private String roleName; @TableLogic private Integer isDelete; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值