通过Spring使用JPA进行数据访问

来源:互联网 发布:怎样增加淘宝账号的心 编辑:程序博客网 时间:2024/05/19 04:04

通过Spring使用JPA进行数据访问

  • 面向对象编程主要处理对象的层次结构。它们创建对象;在对象之间建立关联;修改对象属性;存储对象状态。
  • 对象-关系映射(Object-Relational Mapping,ORM)工具自动完成对象和关系数据之间的转换,从而让开发人员只需关注对象模型的开发。
  • JPA(Java Persistence API)
    1. 定义了Java在应用程序中对象-关系映射工具和框架应该如何处理与持久化相关的任务
    2. 定义了这些工具和框架应该向用户提供哪些功能,并对持久化操作进行标准化,以便在不同的应用程序中执行。

1. 概述ORM和JPA

ORM表示对象关系映射,尝试在应用程序端处理持久化数据,位于业务层和数据层之间,使得数据库和应用程序变得更加隔离,从而让开发人员以一种面向对象的方式思考问题,并将更多精力集中在业务逻辑的开发

  • 对象世界由通过组件或者继承层次结构而彼此相互关联的对象组成。对象内部的属性用来保存它们到底当前状态。
  • 关系世界由表、表中的列以及用来创建表之间关系的外键组成

范式不匹配

  • 对象之间相互管理,且这些关联有方向信息
  • 粒度 在一个类和一个表之间可能没有确切的一对一映射
  • 与继承和多态的行为相关。
  • 对象网络的按需遍历和关系世界中的数据获取方法彼此之间都不相互适用

ORM框架的构建块

  • 对象模型和关系模型之间的元数据映射
  • 用来在对象上执行相关操作的CRUD API(Create Read Update Delete)
  • 一种对象查询语言
  • 不同的数据获取策略和对象网络遍历功能,以便提高内存使用率以及数据获取时间性能

使用JPA的优点

  • JPA提供元数据发现功能
  • 标准和简化的配置
  • 标准的数据访问支持
  • 不同JPA的实现之间切换更加容易

将对象模型映射到关系模型

  • 类和表
@Entity@Table(name="")
  • 类的属性和表中的列
@Basic@Column
  • 对象关联和外键
    1. 一对一

      @OneToOne
      @JoinColumn(name="")
    2. 多对一

      @ManyToOne
      @JoinColumn(name="")
    3. 一对多

      @OneToMany
      @JoinColumn(name="")
    4. 多对多

      @ManyToMany
      @JoinTable(name="",joinColumns=@JoinColumn(name=""),inverseJoinColumns=@JoinColumn(name=""))
  • Java类型和SQL类型

配置和使用JPA

  • 添加依赖
Spring<!-- https://mvnrepository.com/artifact/org.springframework/spring-orm --><dependency>    <groupId>org.springframework</groupId>    <artifactId>spring-orm</artifactId>    <version>4.3.1.RELEASE</version></dependency><!-- https://mvnrepository.com/artifact/org.springframework/spring-context --><dependency>    <groupId>org.springframework</groupId>    <artifactId>spring-context</artifactId>    <version>4.3.1.RELEASE</version></dependency>Hibernate<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core --><dependency>    <groupId>org.hibernate</groupId>    <artifactId>hibernate-core</artifactId>    <version>5.2.1.Final</version></dependency><!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-entitymanager --><dependency>    <groupId>org.hibernate</groupId>    <artifactId>hibernate-entitymanager</artifactId>    <version>5.2.1.Final</version></dependency>H2<!-- https://mvnrepository.com/artifact/com.h2database/h2 --><dependency>    <groupId>com.h2database</groupId>    <artifactId>h2</artifactId>    <version>1.4.192</version></dependency>
  • 在resources下创建META-INF/persistent.xml文件
<?xml version="1.0" encoding="UTF-8"?><persistence version="2.0"             xmlns="http://java.sun.com/xml/ns/persistence"             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence    http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">    <!--使用本地事务-->    <persistence-unit name="test-jpa" transaction-type="RESOURCE_LOCAL">        <!--使用DriverManager直接打开连接-->        <properties>            <!--配置JDBC驱动类-->            <property name="hibernate.connection.driver_class" value="org.h2.Driver" />            <property name="hibernate.connection.url" value="jdbc:h2:tcp://localhost/~/test" />            <property name="hibernate.connection.username" value="sa" />            <property name="hibernate.connection.password" value="" />            <!--配置方言-->            <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" />            <!--配置更新数据库架构-->            <property name="hibernate.hbm2ddl.auto" value="update" />        </properties>    </persistence-unit></persistence>

