MyBatis insert标签及常用属性详解

 更新时间:2023年10月08日 15:22:46   作者:小日子呀  
这篇文章主要介绍了MyBatis insert标签,insert 标签中没有 resultType 属性,只有查询操作才需要对返回结果类型进行相应的指定,需要的朋友可以参考下
<insert id="addWebsite" parameterType="string">
    insert into website(name)
    values(#{name})
</insert>

在 WebsiteMapper 接口中定义一个 add() 方法 

public int addWebsite(String name);

 参数为 Sting 类型的字符串;返回值为 int 类型,即执行 SQL 后,插入记录的行数。测试:

//插入 name 为编程帮1 的记录
String name = "编程1";
int i = websiteMapper.addWebsite(name);
System.out.println("共插入了 " + i + " 条记录");

insert 标签常用属性

属性名称描述备注
id它和 Mapper 的命名空间组合起来使用,是唯一标识符,供 MyBatis 调用如果命名空间+ id 不唯一,那么 MyBatis 抛出异常
parameterType传入 SQL 语句的参数类型的全限定名或别名,它是一个可选属性。支持基本数据类型和 JavaBean、Map 等复杂数据类型
keyProperty该属性的作用是将插入操作的返回值赋给 PO 类的某个属性,通常为主键对应的属性。如果是联合主键,可以将多个值用逗号隔开。-
useGeneratedKe该属性用来设置,是否使用 JDBC 提供的 getGenereatedKeys() 方法,获取数据库内部产生的主键并赋值到 keyProperty 属性设置的请求对象的属性中,例如 MySQL、SQL Server 等自动递增的字段,其默认值为 false。该属性值设置为 true 后,会将数据库生成的主键回填到请求对象中,以供其他业务使用。
flushCache该属性用于设置执行该操作后,是否会清空二级缓存和本地缓存,默认值为 true。-
timeout该属性用于设置执行该操作的最大时限,如果超时,就抛异常。-
databaseId取值范围 oracle、mysql 等,表示数据库厂家;元素内部可通过 <if test="_databaseId = 'oracle'"> 来为特定数据库指定不同的 sql 语句。MyBatis 可以根据不同的数据库厂商执行不同的语句,这种多厂商的支持是基于映射语句中的 databaseId 属性。 MyBatis 会加载不带 databaseId 属性和带有匹配当前数据库 databaseId 属性的所有语句。 如果同时找到带有 databaseId 和不带 databaseId 的相同语句,则后者会被舍弃。
keyColumn该属性用于设置第几列是主键,当主键列不是表中的第 1 列时,就需要设置该属性。如果是联合主键,可以将多个值用逗号隔开。-

注意:insert 标签中没有 resultType 属性,只有查询操作才需要对返回结果类型进行相应的指定。

传递多个参数

在上面的示例中,我们在插入语句中只使用了一个 String 类型的参数,而在实际的开发过程中,我们的插入语句往往需要使用多个参数,Mybatis 为我们提供以下 3 种方式,来实现给映射器传递多个参数:

  • 使用 Map 传递参数
  • 使用注解传递参数
  • 使用 JavaBean 传递参数

使用 Map 传递参数

可以将参数封装到一个 Map 对象中,然后传递给 MyBatis 的映射器,示例如下

在 WebsiteMapper 接口中,定义一个 addWebsiteByMap() 方法,并使用 Map 传递参数 

int addWebsiteByMap(Map<String, String> params);

 在 WebsiteMapper.xml 中,使用 insert 标签定义一条插入语句,并接收通过 Map 传递的参数

<!--接收 Map 参数-->
<insert id="addWebsiteByMap" parameterType="map">
    insert into Website (name, url) values (#{name}, #{url})
</insert>

使用注解传递参数

在 WebsiteMapper 接口中,定义一个 addWebsiteByParam() 方法,并使用 @Param 注解传递参数 

int addWebsiteByParam(@Param("name") String name, @Param("url") String url);

 在 WebsiteMapper.xml 中使用 insert 标签定义一条插入语句,并接收通过 @Param 注解传递的参数

<!--接收 @Param 注解传递的参数-->
<insert id="addWebsiteByParam">
    insert into Website (name, url)  values (#{name}, #{url})
</insert>

 测试代码

int i = websiteMapper.addWebsiteByParam("111", "222");
System.out.println("通过 @Param 注解成功向数据库中添加了 " + i + " 条记录");

使用 JavaBean 传递参数

在 WebsiteMapper 接口中,定义一个addWebsiteByJavaBean() 方法

int addWebsiteByJavaBean(Website website);

 在 WebsiteMapper.xml 中使用 insert 标签定义一条插入语句,并接收通过 JavaBean 传递的参数

<!--接收通过 JavaBean 传递的参数-->
<insert id="addWebsiteByJavaBean" parameterType="net.cc.www.po.Website">
    insert into Website (name, url) values (#{name}, #{url})
</insert>

区别

以上 3 种方式的区别如下:

  • 使用 Map 传递参数会导致业务可读性的丧失,继而导致后续扩展和维护的困难,所以在实际应用中我们应该果断废弃该方式。
  • 使用 @Param 注解传递参数会受到参数个数的影响。当 n≤5 时,它是最佳的传参方式,因为它更加直观;当 n>5 时,多个参数将给调用带来困难。
  • 当参数个数大于 5 个时,建议使用 JavaBean 方式。

主键(自动递增)回填

MySQL、SQL Server 等数据库表可以采用自动递增的字段作为其主键,当向这样的数据库表插入数据时,即使不指定自增主键的值,数据库也会根据自增规则自动生成主键并插入到表中。一些特殊情况下,可能需要将这个刚刚生成的主键回填到请求对象(原本不包含主键信息的请求对象)中,供其他业务使用。可以通过在 insert 标签中添加  keyProperty 和 useGeneratedKeys 属性,来实现该功能。

<insert id="addWebsite" parameterType="net.cc.po.Website" keyProperty="id" useGeneratedKeys="true">
    insert into Website (name,url) values(#{name},#{url})
</insert>

自定义主键

如果在实际项目中,若数据库不支持主键自动递增(例如 Oracle),或者取消了主键自动递增的规则,我们可以使用 MyBatis 的 <selectKey> 标签自定义生成主键,具体配置代码如下:

<insert id="insertWebsite" parameterType="net.cc.po.Website">
    <!-- 先使用selectKey标签定义主键,然后再定义SQL语句 -->
    <selectKey keyProperty="id" resultType="Integer" order="BEFORE">
        select if(max(id) is null,1,max(id)+1) as newId from Website
    </selectKey>
    insert into Website (id,name,url) values(#{id},#{name},#{url})
</insert>

 <selectKey> 标签中属性说明如下:

  • keyProperty:用于指定主键值对应的 PO 类的属性。
  • order:该属性取值可以为 BEFORE 或 AFTER。BEFORE 表示先执行 <selectKey> 标签内的语句,再执行插入语句;AFTER 表示先执行插入语句再执行 <selectKey> 标签内的语句

到此这篇关于MyBatis insert标签的文章就介绍到这了,更多相关MyBatis insert标签内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 正确遍历删除List中的元素方法(推荐)

    正确遍历删除List中的元素方法(推荐)

    下面小编就为大家带来一篇正确遍历删除List中的元素方法(推荐)。小编觉得挺不错的,在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • kafka运维consumer-groups.sh消费者组管理

    kafka运维consumer-groups.sh消费者组管理

    这篇文章主要为大家介绍了kafka运维consumer-groups.sh消费者组管理,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • Java序列化机制与原理的深入分析

    Java序列化机制与原理的深入分析

    有关Java对象的序列化和反序列化也算是Java基础的一部分,下面对Java序列化的机制和原理进行一些介绍
    2013-05-05
  • 本地安装MinIO分布式对象存储服务器的详细步骤

    本地安装MinIO分布式对象存储服务器的详细步骤

    本地安装MinIO非常简单,MinIO提供了独立的二进制文件,无需额外的依赖,本文介绍如何在本地安装MinIO分布式对象存储服务器,感兴趣的朋友一起看看吧
    2024-01-01
  • Java 开发环境配置步骤(介绍)

    Java 开发环境配置步骤(介绍)

    下面小编就为大家带来一篇Java 开发环境配置步骤(介绍)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • JAVA8妙用Optional解决判断Null为空的问题方法

    JAVA8妙用Optional解决判断Null为空的问题方法

    本文主要介绍了JAVA8妙用Optional解决判断Null为空的问题方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • Java实现调用MySQL存储过程详解

    Java实现调用MySQL存储过程详解

    相信大家都知道存储过程是在大型数据库系统中,一组为了完成特定功能的SQL语句集。存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。Java调用mysql存储过程,实现如下,有需要的朋友们可以参考借鉴,下面来一起看看吧。
    2016-11-11
  • Spring官网下载各版本jar包的方法

    Spring官网下载各版本jar包的方法

    这篇文章主要介绍了Spring官网下载各版本jar包的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-04-04
  • 源码分析Spring 中 @Qualifier 注解基本用法

    源码分析Spring 中 @Qualifier 注解基本用法

    这篇文章主要介绍了源码分析Spring 中 @Qualifier 注解基本用法,在源码分析的过程中,也 GET 到 Spring 许多新的玩法,感兴趣的小伙伴赶紧去试试吧
    2023-08-08
  • Java使用String类格式化当前日期实现代码

    Java使用String类格式化当前日期实现代码

    这篇文章主要介绍了Java使用String类格式化当前日期实现代码,需要的朋友可以参考下
    2014-02-02

最新评论