关于Java读取access的方法

来源:互联网 发布:淘宝qq群机器人多少钱 编辑:程序博客网 时间:2024/05/16 06:09

    • 原因
    • 方法
      • odbc连接
      • jdbc连接
      • 使用jackcess
    • 总结

原因

最近因为因为项目需要,需要把数据从Access里面导入的其他数据库里面,于是就开始在网络找寻各种办法.因为我比较熟悉的语言是java 所以就找了一些关于java的方法.

方法

连接Access的方法就是odbc 和jdbc连接.

odbc连接

使用的就是系统自带的odbc连接:

  Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");          /**          * 直接连接access文件。          */          String dbur1 = "jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=d://a1.mdb";          Connection conn = DriverManager.getConnection(dbur1, "username", "password");  

注意在Deiver后面有一个空格,不能省略.
使用这个方法的好处就是系统自带的,比较方便不需要下载什么jar包.
但是:

windows7 64位对于odbc的支持不太好,经常会报“无效的字符串或缓冲区”

使用起来比较郁闷.

jdbc连接

jdbc连接是java里面比较好的,一般支持的都比较好.
找到了开源的ucanaccess 纯jdbc 驱动,发 现在查询效率上远远高于odbc,但是占用的内存比较大,偶尔出现内存溢出(高配机器用着还是挺好的)
ucanacess下载地址

Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");Connection conn=DriverManager.getConnection("jdbc:ucanaccess://<mdb or accdb file path>",user, password); for example: Connection conn=DriverManager.getConnection("jdbc:ucanaccess://c:/pippo.mdb");

这样就可以方便的使用sql语句查询access里面的数据.

使用jackcess

Jackcess 是一个Java 类库,用来读写微软的Access 数据库。
直接使用java代码就可以读取Access数据库的内容,可以建表 删表
jackcess官网

Are password protected databases supported?
Basic password protection (Access 2003 or earlier) is merely software enforced, and Jackcess does not do any password checking at this point. So, a password protected database can be used the same as any other.
If a database is actually encrypted, then you will need need an encoder.

这个是官网的FAQ
大概意思就是对有密码的access数据库也能访问.我测试过.可以
demo
查询表

Database db = DatabaseBuilder.open(new File("mydb.mdb"));Table table = db.getTable("Test"); for(Row row : table) {    System.out.prinln("Look ma, a row: " + row);  }  Row row = ...;  for(Column column : table.getColumns()) {    String columnName = column.getName();    Object value = row.get(columnName);    System.out.println("Column " + columnName + "(" + column.getType() + "): "                       + value + " (" + value.getClass() + ")");  }  // Example Output:  //  // Column ID(LONG): 27 (java.lang.Integer)  // Column Name(TEXT): Bob Smith (java.lang.String)  // Column Salary(MONEY): 50000.00 (java.math.BigDecimal)  // Column StartDate(SHORT_DATE_TIME): Mon Jan 05 09:00:00 EDT 2010 (java.util.Date)

添加记录

 String name = "bob";  BigDecimal salary = new BigDecimal("1000.00");  Date startDate = new Date();  table.addRow(Column.AUTO_NUMBER, name, salary, startDate);

创建新的数据库

File file = new File("test.mdb");  Database db = new DatabaseBuilder(file)    .setFileFormat(Database.FileFormat.V2000)    .create();

创建表

 Table table = new TableBuilder("Test")    .addColumn(new ColumnBuilder("ID", DataType.LONG)               .setAutoNumber(true))    .addColumn(new ColumnBuilder("Name", DataType.TEXT))    .addColumn(new ColumnBuilder("Salary", DataType.MONEY))    .addColumn(new ColumnBuilder("StartDate", DataType.SHORT_DATE_TIME))    .toTable(db);

使用游标查询记录

Table table = db.getTable("Test");  Cursor cursor = CursorBuilder.createCursor(table);  boolean found = cursor.findFirstRow(Collections.singletonMap("ID", 1));  if (found) {      System.out.println(String.format("Row found: Name = '%s'.",                                     cursor.getCurrentRowValue(table.getColumn("Name"))));  } else {      System.out.println("No matching row was found.");  }Table table = db.getTable("Test");  IndexCursor cursor = CursorBuilder.createCursor(table.getPrimaryKeyIndex());  boolean found = cursor.findFirstRow(Collections.singletonMap("ID", 1));Table table = db.getTable("Test");  Row row = CursorBuilder.findRowByPrimaryKey(table, 1);  if (row != null) {      System.out.println(String.format("Row found: Name = '%s'.",                                     row.get("Name")));  } else {      System.out.println("No matching row was found.");  }

总结

以上就是我找寻的能使用的java连接access的方法.
个人觉得是用jdbc和jackcess的方法比较好,可以根据个人的使用场景来选择合适的方法.
tip:

  • ucanaccess使用的也是jackcess的方法,只是ucanacess可以使用sql语句查询记录

  • jackcess使用的游标来查询记录 纯java代码

0 0
原创粉丝点击