mybatis——mysql和oracle插入数据主键冲突时解决存在即更新不存在即插入操作

一、mybatis+mysql数据库

单个新增或编辑:

<insert id="insert" parameterType="com.pagoda.batchprocessingdata.dto.user.User">
	insert into admin.t_user (ID, NAME, AGE, PASSWORD)
	values (#{id}, #{name}, #{age}, #{password})
	ON DUPLICATE KEY UPDATE
	NAME = values(NAME),
	AGE = values(AGE),
	PASSWORD = values(PASSWORD)
</insert>

连接mysql数据库执行测试结果: 

批量新增或编辑:

<insert id="multi_insert" parameterType="com.pagoda.batchprocessingdata.dto.user.User">
	insert into t_user ( ID, NAME, AGE, PASSWORD )
	values
	<foreach collection="list" item="item" index="index" separator="," >  
		 (#{item.id}, #{item.name}, #{item.password})
	</foreach>
	 ON DUPLICATE KEY UPDATE
			NAME = VALUES( NAME ),
			AGE = VALUES( AGE ),
			PASSWORD = VALUES( PASSWORD )
</insert>

测试结果: 

INSERT INTO t_user ( ID, NAME, AGE, PASSWORD )
VALUES
('1', '悟空','20', '2'),
('2', '八戒','20', 's'),
('3', '唐僧','20', 's'),
('4', '沙僧','20', '2'),
('5', '白龙马','20', '2')
    ON DUPLICATE KEY UPDATE 
NAME = VALUES( NAME ),
AGE = VALUES( AGE ),
PASSWORD = VALUES( PASSWORD )

二、mybatis+oracle数据库
单个新增或编辑:单个是我根据批量改的(可以用)

<!-- 插入数据 -->
    <!-- 入参定义:实体类,会自动解析属性到对应的值-->
    <insert id="insert" parameterType="com.pagoda.batchprocessingdata.dto.user.User">
        merge into admin.t_user t
                <!-- insert 和update中所有的数据都需要从using中获取 -->
                using(
                select #{id} as ID, #{name} as NAME, #{age} as AGE, #{password} as PASSWORD
                    from dual
                ) tmp
                <!-- on后面的括弧不能省 -->
                on ( tmp.ID = t.ID)
        when matched THEN
                update set
                <!-- ORA-38104: 在on条件中的列是不可以更新的 t.ID = tmp.ID, -->
                t.NAME = tmp.NAME,
                t.AGE = tmp.AGE,
                t.PASSWORD = tmp.PASSWORD
        when not matched THEN
                insert
                <trim prefix="(" suffix=")" suffixOverrides=",">
                    ID, NAME, AGE, PASSWORD
                </trim>
                <trim prefix="values (" suffix=")" suffixOverrides=",">
                    tmp.ID, tmp.NAME, tmp.AGE, tmp.PASSWORD
                </trim>
    </insert>

批量新增或编辑:

<!-- 入参定义:使用List集合对象 -->
    <insert id="multiInsert" parameterType="java.util.List">
        merge into admin.t_user t
            <!-- insert 和update中所有的数据都需要从using中获取 -->
            using(
            <!-- item:list中的具体对象 -->
            <foreach collection="list" index="index" item="item" open="" close="" separator="union">
                select
                    #{item.id,jdbcType=INTEGER} as ID,
                    #{item.name,jdbcType=VARCHAR} as NAME,
                    #{item.age,jdbcType=VARCHAR} as AGE,
                    #{item.password,jdbcType=INTEGER} as PASSWORD
                from dual
            </foreach>
            ) tmp
            <!-- on后面的括弧不能省 -->
            on ( tmp.ID = t.ID)
        when matched THEN
            update set
            <!-- ORA-38104: 在on条件中的列是不可以更新的 t.ID = tmp.ID -->
            t.NAME = tmp.NAME,t.AGE = tmp.AGE,t.PASSWORD = tmp.PASSWORD
        when not matched THEN
            insert
            <trim prefix="(" suffix=")" suffixOverrides=",">
                ID,NAME,AGE, PASSWORD
            </trim>
            <trim prefix="values (" suffix=")" suffixOverrides=",">
                tmp.ID,tmp.NAME,tmp.AGE,tmp.PASSWORD
            </trim>
    </insert>

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mybatis插入数据后返回id的方式取决于所使用的数据库和mapper配置方式。以下是一些常见的方式: 1. MySQL自增 如果使用MySQL自增,可以在mapper文件中使用`useGeneratedKeys`和`keyProperty`属性来返回自增的值。 示例: ```xml <insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id"> insert into user(name, age) values (#{name}, #{age}) </insert> ``` 在这个例子中,`useGeneratedKeys`属性告诉Mybatis使用数据库自动生成的值,并将其设置到`keyProperty`指定的对象属性中(即`User`对象的`id`属性)。 2. Oracle序列 如果使用Oracle序列,可以在mapper文件中使用`selectKey`元素来返回序列的值。 示例: ```xml <insert id="insertUser" parameterType="User"> <selectKey keyProperty="id" resultType="Long" order="BEFORE"> select user_seq.nextval from dual </selectKey> insert into user(id, name, age) values (#{id}, #{name}, #{age}) </insert> ``` 在这个例子中,`selectKey`元素在插入语句之前执行,返回序列的下一个值,并将其设置到`keyProperty`指定的对象属性中(即`User`对象的`id`属性)。 3. SQL Server自增 如果使用SQL Server自增,可以在mapper文件中使用`selectKey`元素来返回自增的值。 示例: ```xml <insert id="insertUser" parameterType="User"> <selectKey keyProperty="id" order="AFTER" resultType="Long"> select @@IDENTITY </selectKey> insert into user(name, age) values (#{name}, #{age}) </insert> ``` 在这个例子中,`selectKey`元素在插入语句之后执行,返回自增的值,并将其设置到`keyProperty`指定的对象属性中(即`User`对象的`id`属性)。 注意:`@@IDENTITY`是SQL Server中获取自增的方式,需要在mapper文件中使用。如果使用的是其他数据库,需要查阅相应的文档来确定获取自增的方式。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值