文档首页
MySQL Connector/J 开发人员指南
相关文档 下载本手册
PDF (US Ltr) - 1.2Mb
PDF (A4) - 1.2Mb


MySQL Connector/J 开发人员指南  /  使用 Connector/J 与 Spring

第 15 章 使用 Connector/J 与 Spring

Spring 框架是一个基于 Java 的应用程序框架,旨在通过提供一种配置组件的方式来帮助应用程序设计。Spring 使用的技术是一种众所周知的称为依赖注入的设计模式(参见 控制反转容器和依赖注入模式)。本文将重点介绍使用 Spring 2.0 对 MySQL 数据库进行面向 Java 的访问。对于那些好奇的人来说,Spring 的 .NET 端口名为 Spring.NET。

Spring 不仅是一个配置组件的系统,还包括对面向方面编程 (AOP) 的支持。这是 Spring 资源和事务管理的主要优势和基础。Spring 还提供实用程序来集成资源管理与 JDBC 和 Hibernate。

对于本节中的示例,将使用 MySQL 世界样本数据库。第一步是通过 Spring 设置一个 MySQL 数据源。Spring 中的组件使用 bean 术语。例如,要配置与支持世界样本数据库的 MySQL 服务器的连接,可以使用

<util:map id="dbProps">
    <entry key="db.driver" value="com.mysql.cj.jdbc.Driver"/>
    <entry key="db.jdbcurl" value="jdbc:mysql://127.0.0.1/world"/>
    <entry key="db.username" value="myuser"/>
    <entry key="db.password" value="mypass"/>
</util:map>

在上面的示例中,我们为将在配置中使用的属性分配值。对于数据源配置

<bean id="dataSource"
       class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="${db.driver}"/>
    <property name="url" value="${db.jdbcurl}"/>
    <property name="username" value="${db.username}"/>
    <property name="password" value="${db.password}"/>
</bean>

占位符用于为此 bean 的属性提供值。这意味着我们可以将配置的所有属性指定在一个地方,而不是在每个 bean 上输入每个属性的值。但是,我们还需要另一个 bean 来将这一切整合在一起。最后一个 bean 负责实际用属性值替换占位符。

<bean
 class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="properties" ref="dbProps"/>
</bean>

现在我们已经配置了 MySQL 数据源并准备就绪,我们可以编写一些 Java 代码来访问它。下面的示例将使用我们使用 Spring 配置的数据源检索三个随机城市及其对应的国家。

// Create a new application context. this processes the Spring config
ApplicationContext ctx =
    new ClassPathXmlApplicationContext("ex1appContext.xml");
// Retrieve the data source from the application context
    DataSource ds = (DataSource) ctx.getBean("dataSource");
// Open a database connection using Spring's DataSourceUtils
Connection c = DataSourceUtils.getConnection(ds);
try {
    // retrieve a list of three random cities
    PreparedStatement ps = c.prepareStatement(
        "select City.Name as 'City', Country.Name as 'Country' " +
        "from City inner join Country on City.CountryCode = Country.Code " +
        "order by rand() limit 3");
    ResultSet rs = ps.executeQuery();
    while(rs.next()) {
        String city = rs.getString("City");
        String country = rs.getString("Country");
        System.out.printf("The city %s is in %s%n", city, country);
    }
} catch (SQLException ex) {
    // something has failed and we print a stack trace to analyse the error
    ex.printStackTrace();
    // ignore failure closing connection
    try { c.close(); } catch (SQLException e) { }
} finally {
    // properly release our connection
    DataSourceUtils.releaseConnection(c, ds);
}

这与使用 DriverManager 对 MySQL 进行常规 JDBC 访问非常相似,主要区别在于我们使用 DataSourceUtils 而不是 DriverManager 来创建连接。

虽然这看起来可能是一个很小的区别,但它的影响却很大。Spring 以类似于 J2EE 应用程序服务器中容器管理数据源的方式管理此资源。打开连接后,如果它与事务同步,则可以随后在代码的其他部分访问它。这使得将应用程序的不同部分视为事务性成为可能,而不是传递数据库连接。