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

BaseDao代码:
public class BaseDao {
//驱动
private static String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; //数据库地址
private static String url = "jdbc:sqlserver://127.0.0.1:1433;SelectMethod=cursor;DatabaseName=数据库名字;"; //数据库用户名
private static String name = "sa"; //数据库密码
private static String password = "123456"; //数据库连接,定义为全局变量,方便调用
private Connection con; //导入驱动,静态代码块的作用为只运行一次,异常无法向上抛出,只能及时处理
static{
try{
Class.forName(driver);
}catch (ClassNotFoundException e) {
//打印异常相关信息
e.printStackTrace();
}
} //无参构造方法,连接数据库
public BaseDao () {
try {
con=DriverManager.getConnection(url,name,password);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
} //数据查找,返回查找的内容,向上抛异常
public ResultSet executeSQL (String sql,Object...object) throws SQLException{
PreparedStatement ps=con.prepareStatement(sql); for(int i=0;i<object.length;i++){
//ps传入参数的下标是从1开始
ps.setObject(i+1,object[i]);
} //返回结果集
return ps.executeQuery();
} //数据的增删改,返回数据执行行数
public int executeUpdate(String sql,Object...object) throws SQLException {
PreparedStatement ps=con.prepareStatement(sql);
for(int i=0;i<object.length;i++){
ps.setObject(i+1,object[i]);
}
//返回int类型执行行数
return ps.executeUpdate();
} //关闭数据库连接
public void close() throws SQLException{
con.close();
}
}

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

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

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

     //进行批量插入
SQLServerBulkCopyOptions copyOptions = new SQLServerBulkCopyOptions();
copyOptions.setKeepIdentity(true);
copyOptions.setBatchSize(8000);
copyOptions.setUseInternalTransaction(true);
SQLServerBulkCopy bulkCopy = new SQLServerBulkCopy(url);
bulkCopy.setBulkCopyOptions(copyOptions);
bulkCopy.setDestinationTableName("curr");
bulkCopy.writeToServer(crs);
crs.close();
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. maven中scope

    scope maven中scope的默认值是compilescope的分类1)compile 默认是compile.compile表示被依赖项目需要参与当前项目的编译,包括后续的测试,运行周期也参与其 ...

  2. ## H5 canvas画图白板踩坑

    最近接手了一个小型的H5,最主要的功能大概就是拍照上传和canvas画板了. 主要是记录一下自己菜到像傻子一样的技术. 1.canvas画板隔空打牛!画布越往上部分错位距离越小,越往下距离越大. 2. ...

  3. JS实现PC端URL跳转到对应移动端URL

    在做移动端网站时,有时因技术问题或其他原因无法制作响应式版面,而移动端页面只能放到子目录下,但是手机端通过搜索引擎进入网站电脑端子页面,无法匹配到移动端页面,使得用户体验很不好,即影响排名也影响转化. ...

  4. api.versioning 版本控制 自动识别最高版本

    Microsoft.AspNetCore.Mvc.Versioning //引入程序集 .net core 下面api的版本控制作用不需要多说,可以查阅https://www.cnblogs.com/ ...

  5. (Java实现) 拦截导弹

    1260:[例9.4]拦截导弹(Noip1999) 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 4063 通过数: 1477 [题目描述] 某国为了防御敌国的导弹袭击,发展出一 ...

  6. Java实现 蓝桥杯VIP 算法训练 P1102

    定义一个学生结构体类型student,包括4个字段,姓名.性别.年龄和成绩.然后在主函数中定义一个结构体数组(长度不超过1000), 并输入每个元素的值,程序使用冒泡排序法将学生按照成绩从小到大的顺序 ...

  7. Java实现 蓝桥杯 算法训练 数字游戏

    试题 算法训练 数字游戏 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 给定一个1-N的排列a[i],每次将相邻两个数相加,得到新序列,再对新序列重复这样的操作,显然每次得到的序列 ...

  8. Java实现 LeetCode 239 滑动窗口最大值

    239. 滑动窗口最大值 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口内的 k 个数字.滑动窗口每次只向右移动一位. 返回滑动窗口中的最 ...

  9. java实现矩阵变换加密法

    一种Playfair密码变种加密方法如下:首先选择一个密钥单词(称为pair)(字母不重复,且都为小写字母),然后与字母表中其他字母一起填入至一个5x5的方阵中,填入方法如下: 1.首先按行填入密钥串 ...

  10. PAT 锤子剪刀布

    大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示: 现给出两人的交锋记录,请统计双方的胜.平.负次数,并且给出双方分别出什么手势的胜算最大. 输入格式: 输入第 1 行给出正整数 ...