如何在spring中访问内存数据库

时间:2016-09-16 18:32:10

标签: spring-boot

我正在使用内存嵌入式数据库开发一个独立的Java应用程序。我查阅了一些文档,并编写了以下代码。我正在使用spring Boot。  这些是我到目前为止所做的步骤: 在,pom文件中我添加了这些依赖项。

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
             <groupId>com.h2database</groupId>
             <artifactId>h2</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
         <version>5.1.36</version>
    </dependency> 

在application.properties文件中

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

我创建了一个脚本schema.sql和data.sql schema.sql文件

CREATE TABLE users
(
    id int(11) NOT NULL AUTO_INCREMENT,
    name varchar(100) NOT NULL,
    email varchar(100) DEFAULT NULL,
    PRIMARY KEY (id)
);

data.sql

insert into users(id, name, email) values(1,'demouser','user@test.com'); 

这是我的存储库类。

@Repository
public class UserRepository {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Transactional(readOnly = true)
    public List<User> findAll() {
        return jdbcTemplate.query("select * from users", new UserRowMapper());
    }

    class UserRowMapper implements RowMapper<User> {
        @Override
        public User mapRow(ResultSet rs, int rowNum) throws SQLException {
            User user = new User();
            user.setId(rs.getInt("id"));
            user.setName(rs.getString("name"));
            user.setEmail(rs.getString("email"));
            return user;
        }

这是我的junit课程

@Autowired
    private UserRepository userRepository;
    private EmbeddedDatabase db;

    @Before
    public void setUp() {
        // db = new EmbeddedDatabaseBuilder().addDefaultScripts().build();
        Object db = new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2).addScript("schema.sql")
                .addScript("data.sql").build();
    }

    @Test
    public void findAllUsers() {
        List<User> users = userRepository.findAll();
        System.out.println(users.get(0).getName());
        assertNotNull(users);
        assertTrue(!users.isEmpty());
    } 

当我运行junit时,我收到以下错误。

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userRepository': Unsatisfied dependency expressed through field 'jdbcTemplate': Error creating bean with name 'org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration': Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Tomcat.class]: Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSourceInitializer': Invocation of init method failed; nested exception is org.springframework.jdbc.datasource.init.UncategorizedScriptException: Failed to execute database script; nested exception is org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

我是否必须添加任何其他依赖项或下载数据库。

1 个答案:

答案 0 :(得分:1)

由于您希望使用H2的内存数据库,因此您不应该在application.properties中的pom.xml和mysql相关属性中具有MySql依赖性。

pom.xml

中删除MySql连接器依赖项
    <!--Delete This-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
     <version>5.1.36</version>

并删除application.properties文件中的所有属性。 保持空白,Spring启动会自动为H2数据库配置这些属性。

签出GitHub存储库中的完整Spring Boot JDBC Demo项目。