Spring Data JPA学习(一)之环境搭建

Spring Data JPA是依附于Spring Boot的,学习Spring Data JPA之前得先把Spring Boot的环境搭建起来。

先附上一个Spring Data JPA的官方链接:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/

以下学习自:https://segmentfault.com/a/1190000006717969 Spring Data JPA 多数据源+异构数据库实践

1.建立一个maven项目,在pom.xml中添加依赖:

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>


<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.8.RELEASE</version> </parent> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency>
</dependencies>
<build> <finalName>jpa</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins>
</build>

说明:

(1)spring-boot-devtools 是用于当修改了Java文件时,服务器重新启动编译。

(2)spring-boot-starter-test是用于进行单元测试。

(3)spring-boot-starter-data-jpa是用于支持JPA。

保存pom.xml文件之后会自动下载jar包。如果在下载过程中因为某些原因中断,可能会导致jar下载不完全,到jar包的存放位置将相应的jar删除,再maven-->update project下载。

 

2.连接数据库。在src/main/resources下建立application.yml文件,内容如下:

spring:
  datasource:
    terminal:
      driver-class-name: com.mysql.jdbc.Driver
      url: jdbc:mysql://127.0.0.1:3306/terminal?useUnicode=true&characterEncoding=utf-8&useSSL=false
      username: root
      password: xxxx
  jpa:
    show-sql: true
    database-platform: org.hibernate.dialect.MySQL5Dialect
    hibernate:
      ddl-auto: update
注意:在":"之后需要加一个空格。上面的terminal是连接的名称。在url后面内容加了一个useSSL=false,如果不加,会出现下面这个报错:
Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.

这里选择的JPA实现是Hibernate。

 

3.指定使用的数据库连接和事务管理

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef="terminalEntityManagerFactory",
        transactionManagerRef="terminalTransactionManager",basePackages= { "gdut.ff.terminal"})
public class DataSourceConfiguration {
    
    @Autowired
    private JpaProperties jpaProperties;
    
    @Bean
    @Primary
    @ConfigurationProperties(prefix = "spring.datasource.terminal")
    public DataSource terminalDataSource(){
        return DataSourceBuilder.create().build();
    }
    
    @Bean(name = "terminalEntityManagerFactory")
    @Primary
    public LocalContainerEntityManagerFactoryBean terminalEntityManagerFactory(EntityManagerFactoryBuilder builder){
        LocalContainerEntityManagerFactoryBean em = builder.dataSource(terminalDataSource())
                                                           .packages("gdut.ff.terminal")
                                                           .persistenceUnit("terminal")
                                                           .properties(getVendorProperties(terminalDataSource()))
                                                           .build();
        return em;
    }
    
    @Primary
    @Bean(name = "entityManagerTerminal")
    public EntityManager entityManagerDefault(EntityManagerFactoryBuilder builder) {
        return terminalEntityManagerFactory(builder).getObject().createEntityManager();
    }
    
    private Map<String, String> getVendorProperties(DataSource dataSource) {
        return jpaProperties.getHibernateProperties(dataSource);
    }
    
    @Bean(name = "terminalTransactionManager")
    @Primary
    PlatformTransactionManager terminalTransactionManager(EntityManagerFactoryBuilder builder){
        return new JpaTransactionManager(terminalEntityManagerFactory(builder).getObject());
    }

}

注意:

(1)entityManagerFactoryRef="terminalEntityManagerFactory"要与LocalContainerEntityManagerFactoryBean注册的@Bean(name = "terminalEntityManagerFactory")名称相同。

(2)transactionManagerRef="terminalTransactionManager"要与new JpaTransactionManager()注册的@Bean(name = "terminalTransactionManager")名称一致。

(3)basePackages= { "gdut.ff.terminal"}表示这个数据源作用在哪些包。也可以写做basePackages={"gdut.ff.terminal.**"},但是不能写做basePackages={"gdut.ff.terminal.*"}

(4)@Primary表示默认。

(5)@ConfigurationProperties(prefix = "spring.datasource.terminal")表示使用的数据源的前缀是"spring.datasource.terminal"。

(6)贴一下我的包图:

 

 4.建立一个实体Bean和对应的Dao接口

import java.util.List;

import org.springframework.data.repository.CrudRepository;

public interface TerminalMachineRepository extends CrudRepository<TerminalMachine,String>{

    List<TerminalMachine> findByName(String name);
}

CrudRepository<>里的是Bea实体和对应的主键类型。这里还可以继承其他的Repository接口,如JpaRepository和PagingAndSortingRepository等等。

 

5.设置启动类App.class

package gdut.ff.config;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan({"gdut.ff.terminal.**","gdut.ff.config.**"})
public class App {

    public static void main(String[] args) throws Exception {
        
        SpringApplication.run(App.class, args);
        
    }
}

启动类App.class启动,扫描包gdut.ff.terminal和gdut.ff.config下的类

 

6.做一个单元测试

import java.util.Iterator;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import gdut.ff.config.App;

@RunWith(SpringRunner.class)
@SpringBootTest(classes=App.class)
public class TestTerminalMachine {
    
    @Autowired
    private TerminalMachineRepository terminalMachineRepository;
    
    @Test
    public void testFindAll(){
        Iterable<TerminalMachine> list = terminalMachineRepository.findAll();
        Iterator<TerminalMachine> iterator = list.iterator();
        while(iterator.hasNext()){
            TerminalMachine machine = iterator.next();
            System.out.println(machine.getName());
        }
    }

}

 

转载于:https://www.cnblogs.com/bulesnail95/p/8119855.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值