1.使用access数据库
对,你看的没错,我们要用java代码连接access数据库,读取数据进行处理
如上图所示的代码就可以。
但是很遗憾,jdk8以后java不再支持jdbc odbc bridge这个功能:
http://www.oracle.com/technetwork/java/javase/8-compatibility-guide-2156366.html
也就是说如果你希望使用jdk自身的jdbcodbc bridge,你就必须使用jdk6之类的老版本,在2017年9月这个时间点,这个要求十分荒谬。
我们的决定是继续使用jdk8但是放弃jdk自身的access访问方式,转而使用第三方软件包。
软件包的名字叫 ucanaccess, sourceforge网站如下所示:
https://sourceforge.net/projects/ucanaccess/
很开心看到这个包在2017年8月还在被维护
在这里岔开话题,因为没有在sourceforge上找到ucanaccess的maven信息
假如你看上了一个java项目想要导入自己的eclipse,你绝对不能直接下载这个项目的jar包然后去环境变量或者其他方式引用,因为那样做就是个土鳖。
你必须使用maven。
怎么才能找到这个项目的maven信息呢?
哈哈哈
上强大的www.yahoo.com吧
yahoo一下 "ucanaccess maven"得到的结果如下图:
按照上图所示的信息,在你自己的eclipse的maven project上进行配置吧
我们打算使用ucanaccess进行access的数据库访问(*.mdb文件),首先第一个问题:ucanaccess怎么使用?
这个问题其实很傻逼,因为表面看上去确实官方网站没有这方面的文档。
但这只是表面,实际上https://sourceforge.net/projects/ucanaccess/files/
提供了example 告诉了我们怎么使用ucanaccess
下载上述文件 UCanAccess-4.0.1-src.zip
打开看看你就明白了
看见了吧,傻逼把example藏起来,是何居心啊
复制粘贴ucanaccess的example代码写了一个java文件读取本地mdb文件,效果还不错哦,代码如下:
package com.infotech.access;
import java.sql.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.io.IOException;
import java.sql.SQLException;
import java.sql.Statement;
import net.ucanaccess.converters.TypesMap.AccessType;
import net.ucanaccess.ext.FunctionType;
import net.ucanaccess.jdbc.UcanaccessConnection;
import net.ucanaccess.jdbc.UcanaccessDriver;
public class AccessTest {
public Connection ucaConn = null;
public Statement stmt = null;
public ResultSet srs = null;
public ResultSetMetaData rsmd=null;
public static Connection conn2 = null;
public static Statement stmt2 = null;
public static ResultSet srs2 = null;
public static ResultSetMetaData rsmd2=null;
public AccessTest(String pathNewDB) {
try {
this.ucaConn=getUcanaccessConnection(pathNewDB);
} catch (SQLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private static Connection getUcanaccessConnection(String pathNewDB) throws SQLException,IOException {
String url = UcanaccessDriver.URL_PREFIX + pathNewDB+";newDatabaseVersion=V2003";
return DriverManager.getConnection(url, "admin", "");
}
/**
* 一个简易Query查询
*
*/
private void executeQuery() throws SQLException {
Statement st = null;
try {
st = this.ucaConn.createStatement();
ResultSet rs = st.executeQuery("SELECT * from 花名册");
dump(rs,"executeQuery");
} finally {
if (st != null)
st.close();
}
}
/**
* 显示ResultSet中的内容
*/
private static void dump(ResultSet rs,String exName)
throws SQLException {
System.out.println("-------------------------------------------------");
System.out.println();
System.out.println(exName+" result:");
System.out.println();
while (rs.next()) {
System.out.print("| ");
int j=rs.getMetaData().getColumnCount();
for (int i = 1; i <=j ; ++i) {
Object o = rs.getObject(i);
System.out.print(o + " | ");
}
System.out.println();
System.out.println();
}
}
public static void main(String[] args) throws ClassNotFoundException, SQLException{
Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
try {
AccessTest ex=new AccessTest("\\\\172.16.90.170\\share\\cardtemp_be.mdb");
ex.executeQuery();
/* ex.createTablesExample();
ex.insertData();
ex.executeQuery();
ex.executeQueryWithFunctions();
ex.executeQueryWithCustomFunction();
ex.executeLikeExample();
ex.showExtensions();
ex.transaction();*/
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("access db testing...");
}
}
上述代码运行一下看看哦:
运行结果:
补充一点,eclipse和mdb文件位于同一台电脑上,ip地址是172.16.90.170的虚拟机。
经过上述操作,我们已经在jdk8的环境中部署了ucanaccess,这样就可以使用java代码直接访问access数据库中的数据
下面我们在此基础上,引入之前自己编写的java方法代码如下,看看运行的效果:
package com.infotech.access;
import java.sql.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.io.IOException;
import java.sql.SQLException;
import java.util.*;
import java.sql.*;
import java.math.*;
import net.ucanaccess.converters.TypesMap.AccessType;
import net.ucanaccess.ext.FunctionType;
import net.ucanaccess.jdbc.UcanaccessConnection;
import net.ucanaccess.jdbc.UcanaccessDriver;
public class AccessTest {
public Connection ucaConn = null;
public Statement stmt = null;
public ResultSet srs = null;
public ResultSetMetaData rsmd=null;
public static Connection conn2 = null;
public static Statement stmt2 = null;
public static ResultSet srs2 = null;
public static ResultSetMetaData rsmd2=null;
/**
* example 中提供的构造函数
*
*/
public AccessTest(String pathNewDB) {
try {
this.ucaConn=getUcanaccessConnection(pathNewDB);
} catch (SQLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 自己写的构造函数
*/
public AccessTest(){
}
private static Connection getUcanaccessConnection(String pathNewDB) throws SQLException,IOException {
String url = UcanaccessDriver.URL_PREFIX + pathNewDB+";newDatabaseVersion=V2003";
return DriverManager.getConnection(url, "admin", "");
}
/**
* 一个简易Query查询
*
*/
private void executeQuery() throws SQLException {
Statement st = null;
try {
st = this.ucaConn.createStatement();
ResultSet rs = st.executeQuery("SELECT * from RoHS");
//ResultSet rs = st.executeQuery("SELECT * from 花名册");
dump(rs,"executeQuery");
} finally {
if (st != null)
System.out.println("------finally------");
st.close();
}
}
/**
* 显示ResultSet中的内容
*/
private static void dump(ResultSet rs,String exName)
throws SQLException {
System.out.println("-------------------------------------------------");
System.out.println();
System.out.println(exName+" result:");
System.out.println();
while (rs.next()) {
System.out.print("| ");
int j=rs.getMetaData().getColumnCount();
for (int i = 1; i <=j ; ++i) {
Object o = rs.getObject(i);
System.out.print(o + " | ");
}
System.out.println();
System.out.println();
}
}
/**
* 连接access数据库的方法(测试可用)
*/
public void OpenConnAC()throws Exception{
try{
Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
ucaConn=DriverManager.getConnection(UcanaccessDriver.URL_PREFIX + "\\\\172.16.30.106\\share\\入库检验_be.mdb" + ";newDatabaseVersion=V2003", "admin", "" );
ucaConn.setAutoCommit(false);
}
catch(Exception e){
System.err.println("OpenConnAC:exception"+e.getMessage());
}
}
/**
* 带有输入参数的executeQuery()
* @return
*/
public ResultSet executeQuery(String sql) {
try {
stmt = ucaConn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
srs = stmt.executeQuery(sql);
} catch (SQLException e) {
System.err.println("executeQuery:" + e.getMessage());
}
return srs;
}
/**
* 执行更新
*/
public void executeUpdate(String sql) {
try {
stmt = ucaConn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
stmt.executeUpdate(sql);
ucaConn.commit();
} catch (SQLException e) {
System.err.println("executeUpdate:" + e.getMessage());
}
}
/**
* 关闭资源
*/
public void close() {
try {
if (srs != null) {
srs.close();
}
if (stmt != null) {
stmt.close();
}
if (ucaConn != null) {
ucaConn.close();
}
} catch (Exception e) {
e.printStackTrace(System.err);
}
}
/**
* used to return the num of the resultset
* @param 输入参数 sql语句
* @return 返回值 语句执行结果集的元素数目
*/
public int iRSNum(String sql) {
String sRsnum = "";
int iRsnum = 0;
try {
stmt = ucaConn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
srs = stmt.executeQuery(sql);
//System.out.println("----iRSNum()----");
} catch (SQLException e) {
System.err.println("executeQuery:" + e.getMessage());
}
try {
srs.last();
sRsnum = srs.getString(1);
iRsnum = Integer.parseInt(sRsnum);
} catch (SQLException e) {
e.printStackTrace();
}
return iRsnum;
}
/**
* @param sTname 输入参数 表 名
* @return 返回值 表 中记录数目
*/
public int iRSNum2(String sTname){
String sRsnum = "";
int iRsnum = 0;
try {
stmt = ucaConn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
System.out.println("Query OK");
srs = stmt.executeQuery("select count(*) from " + sTname);
} catch (SQLException e) {
System.err.println("executeQuery:" + e.getMessage());
}
try {
srs.last();
sRsnum = srs.getString(1);
iRsnum = Integer.parseInt(sRsnum);
} catch (SQLException e) {
e.printStackTrace();
}
System.out.println("-------iRSNum2()--------");
return iRsnum;
}
/**
* 执行sql查询,
* @param sql
* @return
*/
public Vector testF(String sql) {
int numCols = 0;
//int rowCount = 0;
String st = null;
Vector vo = new Vector();
try {
stmt = ucaConn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
srs = stmt.executeQuery(sql);
rsmd = srs.getMetaData();
numCols = rsmd.getColumnCount(); // 属性数目
srs.last(); // 移到最后一行
//rowCount = srs.getRow(); // 得到当前行号,也就是记录数
srs.beforeFirst();
while (srs.next()) {
Vector v = new Vector();
for (int j = 0; j < numCols; j++) {
st = srs.getString(j + 1) == null ? "" : srs.getString(j + 1);
v.addElement(st);
v.trimToSize();
}
vo.addElement(v);
vo.trimToSize();
}
} catch (NullPointerException ex1) {
ex1.printStackTrace();
System.out.println("fucking you" + ex1.getMessage());
} catch (SQLException sqle) {
sqle.printStackTrace();
} finally {
try {
if (srs != null) {
srs.close();
}
if (stmt != null) {
stmt.close();
}
if (ucaConn != null) {
// ucaConn.close();
// 因为执行了ucaConn.close()之后,会造成 抛出SQL的异常,于是暂时屏蔽这句话
}
} catch (SQLException sqle) {
sqle.printStackTrace();
System.out.println(sqle.getMessage());
}
}
return vo;
}
/**
*
*/
public static void main(String[] args) throws ClassNotFoundException, SQLException{
/* 测试1 example 中的测试代码
*
*
* Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
try {
AccessTest ex=new AccessTest("\\\\172.16.30.106\\share\\入库检验_be.mdb");
ex.executeQuery();
} catch (Exception e) {
e.printStackTrace();
}
测试1 结束
*/
try{
AccessTest ex = new AccessTest();
ex.OpenConnAC();
Vector v=ex.testF("select * from 检验表");
//int irn = ex.iRSNum("SELECT * from RoHS");
//int irn = ex.iRSNum2("检测表");
//System.out.println("total number the resultset is: "+irn);
for(int i=0;i<v.size();i++){
Vector v2=(Vector)v.elementAt(i);
for(int j=0;j<v2.size();j++){
String sId=(String)v2.elementAt(j);
System.out.println("the name is:"+sId);
}
}
//释放资源
ex.close();
} catch(Exception e){
e.printStackTrace();
} finally{
}
System.out.println("access db test ending...");
}
}
上述代码中,testF()方法