4.2 连接Access数据库

Access作为关系型桌面数据库管理系统,在建立中、小型的数据库管理网站中得到了非常广泛的应用。建立与Access数据库的连接通常采用以下三种方式:即建立DSN、使用非DSN和OLE DB。下面通过几个典型实例介绍如何通过不同的方式连接Access数据库。

实例079 通过JDBC-ODBC桥连接Access数据库

本实例是一个数据库连接的程序

实例位置:光盘\mingrisoft\04\079

实例说明

读者在结合数据库开发Web程序或网站之前,要创建一个能和Java进行交互连接的数据库,而不管什么类型的数据库,都可以通过在服务器上创建的数据源名(DSN)对其进行访问。下面将对如何创建DSN并通过DSN访问Access数据库进行详细介绍。实例运行结果如图4.28所示。

图4.28 通过JDBC-ODBC桥连接Access数据库

技术要点

在使用ODBC时,经常提到DSN这个名词。DSN(Data Source Name),是指数据源名。ODBC是一种访问数据库的方法,只要系统中有相应的ODBC驱动程序,任何程序都可以通过ODBC驱动程序操纵数据库。

在给ODBC驱动程序传递SQL指令时,通过DSN来告诉ODBC驱动程序到底操作哪一个数据库。如果数据库的平台发生改变,例如改为SQL Server数据库,只要其中表的结构没变,就不用改写程序,只要重新在系统中配置DSN就可以。

由此可见,DSN是应用程序和数据库之间的桥梁,要通过ODBC访问数据库,前提是必须配置好DSN。即为DSN指定一个名称,而这个名称的作用就是通知系统调用哪个ODBC驱动程序。

实现过程

(1)配置Microsoft Access数据库文件的DSN。选择“控件面板”→“管理工具”命令,双击图标“数据源(ODBC)”,打开图4.29所示的“ODBC数据源管理器”对话框。

(2)选择“系统DSN”选项卡,单击“添加”按钮,打开图4.30所示的“创建新数据源”对话框。

图4.29 “ODBC数据源管理器”对话框

图4.30 “创建新数据源”对话框

(3)从列表框中选择“Microsoft Access Driver”列表项,然后单击“完成”按钮,即可打开图4.31所示的“ODBC Microsoft Access安装”对话框。

(4)在“数据源名”文本框中输入数据源名称Game,然后单击“选择”按钮,打开图4.32所示的“选择数据库”对话框。在这个对话框中选择要和数据源连接的数据库,单击“确定”按钮。

图4.31 “ODBC Microsoft Access安装”对话框

图4.32 “选择数据库”对话框

(5)单击“确定”按钮,完成Microsoft Access数据库文件DSN的配置工作。

(6)创建UserDao类,定义连接和操作Access数据库的代码如下:

        public class UserDao {
            private Connection con = null;
            private Statement stmt = null;
            private ResultSet rs = null;
            public UserDao(){                                     //通过构造方法加载数据库驱动
              try {
                Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
              } catch (Exception ex) {
                  System.out.println("数据库加载失败");
              }
              }
              public boolean Connection(){                                    //创建数据库连接
              try {
                  con = DriverManager.getConnection("jdbc:odbc:Game");
              } catch (SQLException e) {
                  System.out.println(e.getMessage());
                  System.out.println("creatConnectionError!");
              }
              return true;
              }
              public ResultSet selectStatic(String sql)throws SQLException{     //对数据库的查询操作
              ResultSet rs=null;
              if (con == null) {
                  Connection();
              }
              try {
              stmt = con.createStatement();
              rs = stmt.executeQuery(sql);
              } catch (SQLException e) {
                          e.printStackTrace();
                          }
              return rs;
              }
              public void closeConnection() {
              if(con!=null&&stmt!=null&&rs!=null){                          //关闭数据库的操作
                  try {
                      rs.close();
                      stmt.close();
                      con.close();
                  } catch (SQLException e) {
                      e.printStackTrace();
                      System.out.println("Failed to close connection!");
                  } finally {
                      con = null;
                  }
              }
              }
            }

(7)创建index.jsp页面,通过JavaBean标签调用UserDao类,执行查询数据库中数据的方法,输出查询结果集。关键代码如下:

        <%@ page language="java" import="java.sql.*" import="java.util.*" pageEncoding="GBK"%>
        <jsp:useBean id="con" class="com.pkh.dao.UserDao" scope="page"></jsp:useBean>
        <%
            if (con.Connection()) {
                out.println("数据库连接成功!");
            } else {
                out.println("数据库连接失败!");
            }
        %>
        <%
            String SQL = "Select * From tb_ClassList";
            ResultSet Rs;
            Rs = con.selectStatic(SQL);
        %>
        <%
            for (int i = 0; i < 2; i++) {
                Rs.next();
        %>
        <tr class="style1">
            <td><div align="left"><%=Rs.getString("CID")%></div></td>
            <td><div align="left"><%=Rs.getString("CName")%></div></td>
        </tr>
        <%
            }
        %>

举一反三

根据本实例,读者可以:

在编写个人日记软件时,采用Access数据库及本例的连接方式;

在开发家庭型理财软件时,采用Access数据库及本例的连接方式。

实例080 应用Hibernate连接Access数据库

本实例是一个典型的、连接数据库的程序

实例位置:光盘\mingrisoft\04\080

实例说明

