【Mybatis】配置映射文件之insert元素及主键生成策略

insert元素

在使用MyBatis做持久层时,insert语句默认是不返回记录的主键值,而是返回插入的记录条数;如果业务层需要得到记录的主键时,可以通过配置的方式来完成这个功能。
insert`语句常用的几个属性如下:

  • parameterType 表示传入SQL语句句的参数类型,它可以是基本数据类型(如int,String,Date等),基本数据类型传参,只能传入一个,在SQL语句中通过#{参数名} 即可获取传入的值。也可以是复杂数据类型(Java实体类、Map),在SQL语句中通过#{属性名}或#{map的KeyName}即可获取传入的值 。
  • useGeneratedKeys (仅对l 门se叶和update 育用)此属性会使MyBatis 使用JDBC 的getGeneratedKeys()方法来获取由数据库内部生产的主键,其默认值为false
  • keyProperty (仅对 insert 和 update 有用)的作用是将插入或更新操作时的返回值赋值给PO 类的某个属性,通常会设置为主键对应的属性。如果需要设置联合主键,可以在多个值之间用逗号隔开。

数据库支持自动生成主键

若数据库支持自动生成主键的字段(比如 MySQL和 SQL Server),则可以设置useGeneratedKeys=”true”,然后再把keyProperty 设置到目标属性上。

 <insert id="addUser" parameterType="com.lucas.mybatis.model.User"  keyProperty="id" 
 useGeneratedKeys="true">
insert into user (name,age) value (#{name},{age})
</insert>

使用keyProperty属性指定id为主键字段,同时使用useGeneratedKeys属性告诉MyBatis这个主键是否使用数据库的内置规则生成。

数据库不支持自动生成主键

    <insert id="addUser" parameterType="com.lucas.mybatis.model.User"  >
        <selectKey keyProperty="id" order="BEFORE" resultType="Integer">
            select if(max(id) is null , 1 , max(id) +1) as newld from user
        </selectKey>
			insert into user (id,name,age) value (#{id},#{name},{age})
	</insert>

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

在上述 标签的几个属性中

  • resultType 从SQL 语句中返回的结果的类型。它可以是基本数据类型(如int String等)也可以集合类型(List,ArrayList等),如果返回的是集合类型那么返回的应该是集合包含的类型,而不是集合本身,如果我们返回的是List则resultType应为User。
  • order 属性可以被设置为BEFORE 或AFTER 。如果设置为BEFORE ,那么它会首先执行元素中的配置来设置主键,然后执行插入语句;如果设置为AFTER ,那么它会先执行插入语句,然后执行元素中的配置内容。

猜你喜欢

转载自blog.csdn.net/huweiliyi/article/details/107871571
今日推荐