Spring代码通过DBCP数据库连接池访问ms access数据库的探讨

正在做一个升级项目project,project的意思就是不是application也不是platform,仅仅是一个project而已。
项目的需求之一就是对于升级前的数据,保存在access的*.mdb中的数据,继续能够访问。
我希望通过maven构建一个spring框架下的项目,那么目前的一个问题就是我的代码需要可以访问access数据库。
之前博文中,叙述了jdk8环境下java代码使用ucanaccess访问access数据库的过程。
接下来,也就是这篇博文,我希望讨论一下,在spring环境下,透过dbcp这个数据库连接池技术,使用ucannaccess访问access数据库的实现过程。


上图是我自己绘制的图

spring使用dbcp这个项目构建jdbc的连接池
ucanaccess这个项目,是Java JDBC的一个实现

“UCanAccess is a pure Java JDBC Driver implementation which allows java developers and jdbc client programs to read/write Microsoft Access database (.mdb and .accdb files). No ODBC needed.”

我希望使用spring,并导入dbcp的连接池,来操纵UCanAccess封装的方法去访问ms access数据库。

为什么要使用UCanAccess,而不是用Java语言自己的方法去访问ms access数据库呢?因为JDK8以后,Java语言自身不再提供jdbc-odbc bridge这类方法,也就是JDK8以后这部分方法被Java语言自己放弃了。UCanAccess的角色相当于“临时工”或者“外围”或者“龙套”。

dbcp依赖于JDK中的JDBC
"DBCP 2 compiles and runs under Java 7 only (JDBC 4.1)"
ucanaccess是JDBC的一个实现类
因此我推测,dbcp无法使用ucanaccess。

ucanaccess的作用是让java代码可以使用JAVA语言自身的DriverManager.getConnection("url","uname","pwd")方法

经过上述方法之后,就直接获取了Connection类的实例,也就是这以后的工作全都和ucanaccess无关了,全是java的工作了。

至此,我甚至怀疑抛开dbcp不谈,spring本身的JDBCTemplate是否能够使用ucanaccess都是个问题
经过代码验证,我的上述怀疑是错的。
最终的结论是,spring可以通过JdbcTemplate调用ucanaccess注册的链接,对ms access进行数据库访问。
下图为我这部分测试代码

看,顺利的使用Spring从access文件(*.mdb)中读取了数据。
下面我们来描述一下改造的过程。
首先,第一张图的理解有误应该修改成如下所示:

ucanaccess实现了java JDBC的部分功能,自愿成为“外围”也就是“临时工”,只要你的项目正确导入了它,那么日后的所有操作,你就当它不存在就可以了,或者说你就当ucanaccess是java的一部分就可以了。


Spring的子包 spring-jdbc 包含了我们这次改造用到的3个类:
1.DriverManagerDataSource类
2.JdbcTemplate类
3.RowCallbackHandler类

只要你的项目导入了Spring的spring-jdbc,那么你的代码就可以大大方方的使用DriverManagerDataSource创建一个ucanaccess注册的数据源,并把这个数据源提供给JdbcTemplate的实例,然后由这个实例执行JdbcTemplate的方法query()进行查询,这个方法具有回调方法,在回调方法中读取结果集中的数据,并System.out.println()显示出来。

首先,为我们的项目导入spring-jdbc

这里啰嗦一句,你是怎么知道你需要导入spring-jdbc的呢?
其实我也是百度的,而且spring的官网也没有写你应该在自己的项目导入哪些包。主要是我看书需要使用spring的DriverManagerDataSource类来注册数据源,我搜索了一下,这个类属于spring-jdbc

下面直接上代码:

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 org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowCallbackHandler;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

import net.ucanaccess.jdbc.UcanaccessDriver;

/**
 * @author Administrator
 *
 */
public class AccessTest {

