ibatis 批量插入[类对象]到 oracle 数据库

ibatis 批量插入[类对象]到 oracle 数据库

分类: JAVA技术 202人阅读 评论(0) 收藏 举报
1.实现目标:
a)使用ibatis实现批量插入数据到oracle数据库
b)插入的是类对象数据列表
c)插入的同时,需要使用数据库sequence生成对象的唯一标识

2.实现过程:

a)ibatis的xml文件配置详解

  1. <insert id="insertSourceInfoList" parameterClass="java.util.List">
  2. <![CDATA[
  3. INSERT ALL
  4. ]]>
  5. <iterate conjunction=" ">
  6. INTO net_addr_main_info
  7. (na_id,
  8. na_name,
  9. na_status_id,
  10. create_date,
  11. status_date,
  12. src_na_id,
  13. remark)
  14. VALUES
  15. (F_GETSEQ(#list[].timestamp#),
  16. #list[].na_name#,
  17. 10,
  18. sysdate,
  19. sysdate,
  20. #list[].src_na_id#,
  21. #list[].remark#)
  22. </iterate>
  23. <![CDATA[
  24. SELECT * FROM dual
  25. ]]>
  26. </insert>
<insert id="insertSourceInfoList" parameterClass="java.util.List">
	<![CDATA[
		INSERT ALL
	]]>
	<iterate conjunction=" ">
		INTO net_addr_main_info
		  (na_id,
		   na_name,
		   na_status_id,
		   create_date,
		   status_date,
		   src_na_id,
		   remark)
		VALUES
		  (F_GETSEQ(#list[].timestamp#),
		   #list[].na_name#, 
		   10, 
		   sysdate, 
		   sysdate, 
		   #list[].src_na_id#,
		   #list[].remark#)
	</iterate>
	<![CDATA[
		SELECT * FROM dual
	]]>
</insert>
-> parameterClass="java.util.List" 传递需要保存的对象列表;

-> insert all 语法简介: insert all into net_addr_main_info (na_id, na_name) values (1000, 'test1')
into net_addr_main_info (na_id, na_name) values (1001, 'test2')
select * from dual;
insert all 可以实现同时把数据插入到多个表中,当前功能实现,是需要把数据列表插入到同一个表。但是ibatis的配置文件中只支持执行一句完整的sql,因此通过insert all语句来实现同时多条数据入表;

-> F_GETSEQ(P_ID IN NUMBER)是一个数据库函数,功能是取出sequence的值。
因为,ibatis在生成 sql 语句的时候,只会取一次序列值,因此,不能在这个地方使用 sequence.nextval 取值,因此通过这样的数据库函数,取出序列值。函数的入参,是一个任意唯一值。在调用的时候,做为入参传递进去。
实现:

  1. CREATE OR REPLACE FUNCTION F_GETSEQ(P_ID IN NUMBER) RETURN NUMBER
  2. DETERMINISTIC AS
  3. V_SEQ NUMBER;
  4. BEGIN
  5. SELECT SEQ_NA_ID.NEXTVAL INTO V_SEQ FROM DUAL;
  6. RETURN V_SEQ;
  7. END;
CREATE OR REPLACE FUNCTION F_GETSEQ(P_ID IN NUMBER) RETURN NUMBER
  DETERMINISTIC AS
  V_SEQ NUMBER;
BEGIN
  SELECT SEQ_NA_ID.NEXTVAL INTO V_SEQ FROM DUAL;
  RETURN V_SEQ;
END;
-> select * from dual, 是insert all语法的一部分,因此不能省略。
-> 使用<iterate>标签,对它包裹的内容进行迭代;conjunction=" ",迭代内容的连接符,这里使用空格进行连接。
-> 因为传递的入参是list,且list内容是类对象,所以通过 #list[].na_name# 方式取类对象的属性。其中 'list' 无头紧要,可以换成其它任意字符;但是 [] 这两个字符不能舍弃,主要是起迭代作用;.na_name 是引用类对象属性。


b)JAVA类调用,省略。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值