Spring Data学习

  • 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

配置

  1. 配置读取properties文件的工具类
  2. 配置c3p0数据库连接池
  3. 配置hibernate的sessionFactory()
  4. 配置hibernateTemplate对象 
  5. 配置hibernate的事务管理器
  6. 配置开启注解事务处理
  7. 配置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);
    }
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值