简单的jdbc操作数据库例子,高效率插入数据

Posted wj沧浪之水

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单的jdbc操作数据库例子,高效率插入数据相关的知识,希望对你有一定的参考价值。

项目用到的jar:

dom4j-1.6.1.jar
mysql-connector-java-3.1.13-bin.jar
poi-3.8-20120326.jar
poi-ooxml-3.8-20120326.jar
poi-ooxml-schemas-3.8-20120326.jar
xmlbeans-2.3.0.jar

package com.liuyunlong.jdbc;

/**
 * 主函数入口
 * 
 * @author liuyunlong
 *
 */
public class Main 

	public static void main(String[] args) 

		DBstoreHelper dbs = new DBstoreHelper();
		try 
			dbs.storeToDb();
		 catch (Exception e) 
			e.printStackTrace();
		
	


package com.liuyunlong.jdbc;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import com.liuyunlong.Param;

/**
 * 存储数据工具,初始化jdbc连接参数,从Excel读取数据,批量处理insert数据
 * 
 * @author liuyunlong
 *
 */
public class DBstoreHelper 

	private String insert_sql;

	private String username;

	private String password;

	private String driver;

	private String url;

	private String filePath;

	private Connection conn;

	private PreparedStatement psts;

	public DBstoreHelper() 
		initParam();
		initDB();
	

	/**
	 * 初始化数据库链接
	 */
	private void initDB() 
		try 
			Class.forName(driver);
			conn = DriverManager.getConnection(url, username, password);
			psts = conn.prepareStatement(insert_sql);
		 catch (Exception e) 
			e.printStackTrace();
		
	

	/**
	 * 从属性文件中初始化参数
	 */
	private void initParam() 
		insert_sql = "INSERT INTO bbs_myvip_imei (imei, product, updatetime, extra) VALUES (?,?,?,?)"; // 写死了sql语句
		InputStream stream = getClass().getClassLoader().getResourceAsStream("param.properties");
		Properties p = new Properties();
		try 
			p.load(stream);
			username = p.getProperty("jdbc.username");
			password = p.getProperty("jdbc.password");
			driver = p.getProperty("jdbc.driverClassName");
			url = p.getProperty("jdbc.url");
			url += "?useServerPrepStmts=false&rewriteBatchedStatements=true";
			filePath = p.getProperty("file.path");
		 catch (IOException e) 
			e.printStackTrace();
		
	

	public void storeToDb() throws Exception 
		List<Param> imeis = initDate();
		doStroe(imeis);
	

	private void doStroe(List<Param> imeis) throws Exception 
		conn.setAutoCommit(false); // 设置手动提交
		System.out.println("数据导入开始,请耐心等待......");
		long start = System.currentTimeMillis();
		int count = 0;
		int tens = 0;
		if (null != imeis && imeis.size() > 0) 
			for (int i = 0; i < imeis.size(); i++) 
				psts.setString(1, imeis.get(i).getImei());
				psts.setString(2, imeis.get(i).getProduct());
				psts.setLong(3, System.currentTimeMillis() / 1000);
				psts.setString(4, imeis.get(i).getExtra() == null ? "" : imeis.get(i).getExtra());
				psts.addBatch(); // 加入批量处理
				count++;
				if (count % 1000 == 0) 
					++tens;
					System.out.println("当前数剧量:" + tens * 1000);
				
			
		
		psts.executeBatch(); // 执行批量处理
		conn.commit(); // 提交
		long end = System.currentTimeMillis();
		System.out.println("数据导入完毕,总数为:" + count + "   所用时间为: " + (end - start) + " ms");
		conn.close();

	

	/**
	 * 初始化数据,从本地的Excel文件中读取
	 * 
	 * @param srcFile
	 * @return
	 */
	private List<Param> initDate() 
		System.out.println("开始读取数据,请耐心等待......");
		String fileDir = filePath;
		int beginIndex = fileDir.lastIndexOf(".");
		int endIndex = fileDir.length();
		String suffix = fileDir.substring(beginIndex, endIndex);
		List<Param> paramList = new ArrayList<Param>();
		InputStream inputStream;
		try 
			inputStream = new FileInputStream(fileDir);
			if (".xls".equals(suffix)) 
				// paramList = readXls(inputStream);
			 else 
				paramList = readXlsx(inputStream);
			
		 catch (Exception e) 
			e.printStackTrace();
		
		System.out.println("读取数据结束,数据量为:" + paramList.size());
		return paramList;

	

	/**
	 * 读取Excel文件,后缀名为xlsx
	 * 
	 * @param inputStream
	 * @return
	 */
	private List<Param> readXlsx(InputStream inputStream) 

		XSSFWorkbook xssfWorkbook;
		List<Param> paramList = new ArrayList<Param>();
		try 
			xssfWorkbook = new XSSFWorkbook(inputStream);
			// 循环工作表Sheet
			int sheetNumbers = xssfWorkbook.getNumberOfSheets();
			for (int numSheet = 0; numSheet < sheetNumbers; numSheet++) 
				XSSFSheet xssfSheet = xssfWorkbook.getSheetAt(numSheet);
				if (xssfSheet == null) 
					continue;
				

				// 循环当前Sheet的行Row
				int rowNumbers = xssfSheet.getLastRowNum();
				for (int rowNum = 0; rowNum <= rowNumbers; rowNum++) 
					XSSFRow xssfRow = xssfSheet.getRow(rowNum);
					if (xssfRow == null) 
						continue;
					

					// 循环当前Row的列Cell
					Param param = new Param();
					int cellNumbers = xssfRow.getLastCellNum();
					if (2 == cellNumbers) // 2列分别获取两列中的值作为key和value
						for (int cellNum = 0; cellNum <= cellNumbers; cellNum++) 
							XSSFCell xssfCell = xssfRow.getCell(cellNum);
							if (xssfCell == null) 
								continue;
							
							if (cellNum == 0) 
								DecimalFormat df = new DecimalFormat("0");
								String whatYourWant = df.format(xssfCell.getNumericCellValue());
								param.setImei(whatYourWant);
							 else if (cellNum == 1) 
								param.setProduct(xssfCell.toString());
							
						
					 else if (1 == cellNumbers) 
						/*
						 * // 1列,必须用":"或":"分隔开,否则不解析 XSSFCell xssfCell =
						 * xssfRow.getCell(0); String xssStr =
						 * xssfCell.toString(); if (null != xssfCell &&
						 * (xssStr.indexOf(":") > -1 || xssStr.indexOf(":") >
						 * -1))  String[] paramFix = null; if
						 * (xssStr.contains(":"))  paramFix =
						 * xssStr.split(":");  else if (xssStr.contains(":")) 
						 * paramFix = xssStr.split(":");  if (null != paramFix
						 * && paramFix.length > 0) 
						 * param.setParamKey(paramFix[0]);
						 * param.setParamValue(paramFix[1]);   else 
						 * continue; 
						 */ else // 非1或2列为非法文档,不解析
						continue;
					
					paramList.add(param);
				
			
		 catch (Exception e) 
			e.printStackTrace();
		
		return paramList;
	