    public static Connection conn2 = null;
    public static Statement stmt2 = null;
    public static ResultSet srs2 = null;
    public static ResultSetMetaData rsmd2=null;
    public Connection ucaConn = null;
    public Statement stmt = null;
    public ResultSet srs = null;
    public ResultSetMetaData rsmd=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", "");

    }

    /**
     * 连接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;
    }

    /**
     * @param  输入参数  select语句
     * @return 返回值 Vector容器
     */
    public Vector<Vector<String>> testF(String sql) {

        int numCols = 0;
        //int rowCount = 0;
        String st = null;
        Vector<Vector<String>> vo = new Vector<Vector<String>>();

        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<String> v = new Vector<String>();
                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("method testF()'s exception " + 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;
    }

    /**
     * this method is add on 2014-4-9 which is implemented by array instead of vector
     * @param sql
     * @return
     */
    public ArrayList<String[]> arraylistQuery(String sql) {

        int numCols = 0;
        int rowCount = 0;
        String st = null;

        ArrayList<String[]> Lo = new ArrayList<String[]>();

        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();

            for (int i = 0; i < rowCount; i++) {

                String[] s0 = new String[numCols];
                srs.next();                                // java.sql.SQLException: 用尽的 Resultset
                for (int j = 0; j < numCols; j++) {

                    st = srs.getString(j + 1) == null ? "" : srs.getString(j + 1);
                    s0[j] = st;

                }
                Lo.add(i,s0);
                Lo.trimToSize();

            }
        } catch (NullPointerException ex1) {

            ex1.printStackTrace();
            System.out.println(ex1.getMessage());

        } catch (SQLException sqle) {

            sqle.printStackTrace();

        } finally {

            try {

                if (srs != null) {
                    srs.close();
                }
                if (stmt != null) {
                    stmt.close();
                }
                if (ucaConn != null) {
                    ucaConn.close();
                }

            } catch (SQLException sqle) {
                sqle.printStackTrace();
                System.out.println("ArrayList return value exception" + sqle.getMessage());
            }

        }

        return Lo;

    }

    /**
     * @return 获取当前日期
     */
    public String getDate() {

        String sDate = "";
        Calendar cCal = Calendar.getInstance();
        int intDay = cCal.get(Calendar.DATE);
        int intMonth = cCal.get(Calendar.MONTH) + 1;
        int intYear = cCal.get(Calendar.YEAR);
        sDate = intYear + "-" + intMonth + "-" + intDay;
        return sDate;

    }

    /**
     * @return 获取当前日期时间
     */
    public String getDatime() {

        String sDatime = "";
        Calendar cCal = Calendar.getInstance();
        int intDay = cCal.get(Calendar.DATE);
        int intMonth = cCal.get(Calendar.MONTH) + 1;
        int intYear = cCal.get(Calendar.YEAR);
        int intHour = cCal.get(Calendar.HOUR_OF_DAY);
        int intMinute = cCal.get(Calendar.MINUTE);
        int intSecond = cCal.get(Calendar.SECOND);
        sDatime = intYear + "-" + intMonth + "-" + intDay + " " + intHour + ":" + intMinute + ":" + intSecond;
        return sDatime;

    }

    /**
     * 对spring jdbc中DriverManagerDataSource进行测试
     */
    public void testDS(final String sid) {

        DriverManagerDataSource ds = new DriverManagerDataSource();

        ds.setDriverClassName("net.ucanaccess.jdbc.UcanaccessDriver");

        ds.setUrl(UcanaccessDriver.URL_PREFIX + "\\\\172.16.30.106\\share\\入库检验_be.mdb" + ";newDatabaseVersion=V2003");
        ds.setUsername("admin");
        ds.setPassword("");

        JdbcTemplate jt = new JdbcTemplate();
        jt.setDataSource(ds);

        String sql1 = "select * from 检测表  where 编号 = ?";

        jt.query(sql1, new Object[] { sid }, new RowCallbackHandler() {

            public void processRow(ResultSet rs) throws SQLException {
                String sro = rs.getString("检验项目");
                System.out.println(sro);
            }
        });
    }
    /**
     * 入口方法
     */
    public static void main(String[] args) throws ClassNotFoundException, SQLException {

        try {
            AccessTest ex = new AccessTest();
            String sd1 = ex.getDatime();
            ex.testDS("8666798");
            System.out.println(sd1);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {

        }

    }
}

时间: 2024-09-20 20:42:41

Spring代码通过DBCP数据库连接池访问ms access数据库的探讨的相关文章

