Java使用SQLServerBulKCopy实现批量插入SQLSqerver数据库
这是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数据库的更多相关文章
- C# 数据批量插入到数据库SqlBulkCopy(源数据类型:List<T> Or DataTable)
/*_____________________ List<T>类型数据 To Sql_______________________________*/ /// <summary& ...
- [Java]如何把当前时间插入到数据库
[Java]如何把当前时间插入到数据库 1.在orderDao.java中 /** 设置订单*/ public void setOrder(Order order){ Date time = new ...
- java中解析excel 批量插入数据库
Facade 层 实现类 (@Service("samePeriodModelImportFacade")) 1. 获取cells 的方法 public Cells getCel ...
- Mybatis与JDBC批量插入MySQL数据库性能测试及解决方案
转自http://www.cnblogs.com/fnz0/p/5713102.html 不知道自己什么时候才有这种钻研精神- -. 1 背景 系统中需要批量生成单据数据到数据库表,所以采用 ...
- python批量插入mysql数据库(性能相关)以及反引号的使用
参考link: https://blog.csdn.net/qq_35958094/article/details/78462800(插入相关) https://www.cnblogs.com/hya ...
- C# OracleBulkCopy 批量插入oracle数据库的方法
只有安装了oracle 11G客户端的机器上才可以用,要用到ODP.NET组件中的oracleDataAccess.DLL,命名空间引用为Oracle.DataAccess.Client; 引用:Or ...
- C#动态创建Gridview及批量插入到数据库
这里介绍两种动态创建Gridview的方法: (一).有时需要应付上头领导的检查,所以就弄一些静态的Gridview来显示数据,这种方法的优点就是不用连接数据库,比较方便,但是代码灵活性不高,所有数据 ...
- C#批量插入Sybase数据库,Anywhere 8
数据库版本是Adaptive Server Anywhere 8 1.添加引用,程序集 iAnywhere.Data.AsaClient.这个和SQLServer的System.Data.SqlCli ...
- Django—ajax、前端后端编码格式,bulk_create批量插入语数据库、自定义分页
一.ajax简介: XML也是一门标记语言该语法应用场景 1.写配置文件 2.可以写前端页面(odoo框架中 erp) 每家公司都会有属于这家公司独有的内部管理软件:专门用来开发企业内部管理软件 框架 ...
随机推荐
- 永久激活idea
申明:本教程 IntelliJ IDEA 破解补丁.激活码均收集于网络,请勿商用,仅供个人学习使用,如有侵权,请联系作者删除. idea版本为老版本2018版本,下载地址如下,激活方法和插件在压缩包中 ...
- JSP学习之请求和响应编码
今天的学习涉及到了 jsp中的两大函数 request(请求) 和 response(响应),这应该是大家学习jsp时最先碰到的两个对象,具体有什么作用呢?应该怎么用呢?请继续往下面看. 一.requ ...
- 如何在npm发布轮子
我们在前端工程开发中通常使用npm这个包管理器来安装各种好用的轮子(当然也有用yarn的),不安分的码工就想,也发布一个试试,哪怕只是一个小时候滚的铁环而不是轮子. 首先,要在 npmjs官网注册自己 ...
- C# 基础之参数修饰符
参数传参的时候一共有四种传递方式: 一.无修饰符传参 也就是说没有传参修饰符,这种情况传过去的是一个副本,本体是不会被改变的 二.out传参修饰符 在传参的参数全面加一个out: public voi ...
- [JavaWeb基础] 029.OGNL表达式介绍
1.OGNL概述 OGNL,全称为Object-Graph Navigation Language,它是一个功能强大的表达式语言,用来获取和设置Java对象的属性,它旨在提供一个更高的更抽象的层次来对 ...
- [源创] STM32F103ZET6 基于XMODEM 通讯的 BOOTLOADER案列IAP
网上好多初学者 都想知道如何更好的用IAP,BOOTLOADER 功能 我给大家一个我自己的基于Xmodem的例子, 开发环境 KEIL 5.14 + STD标准库 芯片 STM32F103ZET6 ...
- Rocket - tilelink - Delayer
https://mp.weixin.qq.com/s/pc8f_DOJ7w8k8BeM9gPzVw 简单介绍Delayer的实现. 1. 基本介绍 以一定的概率延迟消息的传递. 类参数 ...
- Rocket - diplomacy - DUEB参数模型分析
https://mp.weixin.qq.com/s/533bJxcPRgO4W2gf_OEhEw 分析DUEB参数模型中各种参数类型的可能性. 1. 节点类型 根据参数的传播方向,可 ...
- jchdl - GSL实例 - Assign
https://mp.weixin.qq.com/s/MtHR3iolPd5VQq6AUE-JPg Assign是一个节点,把输入线直接赋值给输出线.在转换成Verilog时,这种类型的节点会直接 ...
- Chisel3 - util - RRArbiter
https://mp.weixin.qq.com/s/GcNIFkHfa0gW0HKkKvHZEQ 循环优先级(Round Robin)仲裁器. 参考链接: https://github. ...