Maison Java javaDidacticiel Explication détaillée d'exemples d'intégration Spring Data JPA implémentés par SpringBoot

Explication détaillée d'exemples d'intégration Spring Data JPA implémentés par SpringBoot

May 04, 2017 am 10:39 AM
boot data jpa spring 读写分离

Cet article présente principalement les connaissances pertinentes de SpringBoot intégrant Spring Data JPA et la séparation en lecture et en écriture. Les amis dans le besoin peuvent se référer au

code associé : github OSCchina

<.>Qu'est-ce que JPA

JPA (Java Persistence

API) est la spécification de persistance Java officiellement proposée par Sun, qui fournit aux développeurs Java un Objet/outil de mappage d'association pour gérer les données relationnelles dans les applications Java. Il comprend les aspects suivants :

1. Le mappage ORM prend en charge

xml et les méthodes d'annotation pour établir le mappage d'entités et de tables entre.

2. L'API de persistance Java définit certaines CRUD

interfaces couramment utilisées, qu'il suffit d'appeler directement sans tenir compte des détails du JDBC et du SQL sous-jacents.

3.JPQL

RequêteLangage Il s'agit d'un aspect très important dans les opérations de persistance. Interrogez les données via Orienté objet au lieu d'un langage de requête orienté base de données pour éviter que les instructions SQL du programme ne soient étroitement couplées.

Dans notre travail, nous utilisons tous des technologies ORM, telles que Hibernate, JOOQ, etc. En fonction des besoins, nous utiliserons différents ORM

frameworks lorsque nous aurons besoin de changer Quand le framework ORM répond à nos besoins, nous avons souvent besoin de reconstruire le code en raison des différences dans la mise en œuvre, l'utilisation et les différences des différents frameworks ORM. L'émergence de JPA est de résoudre ce problème en absorbant pleinement certains des avantages existants de l'ORM. framework sont faciles à utiliser et très évolutifs. Il fournit un ensemble d'interfaces standard pour la technologie ORM afin d'intégrer différents frameworks ORM.

Implémentation de JPA par Hibernate

JPA lui-même n'implémente pas d'implémentations spécifiques, mais définit uniquement certaines spécifications d'interface, permettant à

d'autres ORM d'implémenter ces interfaces spécifiquement. Pour l'instant, la meilleure implémentation de la spécification JPA est Hibernate. ici, Mybatis n'implémente pas la spécification JPA, et elle ne peut pas être considérée comme un véritable framework ORM

Spring Data JPA Qu'est-ce que Spring Data JPA n'est qu'un module du framework Spring Data, qui peut grandement simplifier l'utilisation de JPA. La puissance de Spring Data JPA est qu'il peut simplifier notre logique métier de couche de persistance en standardisant les noms des méthodes de couche de persistance et en utilisant le. noms pour déterminer quelle logique métier doit être implémentée, nous avons la possibilité de terminer la plupart de notre développement sans écrire une phrase SQL ni faire de logique de couche DAO. Bien sûr, pour certaines requêtes complexes avec des exigences de performances élevées, Spring Data JPA. nous aide également à utiliser SQL natif.

Ici, nous n'introduireons pas grand-chose sur JPA et Spring Data JPA, principalement quelques détails d'intégration avec SpringBoot et Sample.

Présentation de la dépendance

Après avoir introduit cette dépendance, nous avons constaté que le package Hibernate a également été introduit, qui est maintenant un L'approche par défaut est qu'Hibernate a été considéré comme la meilleure implémentation de la spécification JPA. La configuration de la source de données Druid ne sera pas présentée ici. Vous pouvez lire un autre article XXXX.
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-jpa -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
Copier après la connexion

Configuration de notre source de données et JPA (Hibernate).

