Spring jdbc配置

时间:2014-06-24 12:58:30

标签: spring spring-mvc spring-data

我一直在尝试使用spring实现Web服务。此Web服务将使用JDBC提供对mySQL数据库的数据访问。我试图不使用任何xml配置文件,所以我遇到了尝试连接数据库的问题。

我正在关注教程:http://spring.io/guides/tutorials/rest/但我在此过程中改变了一些事项。

现在我正在尝试实现与数据库的连接,我在尝试执行tomcat实例时遇到错误,我猜这个问题在配置中。

以下是我的一些代码:

数据源配置:

@Configuration
@Profile("mySQL")
@PropertySource("classpath:/services.properties")
public class MySQLDataSourceConfiguration implements DataSourceConfiguration{

    @Inject
    private Environment environment;

    @Bean
    public DataSource dataSource() throws Exception {
    BasicDataSource dataSource = new BasicDataSource();
    dataSource.setPassword(environment.getProperty("dataSource.password"));
    dataSource.setUrl(environment.getProperty("dataSource.url"));
    dataSource.setUsername(environment.getProperty("dataSource.user"));
    dataSource.setDriverClassName(environment.getPropertyAsClass("dataSource.driverClass",  Driver.class).getName());
    return dataSource;
    }
}

文件service.properties是我保存数据库配置的地方,所以当我想要更改数据库时,我只需要更改4个字段。

用于设置JDBCtemplate的JDBCConfiguration类

    @Configuration
    @EnableTransactionManagement
    @PropertySource("classpath:/services.properties")
    @Import( { MySQLDataSourceConfiguration.class })
    public class JdbcConfiguration {

         @Autowired 
         private DataSourceConfiguration dataSourceConfiguration;

         @Inject 
         private Environment environment;

            @Bean
            public JdbcTemplate setupJdbcTemplate() throws Exception {
            return new JdbcTemplate(dataSourceConfiguration.dataSource());
            }

            @Bean
            public PlatformTransactionManager transactionManager(DataSource dataSource) throws Exception {
              return new DataSourceTransactionManager(dataSource);
            }    
          }

然后是Repository,它接收模板。

@Transactional
@Repository
@Qualifier("jdbcRepository")
public class JdbcIndividualRepository implements IndividualsRepository{

private static final Logger LOG = LoggerFactory.getLogger(JdbcIndividualRepository.class);

@Autowired
private JdbcTemplate jdbcTemplate;

@Autowired
public JdbcIndividualRepository(DataSource jdbcDataSource) {
    LOG.info("JDBCRepo arg constructor");
    this.jdbcTemplate = new JdbcTemplate(jdbcDataSource);
}

@Override
public Individual save(Individual save) {
    String sql = "INSERT INTO Individual(idIndividual, Name) VALUES(?,?)";
    this.jdbcTemplate.update(sql, save.getId(), save.getName());
    return save;
}

@Override
public void delete(String key) {
    String sql = "DELETE FROM Individual WHERE idIndividual=?";
    jdbcTemplate.update(sql, key);
}

@Override
public Individual findById(String key) {
    String sql = "SELECT i.* FROM Individual i WHERE i.idIndividual=?";
    return this.jdbcTemplate.queryForObject(sql, new IndividualRowMapper(), key);
}

@Override
public List<Individual> findAll() {
    String sql = "SELECT * FROM Individual";
    return new LinkedList<Individual>(this.jdbcTemplate.query(sql, new IndividualRowMapper()));
}

}

然后我在创建应用程序的根上下文时在初始化程序类中注册jdbc配置,如下所示:

 private WebApplicationContext createRootContext(ServletContext servletContext) {
    AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();

    rootContext.register(CoreConfig.class, SecurityConfig.class, JdbcConfiguration.class);
    rootContext.refresh();

    servletContext.addListener(new ContextLoaderListener(rootContext));
    servletContext.setInitParameter("defaultHtmlEscape", "true");

    return rootContext;
}

但是,Tomcat服务器不会运行,因为它无法自动装配MySQLDataSourceConfiguration类。

任何人都知道问题可能是什么?我可以提供有关代码的更多详细信息,但问题已经很大了。

感谢任何帮助! 干杯

修改

解决了将JdbcConfiguration类更改为:

的问题
@Configuration
@EnableTransactionManagement
@PropertySource("classpath:/services.properties")
@Import( { MySQLDataSourceConfiguration.class })
public class JdbcConfiguration {

    @Autowired 
    private DataSource dataSource;

    @Inject 
    private Environment environment;

    @Bean
        public JdbcTemplate setupJdbcTemplate() throws Exception {
        return new JdbcTemplate(dataSource);
        }

        @Bean
        public PlatformTransactionManager transactionManager(DataSource dataSource) throws Exception {
           return new DataSourceTransactionManager(dataSource);
        }

    @Bean
    public IndividualsRepository createRepo(){
    return new JdbcIndividualRepository(dataSource);
    }
}

2 个答案:

答案 0 :(得分:1)

删除

@Autowired 
private DataSourceConfiguration dataSourceConfiguration;

因为它不是应该如何使用的。而是将以下内容添加到同一个类中:

@Autowired DataSource dataSource;

并像这样使用它:new JdbcTemplate(dataSource);

另外,尝试将@ComponentScan添加到JdbcConfiguration类。从我在你的代码中看到的,JdbcIndividualRepository类没有被任何东西选中。

答案 1 :(得分:0)

在您的班级JdbcConfiguration中,您正尝试自动装配DataSourceConfiguration。我不确定这是否可行 - 通常你应该尝试自动引导DataSource,而不是DataSourceConfiguration

@Import( { MySQLDataSourceConfiguration.class })
public class JdbcConfiguration {

    @Autowired 
    private DataSource dataSource;

    @Bean
    public JdbcTemplate setupJdbcTemplate() throws Exception {
        return new JdbcTemplate(dataSource);
    }

此外,如果你有几个DataSource并且你正在使用Spring配置文件来分隔它们,那么在一个文件中提供所有DataSource bean并使用不同的配置文件注释每个bean会更容易:< / p>

@Configuration
public class DataSourceConfig {

    @Bean
    @Profile("Test")
    public DataSource devDataSource() {
        .... configure data source
    }

    @Bean
    @Profile("Prod")
    public DataSource prodDataSource() {
        ... configure data source
    }