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 ,那么它会先执行插入语句,然后执行元素中的配置内容。