mybatis單筆批量保存實體數(shù)據(jù)的方法
這一篇主要介紹,如何保存實體數(shù)據(jù)。具體內(nèi)容如下所示;
一,xml樣例
<?xml version="1.0" encoding="GBK"?>
<!-- 1..1 -->
<cisReports batNo="查詢批次號" unitName="查詢單位名稱" subOrgan="分支機構(gòu)名稱" queryUserID="查詢操作員登錄名" queryCount="查詢請求數(shù)量" receiveTime="查詢申請時間,格式Y(jié)YYYMMDD HH24:mm:ss">
<!-- 以下為每個查詢申請的查詢結(jié)果 1..n -->
<cisReport reportID="報告編號" buildEndTime="報告生成結(jié)束時間,格式Y(jié)YYY-MM-DD HH24:mm:ss" queryReasonID="查詢原因ID,詳見數(shù)據(jù)字典" subReportTypes="查詢的收費子報告ID,多個收費子報告ID用逗號分隔" treatResult="對應(yīng)的收費子報告收費次數(shù),與subReportTypes一一對應(yīng),為大于等于0的值的集合,用逗號分隔"
subReportTypesShortCaption="查詢的收費子報告中文名稱 " refID="引用ID,為查詢申請條件中的引用ID" hasSystemError="有否系統(tǒng)錯誤,true:有錯誤,false:無錯誤"
isFrozen="該客戶是否被凍結(jié),true:被凍結(jié),false:未被凍結(jié)">
<!-- 1查詢條件信息 1..1 -->
<queryConditions>
<!-- 1..n -->
<item>
<name>查詢條件英文名稱</name>
<caption>查詢條件中文名稱</caption>
<value>查詢條件值</value>
</item>
</queryConditions>
<!--2身份認(rèn)證 1..1 -->
<policeCheckInfo subReportType="10602" subReportTypeCost="96040" treatResult="子報告查詢狀態(tài),1:查得,2:未查得,3:其他原因未查得" treatErrorCode ="treatResult=3時的錯誤代碼,詳見數(shù)據(jù)字典,treatResult!=3時,該屬性不存在" errorMessage="treatResult=3時的錯誤描述信息,treatResult!=3時,該屬性的值為空">
<item>
<name>被查詢者姓名</name>
<documentNo>被查詢者證件號碼</documentNo>
<!--1,一致 2,不一致 treatResult為3時為空-->
<result>身份認(rèn)證結(jié)果,1,一致 2,不一致</result>
</item>
</policeCheckInfo>
<!-- 3個人手機號碼核查 1..1 -->
<mobileCheckInfo subReportType="13612" subReportTypeCost="96040" treatResult="子報告查詢狀態(tài),1:查得,2:未查得,3:其他原因未查得" treatErrorCode="treatResult=3時的錯誤代碼,詳見數(shù)據(jù)字典,treatResult!=3時,該屬性不存在" errorMessage="treatResult=3時的錯誤描述信息,treatResult!=3時,該屬性的值為空">
<!--treatresult為2、3時沒有以下節(jié)點-->
<item>
<nameCheckResult>姓名核查結(jié)果,有:一致、基本一致、不一致、無法核查 </nameCheckResult>
<documentNoCheckResult>證件號碼核查結(jié)果,有:一致、不一致、無法核查 </documentNoCheckResult>
<phoneCheckResult>手機號碼核查結(jié)果:一致、無法核查 </phoneCheckResult>
<areaInfo>號碼歸屬地</areaInfo>
<operator>運營商 1:中國電信 2:中國移動 3:中國聯(lián)通 </operator>
</item>
</mobileCheckInfo>
<!--4個人反欺詐風(fēng)險綜述信息 1..1 -->
<personAntiSpoofingDescInfo subReportType="14225" subReportTypeCost="96040" treatResult="子報告查詢狀態(tài),1:查得,2:未查得,3:其他原因未查得" treatErrorCode="treatResult=3時的錯誤代碼,詳見數(shù)據(jù)字典,treatsult!=3時,該屬性不存在" errorMessage="treatResult=3時的錯誤描述信息,treatResult!=3時,該屬性的值為空">
<!--treatresult為2時沒有以下節(jié)點-->
<!--
個人反欺詐綜述信息。如以下例子,可能為空,可能存在其中0條或n條,根據(jù)具體結(jié)果返回。
1、 反欺詐風(fēng)險評分為100分,風(fēng)險等級為高,建議拒絕。
2、 電信手機號碼131****1542使用不足1個月。
3、 命中羊毛黨名單。
4、 命中欺詐風(fēng)險名單。
5、 命中高風(fēng)險人員名單。
6、 存在7筆逾期的信貸記錄。
7、 存在40條個人風(fēng)險概要信息。
8、 在近兩年被機構(gòu)查詢過23次個人信息。
-->
<personAntiSpoofingDesc>個人反欺詐綜述信息</personAntiSpoofingDesc>
</personAntiSpoofingDescInfo>
<!--5個人反欺詐風(fēng)險評分信息 1..1 -->
<personAntiSpoofingInfo subReportType="14224" subReportTypeCost="96040" treatResult="子報告查詢狀態(tài),1:查得,2:未查得,3:其他原因未查得" treatErrorCode="treatResult=3時的錯誤代碼,詳見數(shù)據(jù)字典,treatResult!=3時,該屬性不存在" errorMessage="treatResult=3時的錯誤描述信息,treatResult!=3時,該屬性的值為空">
<!--treatresult為2、3時沒有以下節(jié)點-->
<riskScore>風(fēng)險評分</riskScore>
<riskLevel>風(fēng)險等級,取值:高,中度,低</riskLevel>
<suggest>風(fēng)險建議,取值:建議拒絕,建議復(fù)核,建議通過</suggest>
<hitTypes>命中類型:高風(fēng)險名單、個人風(fēng)險信息、信貸逾期名單、被機構(gòu)查詢信息、手機號碼狀態(tài)異常、手機號碼低網(wǎng)齡、羊毛黨名單、欺詐風(fēng)險名單等等,可能為1個或多個</hitTypes>
</personAntiSpoofingInfo>
<!-- 6手機號碼狀態(tài)信息 1..1 -->
<mobileStatusInfo subReportType="13611" subReportTypeCost="96040" treatResult="子報告查詢狀態(tài),1:查得,2:未查得,3:其他原因未查得" treatErrorCode="treatResult=3時的錯誤代碼,詳見數(shù)據(jù)字典,treatResult!=3時,該屬性不存在" errorMessage="treatResult=3時的錯誤描述信息,treatResult!=3時,該屬性的值為空">
<!--treatresult為2、3時沒有以下節(jié)點-->
<item>
<operator>運營商 1:中國電信 2:中國移動 3:中國聯(lián)通 </operator>
<areaInfo>手機號碼歸屬地 </areaInfo>
<phoneStatus>手機狀態(tài) 1:正常在用 2: 停機 3:未啟用 4:已銷號 5-其他 6:預(yù)銷號</phoneStatus>
<timeLength>手機號碼在網(wǎng)時長,如:在網(wǎng)時長不足1個月,1-2個月,3-6個月,7-12個月 </timeLength>
<cancelTime>號碼注銷時間</cancelTime>
</item>
</mobileStatusInfo>
<!--7是否命中羊毛黨名單 1..1-->
<econnoisserurInfo subReportType="14228" subReportTypeCost="96040" treatResult="子報告查詢狀態(tài),1:查得,2:未查得,3:其他原因未查得" treatErrorCode="treatResult=3時的錯誤代碼,詳見數(shù)據(jù)字典,treatResult!=3時,該屬性不存在" errorMessage="treatResult=3時的錯誤描述信息,treatResult!=3時,該屬性的值為空">
<!--treatresult為2、3時沒有以下節(jié)點-->
<state>是否命中羊毛黨名單,取值:0/1,0表示未命中羊毛黨名單,1表示命中羊毛黨名單</state>
</econnoisserurInfo>
<!--8是否命中欺詐風(fēng)險名單 1..1-->
<fraudRiskInfo subReportType="14229" subReportTypeCost="96040" treatResult="子報告查詢狀態(tài),1:查得,2:未查得,3:其他原因未查得" treatErrorCode="treatResult=3時的錯誤代碼,詳見數(shù)據(jù)字典,treatResult!=3時,該屬性不存在" errorMessage="treatResult=3時的錯誤描述信息,treatResult!=3時,該屬性的值為空">
<!--treatresult為2、3時沒有以下節(jié)點-->
<state>是否命中欺詐風(fēng)險名單,取值:0/1,0表示未命中欺詐風(fēng)險名單,1表示命中欺詐風(fēng)險名單</state>
</fraudRiskInfo>
<!--9是否命中高風(fēng)險名單 1..1 -->
<personRiskAssess subReportType="14226" subReportTypeCost="96040" treatResult="子報告查詢狀態(tài),1:查得,2:未查得,3:其他原因未查得" treatErrorCode="treatResult=3時的錯誤代碼,詳見數(shù)據(jù)字典,treatResult!=3時,該屬性不存在" errorMessage="treatResult=3時的錯誤描述信息,treatResult!=3時,該屬性的值為空">
<!--treatresult為2、3時沒有以下節(jié)點-->
<checkResult>是否命中高風(fēng)險名單 1:是,2:否</checkResult>
</personRiskAssess>
<!-- 10網(wǎng)貸逾期信息 1..1 -->
<microNearlyThreeYearsOverdueInfo subReportType="13204" subReportTypeCost="96040" treatResult="子報告查詢狀態(tài),1:查得,2:未查得,3:其他原因未查得" treatErrorCode="treatResult=3時的錯誤代碼,詳見數(shù)據(jù)字典,treatResult!=3時,該屬性不存在" errorMessage="treatResult=3時的錯誤描述信息,treatResult!=3時,該屬性的值為空">
<!--treatresult為2、3時沒有以下節(jié)點-->
<!--逾期匯總信息 0..1-->
<stat>
<overdueAmount>逾期本金,單位:以貸款基本信息的幣種為準(zhǔn)</overdueAmount>
<overdueDays>逾期天數(shù)區(qū)間,取值區(qū)間:逾期1天(含)以上</overdueDays>
<overdueCount>逾期天數(shù)區(qū)間的總筆數(shù)</overdueCount>
</stat>
<!--0..1-->
<items>
<!--逾期概要信息 1..5 多個記錄-->
<item>
<overdueAmount>逾期本金,單位:以貸款基本信息的幣種為準(zhǔn)</overdueAmount>
<overdueDays>逾期天數(shù)區(qū)間,取值區(qū)間:逾期1-6天,逾期7-29天,逾期30-59天,逾期60-89天,逾期90天(含)以上</overdueDays>
<overdueCount>逾期天數(shù)區(qū)間的筆數(shù)</overdueCount>
</item>
</items>
</microNearlyThreeYearsOverdueInfo>
<!-- 11風(fēng)險信息 1..1 -->
<personRiskInfo subReportType="14227" subReportTypeCost="96040" treatResult="子報告查詢狀態(tài),1:查得,2:未查得,3:其他原因未查得" treatErrorCode="treatResult=3時的錯誤代碼,詳見數(shù)據(jù)字典,treatResult!=3時,該屬性不存在" errorMessage="treatResult=3時的錯誤描述信息,treatResult!=3時,該屬性的值為空">
<!--treatresult為2、3時沒有以下節(jié)點-->
<!-- 匯總信息 0..1-->
<stat>
<totleCount>概要匯總條數(shù)</totleCount>
<alCount>司法案例信息條數(shù)</alCount>
<zxCount>司法執(zhí)行信息條數(shù)</zxCount>
<sxCount>司法失信信息條數(shù)</sxCount>
<swCount>稅務(wù)行政執(zhí)法信息條數(shù)</swCount>
<cqggCount>催欠公告信息條數(shù)</cqggCount>
<wdyqCount>網(wǎng)貸逾期信息條數(shù)</wdyqCount>
</stat>
<!-- 匯總信息 end-->
<!-- 概要信息 0..1-->
<summary>
<!-- 司法案例信息概要信息 0..1 -->
<als>
<!-- 司法案例信息概要信息內(nèi)容 1..n -->
<item>
<recordId>記錄編號</recordId>
<bt>標(biāo)題</bt>
<ajlx>案件類型</ajlx>
<sjnf>審結(jié)年份,格式:YYYY</sjnf>
<dsrlx>當(dāng)事人類型</dsrlx>
</item>
</als>
<!-- 司法執(zhí)行信息概要信息 0..1 -->
<zxs>
<!-- 司法執(zhí)行信息概要信息內(nèi)容 1..n -->
<item>
<recordId>記錄編號</recordId>
<bt>標(biāo)題</bt>
<zxbd>執(zhí)行標(biāo)的,單位:以幣種為準(zhǔn)</zxbd>
<larq>立案日期,格式Y(jié)YYY-MM-DD</larq>
</item>
</zxs>
<!-- 司法失信信息概要信息 0..1 -->
<sxs>
<!-- 司法失信信息概要信息內(nèi)容 1..n -->
<item>
<recordId>記錄編號</recordId>
<bt>標(biāo)題</bt>
<larq>立案日期,格式Y(jié)YYY-MM-DD</larq>
<fbrq>發(fā)布日期,格式Y(jié)YYY-MM-DD</fbrq>
</item>
</sxs>
<!-- 稅務(wù)行政執(zhí)法信息概要信息 0..1 -->
<sws>
<!-- 稅務(wù)行政執(zhí)法信息概要信息內(nèi)容 1..n -->
<item>
<recordId>記錄編號</recordId>
<bt>標(biāo)題</bt>
<ggrq>公告日期,格式Y(jié)YYY-MM-DD</ggrq>
</item>
</sws>
<!-- >催欠公告信息概要信息 0..1 -->
<cqs>
<!-- 催欠公告信息概要信息內(nèi)容 1..n -->
<item>
<recordId>記錄編號</recordId>
<bt>標(biāo)題</bt>
<fbrq>發(fā)布日期,格式Y(jié)YYY-MM-DD</fbrq>
</item>
</cqs>
<!-- 網(wǎng)貸逾期信息概要信息 0..1 -->
<wdyqs>
<!-- 網(wǎng)貸逾期信息概要信息內(nèi)容 1..n -->
<item>
<recordId>記錄編號</recordId>
<bt>標(biāo)題</bt>
<fbrq>發(fā)布日期,格式Y(jié)YYY-MM-DD</fbrq>
</item>
</wdyqs>
</summary>
</personRiskInfo>
<!--12個人近兩年歷史查詢記錄 1..1 -->
<historySimpleQueryInfo subReportType="19902" subReportTypeCost="96040" treatResult="子報告查詢狀態(tài),1:查得,2:未查得,3:其他原因未查得" treatErrorCode="treatResult=3時的錯誤代碼,詳見數(shù)據(jù)字典,treatResult!=3時,該屬性不存在" errorMessage="treatResult=3時的錯誤描述信息,treatResult!=3時,該屬性的值為空">
<!--treatresult為2、3時沒有以下節(jié)點-->
<!--0..1-->
<items>
<!-- 1..n -->
<item>
<unitMember>單位類型名稱</unitMember>
<last1Month>近1個月查詢記錄數(shù)</last1Month>
<last3Month>近3個月查詢記錄數(shù)</last3Month>
<last6Month>近6個月查詢記錄數(shù)</last6Month>
<last12Month>近12個月查詢記錄數(shù)</last12Month>
<last18Month>近18月查詢記錄數(shù)</last18Month>
<last24Month>近24月查詢記錄數(shù)</last24Month>
</item>
</items>
<!--0..1-->
<count>
<last1Month>近1個月各單位類型查詢記錄總數(shù)</last1Month>
<last3Month>近3個月各單位類型查詢記錄總數(shù)</last3Month>
<last6Month>近6個月各單位類型查詢記錄總數(shù)</last6Month>
<last12Month>近12個月各單位類型查詢記錄總數(shù)</last12Month>
<last18Month>近18月各單位類型查詢記錄總數(shù)</last18Month>
<last24Month>近24月各單位類型查詢記錄總數(shù)</last24Month>
</count>
</historySimpleQueryInfo>
</cisReport>
</cisReports>
二,表結(jié)構(gòu)設(shè)計
1,批次號:各表之間用最外層批次號關(guān)聯(lián)。
2,主表:即把各層字段全部存在一個表中。
三,實體設(shè)計
分為三層: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.
* 報告節(jié)點屬性以及子節(jié)點
*/
public class CisReportChild extends BasePojo {
/**
* 報告生成結(jié)束時間
**/
private String buildEndTime;
/**
* 是否有系統(tǒng)錯誤 true表示有 false表示沒有
**/
private String hasSystemError;
/**
* 該客戶是否被凍結(jié)
**/
private String isFrozen;
private ReportElement reportElement;
public class ReportElement extends BasePojo {
private String phone;
private PoliceCheckInfo policeCheckInfo;//身份認(rèn)證
private MobileCheckInfo mobileCheckInfo;//個人手機號碼核查
private PersonAntiSpoofingDescInfo personAntiSpoofingDescInfo;//個人反欺詐風(fēng)險綜述信息
private PersonAntiSpoofingInfo personAntiSpoofingInfo;//個人反欺詐風(fēng)險評分信息
private MobileStatusInfo mobileStatusInfo;//手機號碼狀態(tài)信息
private EconnoisserurInfo econnoisserurInfo;//是否命中羊毛黨名單
private FraudRiskInfo fraudRiskInfo;//是否命中欺詐風(fēng)險名單
private PersonRiskAssess personRiskAssess;//是否命中高風(fēng)險名單
private MicroNearlyThreeYearsOverdueInfo microNearlyThreeYearsOverdueInfo;//網(wǎng)貸逾期信息
private PersonRiskInfo personRiskInfo;//風(fēng)險信息
private HistorySimpleQueryInfo historySimpleQueryInfo;//個人近兩年歷史查詢記錄
四,代碼
<1>單筆,批量無需主鍵
無論單筆還是批量都可以把數(shù)據(jù)存在map中,sql中通過map的鍵獲取數(shù)據(jù)。
如:
private void savePersonRiskInfo(String batNo, PersonRiskInfo personRiskInfo) throws Exception {
Map<String, Object> 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:
<!--個人風(fēng)險記錄 -->
//單筆
<insert id="savePersonRiskInfo" parameterType="java.util.Map">
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>
<!--逾期詳細(xì)記錄 -->
//批量
<insert id="saveMicroNearlyThreeYearsOverdueInfoList" parameterType="java.util.Map">
INSERT INTO TABLE_MNTYOI (BATNO,OVERDUEAMOUNT,OVERDUEDAYS,OVERDUECOUNT)
<foreach collection="list" item="item" separator="union all">
(
SELECT #{batNo,jdbcType=VARCHAR},
#{item.overdueAmount,jdbcType=VARCHAR},
#{item.overdueDays,jdbcType=VARCHAR},
#{item.overdueCount,jdbcType=NUMERIC}
FROM DUAL
)
</foreach>
</insert>
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)保存數(shù)據(jù)
saveCisReport(cisReportRoot);
return cisReportRoot;
}
(1)保存數(shù)據(jù)
@Transactional(rollbackFor = Exception.class)
@Override
public CisReportRoot saveCisReport(CisReportRoot cisReportRoot) throws Exception {
try {
ReportElement reportElement = cisReportRoot.getCisReportChild().getReportElement();
PersonRiskInfo personRiskInfo = reportElement.getPersonRiskInfo();
//(2)主表,保存xml所有節(jié)點信息(不包含個人風(fēng)險信息),保存單筆數(shù)據(jù)
pyMapper.saveCisReport(cisReportRoot);
if (SUCCESS.equals(cisReportRoot.getCisReportChild().getReportElement().getPersonRiskInfo().getTreatResult())) {
savePersonRiskInfo(cisReportRoot.getBatNo(), personRiskInfo);
}
if (cisReportRoot.getCisReportChild().getReportElement().getHistorySimpleQueryInfo().getTreatResult().equals(SUCCESS)) {
Map<String, Object> map = new HashMap<>();
//(3)保存批量數(shù)據(jù)
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 id="saveCisReport" parameterType="java.util.Map">
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 hh24: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)保存批量數(shù)據(jù)(不自動生成主鍵)
<!--個人近兩年歷史查詢記錄 -->
<insert id="saveHistorySimpleQueryInfoList" parameterType="java.util.Map">
INSERT INTO
TABLE_HISTORY_SIMPLE_QUERY
(BATNO,UNIT_MEMBER,LAST1MONTH,LAST3MONTH,LAST6MONTH,LAST12MONTH,LAST18MONTH,LAST24MONTH)
<foreach collection="list" item="item" separator="union all">
(
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
)
</foreach>
</insert>
<2>單筆,批量需要插入主鍵
單筆含主鍵
DataServiceDetailResult dataServiceDetailResult = tdService.getDataServiceDetailResult(tdReportRoot);
int n = tdDataServiceMapper.insertDataServiceDetailResult(dataServiceDetailResult);
<!--信息核驗接口-->
<!--DATASERVICE-->
<insert id="insertDataServiceDetailResult" parameterType="DataServiceDetailResult">
<selectKey keyProperty="id" resultType="BigDecimal" order="BEFORE">
select SEQ_ICS_TD_DATASERVICE.nextval as id from dual
</selectKey>
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})
</insert>
批量保存包含主鍵
if (!ListUtil.isEmpty(interfacesList)) {
map.put("recordId", id);
map.put("list", interfacesList);
tdDataServiceMapper.addBatchInterfaces(map);
}
sql:
<!--批量保存interfaces-->
<insert id="addBatchInterfaces" parameterType="java.util.List">
<!--
注釋為mysql插入方式,可以插入但是導(dǎo)致數(shù)據(jù)回滾不了
下面為oracle插入方式:注意parameterType:java.util.List或java.util.Map都可以
BEGIN
<foreach collection="list" item="item" index="index" separator="">
INSERT INTO ICS_TD_INTERFACES(ID, RECORDID, TYPE)
VALUES
(
BLOANCRDTDATA.SEQ_ICS_TD_INTERFACES.nextval,
#{recordId,jdbcType=DECIMAL},
#{item.type,jdbcType=VARCHAR}
);
</foreach>
COMMIT;
END;-->
insert into ICS_TD_INTERFACES (ID,RECORDID, TYPE)
SELECT SEQ_ICS_TD_INTERFACES.nextval ID, A.*
FROM(
<foreach collection="list" item="item" index="index" separator="union all">
SELECT
#{recordId,jdbcType=DECIMAL},
#{item.type,jdbcType=VARCHAR}
FROM DUAL
</foreach>
) A
</insert>
總結(jié)
以上所述是小編給大家介紹的mybatis單筆批量保存實體數(shù)據(jù)的方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
- Mybatis批量插入數(shù)據(jù)返回主鍵的實現(xiàn)
- MyBatis批量插入數(shù)據(jù)過程解析
- 詳解mybatis 批量更新數(shù)據(jù)兩種方法效率對比
- MyBatis批量插入數(shù)據(jù)到Oracle數(shù)據(jù)庫中的兩種方式(實例代碼)
- 詳解MyBatis批量插入數(shù)據(jù)Mapper配置文件的寫法
- Mybatis批量刪除數(shù)據(jù)操作方法
- MyBatis批量插入(insert)數(shù)據(jù)操作
- Java實現(xiàn)mybatis批量插入數(shù)據(jù)到Oracle
- 詳解MyBatis直接執(zhí)行SQL查詢及數(shù)據(jù)批量插入
- MyBatis批量添加數(shù)據(jù)2種實現(xiàn)方法
相關(guān)文章
Tomcat 實現(xiàn)WebSocket詳細(xì)介紹
這篇文章主要介紹了Tomcat 如何實現(xiàn)WebSocket的相關(guān)資料,對WebSocket協(xié)議通信的過程進行了詳細(xì)介紹,需要的朋友可以參考下2016-12-12
Netty分布式Server啟動流程服務(wù)端初始化源碼分析
本章主要講解server啟動的關(guān)鍵步驟,?讀者只需要了解server啟動的大概邏輯,?知道關(guān)鍵的步驟在哪個類執(zhí)行即可,?并不需要了解每一步的運作機制,?之后會對每個模塊進行深度分析2022-03-03
java Socket實現(xiàn)簡單模擬HTTP服務(wù)器
這篇文章主要介紹了java Socket實現(xiàn)簡單模擬HTTP服務(wù)器,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05
Java多線程Callable和Future接口區(qū)別
這篇文章主要介紹了Java多線程Callable和Future接口區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-04-04
java數(shù)據(jù)結(jié)構(gòu)之插入排序
這篇文章主要為大家詳細(xì)介紹了java數(shù)據(jù)結(jié)構(gòu)之插入排序的相關(guān)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-11-11

