数据访问层的核心就是sql,因此逻辑正确性也必须验证。通过对比看,第三种方式满足诉求。
h2database是一个用Java编写的嵌入式关系型数据库管理系统,可以在内存中运行。h2database支持标准的SQL语法和JDBC API。此外h2database还具备下列特点:
添加依赖
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-jpaartifactId>
dependency>
<dependency>
<groupId>com.h2databasegroupId>
<artifactId>h2artifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
dependency>
在src/test/resources/application.properties文件下增加配置属性
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1
spring.datasource.username=sa
spring.datasource.password=sa
此外可以将属性单独配置在一个属性文件中。例如在src/test/resources/persistence-generic-entity.properties文件下单独配置h2db的属性。
jdbc.driverClassName=org.h2.Driver
jdbc.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1
jdbc.username=sa
jdbc.password=sa
在单测中写测试,如果我们对h2db使用了单独的测试文件,那么单测中需要通过注解引入配置。
我们先定义配置:
@Configuration
@EnableJpaRepositories(basePackages = "org.baeldung.repository")
@PropertySource("persistence-generic-entity.properties")
@EnableTransactionManagement
public class H2JpaConfig {
// ...
}
单测中引入配置
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {Application.class, H2JpaConfig.class})
public class SpringBootH2IntegrationTest {
// ...
}
如果没有单独使用配置文件,那么按如下方式配置即可
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class SpringBootJPAIntegrationTest {
@Autowired
private GenericEntityRepository genericEntityRepository;
@Test
public void givenGenericEntityRepository_whenSaveAndRetreiveEntity_thenOK() {
}
}
在前文介绍的配置文件中增加配置
spring.h2.console.enabled=true
接着启动系统,通过http://localhost:8080/h2-console打开控制台。 8080端口是设置的http端口。
接着输入前文中配置的用户名密码后就可以进入后台看到数据。
遇到这种情况是mysql语法与h2db有差异,此时如果使用idea,可以使用 「MySql To H2」这个插件进行转换,随后就能得到可执行的SQL。
遇到这个问题是配置文件中为了配置多套属性,使用了数组的方式配置
c[1].p1=xxx
c[1].p2=xxx
但在一个属性文件中,这种方式下标从0开始,必须连续。因此调整为c[0].p1。如果后续再有配置,连续配置即可 c[1].p1 ,… c[n].p1 届。
[1].https://www.baeldung.com/spring-testing-separate-data-source
[2].https://www.baeldung.com/spring-boot-h2-database