insert元素
属性 | 描述 | 注意 |
id | SQL编号,用于标识这条SQL | 命名空间+id+databaseId唯一,否则MyBais会抛出异常 |
parameterType | 参数类型 | 可以是单个也可以是多个参数 |
flushCache | 是否刷新缓存,可以配置ture/false,为true时,插入时会刷新级和二级缓存,否则不刷新 | 默认值为true |
keyProperty | w唯一标记一个属性,Mybatis会通过getGeneratedKeys的返回值,货值听过insert语句的selectKey子元素设置它的键值。若是复合主键用(,)隔开 | (对update和insert有用)默认值为unset.。不能和keyColumn连用 |
statementType | STATEMENT、PREPARED 或CALLABLE中的一个。这会让MyBatis分别使用Statement、 PreparedStatement (预编译)或CallableStatement (存储过程) | 默认值PREPARED |
useGeneratedKeys | 是否启用JDBC的getGeneratedKeys方法取出有数据库内部生成的主键 | 默认值为false |
keyColumn | 通过生成的键值设置表中的列名,只在PostgreSQL中是必须的,当主键的第一列是需要设置。若是复合主键用(,)隔开 | (对update和insert有用)不和keyProperty一起用 |
timeout | 超时时间,单位为秒 |
一条SQL插入一个简单的User
<insert id = "insertUser" parameterType="User">
INSERT INTO t_user(user_name, note) VALUES (#{userName}, #{note})
</insert>
- id标识出这条SQL,结合命名空间让MyBatis能够找到它
- parameterType代表传入参数类型
- 没有配置均采用默认值
主键回填
在上面的简单例子里,我们没有看见插入id列,这是因为MYSQL中的表格采用了自增主键,MYSQL数据库会为该记录生成对应的主键。但在实际的应用中,我们会经常使用id来关联其他业务,因此取到主键也是十分有必要的。
在JDBC中的StateMent对象在执行插入的SQL后,可以通过getGeneratedKeys方法获得数据库生成的主键(需要数据库驱动的支持),这样便能达到获取主键的功能。在insert语句中有一个开关属性useGeneratedKeys,用来控制是否打开这个功能,它的默认值是false。
当我们打开这个开关来使用这个功能时,我们还要配置keyProperty或keyColumn属性,告诉系统吧生成的主键放在哪个属性中,如果存在多个主键,就要使用(,)将它们隔开。
<insert id = "insertUser" parameterType="User"
useGeneratedKeys="true" keyProperty="id">
INSERT INTO t_user(user_name, note) VALUES (#{userName}, #{note})
</insert>
useGeneratedKeys代表采用JDBC的Statement对象的getGeneratedKeys方法返回主键,而keyProperty则代表将使用哪个POJO的属性去匹配这个主键,这里使用的是id,说明它会用数据库生成的主键赋值POJO,测试主键回填的结果。
自定义主键
当我们的业务需要使用某些规则来约束主键的时候例如:
- 当用户表记录为空时,id设置为 1
- 当用户表记录不为空是,id设置为当前 id 乘以 2
强大的Mybatis对这样的场景提供了一定的支持,使用selectKey元素进行支持,它允许自定义键值得生成规则。
<insert id = "insertUser" parameterType="User">
<selectKey keyProperty="id" resultType="long" order="BEFORE">
SELECT if (max(id) = NULL ,1, MAX (id) * 2) FROM t_user
</selectKey>
INSERT INTO t_user(user_name, note) VALUES (#{userName}, #{note})
</insert>
在代码中定义的selectKey元素,它的keyProperty指定了采用那个属性作为POJO的主键。resultType 告诉MyBatis将返回个long型的结果集,而order设置为BEFORE,说明它将于当前定义的SQL前执行。通过这样的自定义主键的规则,可见MyBatis很强大。说明它将于当前定义的SQL前执行。这里的order配置为BEFORE,说明它会在插入之前会先执行生成主键的SQL,然后插入数据。如果有一些特殊需要,可以把它设置为AFTER,能有嵌入索引调用,这样它就会在插入语句之后执行了.
update元素和delete元素
这两个元素比较简单,我们简单看过
update
<update id="updateUser" parameterType="User">
UPDATE t_user SET user_name = #{userName}, note = #{note}
WHERE id = #{id}
</update>
delete
<delete id="deleteUser" parameterType="User">
DELETE FROM t_user WHERE id = #{id}
</delete>
sql元素
sql元素的作用在于可以定义一条SQL的一部分,方便在后面的SQL中引用它,比如列名。
在select和insert中我们经常大量编写重复的语句,在实际开发中字段名会很长,所以引入sql元素来一次解决。
<sql id="userCols">
id, user_name, note
</sql>
当你想使用时,可以这样
<select id="selectUser" parameterType="long" resultMap="userMap">
SELECT <include refid="userCols"/> FROM t_user WHERE id = #{id}
</select>
<insert id = "insertUser" parameterType="User">
INSERT INTO t_user(<include refid="userCols"/>) VALUES (#{id}, #{userName}, #{note})
</insert>
使用<include refid="别名"/>