insert和insertSelective區別

風泊月發表於2018-06-03

使用逆向工程生成的程式碼做一個新增時通常都會給出兩個答案,如題目想要增加一條資料會讓你選擇insert或者insertSelective


兩者的區別在於如果選擇insert 那麼所有的欄位都會新增一遍即使沒有值

 <insert id="insert" parameterType="com.ego.pojo.TbContentCategory" >
    insert into tb_content_category (id, parent_id, name, 
      status, sort_order, is_parent, 
      created, updated)
    values (#{id,jdbcType=BIGINT}, #{parentId,jdbcType=BIGINT}, #{name,jdbcType=VARCHAR}, 
      #{status,jdbcType=INTEGER}, #{sortOrder,jdbcType=INTEGER}, #{isParent,jdbcType=BIT}, 
      #{created,jdbcType=TIMESTAMP}, #{updated,jdbcType=TIMESTAMP})
  </insert>

但是如果使用inserSelective就會只給有值的欄位賦值(會對傳進來的值做非空判斷)

<insert id="insertSelective" parameterType="com.ego.pojo.TbContentCategory" >
    insert into tb_content_category
    <trim prefix="(" suffix=")" suffixOverrides="," >
      <if test="id != null" >
        id,
      </if>
      <if test="parentId != null" >
        parent_id,
      </if>
      <if test="name != null" >
        name,
      </if>
      <if test="status != null" >
        status,
      </if>
      <if test="sortOrder != null" >
        sort_order,
      </if>
      <if test="isParent != null" >
        is_parent,
      </if>
      <if test="created != null" >
        created,
      </if>
      <if test="updated != null" >
        updated,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides="," >
      <if test="id != null" >
        #{id,jdbcType=BIGINT},
      </if>
      <if test="parentId != null" >
        #{parentId,jdbcType=BIGINT},
      </if>
      <if test="name != null" >
        #{name,jdbcType=VARCHAR},
      </if>
      <if test="status != null" >
        #{status,jdbcType=INTEGER},
      </if>
      <if test="sortOrder != null" >
        #{sortOrder,jdbcType=INTEGER},
      </if>
      <if test="isParent != null" >
        #{isParent,jdbcType=BIT},
      </if>
      <if test="created != null" >
        #{created,jdbcType=TIMESTAMP},
      </if>
      <if test="updated != null" >
        #{updated,jdbcType=TIMESTAMP},
      </if>
    </trim>
  </insert>

如果不明白的話提供一個簡單的例子,再結合上面的原始碼體會一下

前提Goods商品表裡面有三個欄位:id,name,price 
        1.此時我只設定了一個欄位名字:  
        Goods g = new Goods();  
        g.setName("手機");
        insertSelective(g);
        insertSelective執行對應的sql語句的時候,只插入對應的name欄位;
        (主鍵是自動新增的,預設插入為空)insert into tb_goods (id,name) value (null,"手機");
        注意:此時是沒有price什麼事的
        2、如果使用insert則是不論你設定多少個欄位,統一都要新增一遍,不論你設定幾個欄位,即使是一個。
        Goods g=new Goods();
        g.setName("冰箱");
        insert(g)
        insert執行對應的sql語句的時候,統一都要新增一遍;
        insert into tb_goods (id,name,price) value (null,"冰箱",null);
        注意:price也在哦!!
結束!!!

相關文章