在开发非常简单的软件时,Access数据库是一个不错的选择,因为它对计算机没有什么特殊的要求,并且每个计算机都可能有Access数据库,另外,还可以将Access数据库文件直接打包到软件当中去。通过本例,你会感觉到通过Hibernate进行数据持久化为移植数据库带来的方便。运行本实例,将查询“籍贯”为“吉林”的员工信息,如图4.33所示。

图4.33 应用Hibernate连接Access数据库

技术要点

在采用JDBC-ODBC方式连接数据库时,需要注意的是URL中指定的为数据源名称,而不是数据库的绝对路径,可仔细研究本例的Hibernate配置文件。

实现过程

(1)创建JDBC-ODBC数据源,名称为joinAccess,具体步骤可参见实例079。

(2)配置Hibernate的配置文件hibernate.cfg.xml,主要代码如下:

        <hibernate-configuration>
          <session-factory>
            <property name="connection.driver_class">sun.jdbc.odbc.JdbcOdbcDriver</property>
            <property name="connection.url">jdbc:odbc:joinAccess</property>
            <property name="connection.username"></property>
            <property name="connection.password"></property>
            <property name="dialect">org.hibernate.dialect.SQLServerDialect</property>
            <property name="show_sql">true</property>
            <mapping resource="mrgf/HibernateJoin.hbm.xml"/>
          </session-factory>
        </hibernate-configuration>

元素connection.driver_class指定的并不是连接数据库所用的驱动包,而是连接方式(JDBC-ODBC桥连接)。

元素connection.url的值中joinAccess为在技术要点中建立的数据源名称。

在该配置文件中还添加了一个dialect元素,它用来指定要访问数据库使用的SQL方言,供Hiberate生成SQL语句时参考,由于Access数据库没有自己的方言,在这里采用的是SQL Server数据库的方言,因为它们在语法上有些相似之处,这从严格意义上来讲是不允许的,但对于简单操作来说不会影响程序的运行。

图4.34 Access数据表结构图

(3)创建本例使用的数据表,表结构如图4.34所示。

(4)创建tb_hibernateJoin数据表的实体类,名称为“HibernateJoin”。创建对应数据表字段的实体类成员变量。关键代码如下。

        public class HibernateJoin {
            private int id;                //ID值
              private String name;              //名称
              private String sex;               //年龄
              private Date birthday;            //生日
              private String nativePlace;       //籍贯
              private String address;           //地址
              private String postcard;          //邮编
              public int getId(){               //定义getXXX方法
              return id;
              }
              public String getName() {
              return name;
              }
            ……// 省略部分代码
            }

(5)创建数据表与实体类的XML映射文件“Tb HibernateJoin.hbm.xml”,在该映射文件中设置主键生成方式为“identity”,是主键自动累加编号,然后设置其他表字段对应的实体类成员变量和非空约束。完整代码如下:

        <?xml version="1.0"?>
        <!DOCTYPE hibernate-mapping
              PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
              "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
        <hibernate-mapping>
            <class name="mrgf.HibernateJoin" table="tb_hibernateJoin">
              <id name="id" column="id" type="int">
            <generator class="increment"/>
              </id>
              <property name="name"  column="name"  type="string"/>
              <property name="sex"  column="sex"  type="string"/>
              <property name="birthday"  column="birthday"  type="java.sql.Date"/>
              <property name="nativePlace"  column="nativePlace"  type="string"/>
              <property name="address"  column="address"  type="string"/>
              <property name="postcard"  column="postcard"  type="string"/>
            </class>
        </hibernate-mapping>

(6)创建index.jsp页面,调用query()方法检索数据,并遍历检索结果。关键代码如下:

            <%@page contentType="text/html;charset=GBK"%>
            <%@page import="java.util.*"%>
            <%@page import="mrgf.*"%>
            <%
            String nativePlace="";                                //定义字符串变量
            String where="";                                      //定义查询条件变量
            if(request.getParameter("nativePlace")!=null){       //判断当籍贯的值不为空时
                nativePlace=request.getParameter("nativePlace"); //获取request请求中提交的籍贯数据
                if(nativePlace.length()!=0){                     //判断字符串的长度不等于0
                    nativePlace=new String(nativePlace.trim().getBytes("ISO8859_1"),"GBK");  //编码转换
                    where="where nativePlace='"+nativePlace+"'";            //定义查询的条件
                }
            }
            %>
            <form action="index.jsp">
            <tr align="center">
                <td>您当前查询的“籍贯”条件为:
                    <input type="text" name="nativePlace" value="<%=nativePlace %>" size="10" maxlength="10" />
                    <input type="submit" value="查询" />
                </td>
            </tr>
            </form>
            <%
            Hibernate hibernate=new Hibernate();                             //实例化Hibernate
            List result=hibernate.query("from HibernateJoin"+where);         //执行查询语句
            for(int i=0;i<result.size();i++){                               //通过for循环输出List集合中的数据
                HibernateJoin join=(HibernateJoin)result.get(i);            //获取指定的数据
            %>
            <tr align="center">
            <td><%=join.getId() %></td>
            <td><%=join.getName() %></td>
            <td><%=join.getSex() %></td>
            <td><%=join.getBirthday() %></td>
            <td><%=join.getNativePlace() %></td>
            <td><%=join.getAddress() %></td>
            <td><%=join.getPostcard() %></td>
        </tr>
        <%
            }
        %>

举一反三

根据本实例,读者可以:

通过Hibernate连接加密的Access数据库;

通过自动创建数据源连接Access数据库。