#配置模板
#https://docs.spring.io/spring-boot/docs/1.4.0.RELEASE/reference/html/common-application-properties.html
#数据源
spring.datasource.druid.write.url=jdbc:mysql://localhost:3306/jpa
spring.datasource.druid.write.username=root
spring.datasource.druid.write.password=1
spring.datasource.druid.write.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.druid.read.url=jdbc:mysql://localhost:3306/jpa
spring.datasource.druid.read.username=root
spring.datasource.druid.read.password=1
spring.datasource.druid.read.driver-class-name=com.mysql.jdbc.Driver
#JPA (JpaBaseConfiguration, HibernateJpaAutoConfiguration)
spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect
spring.jpa.database=mysql
spring.jpa.generate-ddl=true
#就是hibernate.hbm2ddl.auto,具体说明可以看README
spring.jpa.hibernate.ddl-auto=update
#通过方法名解析sql的策略,具体说明可以看README,这里就不配置了
spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.DefaultComponentSafeNamingStrategy
spring.jpa.show-sql=true
#spring.jpa.properties.*
#spring.jpa.properties.hibernate.hbm2ddl.auto=update
#spring.jpa.properties.hibernate.show_sql=true
#spring.jpa.properties.hibernate.use-new-id-generator-mappings=true
Copier après la connexion
Injection de source de données Druid

@Configuration
public class DruidDataSourceConfig {
  /**
   * DataSource 配置
   * @return
   */
  @ConfigurationProperties(prefix = "spring.datasource.druid.read")
  @Bean(name = "readDruidDataSource")
  public DataSource readDruidDataSource() {
    return new DruidDataSource();
  }
  /**
   * DataSource 配置
   * @return
   */
  @ConfigurationProperties(prefix = "spring.datasource.druid.write")
  @Bean(name = "writeDruidDataSource")
  @Primary
  public DataSource writeDruidDataSource() {
    return new DruidDataSource();
  }
}
Copier après la connexion
Injection d'instance EntityManagerFactory

EntityManagerFactory est similaire à SessionFactory d'Hibernate et SqlSessionFactory de mybatis. En bref, avant d'effectuer une opération, nous devons toujours obtenir un EntityManager, qui est similaire à la Session d'Hibernate et à la sqlSession de mybatis. Il existe deux façons d'injecter EntityManagerFactory, l'une consiste à injecter directement EntityManagerFactory et l'autre. L'autre consiste à injecter indirectement via LocalContainerEntityManagerFactoryBean Bien que ces deux méthodes soient basées sur LocalContainerEntityManagerFactoryBean, il existe encore quelques différences dans la configuration

1. Injectez directement EntityManagerFactory

Configuration. Configurez les propriétés

d'Hibernate via spring.jpa.properties.* Configuration d'EntityManagerFactory

 :

spring.jpa.properties.hibernate.hbm2ddl.auto=update
spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.use-new-id-generator-mappings=true
@Configuration
@EnableJpaRepositories(value = "com.lc.springBoot.jpa.repository",
            entityManagerFactoryRef = "writeEntityManagerFactory",
            transactionManagerRef="writeTransactionManager")
public class WriteDataSourceConfig {
  @Autowired
  JpaProperties jpaProperties;
  @Autowired
  @Qualifier("writeDruidDataSource")
  private DataSource writeDruidDataSource;
  /**
   * EntityManagerFactory类似于Hibernate的SessionFactory,mybatis的SqlSessionFactory
   * 总之,在执行操作之前,我们总要获取一个EntityManager,这就类似于Hibernate的Session,
   * mybatis的sqlSession.
   * @return
   */
  @Bean(name = "writeEntityManagerFactory")
  @Primary
  public EntityManagerFactory writeEntityManagerFactory() {
    HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
    LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
    factory.setJpaVendorAdapter(vendorAdapter);
    factory.setPackagesToScan("com.lc.springBoot.jpa.entity");
    factory.setDataSource(writeDruidDataSource);//数据源
    factory.setJpaPropertyMap(jpaProperties.getProperties());
    factory.afterPropertiesSet();//在完成了其它所有相关的配置加载以及属性设置后,才初始化
    return factory.getObject();
  }
  /**
   * 配置事物管理器
   * @return
   */
  @Bean(name = "writeTransactionManager")
  @Primary
  public PlatformTransactionManager writeTransactionManager() {
    JpaTransactionManager jpaTransactionManager = new JpaTransactionManager();
    jpaTransactionManager.setEntityManagerFactory(this.writeEntityManagerFactory());
    return jpaTransactionManager;
  }
}
Copier après la connexion

