资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

mybatis单笔批量保存实体数据的方法

这一篇主要介绍,如何保存实体数据。具体内容如下所示;

成都创新互联专业为企业提供淇滨网站建设、淇滨做网站、淇滨网站设计、淇滨网站制作等企业网站建设、网页设计与制作、淇滨企业网站模板建站服务,十载淇滨做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。

一,xml样例

<?xml version="1.0" encoding="GBK"?>


  
  
    
    
      
      
        查询条件英文名称
        查询条件中文名称
        查询条件值
      
    
    
    
                  
          被查询者姓名
          被查询者证件号码
          
          身份认证结果,1,一致 2,不一致
        
    
    
    
        
        
          姓名核查结果,有:一致、基本一致、不一致、无法核查 
          证件号码核查结果,有:一致、不一致、无法核查 
          手机号码核查结果:一致、无法核查           
          号码归属地
          运营商 1:中国电信 2:中国移动 3:中国联通 
        
    
    
    
      
            
      个人反欺诈综述信息
    
    
    
      
      风险评分
      风险等级,取值:高,中度,低
      风险建议,取值:建议拒绝,建议复核,建议通过
      命中类型:高风险名单、个人风险信息、信贷逾期名单、被机构查询信息、手机号码状态异常、手机号码低网龄、羊毛党名单、欺诈风险名单等等,可能为1个或多个
    
    
    
        
        
          运营商 1:中国电信 2:中国移动 3:中国联通 
          手机号码归属地 
          手机状态 1:正常在用 2: 停机 3:未启用 4:已销号 5-其他 6:预销号
          手机号码在网时长,如:在网时长不足1个月,1-2个月,3-6个月,7-12个月 
          号码注销时间
        
    
    
    
      
      是否命中羊毛党名单,取值:0/1,0表示未命中羊毛党名单,1表示命中羊毛党名单
    
    
    
      
      是否命中欺诈风险名单,取值:0/1,0表示未命中欺诈风险名单,1表示命中欺诈风险名单
    
    
    
        
        是否命中高风险名单 1:是,2:否
    
    
    
       
       
        
          逾期本金,单位:以贷款基本信息的币种为准
          逾期天数区间,取值区间:逾期1天(含)以上
          逾期天数区间的总笔数
        
        
        
          
          
            逾期本金,单位:以贷款基本信息的币种为准
            逾期天数区间,取值区间:逾期1-6天,逾期7-29天,逾期30-59天,逾期60-89天,逾期90天(含)以上
            逾期天数区间的笔数
          
        
    
    
    
      
      
      
        概要汇总条数
        司法案例信息条数
        司法执行信息条数
        司法失信信息条数
        税务行政执法信息条数
        催欠公告信息条数
        网贷逾期信息条数
      
      
      
      
        
        
          
          
            记录编号
            标题
            案件类型
            审结年份,格式:YYYY
            当事人类型
          
        
        
        
          
          
            记录编号
            标题
            执行标的,单位:以币种为准
            立案日期,格式YYYY-MM-DD
          
        
        
        
          
          
            记录编号
            标题
            立案日期,格式YYYY-MM-DD
            发布日期,格式YYYY-MM-DD
          
        
        
        
          
          
            记录编号
            标题
            公告日期,格式YYYY-MM-DD
          
        
        
        
          
          
            记录编号
            标题
            发布日期,格式YYYY-MM-DD
          
        
        
        
          
          
            记录编号
            标题
            发布日期,格式YYYY-MM-DD
          
        
      
        
    
    
      
      
      
        
        
          单位类型名称
          近1个月查询记录数
          近3个月查询记录数
          近6个月查询记录数
          近12个月查询记录数
          近18月查询记录数
          近24月查询记录数
        
      
      
      
        近1个月各单位类型查询记录总数
        近3个月各单位类型查询记录总数
        近6个月各单位类型查询记录总数
        近12个月各单位类型查询记录总数
        近18月各单位类型查询记录总数
        近24月各单位类型查询记录总数      
      
    
  

二,表结构设计

1,批次号:各表之间用最外层批次号关联。

2,主表:即把各层字段全部存在一个表中。

三,实体设计

分为三层:CisReportRoot ,CisReportChild ,ReportElement

