当前位置: 首页 > news >正文

Java使用SQLServerBulkCopy实现数据库批量操作

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

Microsoft SQL Server 的bcp命令可以快速将大型文件复制插入到数据库中,C#提供了SqlBulkCopy方法实现该功能,而在java中可以通过SQLServerBulkCopy类实现类似的功能,且相对于insert、update等命令来说,这个类的效率要高的多。(对比常用的JDBC的Batch方法也高的多)。

SQLServerBulkCopy类只能用于对SQL Sever数据库的插入,但是数据来源可以不是SQL Sever数据库。旧版的Microsoft SQL Server JDBC 驱动并没有提供这个类,需要下载Microsoft SQL Server JDBC 驱动程序 6.0版本:https://www.microsoft.com/zh-cn/download/confirmation.aspx?id=11774。MS官方的说明文档在这个地址:https://docs.microsoft.com/en-us/sql/connect/jdbc/using-bulk-copy-with-the-jdbc-driver。

SQLServerBulKCopy类向数据库插入数据支持三种类型封装的数据:Java本身提供的ResultSet、RowSet和JDBC提供的ISQLServerBulkRecord接口实现类。下面提供一种实现:

 /**
     * 获取空的CachedRowSet对象
     * 其中BaseDao为最常见的JDBC操作,这里就不贴出,相信大家看的懂
     * @throws SQLException
     */
    public CachedRowSetImpl getCachedRowSet() throws SQLException{
        //查询出空值用于构建CachedRowSetImpl对象以省去列映射的步骤
        ResultSet rs = baseDao.executeSQL("select * from FactMonthTimeTable where 1=0");
        CachedRowSetImpl crs = new CachedRowSetImpl();
        crs.populate(rs);
        //获取crs以后关闭数据库连接
        baseDao.closeResource();
        return crs;
    }

    /**
     * 向CachedRowSet对象插入一条数据
     * 循环调用这一个方法,将想插入数据库的数据先插入到CachedRowSet对象里
     * @param crs
     * @param fmt
     * @return
     * @throws SQLException
     */
    public CachedRowSetImpl insertIntoCachedRowSet(CachedRowSetImpl crs,Student stu) throws SQLException{
        //移动指针到“插入行”,插入行是一个虚拟行
        crs.moveToInsertRow();
        //更新虚拟行的数据
        crs.updateString("name", stu.getName());
        crs.updateInt("id", stu.getId());
        //插入虚拟行
        crs.insertRow();
        //移动指针到当前行
        crs.moveToCurrentRow();
        return crs;
    }

    /**
     * 使用BulkCopy和RowSet进行批量插入
     * @param crs
     * @param batchSize
     */
    public void insertBatch(CachedRowSetImpl crs,int batchSize)throws SQLException{
        //数据库连接字符串
        String url = "jdbc:sqlserver://localhost:1433;DatabaseName=datebaseName"
                         +";user=userName;password=userPassword";
        SQLServerBulkCopyOptions copyOptions = new SQLServerBulkCopyOptions();
        copyOptions.setKeepIdentity(true);
        copyOptions.setBatchSize(8000);
        copyOptions.setUseInternalTransaction(true);
        SQLServerBulkCopy bulkCopy =
                new SQLServerBulkCopy(connectionUrl);
        bulkCopy.setBulkCopyOptions(copyOptions);
        bulkCopy.setDestinationTableName("tableName");
        bulkCopy.writeToServer(crs);
        crs.close();
        bulkCopy.close();
    }

 

转载于:https://my.oschina.net/pierrecai/blog/852196

相关文章:

  • innerHTML,innerText,outHTML,outText区别
  • Selenium2+python自动化37-爬页面源码(page_source)
  • reverse-integer
  • AC日记——传纸条 洛谷 P1006
  • mongodb 聚合操作
  • P1396 营救
  • 使用Gradle第一次构建Java程序
  • 深入认识CSS的行内元素
  • PHP Smarty template for website
  • 网络中数据传输过程的分析
  • BIO、NIO和AIO的区别(简明版)
  • JavaScript-基础入门.0008.JavaScript作用范围
  • 《微信公众平台开发》图书介绍
  • PE分析
  • 判断用户名是否正确
  • [译] React v16.8: 含有Hooks的版本
  • “大数据应用场景”之隔壁老王(连载四)
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • Computed property XXX was assigned to but it has no setter
  • CSS相对定位
  • Java|序列化异常StreamCorruptedException的解决方法
  • javascript数组去重/查找/插入/删除
  • Java新版本的开发已正式进入轨道,版本号18.3
  • JS题目及答案整理
  • Just for fun——迅速写完快速排序
  • Python 反序列化安全问题(二)
  • python 装饰器(一)
  • Vim 折腾记
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 阿里研究院入选中国企业智库系统影响力榜
  • 关于for循环的简单归纳
  • 线上 python http server profile 实践
  • 与 ConTeXt MkIV 官方文档的接驳
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • 阿里云ACE认证学习知识点梳理
  • # Apache SeaTunnel 究竟是什么?
  • (Python第六天)文件处理
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (分布式缓存)Redis持久化
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (四)Linux Shell编程——输入输出重定向
  • ***测试-HTTP方法
  • .gitignore文件—git忽略文件
  • .htaccess配置常用技巧
  • .net 提取注释生成API文档 帮助文档
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .NetCore项目nginx发布
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示
  • .vue文件怎么使用_我在项目中是这样配置Vue的
  • @Bean注解详解
  • [④ADRV902x]: Digital Filter Configuration(发射端)
  • [ABP实战开源项目]---ABP实时服务-通知系统.发布模式
  • [Avalon] Avalon中的Conditional Formatting.
  • [BZOJ] 2044: 三维导弹拦截