Pour cette configuration, le

getObject () peut obtenir une instance de EntityManagerFactory, qui semble être la même que la première. Il n'y a pas de différence, mais nous ne pouvons pas utiliser getObject() directement, sinon nous ne pourrons pas l'obtenir, et une exception de pointeur nul le fera être signalé.

spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect
spring.jpa.database=mysql
spring.jpa.generate-ddl=true
#就是hibernate.hbm2ddl.auto,具体说明可以看README
spring.jpa.hibernate.ddl-auto=update
#通过方法名解析sql的策略,具体说明可以看README,这里就不配置了
spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.DefaultComponentSafeNamingStrategy
spring.jpa.show-sql=true
@Configuration
@EnableJpaRepositories(value = "com.lc.springBoot.jpa.repository",
    entityManagerFactoryRef = "writeEntityManagerFactory",
    transactionManagerRef = "writeTransactionManager")
public class WriteDataSourceConfig1 {
  @Autowired
  JpaProperties jpaProperties;
  @Autowired
  @Qualifier("writeDruidDataSource")
  private DataSource writeDruidDataSource;
  /**
   * 我们通过LocalContainerEntityManagerFactoryBean来获取EntityManagerFactory实例
   * @return
   */
  @Bean(name = "writeEntityManagerFactoryBean")
  @Primary
  public LocalContainerEntityManagerFactoryBean writeEntityManagerFactoryBean(EntityManagerFactoryBuilder builder) {
    return builder
        .dataSource(writeDruidDataSource)
        .properties(jpaProperties.getProperties())
        .packages("com.lc.springBoot.jpa.entity") //设置实体类所在位置
        .persistenceUnit("writePersistenceUnit")
        .build();
    //.getObject();//不要在这里直接获取EntityManagerFactory
  }
  /**
   * EntityManagerFactory类似于Hibernate的SessionFactory,mybatis的SqlSessionFactory
   * 总之,在执行操作之前,我们总要获取一个EntityManager,这就类似于Hibernate的Session,
   * mybatis的sqlSession.
   * @param builder
   * @return
   */
  @Bean(name = "writeEntityManagerFactory")
  @Primary
  public EntityManagerFactory writeEntityManagerFactory(EntityManagerFactoryBuilder builder) {
    return this.writeEntityManagerFactoryBean(builder).getObject();
  }
  /**
   * 配置事物管理器
   * @return
   */
  @Bean(name = "writeTransactionManager")
  @Primary
  public PlatformTransactionManager writeTransactionManager(EntityManagerFactoryBuilder builder) {
    return new JpaTransactionManager(writeEntityManagerFactory(builder));
  }
}
Copier après la connexion

Configuration de séparation en lecture-écriture

@Bean(name = "writeEntityManagerFactoryBean")
  @Primary
  public LocalContainerEntityManagerFactoryBean writeEntityManagerFactoryBean(EntityManagerFactoryBuilder builder) {
    return builder
        .dataSource(writeDruidDataSource)
        .properties(jpaProperties.getProperties())
        .packages("com.lc.springBoot.jpa.entity") //设置实体类所在位置
        .persistenceUnit("writePersistenceUnit")
        .build();
    //.getObject();//不要在这里直接获取EntityManagerFactory
  }
Copier après la connexion

Injection personnalisée de AbstractRoutingDataSource

Annotation personnalisée.

