SpringBoot로 구현된 Spring Data JPA 통합 예제에 대한 자세한 설명
이 글에서는 Spring Data JPA와 읽기/쓰기 분리를 통합한 SpringBoot 관련 지식을 주로 소개합니다. 필요한 친구들은
관련 코드를 참고하세요: github OSCchina
JPA란
JPA(Java Persistence API)는 Sun에서 공식적으로 제안한 Java 지속성 사양으로, Java 개발자에게 객체/association 매핑 도구는 다음과 같은 측면을 포함합니다:
1. ORM 매핑은 xml과 주석 메서드를 지원하여 엔터티와 테이블 간의 매핑을 설정합니다.
2. Java 지속성 API는 일반적으로 사용되는 일부 CRUD인터페이스를 정의하며, 기본 JDBC 및 SQL의 세부 사항을 고려하지 않고 직접 호출하기만 하면 됩니다.
3.JPQL 쿼리언어 이는 지속성 작업에서 매우 중요한 측면입니다. 프로그램의 SQL 문이 긴밀하게 결합되지 않도록 데이터베이스 지향 쿼리 언어 대신 객체 지향을 통해 데이터를 쿼리합니다.
작업에서 우리는 모두 Hibernate, JOOQ 등과 같은 ORM 기술을 사용합니다. 필요에 따라 변경해야 할 때 다른 ORM프레임워크를 사용합니다. ORM 프레임워크가 필요할 때 우리의 요구 사항을 충족하려면 구현, 사용법, 다양한 ORM 프레임워크의 차이로 인해 코드를 재구성해야 하는 경우가 많습니다. JPA의 등장은 이러한 문제를 ORM의 기존 장점 중 일부를 완전히 흡수하는 것입니다. 프레임워크의 장점은 사용하기 쉽고 다양한 ORM 프레임워크를 통합하기 위한 ORM 기술용 표준 인터페이스 세트를 제공한다는 것입니다.
Hibernate의 JPA 구현
JPA 자체는 특정 구현을 구현하지 않고 일부 인터페이스 사양만 정의하므로 다른 ORM이 이러한 인터페이스를 구체적으로 구현할 수 있습니다. 현재 JPA 사양의 가장 좋은 구현은 Hibernate입니다. 여기서 Mybatis에 대해 언급하겠습니다. Mybatis는 JPA 사양을 구현하지 않으며 자체적으로 실제 ORM 프레임워크로 간주할 수 없습니다.
Spring Data JPA란
Spring Data JPA는 JPA 사용을 크게 단순화할 수 있는 Spring Data 프레임워크의 모듈일 뿐입니다. Spring Data JPA의 장점은 지속성 계층의 이름을 표준화하여 지속성 계층 비즈니스 로직을 단순화할 수 있다는 것입니다. 구현해야 할 비즈니스 로직을 결정하기 위해 메서드와 이름을 사용하면 SQL 문장을 작성하거나 DAO 레이어 로직을 수행하지 않고도 대부분의 개발을 완료할 수 있습니다. 물론 고성능 요구 사항이 있는 일부 복잡한 쿼리의 경우입니다. , Spring Data JPA는 기본 SQL 사용도 지원합니다.
여기에서는 JPA와 Spring Data JPA에 대해 너무 많이 소개하지 않고 주로 SpringBoot 및 예제와의 통합에 대한 몇 가지 세부 사항을 소개합니다.
종속성 소개
<!-- 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>
이 종속성을 도입한 후 우리는 Hibernate 패키지도 도입되었음을 발견했습니다. 이는 이제 기본 Practice입니다. Hibernate는 최고의 구현으로 간주되었습니다. 여기서는 Druid 데이터 소스 구성에 대해 소개하지 않겠습니다. XXXX의 다른 기사를 읽어보세요.
Configuring our data source And 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
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(); } }
EntityManagerFactory 인스턴스 삽입
EntityManagerFactory는 Hibernate의 SessionFactory 및 mybatis의 SqlSessionFactory와 유사합니다. 즉, 작업을 수행하기 전에 항상 Hibernate의 Session 및 mybatis의 sqlSession과 유사한 EntityManager를 얻어야 합니다. EntityManagerFactory를 주입하는 방법에는 두 가지가 있습니다. 하나는 EntityManagerFactory를 직접 주입하는 것이고, 다른 하나는 LocalContainerEntityManagerFactoryBean을 통해 간접적으로 주입하는 것입니다. . 이 두 메소드는 LocalContainerEntityManagerFactoryBean을 기반으로 하지만 여전히 구성에는 약간의 차이가 있습니다.
1. EntityManagerFactory
구성: 다음을 통해 Hibernate의 속성을 구성합니다. 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 @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; } }
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)); } }
@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 }
@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; } }
ThreadLocal을 사용하여 데이터 소스를 스레드에 바인딩
@Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface TargetDataSource { String dataSource() default "";//数据源 }
위 내용은 SpringBoot로 구현된 Spring Data JPA 통합 예제에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제










![Windows ISO 파일이 너무 큼 BootCamp 오류 [수정됨]](https://img.php.cn/upload/article/000/887/227/170831702395455.jpg?x-oss-process=image/resize,m_fill,h_207,w_330)
Mac 컴퓨터에서 BootCampAssistant를 사용할 때 "Windows ISO 파일이 너무 큽니다"라는 오류 메시지가 표시되는 경우 ISO 파일 크기가 BootCampAssistant에서 지원하는 제한을 초과했기 때문일 수 있습니다. 이 문제에 대한 해결책은 다른 도구를 사용하여 ISO 파일 크기를 압축하여 BootCamp Assistant에서 처리할 수 있도록 하는 것입니다. BootCampAssistant는 Mac 컴퓨터에 Windows 운영 체제를 설치하고 실행하기 위해 Apple에서 제공하는 편리한 도구입니다. 사용자가 듀얼 부팅 시스템을 설정하여 시작 시 MacOS 또는 Wind를 사용하도록 쉽게 선택할 수 있습니다.

2023년에는 AI 기술이 화두가 되면서 다양한 산업, 특히 프로그래밍 분야에 큰 영향을 미치고 있다. 사람들은 AI 기술의 중요성을 점점 더 인식하고 있으며 Spring 커뮤니티도 예외는 아닙니다. GenAI(일반 인공 지능) 기술이 지속적으로 발전함에 따라 AI 기능을 갖춘 애플리케이션 생성을 단순화하는 것이 중요하고 시급해졌습니다. 이러한 배경에서 AI 기능 애플리케이션 개발 프로세스를 단순화하고 간단하고 직관적이며 불필요한 복잡성을 피하는 것을 목표로 하는 "SpringAI"가 등장했습니다. 'SpringAI'를 통해 개발자는 AI 기능이 포함된 애플리케이션을 더욱 쉽게 구축할 수 있어 사용 및 운영이 더욱 쉬워진다.

JPA 또는 MyBatis 선택은 특정 요구 사항과 선호 사항에 따라 다릅니다. JPA와 MyBatis는 모두 Java 지속성 계층 프레임워크이며 둘 다 Java 개체를 데이터베이스 테이블에 매핑하는 기능을 제공합니다. 데이터베이스 간 작업을 지원하는 성숙한 프레임워크가 필요하거나 프로젝트가 이미 지속성 계층 솔루션으로 JPA를 채택한 경우 JPA를 계속 사용하는 것이 더 나은 선택일 수 있습니다. 더 높은 성능과 더 유연한 SQL 작성 기능을 원하거나 데이터베이스에 덜 의존적인 솔루션을 찾고 있다면 MyBatis가 더 적합합니다.

업계 리더인 Spring+AI는 강력하고 유연한 API와 고급 기능을 통해 다양한 산업에 선도적인 솔루션을 제공합니다. 이 주제에서는 다양한 분야의 Spring+AI 적용 사례를 살펴보겠습니다. 각 사례에서는 Spring+AI가 어떻게 특정 요구 사항을 충족하고 목표를 달성하며 이러한 LESSONSLEARNED를 더 넓은 범위의 애플리케이션으로 확장하는지 보여줍니다. 이 주제가 여러분이 Spring+AI의 무한한 가능성을 더 깊이 이해하고 활용하는 데 영감을 줄 수 있기를 바랍니다. Spring 프레임워크는 소프트웨어 개발 분야에서 20년 이상의 역사를 가지고 있으며, Spring Boot 1.0 버전이 출시된 지 10년이 되었습니다. 이제 봄이 왔다는 것에 대해 누구도 이의를 제기할 수 없습니다.

Spring 프로그래밍 방식 트랜잭션을 구현하는 방법: 1. TransactionCallback 및 TransactionCallbackWithoutResult를 사용합니다. 3. Transactional 주석을 사용합니다. 4. @Transactional과 함께 TransactionTemplate을 사용합니다.

JPA와 MyBatis: 기능과 성능의 비교 분석 소개: Java 개발에서 지속성 프레임워크는 매우 중요한 역할을 합니다. 일반적인 지속성 프레임워크에는 JPA(JavaPersistenceAPI) 및 MyBatis가 포함됩니다. 이 기사에서는 두 프레임워크의 기능과 성능을 비교 분석하고 구체적인 코드 예제를 제공합니다. 1. 기능 비교: JPA: JPA는 JavaEE의 일부이며 객체 지향 데이터 지속성 솔루션을 제공합니다. 주석 또는 X가 전달되었습니다.

Spring에서 트랜잭션 격리 수준을 설정하는 방법: 1. @Transactional 주석을 사용합니다. 2. Spring 구성 파일에서 설정합니다. 3. PlatformTransactionManager를 사용합니다. 4. Java 구성 클래스에서 설정합니다. 자세한 소개: 1. @Transactional 주석을 사용하고, 트랜잭션 관리가 필요한 클래스나 메소드에 @Transactional 주석을 추가하고, 속성에서 격리 수준을 설정합니다. 2. Spring 구성 파일에서 등.

Java 프로그래밍 분야에서 널리 사용되는 지속성 프레임워크인 JPA(JavaPersistence API)는 개발자에게 관계형 데이터베이스를 운영하는 편리한 방법을 제공합니다. JPA를 사용하면 개발자는 Java 개체를 데이터베이스에 쉽게 유지하고 데이터베이스에서 데이터를 검색할 수 있으므로 애플리케이션 개발 효율성과 유지 관리성이 크게 향상됩니다. 이 기사에서는 개발자에게 보다 효율적이고 안정적인 애플리케이션을 만드는 데 도움이 되는 더 많은 영감과 솔루션을 제공하는 것을 목표로 다양한 기능과 애플리케이션 시나리오를 다루는 10개의 고품질 JavaJPA 오픈 소스 프로젝트를 신중하게 선택합니다. 이러한 프로젝트에는 다음이 포함됩니다. SpringDataJPA: springDataJPA는 Spr입니다.
