通过insert/update标签相关属性

案例:ZJJ_Mybatis_2019/09/29_18:42:53_j5v1b
属性 描述
useGeneratedKeys (仅对 insert 和 update 有用)这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系数据库管理系统的自动递增字段),默认值:false。
keyProperty (仅对 insert 和 update 有用)唯一标记一个属性,MyBatis 会通过 getGeneratedKeys 的返回值或者通过 insert 语句的 selectKey 子元素设置它的键值,默认:unset。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。

注意:自增长序号不是简单的行数+1,而是序号最大值+1;






通过selectKey元素

案例:ZJJ_Mybatis_2019/09/29_18:55:58_rrypg
属性 描述
keyProperty selectKey 语句结果应该被设置的目标属性。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。
resultType 结果的类型。MyBatis 通常可以推算出来,但是为了更加确定写上也不会有什么问题。MyBatis 允许任何简单类型用作主键的类型,包括字符串。如果希望作用于多个生成的列,则可以使用一个包含期望属性的 Object 或一个 Map。
order 这可以被设置为 BEFORE 或 AFTER。如果设置为 BEFORE,那么它会首先选择主键,设置 keyProperty 然后执行插入语句。如果设置为 AFTER,那么先执行插入语句,然后获取主键字段;mysql数据库自增长的方式order设置为After,oracle数据库通过sequnce获取主键order设置为Before


Oracle通过sequnce获取主键示例:
获取自动生成的主键(插入数据后) - 图1

Mysql通过自增长序号获取主键示例:

| <insert id=”insertSelective” parameterType=”com.fancy.projecty.pojo.WaterAgent”>
<selectKey keyProperty=”agentId” order=”AFTER” resultType=”int”> select LAST_INSERT_ID()
</selectKey> insert into water_agent
<trim prefix=”(“ suffix=”)” suffixOverrides=”,”>
<if test=”agentId != null”> | | —- |


order=”AFTER” //MySQL中order属性设置的值为after ,因为当前记录主键值在insert语句执行成功之后才能获取到.
resultType=”int” //写主键的返回值类型
keyProperty=”agentId” //这个写你 parameterType指定的实体类的属性值,用于接收返回的主键的,一般写实体类而主键

取值
你传入的是什么实体类,取值就直接用这个实体类的get方法就行了,
Integer i = waterAgentService.insert(waterAgent);

Integer agentId = waterAgent.getAgentId(); //获取自增的主键




ü Mysql resultType 是Map集合的话如何操作:

<insert id=”insertAppUser” parameterType=”java.util.Map” useGeneratedKeys=”true” keyProperty=”id” keyColumn=”id”>
/注意”因为用map接收的,map的value初始化也设定了String类型的,resultType 必须写成String类型的, /

  1. <**selectKey resultType="String" order="AFTER" keyProperty="id"**><br /> SELECT LAST_INSERT_ID() as id<br /> </**selectKey**><br /> INSERT INTO user (uuid, user_nick_name, user_phone, user_password, user_status, creation_time,user_type)<br /> VALUES (#{uuid},#{userNickName},#{userPhone},#{userPassword},"0",now() ,"0" )<br /></**insert**><br /> <br />Java代码:<br />**int **userId = **this**.**appUserDao**.insertAppUser(map);

String id = map.get(“id”); //能取出来刚刚插入数据库信息时候的主键



Oracle

ü Oracle:(没测试过)
Oracle数据库中,order值要设置为before,这是因为Oracle中需要先从序列获取值,然后将值作为主键插入到数据库中.需要注意,Oracle方式insert语句中明确写出了id列和值#{id} ,因为执行selectKey 中的语句后id就有值了,我们需要把整儿序列值插入到数据库中,所以必须指定id列.如果不指定id列,数据库就会因为主键不能为空而抛异常.

<insert id=”insertOracle”>
<selectKey keyColumn=”id” resultType=”long” keyProperty=”id” order=”BEFORE”>
SELECT SEQ_USER.nextval from dual
</selectKey>
insert into sys_user(
id, user_name, user_password, user_email,
user_info, head_img, create_time)
values(
#{id}, #{userName}, #{userPassword}, #{userEmail},
#{userInfo}, #{headImg, jdbcType=BLOB}, #{createTime, jdbcType=TIMESTAMP})
</insert>


ü oracle:???

实现思路:
先查询序列得到主键,将主键设置到user对象中,将user对象插入数据库。





select 序列.nextval() from dual

selectKey>

INSERT INTO USER(id,username,birthday,sex,address) VALUES( 序列.nextval(),#{username},#{birthday},#{sex},#{address})

insert>