栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

MybatisPlus中调用Oracle存储过程

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

MybatisPlus中调用Oracle存储过程

起因

由于需要将新数据同步到另外的数据库,所以需要使用dblink进行操作,但是dblink不支持写入操作,因此需要调用写好的存储过程才能实现将新数据插入新数据的同时插入旧数据库。

准备工作

预先准备好新旧两个数据库

旧的数据库
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),
  DELETEDNUMBER(1),
  ACCOUNTVARCHAr2(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中的方法



 



注意点:

  1. statementType 设置为 CALLABLE
  2. 在存储过程中使用参数时,除了写上必要的属性名外,还必须指定参数的 mode(模式),可选值为 IN、OUT、INOUT 三种,入参使用 IN,出参使用 OUT,输入输出参数使用 INOUT。
  3. OUT 模式的参数,必须指定 jdbcType。因为在 IN 模式下,MyBatis 提供了默认的 jdbcType,在 OUT 模式下没有提供,因此必须指定 jdbcType
  4. 当入参存在无法识别,执行报错时,最好指定 jdbcType
创建mapper接口
@Mapper
@Repository
public interface NewUserMapper extends baseMapper {
  
  void insertIntoOldUser(NewUser req);
}

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

创建controller方法

这里为了方便就直接在controller中写方法调用了。

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())
	}
}

执行的debug日志

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)
转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号