学习大纲:
回顾JPA和Spring对JPA的支持
在学习Spring Data JPA之前,我们先来回顾一下JPA的基本使用
-
首先在项目Resources中创建文件夹META-INF,编写persistence.xml配置文件
其中主要配置需要持久化的类/JPA实现的提供方/hibernate相关的属性配置 -
编写实体类:Person
@Entity @Getter@Setter@ToString public class Person { @Id //使用默认的主键自增长策略 @GeneratedValue private Long id; private String name; private Integer age; }
-
编写DAO接口和实现类
这里我们仅仅使用一个保存操作来测试JPA的基本使用public interface IPersonDao { void save(Person person); }
public class PersonDaoImpl implements IPersonDao { @PersistenceContext private EntityManager em; public void save(Person person) { EntityManager manager = Persistence.createEntityManagerFactory("myPersistence").createEntityManager(); manager.getTransaction().begin(); manager.persist(person); manager.getTransaction().commit(); manager.close(); } }
-
编写Service接口和实现类
public interface IPersonService { void save(Person person); }
public class PersonServiceImpl implements IPersonService { private IPersonDao dao= new PersonDaoImpl(); public void save(Person person) { dao.save(person); } }
-
编写测试类,对Service中得所有方法进行测试
public class PersonServiceImplTest { private IPersonService service= new PersonServiceImpl(); @Test public void testSave(){ Person person = new Person(); person.setName("Neld"); person.setAge(10); service.save(person); } }
测试执行结果:
Hibernate: drop table if exists Person
Hibernate: create table Person (id bigint not null auto_increment, age integer, name varchar(255), primary key (id))
Hibernate: insert into Person (age, name) values (?, ?)
以上是使用JPA实现基本的CRUD的流程,在完成一些基本配置(persistence.xml文件中的配置)之后,只需要在dao的实现类中,获取到EntityManager,然后执行对应的CRUD即可,SQL是有JPA的实现者Hibernate自动生成
问题:这里存在一个问题,就是dao实现类中实现CRUD还是存在较多的相同代码,每个CRUD方法中都需要执行相同的业务模块
EntityManager manager = Persistence.createEntityManagerFactory("myPersistence").createEntityManager();
manager.getTransaction().begin();
manager.getTransaction().commit();
manager.close();
既然存在这样的相同代码,我们就有理由使用更好的方式来解决这些代码
解决方案是使用Spring对JPA进行整合
Spring对JPA进行整合
接下来我们要做的是,将Service/DAO/EntityManager的生命周期都交给Spring来管理,实现起来很简单,只需要在applicationContext.xml文件中做如下配置即可:
cn.wolfcode
整合之后,DAO中的代码实现:
@Repository
public class PersonDaoImpl implements IPersonDao {
@PersistenceContext
private EntityManager em;
public void save(Person person) {
em.persist(person);
}
}
这里,我们使用PersistenceContext注解,让Spring自动从容器中根据EntityManagerFactory获取到EntityManager对象,并且我们也将事务管理交给了Spring来统一管理,
所以,现在需要我们程序员做的就是调用对应的CRUD方法完成数据的增删改查
以上是对在Spring环境中使用JPA的回顾,使用这种方式实现持久层的CRUD可以说已经相当简单了,作为Java工程师,我们可以不用手动编写复杂的SQL,就能很便捷快速的的完成数据的增删改查
但是,在Spring Data项目小组的大神眼里,这还不够,还是存在一点点瑕疵!
什么?我们现在在dao的实现方法中可是只需要编写一行代码就能完成对应的功能了,哪来的瑕疵?难道能简单到不写代码?
嗯,是的,这就是Spring Data JPA要实现的宏伟目标,只写dao接口,不写dao实现即可完成数据的CRUD
来吧,我们这就来感受一下Spring Data JPA的魅力!