(六)MyBatis映射器——insert、update、delete及sql元素

 

 insert元素

 

insert元素的配置
属性描述 注意
id

SQL编号,用于标识这条SQL

命名空间+id+databaseId唯一,否则MyBais会抛出异常
parameterType参数类型可以是单个也可以是多个参数
flushCache是否刷新缓存,可以配置ture/false,为true时,插入时会刷新级和二级缓存,否则不刷新默认值为true
keyPropertyw唯一标记一个属性,Mybatis会通过getGeneratedKeys的返回值,货值听过insert语句的selectKey子元素设置它的键值。若是复合主键用(,)隔开(对update和insert有用)默认值为unset.。不能和keyColumn连用
statementTypeSTATEMENT、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="别名"/>

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值