MyBatis插入Insert、InsertSelective的区别及使用心得

目录

逆向自动生成的mybatis对应配置Mapper文件里面,有两个方法,分别为insert和insertSelective。这两个方法均是插入对象的方法。为什么会有两个插入方法呢?这里说一下两者的区别。

首先我们看代码如下:

insert方法

<insert id="insert" parameterType="demo.pojo.domain.HspMediaInf" >
    insert into MEDIA_INF (MED_SEQ, EMG_SEQ, MED_CLASS,
      MED_NAME, MED_FILE, MED_EXTEND,
      MED_TYPE, MED_DATE, MED_SIZE,
      MED_DATA)
    values (#{medSeq,jdbcType=VARCHAR}, #{emgSeq,jdbcType=VARCHAR}, #{medClass,jdbcType=VARCHAR},
      #{medName,jdbcType=VARCHAR}, #{medFile,jdbcType=VARCHAR}, #{medExtend,jdbcType=VARCHAR},
      #{medType,jdbcType=VARCHAR}, #{medDate,jdbcType=TIMESTAMP}, #{medSize,jdbcType=DECIMAL},
      #{medData,jdbcType=BLOB})
  </insert>

 

insertSelective方法:

<insert id="insertSelective" parameterType="activetech.zyyhospital.pojo.domain.HspMediaInf" >
    insert into HSP_MEDIA_INF
    <trim prefix="(" suffix=")" suffixOverrides="," >
      <if test="medSeq != null" >
        MED_SEQ,
      </if>
      <if test="emgSeq != null" >
        EMG_SEQ,
      </if>
      <if test="medClass != null" >
        MED_CLASS,
      </if>
      <if test="medName != null" >
        MED_NAME,
      </if>
      <if test="medFile != null" >
        MED_FILE,
      </if>
      <if test="medExtend != null" >
        MED_EXTEND,
      </if>
      <if test="medType != null" >
        MED_TYPE,
      </if>
      <if test="medDate != null" >
        MED_DATE,
      </if>
      <if test="medSize != null" >
        MED_SIZE,
      </if>
      <if test="medData != null" >
        MED_DATA,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides="," >
      <if test="medSeq != null" >
        #{medSeq,jdbcType=VARCHAR},
      </if>
      <if test="emgSeq != null" >
        #{emgSeq,jdbcType=VARCHAR},
      </if>
      <if test="medClass != null" >
        #{medClass,jdbcType=VARCHAR},
      </if>
      <if test="medName != null" >
        #{medName,jdbcType=VARCHAR},
      </if>
      <if test="medFile != null" >
        #{medFile,jdbcType=VARCHAR},
      </if>
      <if test="medExtend != null" >
        #{medExtend,jdbcType=VARCHAR},
      </if>
      <if test="medType != null" >
        #{medType,jdbcType=VARCHAR},
      </if>
      <if test="medDate != null" >
        #{medDate,jdbcType=TIMESTAMP},
      </if>
      <if test="medSize != null" >
        #{medSize,jdbcType=DECIMAL},
      </if>
      <if test="medData != null" >
        #{medData,jdbcType=BLOB},
      </if>
    </trim>
  </insert>

 

 

从上面连段代码我们会发现insertSelective对应的sql语句加入了NULL校验,只会插入数据不为null的字段值。insert则会插入所有字段,会插入null。

笔者反思但是为什么会有这两种方法呢?

总结:由于真实开发中,我们在修改功能的from表单,或者一个类的某些模块编辑的from表单中不会将所有的数据都查询出来放到from表单中然后再insert到数据库,所以我们经常在这些功能中使用insertSelective方法,此时只针对我们操作的属性进行insert操作,而如果使用insert方法,将会把非表单内的内容置为null从而影响数据安全。

(0)

相关推荐

  • mybatis中批量插入的两种方式(高效插入)

    MyBatis简介 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录. 一.mybiats foreach标签 foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合.foreach元素的属性主

  • MyBatis批量插入(insert)数据操作

    在程序中封装了一个List集合对象,然后需要把该集合中的实体插入到数据库中,由于项目使用了Spring+MyBatis的配置,所以打算使用MyBatis批量插入,由于之前没用过批量插入,在网上找了一些资料后最终实现了,把详细过程贴出来. 实体类TrainRecord结构如下: public class TrainRecord implements Serializable { private static final long serialVersionUID = -12069604621179

  • mybatis insert foreach循环插入方式

    mybatis insert foreach循环插入 @Insert("<script>" + "insert into driver_account_appeal_photo (appeal_id,appeal_photo_path) values\n" + "<foreach collection=\"photoList\" item=\"item\" index=\"index\&q

  • 关于使用Mybatisplus自带的selectById和insert方法时的一些问题

    一.关于使用Mybatisplus自带的selectById和insert方法时的一些问题 1.selectById的问题 (1).表的主键列名不是id时 查询不到数据,因为Mybatisplus自动生成的sql语句where后面拼接的是where null = ? 这就表示表的主键列名的名字不是id,而Mybatisplus默认的是使用id为主键名的 (2).解决方法 @Id @TableId("commodity_id") @Column("commodity_id&qu

  • MyBatis插入Insert、InsertSelective的区别及使用心得

    目录 逆向自动生成的mybatis对应配置Mapper文件里面,有两个方法,分别为insert和insertSelective.这两个方法均是插入对象的方法.为什么会有两个插入方法呢?这里说一下两者的区别. 首先我们看代码如下: insert方法 <insert id="insert" parameterType="demo.pojo.domain.HspMediaInf" > insert into MEDIA_INF (MED_SEQ, EMG_SE

  • MyBatis在insert插入操作时返回主键ID的配置(推荐)

    很多时候,在向数据库插入数据时,需要保留插入数据的id,以便进行后续的update操作或者将id存入其他表作为外键. 但是,在默认情况下,insert操作返回的是一个int值,并且不是表示主键id,而是表示当前SQL语句影响的行数... 接下来,我们看看MyBatis如何在使用MySQL和Oracle做insert插入操作时将返回的id绑定到对象中. MySQL用法: <insert id="insert" parameterType="com.test.User&qu

  • mybatis的insert语句插入数据时的返回值的实现

    mybatis的sql语句一般是配置在配置文件中,现先给出一个例子, sqlMap.xml文件中的一条插入语句: <insert id="add" parameterClass="xxx"> insert into A(a, b, c, d) VALUE (#a#, #b#, #c#, #d#) </insert> 以上的代码片段只是最简单的插入语句,上面这条SQL语句无论执行结果是成功还是失败,它的返回值都是null 如果想要在执行插入之后

  • 详解Java MyBatis 插入数据库返回主键

    最近在搞一个电商系统中由于业务需求,需要在插入一条产品信息后返回产品Id,刚开始遇到一些坑,这里做下笔记,以防今后忘记. 类似下面这段代码一样获取插入后的主键 User user = new User(); user.setUserName("chenzhou"); user.setPassword("xxxx"); user.setComment("测试插入数据返回主键功能"); System.out.println("插入前主键为:

  • MyBatis中insert操作返回主键的实现方法

    在使用MyBatis做持久层时,insert语句默认是不返回记录的主键值,而是返回插入的记录条数:如果业务层需要得到记录的主键时,可以通过配置的方式来完成这个功能 针对Sequence主键而言,在执行insert sql前必须指定一个主键值给要插入的记录,如Oracle.DB2,可以采用如下配置方式: <insert id="add" parameterType="vo.Category"> <selectKey resultType="

  • Mybatis 插入和删除批处理操作

    在操作数据库时,经常会碰到批量插入.批量删除的情况,直接执行SQL语句还好做一点,当使用Mybatis进行批量插入.批量删除时会有一些问题.下面对使用Mybatis批量插入,批量删除进行介绍. 1. 批量插入 Java代码: // Model: Test.java @Data public class Test { private String x; private String y; private String z; } // Mapper: TestMapper.java public v

  • MyBatis插入时获取自增主键方法

    MyBatis 3.2.6插入时候获取自增主键方法有两种.下面以以MySQL5.5为例通过两种方法给大家介绍mybatis获取自增主键的方法,一起看看吧. 以MySQL5.5为例: 方法1: <insert id="insert" parameterType="Person" useGeneratedKeys="true" keyProperty="id"> insert into person(name,pswd

  • 浅谈mybatis中的#和$的区别

    1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id". 2. $将传入的数据直接显示生成在sql中.如:order by $user_id$,如果传入的值是111,那么解析成sql时的值为order by user_id, 如果传入的值是id,则解析成的sql为ord

  • Mybatis 插入一条或批量插入 返回带有自增长主键记录的实例

    首先讲一下, 插入一条记录返回主键的 Mybatis 版本要求低点,而批量插入返回带主键的 需要升级到3.3.1版本,3.3.0之前的都不行. <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>3.3.1</version> </dependency> 1.MySQL <

  • mybatis中insert返回值为1,但数据库却没有数据

    今天在利用Mybatis框架进行数据库插入时,遇到了好几个超级奇怪的问题,也可能是我真的太菜鸡了.做个记录吧~ 1. 排除数据库中表设置错误 使用show variables like '%autocommit%';查看表是否设置自动提交 autocommit已经设置为on,无问题 2. 检查测试类代码 Test.java import entity.Data; import org.apache.ibatis.io.Resources; import org.apache.ibatis.ses

随机推荐