public class CisReportRoot extends BasePojo implements Serializable {
  private String docId;
  private String batNo;//查询批次号
  @JSONField(serialize = false)
  private String xmlId;
  private CisReportChild cisReportChild;
/**
 * 2017/7/21.
 * 报告节点属性以及子节点
 */
public class CisReportChild extends BasePojo {
  /**
   * 报告生成结束时间
   **/
  private String buildEndTime;
  /**
   * 是否有系统错误 true表示有 false表示没有
   **/
  private String hasSystemError;
  /**
   * 该客户是否被冻结
   **/
  private String isFrozen;
  private ReportElement reportElement;

public class ReportElement extends BasePojo {
  private String phone;
  private PoliceCheckInfo policeCheckInfo;//身份认证
  private MobileCheckInfo mobileCheckInfo;//个人手机号码核查
  private PersonAntiSpoofingDescInfo personAntiSpoofingDescInfo;//个人反欺诈风险综述信息
  private PersonAntiSpoofingInfo personAntiSpoofingInfo;//个人反欺诈风险评分信息
  private MobileStatusInfo mobileStatusInfo;//手机号码状态信息
  private EconnoisserurInfo econnoisserurInfo;//是否命中羊毛党名单
  private FraudRiskInfo fraudRiskInfo;//是否命中欺诈风险名单
  private PersonRiskAssess personRiskAssess;//是否命中高风险名单
  private MicroNearlyThreeYearsOverdueInfo microNearlyThreeYearsOverdueInfo;//网贷逾期信息
  private PersonRiskInfo personRiskInfo;//风险信息
  private HistorySimpleQueryInfo historySimpleQueryInfo;//个人近两年历史查询记录

四,代码

<1>单笔,批量无需主键

无论单笔还是批量都可以把数据存在map中,sql中通过map的键获取数据。

如:

 private void savePersonRiskInfo(String batNo, PersonRiskInfo personRiskInfo) throws Exception {
    Map map = new HashMap<>();
    map.put("batNo", batNo);
     //单笔
    map.put("item", personRiskInfo);
    pyMapper.savePersonRiskInfo(map);
    if (!ListUtil.isEmpty(personRiskInfo.getAlList())) {
       //批量
      map.put("list", personRiskInfo.getAlList());
      pyMapper.saveAlInfoList(map);
    }

sql:


   //单笔
  
    INSERT INTO TABLE_PERSON_RISK_INFO(BATNO,TOTLECOUNT,ALCOUNT,ZXCOUNT,SXCOUNT,SWCOUNT,CQGGCOUNT,WDYQCOUNT)
    VALUES (#{batNo,jdbcType=VARCHAR},
    #{item.totleCount,jdbcType=NUMERIC},
    #{item.alCount,jdbcType=NUMERIC},#{item.zxCount,jdbcType=NUMERIC},#{item.sxCount,jdbcType=NUMERIC},
    #{item.swCount,jdbcType=NUMERIC},#{item.cqggCount,jdbcType=NUMERIC},#{item.wdyqCount,jdbcType=NUMERIC})
  
  
   //批量
  
    INSERT INTO TABLE_MNTYOI (BATNO,OVERDUEAMOUNT,OVERDUEDAYS,OVERDUECOUNT)
    
      (
      SELECT #{batNo,jdbcType=VARCHAR},
      #{item.overdueAmount,jdbcType=VARCHAR},
      #{item.overdueDays,jdbcType=VARCHAR},
      #{item.overdueCount,jdbcType=NUMERIC}
      FROM DUAL
      )
    
  

 private CisReportRoot invokePy(PyQueryBean pyQueryBean) throws Exception {
    pyQueryBean.setQueryFromPy(QUERY_FROM_PY);
    //call py service
    CisReportRoot cisReportRoot = queryCisReportFromPyServer(pyQueryBean);
    cisReportRoot.getCisReportChild().getReportElement().setPhone(pyQueryBean.getPhone());
    //cacheService.save(cisReportRoot);
     //(1)保存数据
    saveCisReport(cisReportRoot);
    return cisReportRoot;
  }

(1)保存数据

 @Transactional(rollbackFor = Exception.class)
  @Override
  public CisReportRoot saveCisReport(CisReportRoot cisReportRoot) throws Exception {
    try {
      ReportElement reportElement = cisReportRoot.getCisReportChild().getReportElement();
      PersonRiskInfo personRiskInfo = reportElement.getPersonRiskInfo();
      //(2)主表,保存xml所有节点信息(不包含个人风险信息),保存单笔数据
      pyMapper.saveCisReport(cisReportRoot);
      if (SUCCESS.equals(cisReportRoot.getCisReportChild().getReportElement().getPersonRiskInfo().getTreatResult())) {
        savePersonRiskInfo(cisReportRoot.getBatNo(), personRiskInfo);
      }
      if (cisReportRoot.getCisReportChild().getReportElement().getHistorySimpleQueryInfo().getTreatResult().equals(SUCCESS)) {
        Map map = new HashMap<>();
          //(3)保存批量数据
        map.put("batNo", cisReportRoot.getBatNo());
        if (!ListUtil.isEmpty(cisReportRoot.getCisReportChild().getReportElement().getHistorySimpleQueryInfo().getItemList())) {
          map.put("list", cisReportRoot.getCisReportChild().getReportElement().getHistorySimpleQueryInfo().getItemList());
          pyMapper.saveHistorySimpleQueryInfoList(map);
        }
        if (!ListUtil.isEmpty(cisReportRoot.getCisReportChild().getReportElement().getMicroNearlyThreeYearsOverdueInfo().getList())) {
          map.put("list", cisReportRoot.getCisReportChild().getReportElement().getMicroNearlyThreeYearsOverdueInfo().getList());
          pyMapper.saveMicroNearlyThreeYearsOverdueInfoList(map);
        }
      }
      return cisReportRoot;
    } catch (Exception e) {
      logger.error("saveCisReport@PyserviceImpl_Exception", e);
      throw e;
    }
  }

(2)保存主表


    INSERT INTO TABLE_CISREPORT
    (BATNO,BUILDENDTIME,ISFROZEN,
    MCI_NAMECHECKRESULT,MCI_AREAINFO,MCI_DOCUMENTNOCHECKRESULT,MCI_OPERATOR,MCI_PHONECHECKRESULT,
    PCI_DOCUMENTNO,PCI_NAME,PCI_RESULT,
    PASDI_DESC,
    PASI_HITTYPES,PASI_RISKLEVEL,PASI_RISKSCORE,PASI_RISKSUGGEST,
    MS_AREAINFO,MS_CAnCELTIME,MS_OPERATOR,MS_PHONESTATUS,MS_TIMELENGTH,
    ECONNOISSERUR,
    FRAUDRISK,
    PRA_CHECKRESULT,
    MNTYOI_OVERDUEAMOUNT,MNTYOI_OVERDUECOUNT,MNTYOI_OVERDUEDAYS,
    HS_LAST1MONTH,HS_LAST3MONTH,HS_LAST6MONTH,HS_LAST12MONTH,HS_LAST18MONTH,HS_LAST24MONTH,
    PHONE,XMLID)
    VALUES
    (#{batNo,jdbcType=VARCHAR},
    to_date(#{cisReportChild.buildEndTime},'yyyy-MM-dd hh34:mi:ss'),
    #{cisReportChild.isFrozen,jdbcType=VARCHAR},
    #{cisReportChild.reportElement.mobileCheckInfo.nameCheckResult,jdbcType=VARCHAR},
    #{cisReportChild.reportElement.mobileCheckInfo.areaInfo,jdbcType=VARCHAR},
    #{cisReportChild.reportElement.mobileCheckInfo.documentNoCheckResult,jdbcType=VARCHAR},
    #{cisReportChild.reportElement.mobileCheckInfo.operator,jdbcType=NUMERIC},
    #{cisReportChild.reportElement.mobileCheckInfo.phoneCheckResult,jdbcType=VARCHAR},
    #{cisReportChild.reportElement.policeCheckInfo.documentNo,jdbcType=VARCHAR},
    #{cisReportChild.reportElement.policeCheckInfo.name,jdbcType=VARCHAR},
    #{cisReportChild.reportElement.policeCheckInfo.result,jdbcType=NUMERIC},
    #{cisReportChild.reportElement.personAntiSpoofingDescInfo.personAntiSpoofingDesc,jdbcType=VARCHAR},
    #{cisReportChild.reportElement.personAntiSpoofingInfo.hitTypes,jdbcType=VARCHAR},
    #{cisReportChild.reportElement.personAntiSpoofingInfo.riskLevel,jdbcType=VARCHAR},
    #{cisReportChild.reportElement.personAntiSpoofingInfo.riskScore,jdbcType=VARCHAR},
    #{cisReportChild.reportElement.personAntiSpoofingInfo.suggest,jdbcType=VARCHAR},
    #{cisReportChild.reportElement.mobileStatusInfo.areaInfo,jdbcType=VARCHAR},
    #{cisReportChild.reportElement.mobileStatusInfo.cancelTime,jdbcType=VARCHAR},
    #{cisReportChild.reportElement.mobileStatusInfo.operator,jdbcType=NUMERIC},
    #{cisReportChild.reportElement.mobileStatusInfo.phoneStatus,jdbcType=NUMERIC},
    #{cisReportChild.reportElement.mobileStatusInfo.timeLength,jdbcType=VARCHAR},
    #{cisReportChild.reportElement.econnoisserurInfo.state,jdbcType=NUMERIC},
    #{cisReportChild.reportElement.fraudRiskInfo.state,jdbcType=NUMERIC},
    #{cisReportChild.reportElement.personRiskAssess.checkResult,jdbcType=NUMERIC},
    #{cisReportChild.reportElement.microNearlyThreeYearsOverdueInfo.overdueAmount,jdbcType=VARCHAR},
    #{cisReportChild.reportElement.microNearlyThreeYearsOverdueInfo.overdueCount,jdbcType=NUMERIC},
    #{cisReportChild.reportElement.microNearlyThreeYearsOverdueInfo.overdueDays,jdbcType=VARCHAR},
    #{cisReportChild.reportElement.historySimpleQueryInfo.totalCount.last1Month,jdbcType=NUMERIC},
    #{cisReportChild.reportElement.historySimpleQueryInfo.totalCount.last3Month,jdbcType=NUMERIC},
    #{cisReportChild.reportElement.historySimpleQueryInfo.totalCount.last6Month,jdbcType=NUMERIC},
    #{cisReportChild.reportElement.historySimpleQueryInfo.totalCount.last12Month,jdbcType=NUMERIC},
    #{cisReportChild.reportElement.historySimpleQueryInfo.totalCount.last18Month,jdbcType=NUMERIC},
    #{cisReportChild.reportElement.historySimpleQueryInfo.totalCount.last24Month,jdbcType=NUMERIC},
    #{cisReportChild.reportElement.phone,jdbcType=VARCHAR},
    #{xmlId,jdbcType=VARCHAR}
    )

(3)保存批量数据(不自动生成主键)


  
    INSERT INTO
    TABLE_HISTORY_SIMPLE_QUERY
    (BATNO,UNIT_MEMBER,LAST1MONTH,LAST3MONTH,LAST6MONTH,LAST12MONTH,LAST18MONTH,LAST24MONTH)
    
      (
      SELECT
      #{batNo,jdbcType=VARCHAR},
      #{item.unitMember,jdbcType=VARCHAR},
      #{item.last1Month,jdbcType=NUMERIC},#{item.last3Month,jdbcType=NUMERIC},
      #{item.last6Month,jdbcType=NUMERIC},#{item.last12Month,jdbcType=NUMERIC},
      #{item.last18Month,jdbcType=NUMERIC},#{item.last24Month,jdbcType=NUMERIC}
      FROM DUAL
      )
    
  

<2>单笔,批量需要插入主键

单笔含主键

  DataServiceDetailResult dataServiceDetailResult = tdService.getDataServiceDetailResult(tdReportRoot);
    int n = tdDataServiceMapper.insertDataServiceDetailResult(dataServiceDetailResult);

 
  
  
    
      select SEQ_ICS_TD_DATASERVICE.nextval as id from dual
    
    insert into ICS_TD_DATASERVICE (ID, RECORDID, REASON_DESC, REASON_CODE,
    SUCCESS)
    values (#{id,jdbcType=DECIMAL}, #{recordId,jdbcType=DECIMAL}, #{reasonDesc,jdbcType=VARCHAR},
    #{reasonCode,jdbcType=VARCHAR},
    #{success,jdbcType=DECIMAL})
  

批量保存包含主键

 if (!ListUtil.isEmpty(interfacesList)) {
      map.put("recordId", id);
      map.put("list", interfacesList);
      tdDataServiceMapper.addBatchInterfaces(map);
    }

sql: 


  
    
    insert into ICS_TD_INTERFACES (ID,RECORDID, TYPE)
    SELECT SEQ_ICS_TD_INTERFACES.nextval ID, A.*
    FROM(
    
      SELECT
      #{recordId,jdbcType=DECIMAL},
      #{item.type,jdbcType=VARCHAR}
      FROM DUAL
    
    ) A
  

总结

以上所述是小编给大家介绍的mybatis单笔批量保存实体数据的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对创新互联网站的支持!


文章名称:mybatis单笔批量保存实体数据的方法
文章分享:http://cdkjz.cn/article/josshi.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

大客户专线   成都:13518219792   座机:028-86922220