@Configuration
public class DataSourceConfig {
  private final static String WRITE_DATASOURCE_KEY = "writeDruidDataSource";
  private final static String READ_DATASOURCE_KEY = "readDruidDataSource";
  /**
   * 注入AbstractRoutingDataSource
   * @param readDruidDataSource
   * @param writeDruidDataSource
   * @return
   * @throws Exception
   */
  @Bean
  public AbstractRoutingDataSource routingDataSource(
      @Qualifier(READ_DATASOURCE_KEY) DataSource readDruidDataSource,
      @Qualifier(WRITE_DATASOURCE_KEY) DataSource writeDruidDataSource
  ) throws Exception {
    DynamicDataSource dataSource = new DynamicDataSource();
    Map<Object, Object> targetDataSources = new HashMap();
    targetDataSources.put(WRITE_DATASOURCE_KEY, writeDruidDataSource);
    targetDataSources.put(READ_DATASOURCE_KEY, readDruidDataSource);
    dataSource.setTargetDataSources(targetDataSources);
    dataSource.setDefaultTargetDataSource(writeDruidDataSource);
    return dataSource;
  }
}
Copier après la connexion
Utilisez ThreadLocal pour lier la source de données au fil

Définir les aspects
  @Target({ElementType.METHOD, ElementType.TYPE})
  @Retention(RetentionPolicy.RUNTIME)
  @Documented
  public @interface TargetDataSource {
    String dataSource() default "";//数据源
  }
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Fichier ISO Windows trop volumineux Erreur BootCamp [Corrigé] Fichier ISO Windows trop volumineux Erreur BootCamp [Corrigé] Feb 19, 2024 pm 12:30 PM

Si vous recevez le message d'erreur « Le fichier ISO Windows est trop volumineux » lorsque vous utilisez BootCampAssistant sur un ordinateur Mac, cela peut être dû au fait que la taille du fichier ISO dépasse la limite prise en charge par BootCampAssistant. La solution à ce problème consiste à utiliser d'autres outils pour compresser la taille du fichier ISO afin de garantir qu'il puisse être traité dans BootCamp Assistant. BootCampAssistant est un outil pratique fourni par Apple pour installer et exécuter le système d'exploitation Windows sur les ordinateurs Mac. Il aide les utilisateurs à configurer un système à double démarrage, leur permettant de choisir facilement d'utiliser MacOS ou Wind au démarrage.

Un nouveau paradigme de programmation, quand Spring Boot rencontre OpenAI Un nouveau paradigme de programmation, quand Spring Boot rencontre OpenAI Feb 01, 2024 pm 09:18 PM

En 2023, la technologie de l’IA est devenue un sujet brûlant et a un impact énorme sur diverses industries, notamment dans le domaine de la programmation. Les gens sont de plus en plus conscients de l’importance de la technologie de l’IA, et la communauté Spring ne fait pas exception. Avec l’évolution continue de la technologie GenAI (Intelligence Artificielle Générale), il est devenu crucial et urgent de simplifier la création d’applications dotées de fonctions d’IA. Dans ce contexte, « SpringAI » a émergé, visant à simplifier le processus de développement d'applications fonctionnelles d'IA, en le rendant simple et intuitif et en évitant une complexité inutile. Grâce à « SpringAI », les développeurs peuvent plus facilement créer des applications dotées de fonctions d'IA, ce qui les rend plus faciles à utiliser et à exploiter.

Lequel est le meilleur, jpa ou mybatis ? Lequel est le meilleur, jpa ou mybatis ? Jan 15, 2024 pm 01:48 PM

Le choix de JPA ou MyBatis dépend de besoins et de préférences spécifiques. JPA et MyBatis sont tous deux des frameworks de couche de persistance Java et tous deux fournissent la fonction de mapper des objets Java aux tables de base de données. Si vous avez besoin d'un framework mature prenant en charge les opérations entre bases de données, ou si le projet a déjà adopté JPA comme solution de couche de persistance, continuer à utiliser JPA peut être un meilleur choix. Si vous souhaitez des performances plus élevées et des capacités d'écriture SQL plus flexibles, ou si vous recherchez une solution moins dépendante de la base de données, MyBatis est plus adapté.

