如何在春季访问内存数据库
Posted
技术标签:
【中文标题】如何在春季访问内存数据库【英文标题】:How to access a in-memory database in spring 【发布时间】:2016-09-16 18:32:09 【问题描述】:我正在使用内存嵌入式数据库开发一个独立的 Java 应用程序。我参考了一些文档,并编写了以下代码。我正在使用弹簧引导。 这些是我到目前为止所做的步骤: 在 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)
);
数据.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】:由于您想使用 H2 内存数据库,因此您不应该在 pom.xml 中使用 MySql 依赖,在 application.properties
中使用 mysql 相关属性。
从pom.xml
中移除MySql连接器依赖
<!--Delete This-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.36</version>
并删除application.properties
文件中的所有属性。
留空,Spring boot 会为 H2 数据库自动配置这些属性。
在 GitHub 存储库中查看完整的 Spring Boot JDBC Demo 项目。
【讨论】:
@madhu 如果这回答了您的问题,请接受它。以上是关于如何在春季访问内存数据库的主要内容,如果未能解决你的问题,请参考以下文章
如何在内存分析期间跟踪 .NET 应用程序中内存访问的频率和数量?