这是CodingSir的帖子说的(由于不够详细,我现在提供给详细的,上手即用):

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接口实现类。下面提供一种实现:

  1. BaseDao代码:
  1. public class BaseDao {
  2. //驱动
  3. private static String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
  4.  
  5. //数据库地址
  6. private static String url = "jdbc:sqlserver://127.0.0.1:1433;SelectMethod=cursor;DatabaseName=数据库名字;";
  7.  
  8. //数据库用户名
  9. private static String name = "sa";
  10.  
  11. //数据库密码
  12. private static String password = "123456";
  13.  
  14. //数据库连接,定义为全局变量,方便调用
  15. private Connection con;
  16.  
  17. //导入驱动,静态代码块的作用为只运行一次,异常无法向上抛出,只能及时处理
  18. static{
  19. try{
  20. Class.forName(driver);
  21. }catch (ClassNotFoundException e) {
  22. //打印异常相关信息
  23. e.printStackTrace();
  24. }
  25. }
  26.  
  27. //无参构造方法,连接数据库
  28. public BaseDao () {
  29. try {
  30. con=DriverManager.getConnection(url,name,password);
  31. } catch (SQLException throwables) {
  32. throwables.printStackTrace();
  33. }
  34. }
  35.  
  36. //数据查找,返回查找的内容,向上抛异常
  37. public ResultSet executeSQL (String sql,Object...object) throws SQLException{
  38. PreparedStatement ps=con.prepareStatement(sql);
  39.  
  40. for(int i=0;i<object.length;i++){
  41. //ps传入参数的下标是从1开始
  42. ps.setObject(i+1,object[i]);
  43. }
  44.  
  45. //返回结果集
  46. return ps.executeQuery();
  47. }
  48.  
  49. //数据的增删改,返回数据执行行数
  50. public int executeUpdate(String sql,Object...object) throws SQLException {
  51. PreparedStatement ps=con.prepareStatement(sql);
  52. for(int i=0;i<object.length;i++){
  53. ps.setObject(i+1,object[i]);
  54. }
  55. //返回int类型执行行数
  56. return ps.executeUpdate();
  57. }
  58.  
  59. //关闭数据库连接
  60. public void close() throws SQLException{
  61. con.close();
  62. }
  63. }

下面的代码,大家可以也封装成工具类:

  1. public static void main(String[] args) {
  1.     String url = "jdbc:sqlserver://127.0.0.1:1433;SelectMethod=cursor;DatabaseName=ry"
  2. + ";user=sa;password=123456";
  3. //查询出空值用于构建CachedRowSetImpl对象以省去列映射的步骤
  4. BaseDao baseDao=new BaseDao();
  5. ResultSet rs = baseDao.executeSQL("select * from curr where 1=0");
  6. CachedRowSetImpl crs = new CachedRowSetImpl();
  7. crs.populate(rs);

  8.      //既然是批量插入肯定是需要循环
         forint i=0;i<执行的次数;i++){
  9.   //移动指针到“插入行”,插入行是一个虚拟行
  10.   crs.moveToInsertRow();
  11.   //更新虚拟行的数据(实体类要新增的字段,大家根据自己的实体类的字段来修改)
                     //数据库字段 ,填写的值
  12.   crs.updateString("monetary_code", "014");//string类型的值
  13.   crs.updateString("curr_code", "CNY");
  14.   crs.updateString("name", "人民币");
           //别的类型的值,自己看api,基本上都是crs.update***这样的
  15.   //crs.updateInt("curr_code", 2);//int类型的值
  16.   //插入虚拟行
  17.   crs.insertRow();
  18.   //移动指针到当前行
  19.   crs.moveToCurrentRow();
         }

  20.      //进行批量插入
  21. SQLServerBulkCopyOptions copyOptions = new SQLServerBulkCopyOptions();
  22. copyOptions.setKeepIdentity(true);
  23. copyOptions.setBatchSize(8000);
  24. copyOptions.setUseInternalTransaction(true);
  25. SQLServerBulkCopy bulkCopy = new SQLServerBulkCopy(url);
  26. bulkCopy.setBulkCopyOptions(copyOptions);
  27. bulkCopy.setDestinationTableName("curr");
  28. bulkCopy.writeToServer(crs);
  29. crs.close();
  30. bulkCopy.close();
    }

感想:由于大牛对小白关照细节不到位,所以决定写篇详细的给你们,节省大家的时间。

