项目地址:
https://github.com/FateSolo/DAO-Test
目录:
该系列文章将展示六种不同的DAO层实现方法并总结其不同,本章使用JPA (Hibernate实现) 完成DAO操作。
1. 示例代码:
1) 在spring-common.xml中,配置JPA的EntityManagerFactory:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20<!-- JPA -->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="packagesToScan" value="com.fatesolo.entity"/>
<property name="jpaVendorAdapter" ref="jpaVendorAdapter"/>
<property name="jpaProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
</bean>
<bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="generateDdl" value="false"/>
<property name="database" value="MYSQL"/>
<property name="databasePlatform" value="org.hibernate.dialect.MySQL5InnoDBDialect"/>
</bean>
注释掉Hibernate的事务管理器,并配置JPA的事务管理器1
2
3
4
5
6<!-- 配置 JPA 事务 -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
2) 在dao.impl包中创建BookDaoJpaImpl.java,编写如下代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34package com.fatesolo.dao.impl;
import com.fatesolo.dao.BookDao;
import com.fatesolo.entity.Book;
import org.springframework.stereotype.Repository;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import java.util.List;
@Repository("bookDaoJpaImpl")
public class BookDaoJpaImpl implements BookDao {
@PersistenceContext(unitName = "entityManagerFactory")
private EntityManager entityManager;
@Override
public Book findById(int id) {
return entityManager.find(Book.class, id);
}
@Override
public List<Book> findByNameContaining(String name) {
return entityManager.createQuery("select b from Book b where b.name like ?", Book.class)
.setParameter(0, "%" + name + "%")
.getResultList();
}
@Override
public void save(Book book) {
entityManager.persist(book);
}
}
3) 打开BookService.java,修改成员变量bookDao的注解:1
@Resource(name = "bookDaoJpaImpl")
2. 项目运行:
1) 使用Tomcat 8运行项目,使用curl工具添加一条数据:1
curl -d "name=Test5&author=Fate" http://localhost:8080/book
得到如下返回:1
Book{id=5, name='Test5', author='Fate'}
2) 访问http://localhost:8080/book/5 ,得到如下结果:1
Book{id=5, name='Test5', author='Fate'}
3) 访问http://localhost:8080/book/name/Test ,得到如下结果:1
[Book{id=1, name='Test1', author='Fate'}, Book{id=2, name='Test2', author='Fate'}, Book{id=3, name='Test3', author='Fate'}, Book{id=4, name='Test4', author='Fate'}, Book{id=5, name='Test5', author='Fate'}]
3. 总结
JPA是JSR-220标准的一部分,本身并不提供实现,只是统一规范了API,而Hibernate已经支持了JPA标准,所以可以作为其具体实现。
可以看到JPA使用EntityManager进行的操作和Hibernate使用SessionFactory类似,但因为其是统一的标准,所以如果要更换其实现时,逻辑代码无需改动,只需在配置文件中修改即可,而如果使用的是Hibernate自己的API的话,当要更换ORM框架时,要进行大量的逻辑代码改动。
作者 [@FateSolo]
2017 年 03月 12日