- Java Web程序开发范例宝典
- 王国辉 郭铁 李根福编著
- 827字
- 2020-06-27 11:01:04
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数据库。