DataBase Pooling - 连接到Spring3 MVC中的Mysql数据库

时间:2012-01-22 23:24:56

标签: java spring-mvc jdbc

我正在尝试连接到我的第一个Spring项目的mysql数据库,我似乎忽略了一些非常简单的事情。

我的application-context.xml文件中有这个bean,它被注释掉了!

<bean id="dataSource"
      class="org.springframework.jdbc.datasource.DriverManagerDataSource"
      p:driverClassName="${jdbc.driverClassName}"
      p:url="${jdbc.url}"
      p:username="${jdbc.username}"
      p:password="${jdbc.password}" />

我知道这听起来很愚蠢,但为了创建一个使用JDBC和Spring JDBCTemplate连接到Mysql数据库的类,我该怎么办呢?

我对如何在上面的bean中填充属性感到困惑,我是否在这样的超类中进行,然后从中扩展我的子类。

import org.springframework.jdbc.datasource.DriverManagerDataSource;

public class JdbcDao {
     protected DriverManagerDataSource dataSource = new DriverManagerDataSource();
     JdbcDao(){
         dataSource.setDriverClassName("com.mysql.jdbc.Driver");
         dataSource.setUrl("jdbc:mysql://localhost/db_name");
         dataSource.setUsername("bcash");
         dataSource.setPassword("");        
     }    
}

我感到困惑,所以任何帮助都是真正值得赞赏的,

非常感谢

2 个答案:

答案 0 :(得分:2)

如果您使用Tomcat作为应用程序服务器,则可以执行更多类似的操作。

在服务器的context.xml文件中定义与用户名/密码的连接(而不是在应用程序中):

<Resource name="jdbc/resourceNameToUse"
          auth="Container"
          type="javax.sql.DataSource"
          username="<UserName>"
          password="<Password>"
          driverName="com.mysql.jdbc.Driver"
          url="jdbc:mysql://localhost:3306/db_name"
          maxActive="100"
          maxIdle="5"
          validationQuery="Select 1"
          useCompression="true" />

然后,当您配置Spring时,您将创建一个数据源,使用JNDI查找上面定义的资源:

  <bean id="targetDataSource" 
        class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" 
              value="java:comp/env/jdbc/resourceNameToUse"/>
  </bean>
  <bean id="dataSource" 
        class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy">
    <property name="targetDataSource">
      <ref local="targetDataSource"/>
    </property>
  </bean>

此时,您可以将JdbcTemplate的实例创建为引用数据源的Spring bean:

  <bean id="jdbcTemplate"
        class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource">
      <ref bean="dataSource" />
    </property>
  </bean>

如果您使用的是Spring 3,您只需将DAO中的JdbcTemplate标记为@AutoWired,Spring就会将变量名称与您定义的bean的id匹配,并为您注入JdbcTemplate。如果您没有使用Spring 3,那么在定义DAO bean时只需注入JdbcTemplate。

public class MyDao {
    @AutoWired
    private JdbcTemplate jdbcTemplate;
}

答案 1 :(得分:1)

有关详细信息,请参阅JdbcTemplate Best Practices

Nutshell:不,你的DAO不会通过new创建新的数据源;这违背了使用Spring的目的。应该注入实现,而不是直接实例化;大致是:

public class TheDaoImpl implements TheDao {

    private JdbcTemplate jdbcTemplate;

    public void setDataSource(DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }

    // JDBC-backed implementations of TheDao follow...
}

然后在你的Spring配置中(如果没有使用注释),也粗略地说:

<bean id="theDao" class="com.bar.plugh.TheDaoImpl" p:dataSource-ref="dataSource" />

(这使用了一个setter;您也可以使用注释并跳过XML配置。)

您还可以使用JdbcTemplate作为基类,节省更多精力。

我建议您浏览Data access with JDBC参考文档(如果您使用的是JDBC),或直接处理您的ORM选择的相应部分。