- Hibernate - 开放源码的对象关系映射框架,对jdbc进行了非常轻量级的对象封装,将pojo与数据库表建立映射关系,是一个全自动的orm框架。
- JPA 标准- Java持久层API,JDK5.0注解或XML描述对象-关系表的映射关系。简化现有JavaSE应用开发工作。(一套规范)
- Hibernate JPA - Hibernate在3.2之后根据JPA规范了一套操作持久层的API。
- Spring Data - 平台
- Spring Data JPA - 基于JPA标准的一套持久层框架。底层默认使用hibernate做JPA实现。
- Spring Data Redis - 提供对Redis操作的框架。
一、Hibernate
配置
- 配置读取properties文件的工具类
- 配置c3p0数据库连接池
- 配置hibernate的sessionFactory()
- 配置hibernateTemplate对象
- 配置hibernate的事务管理器
- 配置开启注解事务处理
- 配置springIOC的注解扫描
创建实体类 - implements Serializabale @Entity @Table(name="t_users")
@Id @GeneratedValue(strategy=GenerationType.IDENTITY) //自增长 @Column(name="userid")
Dao - 注入对象HibernateTemplate save update delete get
Test Junit测试- @RunWith(SpringJUnite4ClassRunner.class) @ContextConfigruation("classpath:applicationContext.xml")
@Test @Transactional //在测试类中对于事务提交方式默认的是回滚。 @Rollback(false) 取消自动回滚
Session session = hibernateTemplate.getSessionFactory().getCurrentSession();
- getCurrentSession : 当前session必须要有事务边界,且只能处理唯一一个事务。当事务提交或者回滚后session失效
- openSession : 每次都会打开一个新的session,每次使用多次,则获得的是不同session对象。使用完毕需要手动close
HQL查询- query = session.createQuery("from Users where username = : abc"); query.setString("abc",username).list();
SQL - session.createSQLQuery("select * from t_user where username = ?").addEntity(Users.class).setString(0,username).list();
QBC查询
Criteria c= session.createCriteria(Users.class);
c.add(Restrictions.eq("username",username)).list();
二、Spring整合Hibernate JPA -
导入jar包;修改配置文件EntityManagerFactory
注入EntityManager对象, @PersistenceContext(name="entityManagerFactory") //从工厂中取一个对象
this.entityManager.persist(user); 添加 .merge(user) 更新 .find(user.class,userid) 查询 删除需要先查询出对象 .remove(user); 删除
HQL - entityManager.createQuery("from Users where username = :abc").setParameter("abc",username).getResultList();
SQL - entityManager.createNativeQuery("select * from t_users where username= ?",User.class).setParameter(1,username).getResultList();
//在Hibernate JPA中如果通过?方式来传参数,是从1开始,而Hibernate中从0开始。
QBC - CriteriaBuilder对象,创建一个CriteriaQuery,创建查询条件。CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery对象,执行查询的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);
执行查询。TypeQuery<Users> typeQuery = this.entityManager.createQuery(query); return typeQuery.getResultList();
三、Spring Data JPA(重点)
Spring Data 项目下的子模块,提供了一套基于JPA标准操作数据库的简化方案,底层默认依赖Hibernate JPA实现。
技术特点 - 只需定义接口并集成Spring Data JPA 中所提供的接口就可以了,不需要编写接口实现类。
导入 spring-data-commons spring-data-jpa slf4j日志 架包。
xml中添加命名空间jpa,Spring data JPA的配置
编写Dao - extends JpaRepository<Users,Integer> 对象,主键类型
底层原理 - 接口继承结构 JpaRepository (对父接口中的返回值做适配处理) extends pagingAndSortingRepository (sort,page排序,分页方法) extend CrudRepository (save、findall、findOne、delete...) extend Repository (无方法,标识接口)
- 运行原理 注入的dao接口是基于JDK的动态代理方式创建的SimpleJpaRepository的对象,SimpleJpaRepository接口继承了JpaRepository和JpaSpecificationExecutor接口。(要求dao接口继承Repository接口)
Repository接口 是Spring Data JPA中为我们提供的所有接口中的顶层接口
Repository提供了两种查询方式的支持 - 1.基于方法名称命名规则查询 2.基于@Query注解查询
1. 规则,findBy(关键字)+属性名称(属性名称的首字母大写)+查询条件(首字母大写)
2.基于@Query 注解查询
2.1 通过JPQL语句查询
JPQL : 通过Hibernate的HQL演变过来的,和HQL语法及其相似。
@Query([value=]"from Users where username = ? ")
2.2 通过SQL语句查询
@Query(value="select * from t_users where username = ?",nativeQuery=true)
nativeQuery:默认的是false,表示不开启sql查询,是否对value中的语句做转义
2.3 更新
@Query("update Users set userage = ? where userid=?")
@Modifying //当前语句是一个更新语句 (如果是测试类,需要加Rollback=false)
CrudRepository 接口
save(), findOne(), findAll() 需要强转类型, delete(),更新也使用save方法
PagingAndSortingRepository接口
1.分页 Pageable pageable = new PageRequest(page,size) page<Users> p = dao.findAll(Pageable)
2.排序 单列 Sort sort = new Sort(direction,properties); Sort对象封装了排序规则以及指定的排序字段(对象属性来表示)
direction :排序规则 properties : 指定做排序的属性。(Direction.DESC,"userid")
多列 Order order1 = new Order(Direction.DESC,"userage"); Order order2 = ... Sort sort = new Sort(order1,order2);
JpaRepository接口
对返回值做适配,是我们开发时使用最多的接口,可以是的我们开发时更方便使用这些方法。
JpaSpecificationExecutor接口
完成多条件的查询,并实现分页,排序。 不能单独使用,需要配合jpa中的其他接口一起使用(因为这个接口没有继承Repository接口,dao接口无法注入),底层使用hibernate jpa 的QBC的查询方式。
单条件查询 - Specification<users> spec = new Specification<Users>(){
匿名内部类 Predicate定义了查询条件 toPredicate(root根对象封装了查询条件,query定义一个基本的查询一般不使用,cb创建一个查询的条件);
} findAll(spec);
多条件查询 - 方式1.
方式2 .
分页 findAll(spec,pageable) 排序(spec,sort) 分页+排序 将排序封装在分页对象中PageRequest(2,2,sort)
自定义Repository接口
关联关系映射
1.一对一关联
创建
@OneToOne
@JoinColumn(name="roles_id") 就是维护一个外键
private Roles roles;
@OneToOne(mappedBy="roles")
private Users users;
操作
@OneToOne(cascade=CascadeType.PERSIST) 级联操作
public void test1(){
//创建角色
Roles roles = new Roles();
roles.setRolename("管理员");
//创建用户
Users users = new Users();
users.setUserage(30);
users.setUsername("赵小刚");
//建立关系
users.setRoles(roles);
roles.setUsers(users);
//保存数据
this.usersDao.save(users);
}