jdbc批量更新简单使用

本文介绍了一个基于Lucene的全文检索小示例,重点在于如何通过Java使用JDBC进行批量更新操作。该示例包括从TXT文件读取专业词汇、使用中文分词插件进行切分、将结果写入TXT文件以及最终使用SQL批量更新的方式存入数据库。
前阵子做的一个lucene全文检索的小例子,里面涉及jdbc的批量更新,在此发布出来,与大家共享。
也是作为自己学习过程的复习和记录。

找个类的主要功能如下:
* 1. 读取包含专业词库的txt文件
* 2. 根据中文分词组件进行切分
* 3. split方法处理,返回字符串数组
* 4. 写出到txt文件输出
* 5. 使用sql批量更新方式插入数据库
*/



/**
*
*/
package net.tuolian.product.utils;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Date;

import jeasy.analysis.MMAnalyzer;

/**
* @author sean
*
* @since 2009/04/17
* 1. 读取包含专业词库的txt文件
* 2. 根据中文分词组件进行切分
* 3. split方法处理,返回字符串数组
* 4. 写出到txt文件输出
* 5. 使用sql批量更新方式插入数据库
*/
public class JdbcBatchUpdate {

static String sql = "insert into test04 values (?,?)";
Connection conn = null;
PreparedStatement pstmt = null;

/**
* @param args
* @throws SQLException
* @throws ClassNotFoundException
* @throws IOException
* @throws IllegalAccessException
* @throws InstantiationException
*/
public static void main(String[] args) throws SQLException,
ClassNotFoundException, IOException, InstantiationException, IllegalAccessException {
// TODO Auto-generated method stub
JdbcBatchUpdate update = new JdbcBatchUpdate();
update.init();

//读取txt文件
BufferedReader reader = new BufferedReader(new FileReader("keywordsource//output.txt"));

//打开输出文件
BufferedWriter writer = new BufferedWriter(new FileWriter("newoutput.txt"));

String str = null;
StringBuffer sb = new StringBuffer();

while((str= reader.readLine())!=null){
sb.append(str + " ");
}
//中文分词插件,JEAnalysis, 根据" "空格,将sb的字符串进行分词
MMAnalyzer analyzer = new MMAnalyzer();
String msg = analyzer.segment(sb.toString(), " ");

//将字符串更加空格进行分割,返回字符串数组
String[] terms = msg.toString().split(" ");

//输出到txt文件
for(int i=0; i<terms.length;i++){
System.out.println(i + terms[i]);
writer.write(terms[i] + "\r\n");
}
writer.flush();
writer.close();

//执行mysql批量更新到数据库
update.batchUpdate(terms);


}

/**
* 数据库连接初始化
* 1. 加载mysql jar包
* 2. 获得getConnection
* 3. 获得PreparedStatement
* @throws SQLException
* @throws ClassNotFoundException
*/
public void init() throws SQLException, ClassNotFoundException{
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/db_advertisement", "root", "root");
conn.setAutoCommit(false);
pstmt = (PreparedStatement) conn
.prepareStatement(sql);
System.out.println(new Date());
}

/**
* 批量更新
* 先加入批量, pstm.addBatch()
* 然后executeBatch(), 批量更新
* conmit(), 更新
* @param terms
* @throws SQLException
*/
public void batchUpdate(String[] terms) throws SQLException{
for (int i = 0; i < terms.length -1; i++) {
//此处注意setInt(1, i), 字段名称和栏目数必须匹配
pstmt.setInt(1, i);
pstmt.setString(2, terms[i]);
pstmt.addBatch();
System.out.println(i);
}

//增加到批量工作任务中
pstmt.executeBatch();
System.out.println(new Date());
//提交执行
conn.commit();
pstmt.close();
conn.close();
}
}


JDBC中,批量更新批量插入数据通常是为了提高性能和效率。这里有一个简单的示例说明如何操作: **批量插入数据(BATCH INSERT)**: ```java Connection conn = DriverManager.getConnection(url, username, password); Statement stmt = conn.createStatement(Statement.RETURN_GENERATED_KEYS, Statement.BATCH); // RETURN_GENERATED_KEYS用于获取主键 // 批量插入数据 String sqlInsert = "INSERT INTO table_name (column1, column2) VALUES (?, ?)"; PreparedStatement pstmtBatch = conn.prepareStatement(sqlInsert); int count = 0; for (Object[] data : dataList) { // dataList是一个包含待插入数据的数组 pstmtBatch.setInt(1, data[0]); // 将值设置到占位符 pstmtBatch.setString(2, data[1]); pstmtBatch.addBatch(); // 添加到批处理 count++; } // 执行批处理 if (count > 0) { int[] updateCounts = pstmtBatch.executeBatch(); // 返回每个语句的更新行数 for (int i = 0; i < updateCounts.length; i++) { if (updateCounts[i] != 1) { // 遇到错误或不成功的插入 System.out.println("Error on insert: " + updateCounts[i]); } } } // 获取生成的主键 ResultSet generatedKeys = pstmtBatch.getGeneratedKeys(); while (generatedKeys.next()) { long id = generatedKeys.getLong(1); // 如果表有唯一索引生成主键 // 处理主键 } stmt.close(); conn.close(); ``` **批量更新数据(BATCH UPDATE)**: ```java Statement stmt = conn.createStatement(Statement.RETURN_UPDATES, Statement.BATCH); String sqlUpdate = "UPDATE table_name SET column1 = ? WHERE column2 = ?"; PreparedStatement pstmtBatch = conn.prepareStatement(sqlUpdate); for (Map.Entry<Long, String> entry : mapToUpdate.entrySet()) { pstmtBatch.setLong(1, entry.getKey()); // 更新值 pstmtBatch.setString(2, entry.getValue()); pstmtBatch.addBatch(); } // 执行批处理 int[] updateCounts = pstmtBatch.executeBatch(); for (int i = 0; i < updateCounts.length; i++) { if (updateCounts[i] != 1) { System.out.println("Error on update: " + updateCounts[i]); } } stmt.close(); conn.close(); ``` 在上述代码中,务必检查`executeBatch()`返回的结果,以便处理可能出现的错误或未成功更新的情况。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值