龙空技术网

Spring Data之DataSource数据源配置

JAVA微学堂 109

前言:

现时咱们对“datasourcejava”大概比较关心,看官们都需要学习一些“datasourcejava”的相关文章。那么小编在网上汇集了一些对于“datasourcejava””的相关内容,希望看官们能喜欢,看官们快快来了解一下吧!

概述

Spring Boot默认会根据类路径依赖,自动配置数据源DataSource、数据库连接池即HikariCP、Apache Tomcat或Commons DBCP,并创建数据库实例。

<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency>    <groupId>com.h2database</groupId>    <artifactId>h2</artifactId>    <version>2.4.1</version>     <scope>runtime</scope> </dependency>

但有时我们需要更高级别的控制,比如支持多数据源、读写分离等,就必须编程式实现DataSource配置,从而跳过自动配置过程。

编程方式配置DataSource

最简单方法是定义DataSource工厂方法,并将其放置在@Configuration注解的类中:

@Configurationpublic class DataSourceConfig {        @Bean    public DataSource getDataSource() {        DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();        dataSourceBuilder.driverClassName("org.h2.Driver");        dataSourceBuilder.url("jdbc:h2:mem:test");        dataSourceBuilder.username("SA");        dataSourceBuilder.password("");        return dataSourceBuilder.build();    }}

也可以使用application.properties外部化数据源配置:

spring.datasource.url=jdbc:h2:mem:testspring.datasource.driver-class-name=org.h2.Driver

然后在工厂方法中定义一些基本的DataSource属性:

@Bean public DataSource getDataSource() {     DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();     dataSourceBuilder.username("SA");     dataSourceBuilder.password("");     return dataSourceBuilder.build(); }

或通过用@ConfigurationProperties注解类,覆盖Java API中定义的属性。这样可以保持编译时和运行时之间属性设置的分离。

测试DataSource配置

整个过程归结为创建JPA实体、定义基本存储层API和测试存储层。

创建JPA实体

@Entity@Table(name = "users")public class User {        @Id    @GeneratedValue(strategy = GenerationType.AUTO)    private long id;    private String name;    private String email;    // standard constructors / setters / getters / toString    }
定义存储层API

我们使用的是Spring Data JPA,所以不必从头开始创建DAO实现。只需扩展CrudRepository接口即可获得存储库的CRUD实现:

@Repositorypublic interface UserRepository extends CrudRepository<User, Long> {}
测试存储层

运行测试用例后,可以确认DataSource已经成功配置。

@RunWith(SpringRunner.class)@DataJpaTestpublic class UserRepositoryIntegrationTest {        @Autowired    private UserRepository userRepository;       @Test    public void whenCalledSave_thenCorrectNumberOfUsers() {        userRepository.save(new User("Bob", "bob@domain.com"));        List<User> users = (List<User>) userRepository.findAll();                assertThat(users.size()).isEqualTo(1);    }    }
运行示例应用程序

运行后我们应该在控制台输出中看到存储在数据库中的用户实体列表。

@SpringBootApplicationpublic class Application {    public static void main(String[] args) {        SpringApplication.run(Application.class, args);    }    @Bean    public CommandLineRunner run(UserRepository userRepository) throws Exception {        return (String[] args) -> {            User user1 = new User("John", "john@domain.com");            User user2 = new User("Julie", "julie@domain.com");            userRepository.save(user1);            userRepository.save(user2);            userRepository.findAll().forEach(user -> System.out.println(user);        };    }}
结论

编程式配置DataSource在多数据源、主从读写分离等很常见。

标签: #datasourcejava