JPA :由 Sun 公司提供了一对对于持久层操作的标准 ( 接口 + 文档 )Hibernate: 是 Gavin King 开发的一套对于持久层操作的自动的 ORM 框架。Hibernate JPA: 是在 Hibernate3.2 版本那种提供了对于 JPA 的标准的实现。提供了一套按照 JPA 标准来实现持久层开发的 API
按照JPA的标准,我们的配置文件需要更改如下
<!-- Spring整合JPA 配置EntityManagerFactory-->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<!-- hibernate相关的属性的注入 -->
<!-- 配置数据库类型 -->
<property name="database" value="MYSQL"/>
<!-- 正向工程 自动创建表 -->
<property name="generateDdl" value="true"/>
<!-- 显示执行的SQL -->
<property name="showSql" value="true"/>
</bean>
</property>
<!-- 扫描实体的包 -->
<property name="packagesToScan">
<list>
<value>com.zxw.pojo</value>
</list>
</property>
</bean>
<!-- 配置Hibernate的事务管理器 -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
Hibernate JPA
的
CRUD
操作
(注意与原生hibernate不同的地方:插入为
persist
,修改为
merge
,删除为
remove
,查询为
find
)
@PersistenceContext:该注解是为了从entityManagerFactory中获得entityManager进行注入。
(之前我们一般使用@autowired,这回不能使用,因为我们IOC容器中并没有entityManager,需要工厂来产生)
package com.zxw.dao.impl;
import com.zxw.dao.UsersDao;
import com.zxw.pojo.Users;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate5.HibernateTemplate;
import org.springframework.stereotype.Repository;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.util.List;
@Repository
public class UsersDaoImpl implements UsersDao {
@PersistenceContext(name="entityManagerFactory")
private EntityManager entityManager;
@Override
public void insertUsers(Users users) {
this.entityManager.persist(users);
}
@Override
public void updateUsers(Users users) {
this.entityManager.merge(users);
}
@Override
public void deleteUsers(Users users) {
Users u = this.selectUsersById(users.getUserid());
this.entityManager.remove(u);
}
@Override
public Users selectUsersById(Integer userid) {
return this.entityManager.find(Users.class,userid);
}
}
HQL查询
(entityManager.createQuery)
@Override
public List<Users> selectUserByName(String username) {
return this.entityManager.createQuery("from Users where username = :abc").setParameter("abc",username).getResultList();
}
SQL查询(注意查数和原生hibernate的SQL不同)
(entityManager.createNativeQuery)
@Override
public List<Users> selectUserByNameSQL(String username) {
//在Hibernate JPA中 如果通过?方式来帮顶参数,那么他的查数是从1开始的。而hibernate中是从0开始的。
return this.entityManager.createNativeQuery("select * from t_users where username = ?", Users.class).setParameter(1, username).getResultList();
}
QBC查询
@Override
public List<Users> selectUserByNameUseCriteria(String username) {
//创建查询条件
CriteriaBuilder builder = this.entityManager.getCriteriaBuilder();
//执行查询的Criteria对象
CriteriaQuery<Users> query = builder.createQuery(Users.class);
//获取要查询的实体类对象
Root<Users> root = query.from(Users.class);
//封装查询条件
Predicate cate = builder.equal(root.get("username"),username);
query.where(cate);
//执行查询
TypedQuery<Users> usersTypedQuery = this.entityManager.createQuery(query);
return usersTypedQuery.getResultList();
}