添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
今天同事让我准备一个项目的测试数据,要向一个表中插入上千条记录,并且保证每条记录内容不同,如果用手工一条一条插入肯定是不可能,也不会有哪个SB去做这样的事,我最开始想到了用循环,但要求插入的记录内容不能相同,用循环实现比较麻烦,于是我想到了将记录从文本文件导入至数据库(其实SQLServer可利用sql语句实现导入xls或txt文件,在这就不具体说明了),写个简单的具有解析文本文件并将解析结果插入数据库的类,实现批量插入记录的功能。

1、将数据按一定规律录入到一个文本文件,每一行代表一条记录。

下面是 数据库 建表SQL:
CREATE TABLE t_FltPsgInfo  -- 航班乘客信息

FltNum  VARCHAR(10), -- 航班号

FltLine  VARCHAR(30),  -- 航线

FltDate  VARCHAR(10),  -- 日期

PsgName  VARCHAR(30),  -- 姓名

PsgType  VARCHAR(30), -- 乘客类型,数字表示,目前是1-13

PsgSex  VARCHAR(1),  -- 0 男  1 女

PsgCab  VARCHAR(1),  -- 几等舱, F/Y  舱位按字母顺序排列

PsgSeatNo  VARCHAR(5),-- 座位号 2A,22F,根据这个得到一排有多少个座位,共有多少排座位信息

PsgInfo  VARCHAR(2048) -- 详细信息,可能很长

我们将向表t_FltPsgInfo中插入1000条记录。

新建一个文本文件,每一行代表一条记录,如:

HU7804,广州-北京,2007-07-18,谢丽珍,3,1,C,3A,服务保障信息:未用餐随行人员…

其中以“,”作为字段的分隔标志,我们在解析这个文本文件时将根据“,”来拆分字段值。

按照上面的格式,将要插入的数据输入到文本文件中,注意,是每一行代表一条记录,或者你已有从数据库导出的文本文件,那你就只需找到文件的规律,稍作调整就行了。

2、编写 Java 源码

1》数据库操作类InsertDB.java

package test;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.Statement;

public class InsertDB {

private static final String user = "sa";

private static final String pwd = "sa";

private static final String url = "jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=hhfly";

private static final String driver = "com.microsoft.jdbc.sqlserver.SQLServerDriver";

public static Connection getCon() {

Connection con = null ;

try {

Class. forName ( driver ).newInstance();

con = DriverManager. getConnection ( url , user , pwd );

if (con != null ) {

System. out .println("你已连接到数据库:" + con.getCatalog());

}

} catch (Exception e) {

System. out .println("连接数据库失败!");

e.printStackTrace();

}

return con;

}

public boolean insertDB(String FltNum, String FltLine, String FltDate,

String PsgName, String PsgType, String PsgSex, String PsgCab,

String PsgSeatNo, String PsgInfo) {

Connection con = null ;

Statement stm = null ;

boolean flag = false ;

String sql = "insert into t_FltPsgInfo values('" + FltNum + "','"

+ FltLine + "','" + FltDate + "','" + PsgName + "','" + PsgType

+ "','" + PsgSex + "','" + PsgCab + "','" + PsgSeatNo + "','"

+ PsgInfo + "')";

try {

con = getCon ();

stm = con.createStatement();

int i = stm.executeUpdate(sql);

if (i > 0) {

flag = true ;

System. out .println(flag + "插入数据成功!");

}

} catch (Exception e) {

flag = false ;

e.printStackTrace();

} finally {

close( null , stm, con);

}

return flag;

}

//关闭相关连接

public void close(ResultSet rs, Statement stm, Connection con) {

if (rs != null )

try {

rs.close();

} catch (Exception e) {

e.printStackTrace();

}

if (stm != null )

try {

stm.close();

} catch (Exception e) {

e.printStackTrace();

}

if (con != null )

try {

con.close();

} catch (Exception e) {

e.printStackTrace();

}

}

}

2》数据采集类DataGather.java

package test;

import java.io.RandomAccessFile;

import java.io.UnsupportedEncodingException;