Java使用SQLServerBulKCopy实现批量插入SQLSqerver数据库的更多相关文章

  1. C# 数据批量插入到数据库SqlBulkCopy(源数据类型:List<T> Or DataTable)

      /*_____________________ List<T>类型数据 To Sql_______________________________*/ /// <summary& ...

  2. [Java]如何把当前时间插入到数据库

    [Java]如何把当前时间插入到数据库 1.在orderDao.java中 /** 设置订单*/ public void setOrder(Order order){ Date time = new ...

  3. java中解析excel 批量插入数据库

    Facade 层 实现类 (@Service("samePeriodModelImportFacade")) 1.  获取cells 的方法 public Cells getCel ...

  4. Mybatis与JDBC批量插入MySQL数据库性能测试及解决方案

    转自http://www.cnblogs.com/fnz0/p/5713102.html 不知道自己什么时候才有这种钻研精神- -. 1      背景 系统中需要批量生成单据数据到数据库表,所以采用 ...

  5. python批量插入mysql数据库(性能相关)以及反引号的使用

    参考link: https://blog.csdn.net/qq_35958094/article/details/78462800(插入相关) https://www.cnblogs.com/hya ...

  6. C# OracleBulkCopy 批量插入oracle数据库的方法

    只有安装了oracle 11G客户端的机器上才可以用,要用到ODP.NET组件中的oracleDataAccess.DLL,命名空间引用为Oracle.DataAccess.Client; 引用:Or ...

  7. C#动态创建Gridview及批量插入到数据库

    这里介绍两种动态创建Gridview的方法: (一).有时需要应付上头领导的检查,所以就弄一些静态的Gridview来显示数据,这种方法的优点就是不用连接数据库,比较方便,但是代码灵活性不高,所有数据 ...

  8. C#批量插入Sybase数据库,Anywhere 8

    数据库版本是Adaptive Server Anywhere 8 1.添加引用,程序集 iAnywhere.Data.AsaClient.这个和SQLServer的System.Data.SqlCli ...

  9. Django—ajax、前端后端编码格式,bulk_create批量插入语数据库、自定义分页

    一.ajax简介: XML也是一门标记语言该语法应用场景 1.写配置文件 2.可以写前端页面(odoo框架中 erp) 每家公司都会有属于这家公司独有的内部管理软件:专门用来开发企业内部管理软件 框架 ...

随机推荐

  1. 小智的旅行(Bridge)51nod 提高组试题

    luogu AC传送门(官方数据) 题目描述 小智最喜欢旅行了,这次,小智来到了一个岛屿众多的地方,有N座岛屿,编号为0到N-1,岛屿之间 由一些桥连接,可以从桥的任意一端到另一端,由于岛屿可能比较大 ...

  2. CF652E Pursuit For Aritifacts

    题目传送门 这是一道很好的练习强联通的题目. 首先,从题中可以看到,题目的要求就是要我们求出从起点到终点是否可以经过flag = 1 的边. 由于是无向图,且要求很多,直接暴力dfs会很凌乱. 那么, ...

  3. [工具-005] C#如何绑定HotKey

    由于某种需要,需要做一个控制鼠标在屏幕乱点的程序,运用C#的 [DllImport("user32.dll")]      private static extern int mo ...

  4. [Objective-C] 008_Foundation框架之NSArray与NSMutableArray

    在Cocoa Foundation中NSArray和NSMutableArray 用于对象有序集合,NSArray和NSMutableArray类最大的区别是:NSArray是不可变,NSMutabl ...

  5. PETS渗透测试标准总结

    国外的标准框架,感觉大部分渗透公司的测试指南都是从这俩借鉴的,正好复习下. 国外渗透测试标准:http://www.pentest-standard.org 渗透测试分为:前期交互,情报搜集,威胁建模 ...

  6. 03 . Python入门之运算符

    一.什么是运算符? 举个简单的例子** 4 +5 = 9 . 例子中,4** 和 5 被称为操作数,"+" 称为运算符. Python语言支持以下类型的运算符: [算术运算符] [ ...

  7. 项目打包成手机app 通过什么打包?

    项目打包成手机app  通过什么打包? 1.HbuildX注册邮箱账号 2.新建-app,然后将自动生成的除manifest.json之外的所有文件删除,然后将vue项目build之后生成的dist文 ...

  8. PowerPC-object与elf中的符号引用

    https://mp.weixin.qq.com/s/6snzjEpDT4uQuCI2Nx9VcQ   一. 符号引用 编译会先把每个源代码文件编译成object目标文件,然后把所有目标文件链接到一起 ...

  9. jchdl - GSL Node

    https://mp.weixin.qq.com/s/Oa4qgjIUccu5Y-Jlqcyn_A   org.jchdl.model.gsl.core.meta.Node.java   ​​ gen ...

  10. Java实现 蓝桥杯 蓝桥杯VIP 基础练习 数的读法

    问题描述 当输入12 3456 7009时,会给出相应的念法: 十二亿三千四百五十六万七千零九 用汉语拼音表示为 shi er yi san qian si bai wu shi liu wan qi ...