学科分类
目录
SSM框架

<insert>元素

<insert>元素用于映射插入语句,在执行完元素中定义的SQL语句后,会返回一个表示插入记录数的整数。

<insert>元素的配置示例如下:

<insert
    id="addCustomer"
    parameterType="com.itheima.po.Customer"
    flushCache="true"
    statementType="PREPARED"
    keyProperty=""
    keyColumn=""
    useGeneratedKeys=""
    timeout="20">

从上述示例代码中可以看出,<insert>元素的属性与<select>元素的属性大部分相同,但还包含了3个特有属性,这3个属性的描述如表1所示。

表1 <insert>元素中的属性

属性 说明
keyProperty (仅对insert和update有用)此属性的作用是将插入或更新操作时的返回值赋值给PO类的某个属性,通常会设置为主键对应的属性。如果需要设置联合主键,可以在多个值之间用逗号隔开。
keyColumn (仅对insert和update有用)此属性用于设置第几列是主键,当主键列不是表中的第一列时需要设置。在需要主键联合时,值可以用逗号隔开。
useGeneratedKeys (仅对insert和update有用)此属性会使MyBatis使用JDBC的getGeneratedKeys()方法来获取由数据库内部生产的主键,如MySQL和SQL Server等自动递增的字段,其默认值为false。

执行插入操作后,很多时候我们会需要返回插入成功的数据生成的主键值,此时就可以通过上面所讲解的3个属性来实现。

如果使用的数据库支持主键自动增长(如MySQL),那么可以通过keyProperty属性指定PO类的某个属性是接收主键返回值(通常会设置到id属性上),然后将useGeneratedKeys的属性值设置为true。其使用示例如下:

<insert id="addCustomer" parameterType="com.itheima.po.Customer"
keyProperty="id" useGeneratedKeys="true" >
    insert into t_customer(username,jobs,phone)
    values(#{username},#{jobs},#{phone})
</insert>

使用上述配置执行插入后,会返回插入成功的行数,以及插入行的主键值。为了验证此配置,可以通过如下代码测试。

@Test
public void addCustomerTest(){
    // 获取SqlSession
    SqlSession sqlSession = MybatisUtils.getSession();
    Customer customer = new Customer();
    customer.setUsername("rose");
    customer.setJobs("student");
    customer.setPhone("13333533092");
    int rows = sqlSession.insert("com.itheima.mapper."
            + "CustomerMapper.addCustomer", customer);
    // 输出插入数据的主键id值
    System.out.println(customer.getId());
    if(rows > 0){
        System.out.println("您成功插入了"+rows+"条数据!");
    }else{
        System.out.println("执行插入操作失败!!!");
    }
    sqlSession.commit();
    sqlSession.close();
}

执行程序后,控制台的输出结果如图1所示。

图1 运行结果

如果使用的数据库不支持主键自动增长(如Oracle),或者支持增长的数据库取消了主键自增的规则时,也可以使用MyBatis提供的另一种方式来自定义生成主键,具体配置示例如下:

<insert id="insertCustomer" parameterType="com.itheima.po.Customer">
    <selectKey keyProperty="id" resultType="Integer" order="BEFORE">
      select if(max(id) is null, 1, max(id) +1) as newId from t_customer
    </selectKey>            
    insert into t_customer(id,username,jobs,phone)
    values(#{id},#{username},#{jobs},#{phone})
</insert>

在执行上述示例代码时,<selectKey>元素会首先运行,它会通过自定义的语句来设置数据表中的主键(如果t_customer表中没有记录,则将id设置为1,否则就将id的最大值加1,来作为新的主键),然后再调用插入语句。

<selectKey>元素在使用时可以设置以下几种属性:

<selectKey
    keyProperty="id"
    resultType="Integer"
    order="BEFORE"
    statementType="PREPARED">

在上述<selectKey>元素的几个属性中,keyProperty、resultType和statementType的作用与前面讲解的相同,这里不重复介绍。order属性可以被设置为BEFORE或AFTER。如果设置为BEFORE,那么它会首先执行<selectKey>元素中的配置来设置主键,然后执行插入语句;如果设置为AFTER,那么它会先执行插入语句,然后执行<selectKey>元素中的配置内容。

点击此处
隐藏目录