一、前言
前段时间项目中使用到Access数据库,无奈发现JDK8移除了ODBC相关的部分,查阅资料后笔者使用了第三方jar包ucanaccess来连接,使用后发现有几个弊端。
1、建立连接时间短则十几秒,慢则一分钟左右。
2、Access数据库一旦有插入动作,ucanacess就得重新建立连接(等待十几秒)。
3、程序内存奇高,一个只有十几M的程序运行内存居然2G多(mdb文件110MB)。
最终抛弃使用ucanaccess连接方式,通过移植使JDK8支持ODBC连接。
二、JDK8使用ODBC连接的环境准备
1、资料:环境依赖文件
2、使JDK8支持ODBC的操作步骤:
笔者的jdk装在D盘Java目录下
JdbcOdbc.dll
放在 D:\Java\jre1.8.0_261\bin 目录下
JdbcOdbc.dll
放在 D:\Java\jdk1.8.0_261\jre\bin 目录下
jdbc.jar 放在 D:\Java\jdk1.8.0_261\jre\lib\ext 目录下
jdbc.jar 放在 D:\Java\jre1.8.0_261\lib\ext 目录下
三、建立连接代码工具类
package utils;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/**
* JDBC数据库操作工具类 简化数据库操作
*
*/
public class JDBCUtil {
private static String AccessDriver = "sun.jdbc.odbc.JdbcOdbcDriver";
private static String AccessPWD = "";
public JDBCUtil() {
// TODO Auto-generated constructor stub
}
/**
* 获取Access数据库连接
* @return
*/
public static Connection getAccessCon() {
Connection con = null;
try {
Class.forName(AccessDriver);
Properties prop = new Properties();
prop.put("charSet", "gbk");//防止中文乱码
prop.put("user", "");
prop.put("password", AccessPWD);
String url2 = "jdbc:odbc:CY_ydMIS";
con =DriverManager.getConnection(url2, prop);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
return con;
}
public static void close(Statement stmt, Connection conn) {
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void close(ResultSet rs, PreparedStatement pstmt, Connection conn) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (pstmt != null) {
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void close(ResultSet rs) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void close(ResultSet rs, Statement stmt, Connection conn) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
四、配置ODBC数据源(Win10)
-
打开ODBC数据源设置(这里注意根据数据源选择对应的设置),选错会导致无法连接到数据库,我选择的是64位的。(如果不确定也可以先选择一种试一下,不成功的话换另一种)
-
在
系统DNS
中单击添加
按钮
3.选择access驱动
4.填写连接信息,注意数据源名要和连接代码对应上
五、环境准备完成,可以开始写业务代码了
public Map<String, String> getCancelData(String ReceiptNO) {
PreparedStatement pstm = null;
Connection conn = null;
ResultSet resultSet=null;
Map<String,String> dataMap=new HashMap<>();
String Sql="SELECT * FROM `YBAccounts` WHERE `ReceiptNO`=?";
try {
conn=JDBCUtil.getAccessCon();
pstm=conn.prepareStatement(Sql);
pstm.setString(1, ReceiptNO);
resultSet=pstm.executeQuery();
if(resultSet.next()) {
dataMap.put("setl_id", resultSet.getString(2));
dataMap.put("mdtrt_id", resultSet.getString(3));
dataMap.put("psn_no", resultSet.getString(4));
}
return dataMap;
} catch (SQLException e) {
// TODO: handle exception
e.printStackTrace();
return null;
} finally {
JDBCUtil.close(resultSet,pstm,conn);
}