public class DataGather {

private static final String path = "src/resource/test";

public static final String openFileStyle = "r";

public static final String fieldLimitChar = ",";

public static final int fieldAllCount = 9;

private int count;

private String FltNum;

private String FltLine;

private String FltDate;

private String PsgName;

private String PsgType;

private String PsgSex;

private String PsgCab;

private String PsgSeatNo;

private String PsgInfo;

/*

* 功能:解析文本文件

*/

public void loadFile() {

try {

RandomAccessFile raf = new RandomAccessFile( path , openFileStyle );

String line_record = raf.readLine();

while (line_record != null ) {

// 解析每一条记录

parseRecord(line_record);

line_record = raf.readLine();

}

System. out .println("共有合法的记录" + count + "条");

} catch (Exception e) {

e.printStackTrace();

}

}

/*

* 功能:具体解析每一条记录,这里可以增加很多对记录的解析判断条件,如是否为字母、

* 数字、email等。

*/

private void parseRecord(String line_record) throws Exception {

//拆分记录

String[] fields = line_record.split( fieldLimitChar );

if (fields.length == fieldAllCount ) {

FltNum = tranStr(fields[0]);

FltLine = tranStr(fields[1]);

FltDate = tranStr(fields[2]);

PsgName = tranStr(fields[3]);

PsgType = tranStr(fields[4]);

PsgSex = tranStr(fields[5]);

PsgCab = tranStr(fields[6]);

PsgSeatNo = tranStr(fields[7]);

PsgInfo = tranStr(fields[8]);

System. out .println(FltNum + " " + FltLine + " " + FltDate + " "

+ PsgName + " " + PsgType + " " + PsgSex + " " + PsgCab

+ " " + PsgSeatNo + " " + PsgInfo);

InsertDB db = new InsertDB();

db.insertDB(FltNum, FltLine, FltDate, PsgName, PsgType, PsgSex,

PsgCab, PsgSeatNo, PsgInfo);

count++;

}

}

private String tranStr(String oldstr) {

String newstr = "";

try {

newstr = new String(oldstr.getBytes("ISO-8859-1"), "GBK");

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

return newstr;

}

}

3》 测试 类Test.java

package test;

public class Test {

public static void main(String[] args) {

try {

DataGather gather = new DataGather ();

gather.loadFile();

} catch (Exception e) {

e.printStackTrace();

}

}

}

运行测试类,得到结果:

向数据库插入数据成功!

今天同事让我准备一个项目的测试数据,要向一个表中插入上千条记录,并且保证每条记录内容不同,如果用手工一条一条插入肯定是不可能,也不会有哪个SB去做这样的事,我最开始想到了用循环,但要求插入的记录内容不能相同,用循环实现比较麻烦,于是我想到了将记录从文本文件导入至数据库(其实SQLServer可利用sql语句实现导入xls或txt文件,在这就不具体说明了),写个简单的具有解析文本文件并将解析结果插入 import com.alibaba.fastjson.JSONObject; import org.apache.commons.io.IOUtils; import java .io.*; import java .nio.charset.Charset; import java .sql.*; import java .util.*; import java .util.regex.*; import net.sf.json.JSON; import net.sf.json.xml.XMLSeria import java .io.FileInputStream; import java .sql.Connection; import java .sql.DriverManager; import java .sql.PreparedStatement; import java .sql.SQLException; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class ExcelToDatabase { public static void main(String[] args) { String jdbcUrl = "jdbc:mysql://localhost:3306/mydatabase"; String username = "myusername"; String password = "mypassword"; String excelFilePath = "data.xlsx"; try (Connection connection = DriverManager.getConnection(jdbcUrl, username, password)) { FileInputStream inputStream = new FileInputStream(new File(excelFilePath)); Workbook workbook = new XSSFWorkbook(inputStream); Sheet sheet = workbook.getSheetAt(0); String sql = "INSERT INTO mytable (column1, column2, column3) VALUES (?, ?, ?)"; PreparedStatement statement = connection.prepareStatement(sql); int rowNumber = 0; for (Row row : sheet) { if (rowNumber == 0) { rowNumber++; continue; Cell cell1 = row.getCell(0); String column1 = cell1.getStringCellValue(); Cell cell2 = row.getCell(1); String column2 = cell2.getStringCellValue(); Cell cell3 = row.getCell(2); double column3 = cell3.getNumericCellValue(); statement.setString(1, column1); statement.setString(2, column2); statement.setDouble(3, column3); statement.addBatch(); if (rowNumber % 1000 == 0) { statement.executeBatch(); workbook.close(); statement.executeBatch(); System.out.println("Data imported successfully."); } catch (SQLException e) { System.out.println("Database error:"); e.printStackTrace(); } catch (Exception e) { System.out.println("Error:"); e.printStackTrace(); 请注意,此代码仅适用于Excel文件的第一个工作表,并且假定 数据库 中已经存在名为“mytable”的表,该表具有三个列:column1,column2和column3。您需要根据自己的需求进行修改。