Utilisez Spring Boot et Spring AI pour créer des applications d'intelligence artificielle générative Utilisez Spring Boot et Spring AI pour créer des applications d'intelligence artificielle générative Apr 28, 2024 am 11:46 AM

En tant que leader du secteur, Spring+AI fournit des solutions de pointe pour divers secteurs grâce à son API puissante et flexible et ses fonctions avancées. Dans cette rubrique, nous examinerons les exemples d'application de Spring+AI dans divers domaines. Chaque cas montrera comment Spring+AI répond à des besoins spécifiques, atteint ses objectifs et étend ces LEÇONS APPRISES à une gamme plus large d'applications. J'espère que ce sujet pourra vous inciter à comprendre et à utiliser plus profondément les possibilités infinies de Spring+AI. Le framework Spring a une histoire de plus de 20 ans dans le domaine du développement logiciel, et cela fait 10 ans que la version Spring Boot 1.0 est sortie. Maintenant, personne ne peut contester ce printemps

Quelles sont les méthodes de mise en œuvre des transactions programmatiques Spring ? Quelles sont les méthodes de mise en œuvre des transactions programmatiques Spring ? Jan 08, 2024 am 10:23 AM

Comment implémenter les transactions programmatiques Spring : 1. Utilisez TransactionTemplate ; 2. Utilisez TransactionCallback et TransactionCallbackWithoutResult ; 3. Utilisez les annotations Transactional ; 4. Utilisez TransactionTemplate en combinaison avec @Transactional ;

Analyse comparative des fonctions et performances de JPA et MyBatis Analyse comparative des fonctions et performances de JPA et MyBatis Feb 19, 2024 pm 05:43 PM

JPA et MyBatis : analyse comparative des fonctions et des performances Introduction : Dans le développement Java, le framework de persistance joue un rôle très important. Les frameworks de persistance courants incluent JPA (JavaPersistenceAPI) et MyBatis. Cet article procédera à une analyse comparative des fonctions et des performances des deux frameworks et fournira des exemples de code spécifiques. 1. Comparaison des fonctions : JPA : JPA fait partie de JavaEE et fournit une solution de persistance des données orientée objet. Il est passé une annotation ou X

Comment définir le niveau d'isolement des transactions au printemps Comment définir le niveau d'isolement des transactions au printemps Jan 26, 2024 pm 05:38 PM

Comment définir le niveau d'isolement des transactions dans Spring : 1. Utilisez l'annotation @Transactional ; 2. Définissez-le dans le fichier de configuration Spring ; 3. Utilisez PlatformTransactionManager ; Introduction détaillée : 1. Utilisez l'annotation @Transactional, ajoutez l'annotation @Transactional à la classe ou à la méthode qui nécessite la gestion des transactions et définissez le niveau d'isolement dans l'attribut 2. Dans le fichier de configuration Spring, etc.

Recommandations de projets open source Java JPA : Injectez une nouvelle vitalité à votre projet Recommandations de projets open source Java JPA : Injectez une nouvelle vitalité à votre projet Feb 20, 2024 am 09:09 AM

Dans le domaine de la programmation Java, JPA (JavaPersistence API), en tant que framework de persistance populaire, offre aux développeurs un moyen pratique d'exploiter des bases de données relationnelles. En utilisant JPA, les développeurs peuvent facilement conserver les objets Java dans la base de données et récupérer les données de la base de données, améliorant ainsi considérablement l'efficacité et la maintenabilité du développement d'applications. Cet article sélectionne soigneusement 10 projets open source JavaJPA de haute qualité, couvrant une variété de fonctions et de scénarios d'application différents, dans le but de fournir aux développeurs plus d'inspiration et de solutions pour les aider à créer des applications plus efficaces et plus fiables. Ces projets incluent : SpringDataJPA : springDataJPA est Spr

See all articles