DBF文件是一种数据库文件,可用于记录数据库中的数据。
比较简单的文法是用plSQL导入,方法:工具--ODBC导入器---dBase File---选择文件----导入。
这里我讲解的是用JAVA代码来导入数据 ,原理是使用javadbf包的DBFReader类解析DBF文件,并转换成SQL语句执行。
第一步获取所有字段信息,生成保存所有字段的字符串,格式:(id,name,sex)
第二步依次读取每一行数据 ,并将每一行的数据生成一条SQL语句字符串,字符串格式:insert into table(id,name,sex) values('1','王二','男')
最后连接数据库,依次放入到Statement批处理堆中,并执行操作。
用到了二个类,数据连接类:
DBF导入类:
友情提示:
1.代码中只考虑了关系表字段全是varchar2的情况,更规范的操作是读取字段信息时调用DBFField类实例的getDataType()获取字段的类型,用LinkedHashMap类来保存,因为LinkedHashMap能保证插入与读取数据的一致性,键保存字段数据,值保存字段数据类型,并在生成SQL插入语句时,根据字段数据类型,相应的转换字符串格式,如number型不加单引号,varchar2型加单引号等。
2.原本的想法我是打算用Cglib动态创建类对象的,表格字段作为类对象的属性,然后用get方法获取数据生成插入语句的,后面想想其实也没有必要遍历一遍生成类对象集合,再遍历一遍去创建SQL语句,效率太低,然后就被我pass了。
比较简单的文法是用plSQL导入,方法:工具--ODBC导入器---dBase File---选择文件----导入。
这里我讲解的是用JAVA代码来导入数据 ,原理是使用javadbf包的DBFReader类解析DBF文件,并转换成SQL语句执行。
第一步获取所有字段信息,生成保存所有字段的字符串,格式:(id,name,sex)
第二步依次读取每一行数据 ,并将每一行的数据生成一条SQL语句字符串,字符串格式:insert into table(id,name,sex) values('1','王二','男')
最后连接数据库,依次放入到Statement批处理堆中,并执行操作。
用到了二个类,数据连接类:
public class DBConnection {
/**
* 驱动类
*/
public static String drive = "oracle.jdbc.driver.OracleDriver";
/**
* 连接驱动符
*/
public static String url = "jdbc:oracle:thin:@localhost:1521:orcl";
/**
* 用户名
*/
public static String username = "max";
/**
* 密码
*/
public static String password = "max";
public static Connection getConnection(){
try {
Class.forName(drive);
return DriverManager.getConnection(url, username, password);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
/**
* 关闭数据库
* @param rs 返回结果记录集
* @param pst 执行sql操作
* @param con 建立连接
*/
public static void close(ResultSet rs,Statement pst,Connection con){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(pst!=null){
try {
pst.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(con!=null){
try {
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
}
}
}
DBF导入类:
public class DbfImport {
private String table;//表格名称;
private StringBuffer params;//记录表格各字段
private StringBuffer values;//记录每一行数据
private List sql;//记录所有行的数据
private static Connection con = null;
private static Statement stm = null;
private static ResultSet res = null;
public DbfImport() {
// TODO Auto-generated constructor stub
table ="score";
params = new StringBuffer("(");
values = new StringBuffer("(");
sql = new ArrayList<String>();
}
public void impOracle(String path) throws ClassNotFoundException, IOException, SQLException{
InputStream fis = null;
//读取文件的输入流
fis = new FileInputStream(path);
//根据输入流初始化一个DBFReader实例,用来读取DBF文件信息
DBFReader reader = new DBFReader(fis);
//设置字符集,避免中文乱码
reader.setCharactersetName("GBK");
//获取dbf数据字段数量
int fieldsCount = reader.getFieldCount();
String fieldName;
for( int i=0; i<fieldsCount; i++)
{
//依次获取字段名称
DBFField field = reader.getField(i);
fieldName = field.getName();
//连接每个字段名称
params.append(fieldName+",");
}
params.deleteCharAt(params.length()-1);
params.append(")");
Object[] rowValues;
for(int i=0;(rowValues = reader.nextRecord()) != null;i++)
{
for( int j=0; j<rowValues.length; j++)
{
if(rowValues[j] == null)
values.append("null"+",");
else
values.append("'"+rowValues[j].toString().trim()+"',");
}
values.deleteCharAt(values.length()-1);
values.append(")");
//生成插入语句字符串
sql.add("insert into "+table+params.toString()+" values"+values.toString());
//重置每一行的数据
values.delete(0, values.length());
values.append("(");
}
//传递插入语句,导入数据
dbf_Import(sql);
//关闭输入流
fis.close();
//关闭数据库连接
DBConnection.close(null, stm, con);
}
public void dbf_Import(List sql) throws SQLException{
//打开数据库连接
con = DBConnection.getConnection();
stm = con.createStatement();
int i=0;
for(;i<sql.size();i++){
//将sql语句加入批处理中
stm.addBatch((String)sql.get(i));
}
//执行批处理
stm.executeBatch();
}
public static void main(String[] args) throws SQLException, ClassNotFoundException, IOException {
DbfImport dbf = new DbfImport();
//DBF文件路径
String path ="D:/test/score.DBF";
dbf.impOracle(path);
}
}
友情提示:
1.代码中只考虑了关系表字段全是varchar2的情况,更规范的操作是读取字段信息时调用DBFField类实例的getDataType()获取字段的类型,用LinkedHashMap类来保存,因为LinkedHashMap能保证插入与读取数据的一致性,键保存字段数据,值保存字段数据类型,并在生成SQL插入语句时,根据字段数据类型,相应的转换字符串格式,如number型不加单引号,varchar2型加单引号等。
2.原本的想法我是打算用Cglib动态创建类对象的,表格字段作为类对象的属性,然后用get方法获取数据生成插入语句的,后面想想其实也没有必要遍历一遍生成类对象集合,再遍历一遍去创建SQL语句,效率太低,然后就被我pass了。