【Java教程】Day22-18 Spring框架:访问数据库—— 集成JPA

目录

  1. JPA与Hibernate的关系

  2. JPA的基础配置

    1. 依赖管理

    2. 配置DataSource和事务管理

  3. 使用JPA进行数据操作

    1. 注入EntityManager

    2. 查询操作

    3. 增删改操作

  4. 练习

  5. 小结


1. JPA与Hibernate的关系

在Spring中集成JPA时,首先要了解它与Hibernate的关系。JPA(Java Persistence API)是Java EE规范的一部分,它定义了一套用于对象关系映射(ORM)的标准接口。JPA本身并不提供具体的ORM实现,它依赖于第三方提供的实现,常见的有Hibernate、EclipseLink等。

Hibernate是JPA的一个实现,很多开发者使用JPA接口来操作数据库,而底层则选择Hibernate作为实现方案。Spring框架内置了JPA集成,可以很方便地选择不同的实现。


2. JPA的基础配置

2.1 依赖管理

在Spring中使用JPA时,我们需要引入相关的依赖,以下是Spring与Hibernate结合使用JPA时所需的依赖:

 

 

xml<dependency>    <groupId>org.springframework</groupId>    <artifactId>spring-context</artifactId>    <version>6.0.0</version></dependency><dependency>    <groupId>org.springframework</groupId>    <artifactId>spring-orm</artifactId>    <version>6.0.0</version></dependency><dependency>    <groupId>jakarta.annotation</groupId>    <artifactId>jakarta.annotation-api</artifactId>    <version>2.1.1</version></dependency><dependency>    <groupId>jakarta.persistence</groupId>    <artifactId>jakarta.persistence-api</artifactId>    <version>3.1.0</version></dependency><dependency>    <groupId>org.hibernate</groupId>    <artifactId>hibernate-core</artifactId>    <version>6.1.4.Final</version></dependency><dependency>    <groupId>com.zaxxer</groupId>    <artifactId>HikariCP</artifactId>    <version>5.0.1</version></dependency><dependency>    <groupId>org.hsqldb</groupId>    <artifactId>hsqldb</artifactId>    <version>2.7.1</version></dependency>

 

这些依赖中,Hibernate提供了JPA接口的实现,我们可以通过它来进行数据的持久化操作。

2.2 配置DataSource和事务管理

首先,我们需要在Spring配置类中启用事务管理,并配置数据源(DataSource):

 
java@Configuration@ComponentScan@EnableTransactionManagement@PropertySource("jdbc.properties")public class AppConfig {    @Bean    public DataSource createDataSource() {        // 数据源配置代码    }}

 

接下来,配置JPA相关的EntityManagerFactory,我们需要使用LocalContainerEntityManagerFactoryBean来创建EntityManagerFactory,并指定扫描的实体类包名:

 

 

java@Beanpublic LocalContainerEntityManagerFactoryBean createEntityManagerFactory(@Autowired DataSource dataSource) {    var emFactory = new LocalContainerEntityManagerFactoryBean();    emFactory.setDataSource(dataSource);    emFactory.setPackagesToScan(AbstractEntity.class.getPackageName());    emFactory.setJpaVendorAdapter(new HibernateJpaVendorAdapter());    var props = new Properties();    props.setProperty("hibernate.hbm2ddl.auto", "update");  // 生产环境要避免使用    props.setProperty("hibernate.dialect", "org.hibernate.dialect.HSQLDialect");    props.setProperty("hibernate.show_sql", "true");    emFactory.setJpaProperties(props);    return emFactory;}

 

最后,为了实现事务管理,我们需要配置JpaTransactionManager

 
java@Beanpublic PlatformTransactionManager createTxManager(@Autowired EntityManagerFactory entityManagerFactory) {    return new JpaTransactionManager(entityManagerFactory);}

 

至此,Spring配置的基础部分已经完成。

 


3. 使用JPA进行数据操作

3.1 注入EntityManager

在Spring中使用JPA时,我们需要注入EntityManager来进行数据操作。EntityManager的注入与@Autowired不同,JPA使用@PersistenceContext注解来注入:

 
java@Component@Transactionalpublic class UserService {    @PersistenceContext    private EntityManager em;}

 

通过@PersistenceContext,Spring会自动注入一个EntityManager代理类,它会在不同的线程中分别创建不同的EntityManager实例,从而确保线程安全。

3.2 查询操作

JPA提供了与Hibernate类似的查询方式,我们可以使用JPQL(Java Persistence Query Language)来进行查询。例如,使用主键查询:

 
javapublic User getUserById(long id) {    User user = this.em.find(User.class, id);    if (user == null) {        throw new RuntimeException("User not found by id: " + id);    }    return user;}

 

JPA也支持使用TypedQuery进行查询,下面是一个基于Email查询用户的例子:

 
javapublic User fetchUserByEmail(String email) {    TypedQuery<User> query = em.createQuery("SELECT u FROM User u WHERE u.email = :e", User.class);    query.setParameter("e", email);    List<User> list = query.getResultList();    return list.isEmpty() ? null : list.get(0);}

 

3.3 增删改操作

JPA提供了persistremovemerge方法来进行增、删、改操作,操作与Hibernate类似。

 
javapublic void addUser(User user) {    em.persist(user);  // 增加用户}public void deleteUser(User user) {    em.remove(user);  // 删除用户}public void updateUser(User user) {    em.merge(user);  // 更新用户}

 

这些操作的对象都是Entity Bean,也就是我们定义的Java类(如User类),JPA会自动将这些对象映射到数据库中的相应表。


4. 练习

为了加深对JPA操作的理解,你可以尝试以下练习:

  1. 创建一个User类,包含基本字段如idemailpassword等。

  2. 使用JPA查询用户信息,如通过email查询,或者通过id查询。

  3. 进行用户的增、删、改操作,体验JPA如何与数据库进行交互。

点击下载练习代码

 


5. 小结

  • 在Spring中集成JPA时,可以选择Hibernate或EclipseLink作为JPA的实现。

  • 使用JPA时,我们需要配置EntityManagerFactoryJpaTransactionManager

  • 通过@PersistenceContext注解,我们可以注入EntityManager,它是JPA的核心操作对象。

  • JPA的查询语法与Hibernate的HQL非常相似,可以使用JPQL进行复杂查询。

  • 数据的增删改操作可以通过persistremovemerge方法完成。

 

这就是今天我们关于Spring框架集成JPA的基本内容,掌握这些,你就能够高效地使用Spring来访问数据库,进行数据操作。

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值