批量写数据---将XML数据批量写入数据库

将数据批量写入数据库的需求是比较多的,方法也有很多种,在.net 里使用程序比较好的方法是 使用 Bulk Copy 将大量数据复制到数据库 。如果数据源为XML文件,使用SQL BULK COPY就需要将XML数据导入到DataTable,下面的方法可以直接将XML数据传到SQL SERVER然后处理,另外还可以直接使用T-SQL将XML文件的数据导入到数据库。这里最主要的是要使用二个系统存储过程: SP_XML_PREPAREDOCUMENTSP_XML_REMOVEDOCUMENT     SP_XML_PREPAREDOCUMENT 的功能是:读取XML文件后使用 MSXML 分析器 (Msxmlsql.dll) 对XML数据进行分析,并提供分析后的文档供使用。分析后得到的数据是对 XML 文件中的各节点(元素、属性、文本和注释等)以树状形式表现。分析后的数据存储在 SQL Server 的内部缓存中。     SP_XML_REMOVEDOCUMENT 的功能是:根据文档句柄释放文档所占的内存。     先建立一个XML字符串和一个表:
<?xml version="1.0"?> <ROOT>     <USER ID="1" Name="SBQCEL"/>     <USER ID="2" Name="PEACELI"/>     <USER ID="3" Name="SHEEPCHANG"/> </ROOT>
   
CREATE TABLE  Users (     UserId INT ,     UserName VARCHAR(20 )  )
   处理的方法很简单:
DECLARE @HDOC INT    --文档句柄 DECLARE @XMLSTRING VARCHAR(200)        --XML字符串 SET @xmlString ='<?xml version="1.0"?> <ROOT>     <USER ID="1" Name="SBQCEL"/>     <USER ID="2" Name="PEACELI"/>     <USER ID="3" Name="SHEEPCHANG"/> </ROOT>' --使用系统存储过程SP_XML_PREPAREDOCUMENT分析XML字符串 EXEC SP_XML_PREPAREDOCUMENT @HDOC OUTPUT, @XMLSTRING --使用OPENXML从SQL Server 的内部缓存查询数据 INSERT INTO Users SELECT * FROM OPENXML(@HDOC,N'/ROOT/USER') WITH  (      ID INT,     Name VARCHAR(10) ) --使用系统存储过程SP_XML_REMOVEDOCUMENT释放内存 EXEC SP_XML_REMOVEDOCUMENT @HDOC
   如果要用T-SQL直接读取一个XML文件并将数据导入到表里,需要做一些额外的处理:先要用 XP_CMDSHELL将XML数据读到一个临时表(变量表),然后将每行数据组合成一个字符串,再用上面的方法处理。需要注意的是XP_CMDSHELL以行来处理数据的。下面是一个简单的事例:
-- 定义一个变量表临时存储调用XP_CMDSHELL后得到的数据 DECLARE   @TEMP   TABLE (     ID  INT   IDENTITY ( 1 , 1 ),     XMLSTRING  VARCHAR ( 200 ) ) -- 使用XP_CMDSHELL将XML文件的数据插入到变量表里 INSERT   INTO   @TEMP   EXEC  MASTER.DBO.XP_CMDSHELL  ' TYPE E:/A.XML ' DECLARE   @LOOP   INT ,     -- 循环计数          @COUNT   INT ,     -- 行数          @XMLSTRING   VARCHAR ( 200 )     -- 存储XML字符串 SELECT    @LOOP   =   1 ,     -- 从第1行开始          @XMLSTRING = '' ,     -- 初始化          @COUNT   =  ( SELECT   COUNT ( 1 FROM   @TEMP )     -- 获得行数 -- 做一个循环,将数据组合成一个字符串以便处理 WHILE  ( @LOOP <= @COUNT ) BEGIN           SELECT   @XMLSTRING   =   @XMLSTRING   +  XMLSTRING  FROM   @TEMP   WHERE  ID  =   @LOOP      SET   @LOOP   =   @LOOP   +   1 END -- 查看处理结果 SELECT   @XMLSTRING
用上面的方法处理后就将一个XML文件的数据组合成一个字符串了,然后就可以用上面的方法将数据导入到数据库了
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 MyBatis 中,可以使用批量插入的方式将数据批量写入 Oracle 数据库。具体操作步骤如下: 1. 创建一个包含要插入的数据的 List 对象。 2. 在 Mapper.xml 文件中定义一个 insert 语句,使用 foreach 标签遍历 List 对象,并将数据插入到数据库中。 3. 在 Java 代码中调用 sqlSession 的 batch 方法,将数据批量插入到数据库中。 具体代码如下: 1. 创建一个包含要插入的数据的 List 对象: ``` List<Employee> employeeList = new ArrayList<Employee>(); employeeList.add(new Employee(1001, "John Smith", "Accounting", 5000)); employeeList.add(new Employee(1002, "Jane Doe", "Sales", 6000)); employeeList.add(new Employee(1003, "Bob Johnson", "Marketing", 7000)); ``` 2. 在 Mapper.xml 文件中定义一个 insert 语句,使用 foreach 标签遍历 List 对象,并将数据插入到数据库中: ``` <insert id="batchInsertEmployee" parameterType="java.util.List"> INSERT INTO EMPLOYEE (EMP_ID, EMP_NAME, DEPARTMENT, SALARY) VALUES <foreach collection="list" item="item" index="index" separator=","> (#{item.empId}, #{item.empName}, #{item.department}, #{item.salary}) </foreach> </insert> ``` 3. 在 Java 代码中调用 sqlSession 的 batch 方法,将数据批量插入到数据库中: ``` SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH); EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class); employeeMapper.batchInsertEmployee(employeeList); sqlSession.flushStatements(); sqlSession.commit(); sqlSession.close(); ``` 其中,ExecutorType.BATCH 表示使用批处理方式执行 SQL 语句,flushStatements() 方法将缓存中的 SQL 语句刷新到数据库中,commit() 方法提交事务,close() 方法关闭 SqlSession。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值