在上一篇写了接口调用解析返回的xml,并赋值到实体。这一篇主要介绍,如何保存实体数据。

一,xml样例

  1. <?xml version="1.0" encoding="GBK"?>
  2. <!-- 1..1 -->
  3. <cisReports batNo="查询批次号" unitName="查询单位名称" subOrgan="分支机构名称" queryUserID="查询操作员登录名" queryCount="查询请求数量" receiveTime="查询申请时间,格式YYYYMMDD HH24:mm:ss">
  4. <!-- 以下为每个查询申请的查询结果 1..n -->
  5. <cisReport reportID="报告编号" buildEndTime="报告生成结束时间,格式YYYY-MM-DD HH24:mm:ss" queryReasonID="查询原因ID,详见数据字典" subReportTypes="查询的收费子报告ID,多个收费子报告ID用逗号分隔" treatResult="对应的收费子报告收费次数,与subReportTypes一一对应,为大于等于0的值的集合,用逗号分隔"
  6. subReportTypesShortCaption="查询的收费子报告中文名称 " refID="引用ID,为查询申请条件中的引用ID" hasSystemError="有否系统错误,true:有错误,false:无错误"
  7. isFrozen="该客户是否被冻结,true:被冻结,false:未被冻结">
  8. <!-- 1查询条件信息 1..1 -->
  9. <queryConditions>
  10. <!-- 1..n -->
  11. <item>
  12. <name>查询条件英文名称</name>
  13. <caption>查询条件中文名称</caption>
  14. <value>查询条件值</value>
  15. </item>
  16. </queryConditions>
  17.  
  18. <!--2身份认证 1..1 -->
  19. <policeCheckInfo subReportType="10602" subReportTypeCost="96040" treatResult="子报告查询状态,1:查得,2:未查得,3:其他原因未查得" treatErrorCode ="treatResult=3时的错误代码,详见数据字典,treatResult!=3时,该属性不存在" errorMessage="treatResult=3时的错误描述信息,treatResult!=3时,该属性的值为空">
  20. <item>
  21. <name>被查询者姓名</name>
  22. <documentNo>被查询者证件号码</documentNo>
  23. <!--1,一致 2,不一致 treatResult为3时为空-->
  24. <result>身份认证结果,1,一致 2,不一致</result>
  25. </item>
  26. </policeCheckInfo>
  27.  
  28. <!-- 3个人手机号码核查 1..1 -->
  29. <mobileCheckInfo subReportType="13612" subReportTypeCost="96040" treatResult="子报告查询状态,1:查得,2:未查得,3:其他原因未查得" treatErrorCode="treatResult=3时的错误代码,详见数据字典,treatResult!=3时,该属性不存在" errorMessage="treatResult=3时的错误描述信息,treatResult!=3时,该属性的值为空">
  30. <!--treatresult为2、3时没有以下节点-->
  31. <item>
  32. <nameCheckResult>姓名核查结果,有:一致、基本一致、不一致、无法核查 </nameCheckResult>
  33. <documentNoCheckResult>证件号码核查结果,有:一致、不一致、无法核查 </documentNoCheckResult>
  34. <phoneCheckResult>手机号码核查结果:一致、无法核查 </phoneCheckResult>
  35. <areaInfo>号码归属地</areaInfo>
  36. <operator>运营商 1:中国电信 2:中国移动 3:中国联通 </operator>
  37. </item>
  38. </mobileCheckInfo>
  39.  
  40. <!--4个人反欺诈风险综述信息 1..1 -->
  41. <personAntiSpoofingDescInfo subReportType="14225" subReportTypeCost="96040" treatResult="子报告查询状态,1:查得,2:未查得,3:其他原因未查得" treatErrorCode="treatResult=3时的错误代码,详见数据字典,treatsult!=3时,该属性不存在" errorMessage="treatResult=3时的错误描述信息,treatResult!=3时,该属性的值为空">
  42. <!--treatresult为2时没有以下节点-->
  43. <!--
  44. 个人反欺诈综述信息。如以下例子,可能为空,可能存在其中0条或n条,根据具体结果返回。
  45. 1、 反欺诈风险评分为100分,风险等级为高,建议拒绝。
  46. 2、 电信手机号码131****1542使用不足1个月。
  47. 3、 命中羊毛党名单。
  48. 4、 命中欺诈风险名单。
  49. 5、 命中高风险人员名单。
  50. 6、 存在7笔逾期的信贷记录。
  51. 7、 存在40条个人风险概要信息。
  52. 8、 在近两年被机构查询过23次个人信息。
  53. -->
  54. <personAntiSpoofingDesc>个人反欺诈综述信息</personAntiSpoofingDesc>
  55. </personAntiSpoofingDescInfo>
  56.  
  57. <!--5个人反欺诈风险评分信息 1..1 -->
  58. <personAntiSpoofingInfo subReportType="14224" subReportTypeCost="96040" treatResult="子报告查询状态,1:查得,2:未查得,3:其他原因未查得" treatErrorCode="treatResult=3时的错误代码,详见数据字典,treatResult!=3时,该属性不存在" errorMessage="treatResult=3时的错误描述信息,treatResult!=3时,该属性的值为空">
  59. <!--treatresult为2、3时没有以下节点-->
  60.  
  61. <riskScore>风险评分</riskScore>
  62. <riskLevel>风险等级,取值:高,中度,低</riskLevel>
  63. <suggest>风险建议,取值:建议拒绝,建议复核,建议通过</suggest>
  64. <hitTypes>命中类型:高风险名单、个人风险信息、信贷逾期名单、被机构查询信息、手机号码状态异常、手机号码低网龄、羊毛党名单、欺诈风险名单等等,可能为1个或多个</hitTypes>
  65. </personAntiSpoofingInfo>
  66.  
  67. <!-- 6手机号码状态信息 1..1 -->
  68. <mobileStatusInfo subReportType="13611" subReportTypeCost="96040" treatResult="子报告查询状态,1:查得,2:未查得,3:其他原因未查得" treatErrorCode="treatResult=3时的错误代码,详见数据字典,treatResult!=3时,该属性不存在" errorMessage="treatResult=3时的错误描述信息,treatResult!=3时,该属性的值为空">
  69. <!--treatresult为2、3时没有以下节点-->
  70. <item>
  71. <operator>运营商 1:中国电信 2:中国移动 3:中国联通 </operator>
  72. <areaInfo>手机号码归属地 </areaInfo>
  73. <phoneStatus>手机状态 1:正常在用 2: 停机 3:未启用 4:已销号 5-其他 6:预销号</phoneStatus>
  74. <timeLength>手机号码在网时长,如:在网时长不足1个月,1-2个月,3-6个月,7-12个月 </timeLength>
  75. <cancelTime>号码注销时间</cancelTime>
  76. </item>
  77. </mobileStatusInfo>
  78.  
  79. <!--7是否命中羊毛党名单 1..1-->
  80. <econnoisserurInfo subReportType="14228" subReportTypeCost="96040" treatResult="子报告查询状态,1:查得,2:未查得,3:其他原因未查得" treatErrorCode="treatResult=3时的错误代码,详见数据字典,treatResult!=3时,该属性不存在" errorMessage="treatResult=3时的错误描述信息,treatResult!=3时,该属性的值为空">
  81. <!--treatresult为2、3时没有以下节点-->
  82. <state>是否命中羊毛党名单,取值:0/1,0表示未命中羊毛党名单,1表示命中羊毛党名单</state>
  83. </econnoisserurInfo>
  84.  
  85. <!--8是否命中欺诈风险名单 1..1-->
  86. <fraudRiskInfo subReportType="14229" subReportTypeCost="96040" treatResult="子报告查询状态,1:查得,2:未查得,3:其他原因未查得" treatErrorCode="treatResult=3时的错误代码,详见数据字典,treatResult!=3时,该属性不存在" errorMessage="treatResult=3时的错误描述信息,treatResult!=3时,该属性的值为空">
  87. <!--treatresult为2、3时没有以下节点-->
  88. <state>是否命中欺诈风险名单,取值:0/1,0表示未命中欺诈风险名单,1表示命中欺诈风险名单</state>
  89. </fraudRiskInfo>
  90.  
  91. <!--9是否命中高风险名单 1..1 -->
  92. <personRiskAssess subReportType="14226" subReportTypeCost="96040" treatResult="子报告查询状态,1:查得,2:未查得,3:其他原因未查得" treatErrorCode="treatResult=3时的错误代码,详见数据字典,treatResult!=3时,该属性不存在" errorMessage="treatResult=3时的错误描述信息,treatResult!=3时,该属性的值为空">
  93. <!--treatresult为2、3时没有以下节点-->
  94. <checkResult>是否命中高风险名单 1:是,2:否</checkResult>
  95. </personRiskAssess>
  96.  
  97. <!-- 10网贷逾期信息 1..1 -->
  98. <microNearlyThreeYearsOverdueInfo subReportType="13204" subReportTypeCost="96040" treatResult="子报告查询状态,1:查得,2:未查得,3:其他原因未查得" treatErrorCode="treatResult=3时的错误代码,详见数据字典,treatResult!=3时,该属性不存在" errorMessage="treatResult=3时的错误描述信息,treatResult!=3时,该属性的值为空">
  99. <!--treatresult为2、3时没有以下节点-->
  100.  
  101. <!--逾期汇总信息 0..1-->
  102. <stat>
  103. <overdueAmount>逾期本金,单位:以贷款基本信息的币种为准</overdueAmount>
  104. <overdueDays>逾期天数区间,取值区间:逾期1天(含)以上</overdueDays>
  105. <overdueCount>逾期天数区间的总笔数</overdueCount>
  106. </stat>
  107.  
  108. <!--0..1-->
  109. <items>
  110. <!--逾期概要信息 1..5 多个记录-->
  111. <item>
  112. <overdueAmount>逾期本金,单位:以贷款基本信息的币种为准</overdueAmount>
  113. <overdueDays>逾期天数区间,取值区间:逾期1-6天,逾期7-29天,逾期30-59天,逾期60-89天,逾期90天(含)以上</overdueDays>
  114. <overdueCount>逾期天数区间的笔数</overdueCount>
  115. </item>
  116. </items>
  117. </microNearlyThreeYearsOverdueInfo>
  118.  
  119. <!-- 11风险信息 1..1 -->
  120. <personRiskInfo subReportType="14227" subReportTypeCost="96040" treatResult="子报告查询状态,1:查得,2:未查得,3:其他原因未查得" treatErrorCode="treatResult=3时的错误代码,详见数据字典,treatResult!=3时,该属性不存在" errorMessage="treatResult=3时的错误描述信息,treatResult!=3时,该属性的值为空">
  121. <!--treatresult为2、3时没有以下节点-->
  122.  
  123. <!-- 汇总信息 0..1-->
  124. <stat>
  125. <totleCount>概要汇总条数</totleCount>
  126. <alCount>司法案例信息条数</alCount>
  127. <zxCount>司法执行信息条数</zxCount>
  128. <sxCount>司法失信信息条数</sxCount>
  129. <swCount>税务行政执法信息条数</swCount>
  130. <cqggCount>催欠公告信息条数</cqggCount>
  131. <wdyqCount>网贷逾期信息条数</wdyqCount>
  132. </stat>
  133. <!-- 汇总信息 end-->
  134. <!-- 概要信息 0..1-->
  135. <summary>
  136. <!-- 司法案例信息概要信息 0..1 -->
  137. <als>
  138. <!-- 司法案例信息概要信息内容 1..n -->
  139. <item>
  140. <recordId>记录编号</recordId>
  141. <bt>标题</bt>
  142. <ajlx>案件类型</ajlx>
  143. <sjnf>审结年份,格式:YYYY</sjnf>
  144. <dsrlx>当事人类型</dsrlx>
  145. </item>
  146. </als>
  147. <!-- 司法执行信息概要信息 0..1 -->
  148. <zxs>
  149. <!-- 司法执行信息概要信息内容 1..n -->
  150. <item>
  151. <recordId>记录编号</recordId>
  152. <bt>标题</bt>
  153. <zxbd>执行标的,单位:以币种为准</zxbd>
  154. <larq>立案日期,格式YYYY-MM-DD</larq>
  155. </item>
  156. </zxs>
  157. <!-- 司法失信信息概要信息 0..1 -->
  158. <sxs>
  159. <!-- 司法失信信息概要信息内容 1..n -->
  160. <item>
  161. <recordId>记录编号</recordId>
  162. <bt>标题</bt>
  163. <larq>立案日期,格式YYYY-MM-DD</larq>
  164. <fbrq>发布日期,格式YYYY-MM-DD</fbrq>
  165. </item>
  166. </sxs>
  167. <!-- 税务行政执法信息概要信息 0..1 -->
  168. <sws>
  169. <!-- 税务行政执法信息概要信息内容 1..n -->
  170. <item>
  171. <recordId>记录编号</recordId>
  172. <bt>标题</bt>
  173. <ggrq>公告日期,格式YYYY-MM-DD</ggrq>
  174. </item>
  175. </sws>
  176. <!-- >催欠公告信息概要信息 0..1 -->
  177. <cqs>
  178. <!-- 催欠公告信息概要信息内容 1..n -->
  179. <item>
  180. <recordId>记录编号</recordId>
  181. <bt>标题</bt>
  182. <fbrq>发布日期,格式YYYY-MM-DD</fbrq>
  183. </item>
  184. </cqs>
  185. <!-- 网贷逾期信息概要信息 0..1 -->
  186. <wdyqs>
  187. <!-- 网贷逾期信息概要信息内容 1..n -->
  188. <item>
  189. <recordId>记录编号</recordId>
  190. <bt>标题</bt>
  191. <fbrq>发布日期,格式YYYY-MM-DD</fbrq>
  192. </item>
  193. </wdyqs>
  194. </summary>
  195. </personRiskInfo>
  196.  
  197. <!--12个人近两年历史查询记录 1..1 -->
  198. <historySimpleQueryInfo subReportType="19902" subReportTypeCost="96040" treatResult="子报告查询状态,1:查得,2:未查得,3:其他原因未查得" treatErrorCode="treatResult=3时的错误代码,详见数据字典,treatResult!=3时,该属性不存在" errorMessage="treatResult=3时的错误描述信息,treatResult!=3时,该属性的值为空">
  199. <!--treatresult为2、3时没有以下节点-->
  200.  
  201. <!--0..1-->
  202. <items>
  203. <!-- 1..n -->
  204. <item>
  205. <unitMember>单位类型名称</unitMember>
  206. <last1Month>近1个月查询记录数</last1Month>
  207. <last3Month>近3个月查询记录数</last3Month>
  208. <last6Month>近6个月查询记录数</last6Month>
  209. <last12Month>近12个月查询记录数</last12Month>
  210. <last18Month>近18月查询记录数</last18Month>
  211. <last24Month>近24月查询记录数</last24Month>
  212. </item>
  213. </items>
  214. <!--0..1-->
  215. <count>
  216. <last1Month>近1个月各单位类型查询记录总数</last1Month>
  217. <last3Month>近3个月各单位类型查询记录总数</last3Month>
  218. <last6Month>近6个月各单位类型查询记录总数</last6Month>
  219. <last12Month>近12个月各单位类型查询记录总数</last12Month>
  220. <last18Month>近18月各单位类型查询记录总数</last18Month>
  221. <last24Month>近24月各单位类型查询记录总数</last24Month>
  222. </count>
  223. </historySimpleQueryInfo>
  224. </cisReport>
  225. </cisReports>