执行CRUD操作

//创建Spring容器ApplicationContext applicationContext=new AnnotationConfigApplicationContext(Config.class);//获取EntityManagerFactoryEntityManagerFactory entityManagerFactory=applicationContext.getBean(EntityManagerFactory.class);//获取EntityManagerEntityManager entityManager=entityManagerFactory.createEntityManager();//开启事务EntityTransaction transaction=entityManager.getTransaction();transaction.begin();//测试Student student=new Student();student.setFirstName("Tom");student.setLastName("Cat");//持久化entityManager.persist(student);//删除entityManager.remove(student);//提交事务transaction.commit();//关闭entityManager.close();

使用对象查询语言进行查询

//创建一个查询Query query=entityManager.createQuery("select s from Student s where s.firstName like :firstName");//提供一个输入参数query.setParameter("firstName"List<Student> students=query.getResultList();

2. Spring的JPA支持

Spring的JPA带来的好处

  • 更容易且更强大的持久化单元配置
  • 自动EntityManager管理
  • 更容易的测试
  • 常见的数据库访问异常
  • 集成事务管理

在Spring容器中设置JPA

  • LocalEntityManagerFactoryBean
```- 通过JNDI进行EntityManagerFactory查找- LocalContainerEntityManagerFactoryBean

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(){
LocalContainerEntityManagerFactoryBean factoryBean=new LocalContainerEntityManagerFactoryBean();
//配置持久化提供方
factoryBean.setPersistenceProviderClass(HibernatePersistenceProvider.class);
//配置数据源
factoryBean.setDataSource(dataSource());
//配置包
factoryBean.setPackagesToScan(“org.pikachu.beginningspring”);
//配置属性映射
factoryBean.setJpaPropertyMap(jpaProperties());
//factoryBean.setJpaVendorAdapter(jpaVendorAdapter());
return factoryBean;

/**
* 使用该Bean获取JDBC连接
* @return
*/
@Bean
public DataSource dataSource(){
DriverManagerDataSource dataSource=new DriverManagerDataSource();
//配置驱动
dataSource.setDriverClassName(“org.h2.Driver”);
//配置Url
dataSource.setUrl(“jdbc:h2:tcp://localhost/~/test”);
//配置用户名
dataSource.setUsername(“sa”);
//配置密码
dataSource.setPassword(“”);
//返回数据源
return dataSource;
}

/**
* 提供特定于JPA的配置参数
* @return
*/
@Bean
public Map

###基于纯JPA实现DAO- 使用@PersistenceUnit

@PersistenceUnit
private EntityManagerFactory entityManagerFactory;
/**
* 保存
* @param student 学生类的引用
*/
public void save(Student student){
//创建EntityManager
EntityManager entityManager=entityManagerFactory.createEntityManager();
//开启事务
EntityTransaction transaction=entityManager.getTransaction();
transaction.begin();
//持久化
entityManager.persist(student);
//提交事务
transaction.commit();
//关闭
entityManager.close();
}

- 使用@PersistenceContext注意 配置类上的@EnableTransactionManagement,实现类上的@Transactional

@PersistenceContext
private EntityManager entityManager;
/**
* 保存
*
* @param book 书的引用
*/
@Override
public void save(Book book) {
entityManager.persist(book);

}

@Configuration
@EnableTransactionManagement
public class Config {

@Bean@Autowiredpublic PlatformTransactionManager transactionManager(        EntityManagerFactory entityManagerFactory) {    JpaTransactionManager transactionManager = new JpaTransactionManager();    transactionManager.setEntityManagerFactory(entityManagerFactory);    return transactionManager;}

}
@Transactional
public class BookServiceImpl implements BookService {
private BookDao bookDao;
/**
* 保存书
*
* @param book 书的引用
*/
@Override
public void save(Book book) {
bookDao.save(book);
}

}
“`

0 0