2015-03-06 17 views
9

Tôi đang cố gắng sử dụng Lớp JdbcTemplate của Spring để kết nối với một cơ sở dữ liệu MySql đơn giản dựa trên hướng dẫn this. Trong thực tế, tôi đã sử dụng thiết lập dự án của họ:Làm thế nào để sử dụng JdbcTemplate của Spring để kết nối với một cơ sở dữ liệu MySql đơn giản?

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>test</groupId> 
    <artifactId>jdbc-test</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 

    <parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.2.2.RELEASE</version> 
    </parent> 

    <dependencies> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-jdbc</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>mysql</groupId> 
      <artifactId>mysql-connector-java</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.projectlombok</groupId> 
      <artifactId>lombok</artifactId> 
      <version>1.14.8</version> 
      <scope>provided</scope> 
     </dependency> 
    </dependencies> 
    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-maven-plugin</artifactId> 
      </plugin> 
     </plugins> 
    </build> 
</project> 

Các phụ thuộc Lombok là dành cho getter và setter.

Sau đó là lớp Application:

package test; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.boot.CommandLineRunner; 
import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.jdbc.core.JdbcTemplate; 

@SpringBootApplication 
public class Application implements CommandLineRunner { 
    public static void main(String args[]) { 
     SpringApplication.run(Application.class, args); 
    } 

    @Autowired 
    JdbcTemplate jdbcTemplate; 

    @Override 
    public void run(String... arg0) throws Exception { 
     System.out.println("Creating tables"); 
     jdbcTemplate.execute("drop table customers if exists"); 
     jdbcTemplate.execute("create table customers(" + 
       "id serial, first_name varchar(255), last_name varchar(255))"); 
    } 
} 

Và cuối cùng là một POJO khách hàng:

package test; 

import lombok.AllArgsConstructor; 
import lombok.Data; 

@Data 
@AllArgsConstructor 
public class Customer { 
    private long id; 
    private String firstName, lastName; 
} 

Đối với cấu hình nguồn dữ liệu tôi có một tập tin application.properties trong thư mục nguồn của tôi:

spring.datasource.url=jdbc:mysql://localhost:3306/test 
spring.datasource.username=test 
spring.datasource.password=test 
spring.datasource.driver-class-name=com.mysql.jdbc.Driver 

spring.jpa.database = MYSQL 

spring.jpa.show-sql = true 

spring.jpa.hibernate.ddl-auto = update 
spring.jpa.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect 
spring.jpa.hibernate.naming_strategy = org.hibernate.cfg.ImprovedNamingStrategy 

Cơ sở dữ liệu đang hoạt động và vẫn có vẻ không tự động công việc. Dưới đây là ngoại lệ tôi nhận được khi tôi cố gắng chạy nó:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'application': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory. 
BeanCreationException: Could not autowire field: org.springframework.jdbc.core.JdbcTemplate test.Application.jdbcTemplate; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: 
No qualifying bean of type [org.springframework.jdbc.core.JdbcTemplate] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: 
{@org.springframework.beans.factory.annotation.Autowired(required=true)} 
     at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1202) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) 
     at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303) 
     at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
     at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299) 
     at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) 
     at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:755) 
     at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757) 
     at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480) 
     at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:686) 
     at org.springframework.boot.SpringApplication.run(SpringApplication.java:320) 
     at org.springframework.boot.SpringApplication.run(SpringApplication.java:957) 
     at org.springframework.boot.SpringApplication.run(SpringApplication.java:946) 
     at test.Application.main(Application.java:12) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
     at java.lang.reflect.Method.invoke(Unknown Source) 
     at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:53) 
     at java.lang.Thread.run(Unknown Source) 
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: org.springframework.jdbc.core.JdbcTemplate test.Application.jdbcTemplate; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: 
No qualifying bean of type [org.springframework.jdbc.core.JdbcTemplate] found for dependency: expected at least 1 bean which qualifies as autowire 
candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
     at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:561) 
     at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) 
     at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331) 
     ... 21 common frames omitted 
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.jdbc.core.JdbcTemplate] found for dependency: expected at least 1 bean which 
qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
     at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1301) 
     at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1047) 
     at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:942) 
     at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:533) 
     ... 23 common frames omitted 

Những gì tôi thấy tò mò là một thực tế rằng nếu tôi thay thế dependeny mysql-connector-java với một com.h2database, nó chỉ hoạt động (như trong ví dụ mùa xuân).

Tôi có cần định cấu hình nguồn dữ liệu mysql theo cách khác không? Bất kỳ đề xuất nào?

+1

Xin vui lòng, hãy chắc chắn rằng 'DataSourceAutoConfiguration' được kích hoạt cho bạn. Thêm đối số '--debug'' java' khi bạn chạy ứng dụng khởi động của mình và hãy xem nhật ký. –

Trả lời

19

Thêm phụ thuộc dưới đây:

<dependency> 
    <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-jdbc</artifactId> 
</dependency> 

Mà sẽ autoconfigure Datasource

+0

Đã hoạt động! Datasource được cấu hình. Tôi tìm thấy một sai lầm khác, tuy nhiên: câu lệnh sql đầu tiên phải là: 'tạo bảng nếu không tồn tại các khách hàng' để làm việc trong mysql. cổ vũ – lukas

Các vấn đề liên quan