二,表结构设计

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

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

三,实体设计

分为三层:CisReportRoot ,CisReportChild ,ReportElement

  1. public class CisReportRoot extends BasePojo implements Serializable {
  2. private String docId;
  3. private String batNo;//查询批次号
  4. @JSONField(serialize = false)
  5. private String xmlId;
  6. private CisReportChild cisReportChild;
  1. /**
  2. * 2017/7/21.
  3. * 报告节点属性以及子节点
  4. */
  5. public class CisReportChild extends BasePojo {
  6. /**
  7. * 报告生成结束时间
  8. **/
  9. private String buildEndTime;
  10. /**
  11. * 是否有系统错误 true表示有 false表示没有
  12. **/
  13. private String hasSystemError;
  14. /**
  15. * 该客户是否被冻结
  16. **/
  17. private String isFrozen;
  18.  
  19. private ReportElement reportElement;
  1. public class ReportElement extends BasePojo {
  2. private String phone;
  3. private PoliceCheckInfo policeCheckInfo;//身份认证
  4. private MobileCheckInfo mobileCheckInfo;//个人手机号码核查
  5. private PersonAntiSpoofingDescInfo personAntiSpoofingDescInfo;//个人反欺诈风险综述信息
  6. private PersonAntiSpoofingInfo personAntiSpoofingInfo;//个人反欺诈风险评分信息
  7. private MobileStatusInfo mobileStatusInfo;//手机号码状态信息
  8. private EconnoisserurInfo econnoisserurInfo;//是否命中羊毛党名单
  9. private FraudRiskInfo fraudRiskInfo;//是否命中欺诈风险名单
  10. private PersonRiskAssess personRiskAssess;//是否命中高风险名单
  11. private MicroNearlyThreeYearsOverdueInfo microNearlyThreeYearsOverdueInfo;//网贷逾期信息
  12. private PersonRiskInfo personRiskInfo;//风险信息
  13. private HistorySimpleQueryInfo historySimpleQueryInfo;//个人近两年历史查询记录

四,代码

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

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

如:

  1. private void savePersonRiskInfo(String batNo, PersonRiskInfo personRiskInfo) throws Exception {
  2. Map<String, Object> map = new HashMap<>();
  3. map.put("batNo", batNo);
         //单笔
  4. map.put("item", personRiskInfo);
  5. pyMapper.savePersonRiskInfo(map);
  6. if (!ListUtil.isEmpty(personRiskInfo.getAlList())) {
           //批量
  7. map.put("list", personRiskInfo.getAlList());
  8. pyMapper.saveAlInfoList(map);
  9. }

sql:

  1. <!--个人风险记录 -->
       //单笔
  2. <insert id="savePersonRiskInfo" parameterType="java.util.Map">
  3. INSERT INTO TABLE_PERSON_RISK_INFO(BATNO,TOTLECOUNT,ALCOUNT,ZXCOUNT,SXCOUNT,SWCOUNT,CQGGCOUNT,WDYQCOUNT)
  4. VALUES (#{batNo,jdbcType=VARCHAR},
  5. #{item.totleCount,jdbcType=NUMERIC},
  6. #{item.alCount,jdbcType=NUMERIC},#{item.zxCount,jdbcType=NUMERIC},#{item.sxCount,jdbcType=NUMERIC},
  7. #{item.swCount,jdbcType=NUMERIC},#{item.cqggCount,jdbcType=NUMERIC},#{item.wdyqCount,jdbcType=NUMERIC})
  8. </insert>
  9.  
  10. <!--逾期详细记录 -->
       //批量
  11. <insert id="saveMicroNearlyThreeYearsOverdueInfoList" parameterType="java.util.Map">
  12. INSERT INTO TABLE_MNTYOI (BATNO,OVERDUEAMOUNT,OVERDUEDAYS,OVERDUECOUNT)
  13. <foreach collection="list" item="item" separator="union all">
  14. (
  15. SELECT #{batNo,jdbcType=VARCHAR},
  16. #{item.overdueAmount,jdbcType=VARCHAR},
  17. #{item.overdueDays,jdbcType=VARCHAR},
  18. #{item.overdueCount,jdbcType=NUMERIC}
  19. FROM DUAL
  20. )
  21. </foreach>
  22. </insert>
  1. private CisReportRoot invokePy(PyQueryBean pyQueryBean) throws Exception {
  2. pyQueryBean.setQueryFromPy(QUERY_FROM_PY);
  3. //call py service
  4. CisReportRoot cisReportRoot = queryCisReportFromPyServer(pyQueryBean);
  5. cisReportRoot.getCisReportChild().getReportElement().setPhone(pyQueryBean.getPhone());
  6. //cacheService.save(cisReportRoot);
         //(1)保存数据
  7. saveCisReport(cisReportRoot);
  8. return cisReportRoot;
  9. }

(1)保存数据

  1. @Transactional(rollbackFor = Exception.class)
  2. @Override
  3. public CisReportRoot saveCisReport(CisReportRoot cisReportRoot) throws Exception {
  4. try {
  5. ReportElement reportElement = cisReportRoot.getCisReportChild().getReportElement();
  6. PersonRiskInfo personRiskInfo = reportElement.getPersonRiskInfo();
  7. //(2)主表,保存xml所有节点信息(不包含个人风险信息),保存单笔数据
  8. pyMapper.saveCisReport(cisReportRoot);
  9. if (SUCCESS.equals(cisReportRoot.getCisReportChild().getReportElement().getPersonRiskInfo().getTreatResult())) {
  10. savePersonRiskInfo(cisReportRoot.getBatNo(), personRiskInfo);
  11. }
  12. if (cisReportRoot.getCisReportChild().getReportElement().getHistorySimpleQueryInfo().getTreatResult().equals(SUCCESS)) {
  13. Map<String, Object> map = new HashMap<>();
              //(3)保存批量数据
  14. map.put("batNo", cisReportRoot.getBatNo());
  15. if (!ListUtil.isEmpty(cisReportRoot.getCisReportChild().getReportElement().getHistorySimpleQueryInfo().getItemList())) {
  16. map.put("list", cisReportRoot.getCisReportChild().getReportElement().getHistorySimpleQueryInfo().getItemList());
  17. pyMapper.saveHistorySimpleQueryInfoList(map);
  18. }
  19. if (!ListUtil.isEmpty(cisReportRoot.getCisReportChild().getReportElement().getMicroNearlyThreeYearsOverdueInfo().getList())) {
  20. map.put("list", cisReportRoot.getCisReportChild().getReportElement().getMicroNearlyThreeYearsOverdueInfo().getList());
  21. pyMapper.saveMicroNearlyThreeYearsOverdueInfoList(map);
  22. }
  23. }
  24. return cisReportRoot;
  25. } catch (Exception e) {
  26. logger.error("saveCisReport@PyserviceImpl_Exception", e);
  27. throw e;
  28. }
  29.  
  30. }

(2)保存主表

  1. <insert id="saveCisReport" parameterType="java.util.Map">
  2. INSERT INTO TABLE_CISREPORT
  3. (BATNO,BUILDENDTIME,ISFROZEN,
  4. MCI_NAMECHECKRESULT,MCI_AREAINFO,MCI_DOCUMENTNOCHECKRESULT,MCI_OPERATOR,MCI_PHONECHECKRESULT,
  5. PCI_DOCUMENTNO,PCI_NAME,PCI_RESULT,
  6. PASDI_DESC,
  7. PASI_HITTYPES,PASI_RISKLEVEL,PASI_RISKSCORE,PASI_RISKSUGGEST,
  8. MS_AREAINFO,MS_CAnCELTIME,MS_OPERATOR,MS_PHONESTATUS,MS_TIMELENGTH,
  9. ECONNOISSERUR,
  10. FRAUDRISK,
  11. PRA_CHECKRESULT,
  12. MNTYOI_OVERDUEAMOUNT,MNTYOI_OVERDUECOUNT,MNTYOI_OVERDUEDAYS,
  13. HS_LAST1MONTH,HS_LAST3MONTH,HS_LAST6MONTH,HS_LAST12MONTH,HS_LAST18MONTH,HS_LAST24MONTH,
  14. PHONE,XMLID)
  15. VALUES
  16. (#{batNo,jdbcType=VARCHAR},
  17. to_date(#{cisReportChild.buildEndTime},'yyyy-MM-dd hh24:mi:ss'),
  18. #{cisReportChild.isFrozen,jdbcType=VARCHAR},
  19. #{cisReportChild.reportElement.mobileCheckInfo.nameCheckResult,jdbcType=VARCHAR},
  20. #{cisReportChild.reportElement.mobileCheckInfo.areaInfo,jdbcType=VARCHAR},
  21. #{cisReportChild.reportElement.mobileCheckInfo.documentNoCheckResult,jdbcType=VARCHAR},
  22. #{cisReportChild.reportElement.mobileCheckInfo.operator,jdbcType=NUMERIC},
  23. #{cisReportChild.reportElement.mobileCheckInfo.phoneCheckResult,jdbcType=VARCHAR},
  24.  
  25. #{cisReportChild.reportElement.policeCheckInfo.documentNo,jdbcType=VARCHAR},
  26. #{cisReportChild.reportElement.policeCheckInfo.name,jdbcType=VARCHAR},
  27. #{cisReportChild.reportElement.policeCheckInfo.result,jdbcType=NUMERIC},
  28.  
  29. #{cisReportChild.reportElement.personAntiSpoofingDescInfo.personAntiSpoofingDesc,jdbcType=VARCHAR},
  30.  
  31. #{cisReportChild.reportElement.personAntiSpoofingInfo.hitTypes,jdbcType=VARCHAR},
  32. #{cisReportChild.reportElement.personAntiSpoofingInfo.riskLevel,jdbcType=VARCHAR},
  33. #{cisReportChild.reportElement.personAntiSpoofingInfo.riskScore,jdbcType=VARCHAR},
  34. #{cisReportChild.reportElement.personAntiSpoofingInfo.suggest,jdbcType=VARCHAR},
  35.  
  36. #{cisReportChild.reportElement.mobileStatusInfo.areaInfo,jdbcType=VARCHAR},
  37. #{cisReportChild.reportElement.mobileStatusInfo.cancelTime,jdbcType=VARCHAR},
  38. #{cisReportChild.reportElement.mobileStatusInfo.operator,jdbcType=NUMERIC},
  39. #{cisReportChild.reportElement.mobileStatusInfo.phoneStatus,jdbcType=NUMERIC},
  40. #{cisReportChild.reportElement.mobileStatusInfo.timeLength,jdbcType=VARCHAR},
  41.  
  42. #{cisReportChild.reportElement.econnoisserurInfo.state,jdbcType=NUMERIC},
  43. #{cisReportChild.reportElement.fraudRiskInfo.state,jdbcType=NUMERIC},
  44.  
  45. #{cisReportChild.reportElement.personRiskAssess.checkResult,jdbcType=NUMERIC},
  46. #{cisReportChild.reportElement.microNearlyThreeYearsOverdueInfo.overdueAmount,jdbcType=VARCHAR},
  47. #{cisReportChild.reportElement.microNearlyThreeYearsOverdueInfo.overdueCount,jdbcType=NUMERIC},
  48. #{cisReportChild.reportElement.microNearlyThreeYearsOverdueInfo.overdueDays,jdbcType=VARCHAR},
  49.  
  50. #{cisReportChild.reportElement.historySimpleQueryInfo.totalCount.last1Month,jdbcType=NUMERIC},
  51. #{cisReportChild.reportElement.historySimpleQueryInfo.totalCount.last3Month,jdbcType=NUMERIC},
  52. #{cisReportChild.reportElement.historySimpleQueryInfo.totalCount.last6Month,jdbcType=NUMERIC},
  53. #{cisReportChild.reportElement.historySimpleQueryInfo.totalCount.last12Month,jdbcType=NUMERIC},
  54. #{cisReportChild.reportElement.historySimpleQueryInfo.totalCount.last18Month,jdbcType=NUMERIC},
  55. #{cisReportChild.reportElement.historySimpleQueryInfo.totalCount.last24Month,jdbcType=NUMERIC},
  56. #{cisReportChild.reportElement.phone,jdbcType=VARCHAR},
  57. #{xmlId,jdbcType=VARCHAR}
  58. )

查询主表(多个条件拼接)

  1. <!-- 查询征信主表 -->
  2. <select id="queryCisReportRoot" parameterType="PyQueryBean" resultMap="cisReportRootMap">
  3. SELECT * FROM (
  4. SELECT
  5. BATNO,to_char(BUILDENDTIME,'yyyy-MM-dd hh24:mi:ss') as BUILDENDTIME,ISFROZEN,
  6. MCI_NAMECHECKRESULT,MCI_AREAINFO,MCI_DOCUMENTNOCHECKRESULT,MCI_OPERATOR,MCI_PHONECHECKRESULT,
  7. PCI_DOCUMENTNO,PCI_NAME,PCI_RESULT,
  8. PASDI_DESC,
  9. PASI_HITTYPES,PASI_RISKLEVEL,PASI_RISKSCORE,PASI_RISKSUGGEST,
  10. MS_AREAINFO,MS_CANCELTIME,MS_OPERATOR,MS_PHONESTATUS,MS_TIMELENGTH,
  11. ECONNOISSERUR,
  12. FRAUDRISK,
  13. PRA_CHECKRESULT,
  14. MNTYOI_OVERDUEAMOUNT,MNTYOI_OVERDUECOUNT,MNTYOI_OVERDUEDAYS,
  15. HS_LAST1MONTH,HS_LAST3MONTH,HS_LAST6MONTH,HS_LAST12MONTH,HS_LAST18MONTH,HS_LAST24MONTH,
  16. PHONE,XMLID
  17. FROM
  18. TABLE_CISREPORT
  19. <trim prefix="where" prefixOverrides="AND | OR ">
  20. <if test="name != null and name != '' ">
  21. AND PCI_NAME = #{name,jdbcType=VARCHAR}
  22. </if>
  23. <if test="documentNo != null and documentNo != '' ">
  24. AND PCI_DOCUMENTNO=#{documentNo,jdbcType=VARCHAR}
  25. </if>
  26. <if test="phone != null and phone!= '' ">
  27. AND PHONE = #{phone}
  28. </if>
  29. <if test="docId != null and docId != '' ">
  30. AND BATNO = #{docId,jdbcType=VARCHAR}
  31. </if>
  32. <![CDATA[AND BUILDENDTIME >= add_months(sysdate,-1)]]>
  33. </trim>
  34. ORDER BY BUILDENDTIME DESC )
  35. WHERE <![CDATA[ ROWNUM <= 1 ]]>
  36. </select>

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

  1. <!--个人近两年历史查询记录 -->
  2. <insert id="saveHistorySimpleQueryInfoList" parameterType="java.util.Map">
  3. INSERT INTO
  4. TABLE_HISTORY_SIMPLE_QUERY
  5. (BATNO,UNIT_MEMBER,LAST1MONTH,LAST3MONTH,LAST6MONTH,LAST12MONTH,LAST18MONTH,LAST24MONTH)
  6. <foreach collection="list" item="item" separator="union all">
  7. (
  8. SELECT
  9. #{batNo,jdbcType=VARCHAR},
  10. #{item.unitMember,jdbcType=VARCHAR},
  11. #{item.last1Month,jdbcType=NUMERIC},#{item.last3Month,jdbcType=NUMERIC},
  12. #{item.last6Month,jdbcType=NUMERIC},#{item.last12Month,jdbcType=NUMERIC},
  13. #{item.last18Month,jdbcType=NUMERIC},#{item.last24Month,jdbcType=NUMERIC}
  14. FROM DUAL
  15. )
  16. </foreach>
  17. </insert>

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

  1. DataServiceDetailResult dataServiceDetailResult = tdService.getDataServiceDetailResult(tdReportRoot);
  2. int n = tdDataServiceMapper.insertDataServiceDetailResult(dataServiceDetailResult);
  1. <!--信息核验接口-->
  2. <!--DATASERVICE-->
  3. <insert id="insertDataServiceDetailResult" parameterType="DataServiceDetailResult">
  4. <selectKey keyProperty="id" resultType="BigDecimal" order="BEFORE">
  5. select SEQ_ICS_TD_DATASERVICE.nextval as id from dual
  6. </selectKey>
  7. insert into ICS_TD_DATASERVICE (ID, RECORDID, REASON_DESC, REASON_CODE,
  8. SUCCESS)
  9. values (#{id,jdbcType=DECIMAL}, #{recordId,jdbcType=DECIMAL}, #{reasonDesc,jdbcType=VARCHAR},
  10. #{reasonCode,jdbcType=VARCHAR},
  11. #{success,jdbcType=DECIMAL})
  12. </insert>

批量保存包含主键

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

sql:

  1. <!--批量保存interfaces-->
  2. <insert id="addBatchInterfaces" parameterType="java.util.List">
  3. <!--
  4. 注释为mysql插入方式,可以插入但是导致数据回滚不了
  5. 下面为oracle插入方式:注意parameterType:java.util.List或java.util.Map都可以
  6. BEGIN
  7. <foreach collection="list" item="item" index="index" separator="">
  8. INSERT INTO ICS_TD_INTERFACES(ID, RECORDID, TYPE)
  9. VALUES
  10. (
  11. BLOANCRDTDATA.SEQ_ICS_TD_INTERFACES.nextval,
  12. #{recordId,jdbcType=DECIMAL},
  13. #{item.type,jdbcType=VARCHAR}
  14. );
  15. </foreach>
  16. COMMIT;
  17. END;-->
  18. insert into ICS_TD_INTERFACES (ID,RECORDID, TYPE)
  19. SELECT SEQ_ICS_TD_INTERFACES.nextval ID, A.*
  20. FROM(
  21. <foreach collection="list" item="item" index="index" separator="union all">
  22. SELECT
  23. #{recordId,jdbcType=DECIMAL},
  24. #{item.type,jdbcType=VARCHAR}
  25. FROM DUAL
  26. </foreach>
  27. ) A
  28. </insert>

mybatis单笔批量保存的更多相关文章

  1. mybatis批量保存的两种方式(高效插入)

    知识点:mybatis中,批量保存的两种方式 1.使用mybatis foreach标签 2.mybatis ExecutorType.BATCH 参考博客:https://www.jb51.net/ ...

  2. mybatis 批量保存,并且唯一约束

    1.主键返回在insert配置中添加两个属性 useGeneratedKeys="true" keyProperty="id" 2.唯一约束冲突可以使用 ON ...

  3. 使用SpringBoot-JPA进行自定义的保存及批量保存

    更多精彩博文,欢迎访问我的个人博客 说明 SpringBoot版本:2.1.4.RELEASE java版本:1.8 文中所说JPA皆指spring-boot-starter-data-jpa 使用J ...

  4. mybatis执行批量更新update

    Mybatis的批量插入这里有http://ljhzzyx.blog.163.com/blog/static/38380312201353536375/.目前想批量更新,如果update的值是相同的话 ...

  5. 161102、MyBatis中批量插入

    方法一: <insert id="insertbatch" parameterType="java.util.List"> <selectKe ...

  6. .NET DLL 保护措施应用实例(百度云批量保存工具)

    最近做了个小工具,将保护措施思路全部应用到了此工具中. 点我下载   百度云批量保存工具是一款专门用于自动批量保存百度云分享的软件. 本软件特点:1:完全模拟人工操作:2:可以批量保存百度分享的文件( ...

  7. mybatis foreach批量插入数据:Oracle与MySQL区别

    mybatis foreach批量插入数据:Oracle与MySQL不同点: 主要不同点在于foreach标签内separator属性的设置问题: separator设置为","分 ...

  8. Mybatis+mysql批量插入性能分析测试

    前言 今天在网上看到一篇文章(后文中的文章指的就是它) https://www.jianshu.com/p/cce617be9f9e 发现了一种有关于mybatis批量插入的新方法,而且看了文章发现我 ...

  9. mybatis之批量插入

    一.导入功能优化 普通for循环,对于导入大量数据时非常耗时.可以通过Mybatis的批量插入功能提高效率.每批次导入的数据不能太多,否则会报错.通过测试发现,每批次200条为宜. 测试结果: 开启事 ...

随机推荐

  1. C# 使用BackgroundWorker实现WinForm异步

    写了一个基于BackgorundWorker演示异步操作的例子.由于这个理基本上实现了BackgorundWorker的大部分功能:异步操作的启动.操作结束后的回调.异步操作的撤销和进度报告等等.尽管 ...

  2. (6)Cocos2d-x 3.0坐标系详解

    Cocos2d-x坐标系和OpenGL坐标系相同,都是起源于笛卡尔坐标系. 笛卡尔坐标系 笛卡尔坐标系中定义右手系原点在左下角,x向右,y向上,z向外,OpenGL坐标系为笛卡尔右手系. 屏幕坐标系和 ...

  3. php \r \n 和 <br/> \t

    利用\r \n 和 <br/> \t做了个实验,话不多说,看代码就很清楚的知道

  4. (转)SSIS处理导入数据时, 存在的更新, 不存在的插入

    问题描述: 当你把数据从其他数据库, 或者是文本文件之类的其他数据源导入到目的数据库时, 有时希望在导入的处理中, 能够实现"数据存在时更新, 不存在时导入" 在之前, 一般是通过 ...

  5. WebService—规范介绍和几种实现WebService的框架介绍

    一.关于SOA(面向服务架构)思想   1.关于协议   2.SOA 的诞生 SOA(Service-Oriented Architecture)面向服务架构是一种思想,它将应用程序的不同功能单元通过 ...

  6. spark环境安装

    源码包下载: http://archive.apache.org/dist/spark/spark-2.1.1/v 集群环境: master 192.168.1.99 slave1 192.168.1 ...

  7. bzoj1620 / P2920 [USACO08NOV]时间管理Time Management

    P2920 [USACO08NOV]时间管理Time Management 显然的贪心. 按deadline从大到小排序,然后依次填充时间. 最后时间为负的话那么就是无解 #include<io ...

  8. 漏洞利用之Metasploit使用过程

    漏洞利用之Metasploit使用过程 先扫描端口,看开放的服务,如开放ftp,版本是vsftpd 2.3.4:使用search搜索vsftp查看是否在相应的漏洞利用exploit,输入search ...

  9. LightOJ 1027 A Dangerous Maze(期望)

    https://cn.vjudge.net/problem/LightOJ-1027 题意:有n扇门,每扇门有个时间ti,选择正数的门可以在ti后带你走出迷宫,负数的门会在ti后带你回到起点,然后重新 ...

  10. python文件操作的坑( FileNotFoundError: [Errno 2] No such file or directory...)

    环境:Windows8.1, Python3.6  pycharm community 2017   c盘下有一个配置文件:setup   with open('c:\\setup','r') as ...