推广 热搜: csgo  vue  angelababy  2023  gps  新车  htc  落地  app  p2p 

新数据插入旧数据库中的方法注意点和注意事项

   2023-05-31 网络整理佚名1730
核心提示:由于需要将新数据同步到另外的数据库,所以需要使用进行操作,但是不支持写入操作,因此需要调用写好的存储过程才能实现将新数据插入新数据的同时插入旧数据库。预先准备好新旧两个数据库旧的数据库创建存储过程创建一个存储过程用于将新数据库的数据字段和旧的数据库字段映射上,同时使用序列自增作为id值,将新数据插入旧数据库中。创建中的方法创建接口这里为了方便就直接在中写方法调用了。执行的debug日志

原因

由于新数据需要同步到另一个数据库,需要操作,但是不支持写操作,所以需要在插入新数据的同时调用写好的存储过程将新数据插入到旧数据库中.

准备

提前准备新旧数据库

旧数据库

create table OLD_USER
(
  USER_ID                    NUMBER(6) not null primary key,
  LOGIN_NAME                 VARCHAR2(100) not null,
  REAL_NAME                  VARCHAR2(300),
  PASSWORD                   CHAR(64)
)

新数据库

create table NEW_USER
(
  ID            NUMBER(11) not null primary key,
  CREATE_TIME   TIMESTAMP(6),
  UPDATE_TIME   TIMESTAMP(6),
  DELETED       NUMBER(1),
  ACCOUNT       VARCHAR2(255),
  USERNAME      VARCHAR2(255),
  PASSWORD      VARCHAR2(255)
)

相应的实体是:

package com.donlex.demo.entity;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import java.util.Date;
import java.util.List;
@Getter
@Setter
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
@ApiModel("新数据库对应实体")
@KeySequence("s_old_user")
public class NewUser {
    @ApiModelProperty("主键")
    @TableId(type = IdType.INPUT)
    private Long id;
    @ApiModelProperty(value = "创建时间", hidden = true)
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    @ApiModelProperty(value = "更新时间", hidden = true)
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;
    @ApiModelProperty(value = "删除标志", hidden = true)
    @TableField(fill = FieldFill.INSERT)
    @TableLogic
    private Boolean deleted;
    @ApiModelProperty("用户账号")
    private String account;
    @ApiModelProperty("用户名称")
    private String username;
    @ApiModelProperty("密码")
    private String password;
    @ApiModelProperty("插入旧数据库返回的id")
    @TableField(exist = false)
    private Integer oldUserId;
}

创建存储过程

创建一个存储过程,将新数据库的数据字段映射到旧数据库字段,并使用序列自增作为id值,将新数据插入到旧数据库中。

create or replace procedure PRO_TO_OLD_USER(
                                         v_account in varchar2,
                                         v_username in varchar2,
                                         v_password in varchar2,
                                         v_result out varchar2) is
  V_ID number;
  PRAGMA AUTONOMOUS_TRANSACTION;
begin
-- 使用序列自增做为主键,s_old_user为序列名, @dklinkName 是dblink名
  SELECT s_old_user.NEXTVAL @dklinkName into V_ID FROM DUAL;
  insert into OLD_USER(USER_ID,
                        LOGIN_NAME,
                        REAL_NAME,
                        PASSWORD
                      )
  VALUES (V_ID,
-- 使用case进行判断 v_account 字段是否为空
          case when v_account is null
                 then
                 '空'
               else
                 v_account
          end,
          v_username,
          v_password
        );
  commit;
-- 返回自增的序列值
  v_result := V_ID;
  DBMS_OUTPUT.put_line('添加到旧数据库账号成功ID为' || V_ID);
end PRO_TO_OLD_USER;

创建方法



<mapper namespace="com.donlex.demo.mapper.NewUserMapper">
 <select id="insertIntoOldUser" statementType="CALLABLE" parameterType="com.donlex.demo.entity.NewUser">
    {call PRO_TO_OLD_USER
         (
             #{account,mode=IN},
             #{username,mode=IN},
             #{password,mode=IN},
             #{oldUserId,mode=OUT,jdbcType=INTEGER}
         )
    }
  select>
mapper>

当心:

在存储过程中设置使用参数时,除了写必要的属性名外,还必须指定参数的模式(mode)。 可选值有 IN、OUT 和 INOUT。 输入参数使用 IN,输出参数使用 OUT。 ,输入输出参数使用INOUT。 OUT模式的参数,必须指定。因为在IN模式下,默认提供,而在OUT模式下,不提供,所以必须指定,当输入参数无法识别,执行时报错, 最好指定

创建界面

@Mapper
@Repository
public interface NewUserMapper extends baseMapper<NewUser> {
  
  void insertIntoOldUser(NewUser req);
}

这里定义了void方法,但实际上返回的是实体对象,所以可以通过get方法获取属性值,这就是为什么在实体中定义了一个,但在数据表中并不是真正的字段@(存在=假)

创建方法

这里为了方便,直接把方法调用写在.

import lombok.extern.slf4j.Slf4j;
@Slf4j
@RestController
public class SysUserController {
    @Autowired
    private NewUserMapper newUserMapper;
	@ApiOperation("将新数据写入旧数据库中")
    @PostMapping("/test")
	public Boolean addNewUserToOldUser(NewUser newUser){
	  newUserMapper.insertIntoNewUser(newsUser);
	  log.info("oldUserId为{}",newUser.getOldUserId())
	}
}

执行调试日志

2019-12-30 15:58:31.850 DEBUG  ==>  Preparing: {call PRO_TO_OLD_USER ( ?, ?, ?, ? ) } 
2019-12-30 15:58:31.885 DEBUG  ==>  Parameters: 357869(String), donlex(String), a493fe7c29ce(String), 0(Integer)

 
标签: 大数据 数据库
反对 0举报 0 收藏 0 打赏 0评论 0
 
更多>同类资讯
推荐图文
推荐资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报
Powered By DESTOON