SSM-Mybatis-映射器-insert
insert语句配置:
属性 | 描述 | 备注 |
---|---|---|
id | SQL编号,用于标识这条SQL | 命名空间+id+databaseId唯一,否则Mybatis会抛出异常 |
parameterType | 将会传入这条语句的参数的类全限定名或别名。这个属性是可选的,因为 MyBatis 可以通过类型处理器(TypeHandler)推断出具体传入语句的参数,默认值为未设置(unset)。 | 默认值为未设置(unset) |
用于引用外部 parameterMap 的属性,目前已被废弃。请使用行内参数映射和 parameterType 属性。 | — | |
flushCache | 是否刷新缓存,可以配置true/false,为true时,插入时会刷新一级和二级缓存,否则不刷新 | 默认true |
timeout | 超时时间,单位为秒 | — |
statementType | 可选 STATEMENT,PREPARED 或 CALLABLE。这会让 MyBatis 分别使用 Statement,PreparedStatement(预编译) 或 CallableStatement(存储过程) | 默认值:PREPARED |
useGeneratedKeys | (仅适用于 insert 和 update)这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系型数据库管理系统的自动递增字段) | 默认值:false |
keyProperty | (仅适用于 insert 和 update)指定能够唯一识别对象的属性,MyBatis 会使用 getGeneratedKeys 的返回值或 insert 语句的 selectKey 子元素设置它的值 | 默认值:未设置(unset )。如果生成列不止一个,可以用逗号分隔多个属性名称。 |
keyColumn | (仅适用于 insert 和 update)设置生成键值在表中的列名,在某些数据库(像 PostgreSQL)中,当主键列不是表中的第一列的时候,是必须设置的。如果生成列不止一个,可以用逗号分隔多个属性名称。 | 不能和keyProperty连用 |
databaseId | 如果配置了数据库厂商标识(databaseIdProvider),MyBatis 会加载所有不带 databaseId 或匹配当前 databaseId 的语句;如果带和不带的语句都有,则不带的会被忽略。 | — |
主键回填
JDBC中的Statement对象在执行插入的SQL后,可以通过getGeneratedKeys方法获取数据库生成的主键(需要数据库驱动支持),在insert语句中有一个属性开关useGeneratedKeys,用来控制是否开启这个功能,默认值false
打开这个属性,还需要配置keyProperty或者keyColumn,告诉系统生成的主键放入哪个属性中,如果存在过个主键,就用逗号将他隔开
如:
<insert id="insertRole" parameterType="role"
useGeneratedKeys="true" keyProperty="id" >
insert into t_role(role_name,note) values(#{roleName},#{note})
</insert>
keyProperty代表将用哪个POJO的属性去匹配这个主键,这里是id,说明会用数据库生成的主键去赋值给这个POJO
自定义主键
selectKey元素支持自定义主键生成规则:
<insert id="”insertRole" parameterType="role">
<selectKey keyProperty="id" resultType="long" order="BEFORE">
select if(max(id))=null , 1, max(id)+3 ) from t_role
</selectKey>
insert into t_role(id,role_name,note) values(#{id},#{roleName},#{note})
</insert>
selestKey元素属性:
属性 | 描述 |
---|---|
keyProperty | selectKey 语句结果应该被设置到的目标属性。如果生成列不止一个,可以用逗号分隔多个属性名称。 |
keyColumn | 返回结果集中生成列属性的列名。如果生成列不止一个,可以用逗号分隔多个属性名称。 |
resultType | 结果的类型。通常 MyBatis 可以推断出来,但是为了更加准确,写上也不会有什么问题。MyBatis 允许将任何简单类型用作主键的类型,包括字符串。如果生成列不止一个,则可以使用包含期望属性的 Object 或 Map。 |
order | 可以设置为 BEFORE 或 AFTER 。如果设置为 BEFORE ,那么它首先会生成主键,设置 keyProperty 再执行插入语句。如果设置为 AFTER ,那么先执行插入语句,然后是 selectKey 中的语句 - 这和 Oracle 数据库的行为相似,在插入语句内部可能有嵌入索引调用。 |
statementType | 和前面一样,MyBatis 支持 STATEMENT ,PREPARED 和 CALLABLE 类型的映射语句,分别代表 Statement , PreparedStatement 和 CallableStatement 类型。 |