springmvc在配置dbcp数据库连接池时出错

问题描述 springmvc在配置dbcp数据库连接池时出错 数据源配置 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in file [E:javaEE.metadata.me_tcat7webappsspringmvcWEB-INFclassesspringapplicationContext-dao.xml]: BeanP

oracle 11g使用dbcp数据库连接池出错

问题描述 oracle 11g使用dbcp数据库连接池出错 oracle 11g使用dbcp数据库连接池就出现错误,请问这是什么原因,该怎么解决 解决方案 http://tanwencan.iteye.com/blog/1433066

03_dbcp数据源依赖jar包,DBCP中API介绍,不同过dbcp方式使用dbcp数据库连接池,通过配置文件使用dbcp数据库连接池

 DBCP数据源 使用DBCP数据源,需要导入两个jar包 Commons-dbcp.jar:连接池的实现 Common-pool.jar:连接池实现的依赖库.   导入mysql的jar包.   DBCP核心API BasciDataSource   它可以通过实例化对象的方式获得一个对象. 它里面有如下方法: setDriverClassName(String driverClassName) 设置驱动类的名称. setInitialSize(int initialSize) 设置初始化

spring 配置文件中dbcp连接池,jdbc连接池 引入 配置文件properties,但是不能用$符号引用里面的变量问题

spring 配置 注意红色字体 (1)懒加载要设为true,(2)引入配置文件  注意不能懒加载不能设为false,否则$不能引入配置文件中的变量 第一种配置 jdbc连接池 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3

使用tomcat的数据库连接池,如何获取数据库密码

问题描述 我开发的web应用,使用tomcat的数据库连接池,可以通过java的DatabaseMetaData接口可以获取到url.usename.driver等信息,除了password.我想获取到密码信息,如何获取?请大家帮忙,有分相送! 解决方案 解决方案二:想问问你获取密码干什么用呢?感觉完全没有必要啊解决方案三:这个通过程序是搞不到的.问数据库管理员,或者相关的人员,索要密码.或者重置密码.解决方案四:这个DatabaseMetaData接口没有提供这样的方法,你实在想获取,可以考虑

SQL链接服务器访问远程Access数据库

由于Access数据库是一种文件型数据库,所以无法跨服务器进行访问.下面我们来介绍一下如何利用SQL Server 的链接服务器,把地理上分散的Access 数据库整合起来,使 Access 数据库具有跨越 Web 服务器群的能力.此方法还可以使 Access 数据库与SQL Server数据库,甚至 Oracle 等网络数据库连接起来,实现异构数据库的互连,最终执行分布式的查询.更新.命令和事务. 1.创建链接服务器,连接本地 Access 数据库 创建链接服务器可以用"企业管理器"

应用 SQLServer 链接服务器访问远程 Access 数据库

access|server|sqlserver|访问|服务器|链接|数据|数据库     Web 开发中,经常要用到 Access 数据库.但是由于 Access 是一种文件型数据库,所以无法跨服务器进行访问.经过笔者的探索,发现可以利用 SQL Server 的链接服务器,把地理上分散的 Access 数据库整合起来,使 Access 数据库具有跨越 Web 服务器群的能力.这样做,还可以使 Access 数据库与 SQL Server,甚至 Oracle 等网络数据库连接起来,实现异构数据库

使用ruby与MS Access数据库交互

ruby常规访问access数据库的方法应该是使用DBI库 :   require 'dbi' DBI.connect("DBI:ADO:Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db.mdb;")   可是 简单尝试之后没能成功,提示找不到驱动器ADO,懒得再试,遂找其他方法. 一番搜索之后,发现可以用WIN32OLE来访问access,写一个简单的类包装之:   require 'win32ole' class AccessDb at

java数据库连接池dbcp的使用

近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及,计算机 应用程序已从传统的桌面应用转到Web应用.基于B/S(Browser/Server)架构的3层开发模式逐渐取代C/S(Client/Server)架构的开发模式,成为开发企业级应用和电子商务普遍采用的技术. 在Java语言中,JDBC(Java DataBase Connection)是应用程序与数据库沟通的桥梁, 即Java语言通过JDBC技术访问数据库.JDBC是一种"开放"的方案,它