MyBatis插入相关问题(insert、InsertSelective)

本文转载于:简书《MyBatis插入相关问题(insert、InsertSelective)

自动生成代码insert和insertSelective的区别

自动生成的mybatis对应配置文件里面,有两个方法,分别为insert和insertSelective。这两个方法均是插入对象的方法。这里说一下两者的区别。
首先看一下两者代码:

  • insert
<insert id="insert" parameterType="com.cx.elearnning.model.SysSubject" >
    <!--
      WARNING - @mbggenerated
      This element is automatically generated by MyBatis Generator, do not modify.
    -->
    insert into sys_subject (SUBJECT_ID, SUBJECT_NAME, STATUS, 
      CREATE_TIME, PARENT_ID, sort
      )
    values (#{subjectId,jdbcType=INTEGER}, #{subjectName,jdbcType=VARCHAR}, #{status,jdbcType=BIT}, 
      #{createTime,jdbcType=TIMESTAMP}, #{parentId,jdbcType=INTEGER}, #{sort,jdbcType=INTEGER}
      )
  </insert>
  • insertSelective
<insert id="insertSelective" parameterType="com.cx.elearnning.model.SysSubject" >
    <!--
      WARNING - @mbggenerated
      This element is automatically generated by MyBatis Generator, do not modify.
    -->
    insert into sys_subject
    <trim prefix="(" suffix=")" suffixOverrides="," >
      <if test="subjectId != null" >
        SUBJECT_ID,
      </if>
      <if test="subjectName != null" >
        SUBJECT_NAME,
      </if>
      <if test="status != null" >
        STATUS,
      </if>
      <if test="createTime != null" >
        CREATE_TIME,
      </if>
      <if test="parentId != null" >
        PARENT_ID,
      </if>
      <if test="sort != null" >
        sort,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides="," >
      <if test="subjectId != null" >
        #{subjectId,jdbcType=INTEGER},
      </if>
      <if test="subjectName != null" >
        #{subjectName,jdbcType=VARCHAR},
      </if>
      <if test="status != null" >
        #{status,jdbcType=BIT},
      </if>
      <if test="createTime != null" >
        #{createTime,jdbcType=TIMESTAMP},
      </if>
      <if test="parentId != null" >
        #{parentId,jdbcType=INTEGER},
      </if>
      <if test="sort != null" >
        #{sort,jdbcType=INTEGER},
      </if>
    </trim>
  </insert>

分析

看完代码大体上就能区分两者的区别了吧?
insertSelective对应的sql语句加入了NULL校验,即只会插入数据不为null的字段值。
insert则会插入所有字段,会插入null。

如何在执行插入数据之后返回新增数据的ID(自增)

这里我们需要使用几个属性,分别为:useGeneratedKeys、keyColumn、keyProperty。
上面所说的两个插入方法,均不会返回新增数据的ID。原因就是没有配置这三个属性。

配置方式

首先,需要配置useGeneratedKeys属性,设置为true。说明将自动生成的主键值进行了获取。
之后,设置keyColumn(对应数据表字段)、keyProperty(对应对象属性)。即将自动生成的主键值赋值给那个属性!
示例如下:

<insert id="createSubject" parameterType="com.cx.elearnning.model.SysSubject" useGeneratedKeys="true" keyColumn="SUBJECT_ID" keyProperty="subjectId">
        INSERT INTO SYS_SUBJECT (
        <include refid="sys_subject_columns" />
        )
        VALUES (
        <include refid="sys_subject_properties" />
        )
    </insert>

表示将自增值赋值给了sunjectId属性。

mybatis是一种Java持久化框架,可以方便地操作数据库。当需要保存blob类型的数据时,可以使用insertSelective方法。 insertSelective方法是mybatis提供的一个插入数据的方法,可以根据实体类中的属性值进行判断,只插入非空属性对应的列。对于保存blob类型的数据,可以按照以下步骤进行操作: 1. 创建一个实体类,其中包含了需要保存的blob数据的属性。可以使用byte[]类型来表示blob数据。 ```java public class MyEntity { private byte[] blobData; // getter and setter methods } ``` 2. 在Mapper接口中定义插入数据的方法。 ```java public interface MyMapper { int insertSelective(MyEntity entity); } ``` 3. 在Mapper.xml中编写对应的SQL语句。在插入数据时,可以使用#{}来引用实体类中的属性。 ```xml <insert id="insertSelective" parameterType="com.example.MyEntity"> INSERT INTO my_table (blob_data) VALUES (#{blobData, jdbcType=BLOB}) </insert> ``` 4. 在代码中调用插入数据的方法。 ```java @Autowired private MyMapper myMapper; public void saveBlobData(byte[] data) { MyEntity entity = new MyEntity(); entity.setBlobData(data); int rows = myMapper.insertSelective(entity); // 判断插入是否成功 if (rows > 0) { System.out.println("保存blob数据成功"); } else { System.out.println("保存blob数据失败"); } } ``` 通过以上步骤,我们可以使用mybatisinsertSelective方法来保存blob类型的数据。总结来说,我们需要定义一个实体类来封装blob数据,使用Mapper接口和Mapper.xml定义插入数据的方法和SQL语句,最后在代码中调用方法即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值