package com.liuyunlong;

public class Param 

	private String imei;

	private String product;

	private Integer updatetime;

	private String extra;

	public String getImei() 
		return imei;
	

	public void setImei(String imei) 
		this.imei = imei;
	

	public String getProduct() 
		return product;
	

	public void setProduct(String product) 
		this.product = product;
	

	public Integer getUpdatetime() 
		return updatetime;
	

	public void setUpdatetime(Integer updatetime) 
		this.updatetime = updatetime;
	

	public String getExtra() 
		return extra;
	

	public void setExtra(String extra) 
		this.extra = extra;
	

	@Override
	public String toString() 
		return "Param [imei=" + imei + ", product=" + product + ", updatetime=" + updatetime + ", extra=" + extra + "]";
	


jdbc.driverClassName = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://ip:3306/dbname
jdbc.username = root
jdbc.password = 1q2w3e4r5t!

file.path = D:\\\\excel\\\\8676-I03.xlsx

测试结果:

开始读取数据,请耐心等待......
读取数据结束,数据量为:200000
数据导入开始,请耐心等待......
当前数剧量:1000
当前数剧量:2000
当前数剧量:3000
当前数剧量:4000
当前数剧量:5000
当前数剧量:6000
当前数剧量:7000
当前数剧量:8000
当前数剧量:9000
当前数剧量:10000
当前数剧量:11000
当前数剧量:12000
当前数剧量:13000
当前数剧量:14000
当前数剧量:15000
当前数剧量:16000
当前数剧量:17000
当前数剧量:18000
当前数剧量:19000
当前数剧量:20000
当前数剧量:21000
当前数剧量:22000
当前数剧量:23000
当前数剧量:24000
当前数剧量:25000
当前数剧量:26000
当前数剧量:27000
当前数剧量:28000
当前数剧量:29000
当前数剧量:30000
当前数剧量:31000
当前数剧量:32000
当前数剧量:33000
当前数剧量:34000
当前数剧量:35000
当前数剧量:36000
当前数剧量:37000
当前数剧量:38000
当前数剧量:39000
当前数剧量:40000
当前数剧量:41000
当前数剧量:42000
当前数剧量:43000
当前数剧量:44000
当前数剧量:45000
当前数剧量:46000
当前数剧量:47000
当前数剧量:48000
当前数剧量:49000
当前数剧量:50000
当前数剧量:51000
当前数剧量:52000
当前数剧量:53000
当前数剧量:54000
当前数剧量:55000
当前数剧量:56000
当前数剧量:57000
当前数剧量:58000
当前数剧量:59000
当前数剧量:60000
当前数剧量:61000
当前数剧量:62000
当前数剧量:63000
当前数剧量:64000
当前数剧量:65000
当前数剧量:66000
当前数剧量:67000
当前数剧量:68000
当前数剧量:69000
当前数剧量:70000
当前数剧量:71000
当前数剧量:72000
当前数剧量:73000
当前数剧量:74000
当前数剧量:75000
当前数剧量:76000
当前数剧量:77000
当前数剧量:78000
当前数剧量:79000
当前数剧量:80000
当前数剧量:81000
当前数剧量:82000
当前数剧量:83000
当前数剧量:84000
当前数剧量:85000
当前数剧量:86000
当前数剧量:87000
当前数剧量:88000
当前数剧量:89000
当前数剧量:90000
当前数剧量:91000
当前数剧量:92000
当前数剧量:93000
当前数剧量:94000
当前数剧量:95000
当前数剧量:96000
当前数剧量:97000
当前数剧量:98000
当前数剧量:99000
当前数剧量:100000
当前数剧量:101000
当前数剧量:102000
当前数剧量:103000
当前数剧量:104000
当前数剧量:105000
当前数剧量:106000
当前数剧量:107000
当前数剧量:108000
当前数剧量:109000
当前数剧量:110000
当前数剧量:111000
当前数剧量:112000
当前数剧量:113000
当前数剧量:114000
当前数剧量:115000
当前数剧量:116000
当前数剧量:117000
当前数剧量:118000
当前数剧量:119000
当前数剧量:120000
当前数剧量:121000
当前数剧量:122000
当前数剧量:123000
当前数剧量:124000
当前数剧量:125000
当前数剧量:126000
当前数剧量:127000
当前数剧量:128000
当前数剧量:129000
当前数剧量:130000
当前数剧量:131000
当前数剧量:132000
当前数剧量:133000
当前数剧量:134000
当前数剧量:135000
当前数剧量:136000
当前数剧量:137000
当前数剧量:138000
当前数剧量:139000
当前数剧量:140000
当前数剧量:141000
当前数剧量:142000
当前数剧量:143000
当前数剧量:144000
当前数剧量:145000
当前数剧量:146000
当前数剧量:147000
当前数剧量:148000
当前数剧量:149000
当前数剧量:150000
当前数剧量:151000
当前数剧量:152000
当前数剧量:153000
当前数剧量:154000
当前数剧量:155000
当前数剧量:156000
当前数剧量:157000
当前数剧量:158000
当前数剧量:159000
当前数剧量:160000
当前数剧量:161000
当前数剧量:162000
当前数剧量:163000
当前数剧量:164000
当前数剧量:165000
当前数剧量:166000
当前数剧量:167000
当前数剧量:168000
当前数剧量:169000
当前数剧量:170000
当前数剧量:171000
当前数剧量:172000
当前数剧量:173000
当前数剧量:174000
当前数剧量:175000
当前数剧量:176000
当前数剧量:177000
当前数剧量:178000
当前数剧量:179000
当前数剧量:180000
当前数剧量:181000
当前数剧量:182000
当前数剧量:183000
当前数剧量:184000
当前数剧量:185000
当前数剧量:186000
当前数剧量:187000
当前数剧量:188000
当前数剧量:189000
当前数剧量:190000
当前数剧量:191000
当前数剧量:192000
当前数剧量:193000
当前数剧量:194000
当前数剧量:195000
当前数剧量:196000
当前数剧量:197000
当前数剧量:198000
当前数剧量:199000
当前数剧量:200000
数据导入完毕,总数为:200000   所用时间为: 9077 ms


以上是关于简单的jdbc操作数据库例子,高效率插入数据的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis-Plus的saveBatch批量插入为何效率很低耗时长详解及解决方案

Java操作mysql数据库简单例子

编写一个java程序,通过jdbc访问数据库实现对数据库的插入,删除,修改和查询操作

编写一个java程序,通过jdbc访问数据库实现对数据库的插入,删除,修改和查询操作

JDBC操作数据库的学习

PreparedStatement批量(batch)插入数据