码迷,mamicode.com
首页 > 编程语言 > 详细

springdata-jpa学习

时间:2019-09-29 09:59:37      阅读:108      评论:0      收藏:0      [点我收藏+]

标签:查询   sql查询语句   des   idt   加载   自动   mit   解决   引入   

1.0 jdbc操作数据库回顾

  技术图片

 

2.0 orm思想的引入

  技术图片

 

   实现orm思想的框架有mybatis(半orm)与hibernate,主要就是建立实体类与表的关系,建立实体类属性与表字段的关系

3.0 jpa规范的引入

  由于出现了很多像hibernate这样的orm框架,比较混乱,于是sun公司提出了jpa规范,内部时接口和抽象类

  

技术图片

4.0 jpa基本操作

 4.1工程搭建

    1.创建maven工程导入坐标
    2.需要配置jpa的核心配置文件
       *位置:配置到类路径下的一个叫做 META-INF 的文件夹下
       *命名:persistence.xml
    3.编写客户的实体类
    4.配置实体类和表,类中属性和表中字段的映射关系

 4.2 操作步骤

  1.加载配置文件创建实体管理器工厂  

  2.根据实体管理器工厂,创建实体管理器 

    3.创建事务对象,开启事务

    4.增删改查操作

    5.提交事务

    6.释放资源

 4.3基本操作

 @Test
    public void testSave(){
        // 加载配置文件创建实体管理器工厂
        EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("myJpa");
        // 通过实体管理器工厂获取实体管理器
        EntityManager entityManager = entityManagerFactory.createEntityManager();
        // 获取事务,开启事务
        EntityTransaction tx = entityManager.getTransaction();
        tx.begin();
        // 完成jpa增删改查操作
        Customer customer = new Customer();
        customer.setCustName("传智播客");
        customer.setCustIndustry("教育");
        // 实体管理器保存对象
        entityManager.persist(customer);
        // 事务提交
        tx.commit();
        // 释放资源
        entityManager.close();
        entityManagerFactory.close();
    }

  

/**
     * 根据id查询
     */
    @Test
    public void testFind(){
        EntityManager entityManager = JpaUtils.getEntityManager();
        EntityTransaction tx = entityManager.getTransaction();
        tx.begin();
        Customer customer = entityManager.find(Customer.class, 1L);
        System.out.println(customer);
        tx.commit();
        entityManager.close();
    }

  

    /**
     * 根据id查询(延迟加载)
     */
    @Test
    public void testGetReference(){
        EntityManager entityManager = JpaUtils.getEntityManager();
        EntityTransaction tx = entityManager.getTransaction();
        tx.begin();
        Customer customer = entityManager.getReference(Customer.class,1L);
        System.out.println(customer);
        tx.commit();
        entityManager.close();
    }

  

   /**
     * 删除客户的案例
     */
    @Test
    public void testDelete(){
        EntityManager entityManager = JpaUtils.getEntityManager();
        EntityTransaction tx = entityManager.getTransaction();
        tx.begin();
//        Customer customer = new Customer();
//        customer.setCustId(2L);
        Customer customer = entityManager.find(Customer.class, 1L);
        entityManager.remove(customer);
        tx.commit();
        entityManager.close();
    }

  

    /**
     * 更新客户的案例
     */
    @Test
    public void testUpdate(){
        EntityManager entityManager = JpaUtils.getEntityManager();
        EntityTransaction tx = entityManager.getTransaction();
        tx.begin();
        Customer customer = entityManager.find(Customer.class, 2L);
        customer.setCustIndustry("it教育");
        entityManager.merge(customer);
        tx.commit();
        entityManager.close();
    }

 4.4 jpql操作

 

   /**
     * 查询全部
     */
    @Test
    public void findAll(){
        EntityManager entityManager = JpaUtils.getEntityManager();
        EntityTransaction tx = entityManager.getTransaction();
        tx.begin();
        Query query = entityManager.createQuery("from Customer ");
        List list = query.getResultList();
        list.stream().forEach(customer-> System.out.println(customer));
        tx.commit();
        entityManager.close();
    }

  

   /**
     * 结果排序
     */
    @Test
    public void findOrder(){
        EntityManager entityManager = JpaUtils.getEntityManager();
        EntityTransaction tx = entityManager.getTransaction();
        tx.begin();
        Query query = entityManager.createQuery("from Customer order by custId desc");
        List list = query.getResultList();
        list.stream().forEach(customer-> System.out.println(customer));
        tx.commit();
        entityManager.close();
    }

  

     /**
     * 结果统计
     */
    @Test
    public void findTotal(){
        EntityManager entityManager = JpaUtils.getEntityManager();
        EntityTransaction tx = entityManager.getTransaction();
        tx.begin();
        Query query = entityManager.createQuery("select count(custId) from Customer");
        Object result = query.getSingleResult();
        System.out.println(result);
        tx.commit();
        entityManager.close();
    }

  

    /**
     * 分页查询
     */
    @Test
    public void findPaged(){
        EntityManager entityManager = JpaUtils.getEntityManager();
        EntityTransaction tx = entityManager.getTransaction();
        tx.begin();
        Query query = entityManager.createQuery("from Customer");
        query.setFirstResult(0);
        query.setMaxResults(2);
        List list = query.getResultList();
        list.stream().forEach(customer-> System.out.println(customer));
        tx.commit();
        entityManager.close();
    }

  

    /**
     * 条件查询
     */
    @Test
    public void findCondition(){
        EntityManager entityManager = JpaUtils.getEntityManager();
        EntityTransaction tx = entityManager.getTransaction();
        tx.begin();
        Query query = entityManager.createQuery("from Customer where custName like ?");
        query.setParameter(1,"传智%");
        List list = query.getResultList();
        list.stream().forEach(customer-> System.out.println(customer));
        tx.commit();
        entityManager.close();
    }

 

 

5.0 springdata-jpa 

  Spring Data JPA 是 Spring 基于 ORM 框架、JPA 规范的基础上封装的一套JPA应用框架,可使开发者用极简的代码即可实现对数据库的访问和操作。

Spring Data JPA 让我们解脱了DAO层的操作,基本上所有CRUD都可以依赖于它来实现,在实际的工作工程中,推荐使用Spring Data JPA + ORM(如:hibernate)

完成操作,这样在切换不同的ORM框架时提供了极大的方便,同时也使数据库层操作更加简单,方便解耦。使用了SpringDataJpa,我们的dao层中只需要写接口,

就自动具有了增删改查、分页查询等方法

  技术图片

   5.1 基本增删改查

    i.搭建环境
      创建工程导入坐标
      配置spring的配置文件(配置spring Data jpa的整合)
      编写实体类(Customer),使用jpa注解配置映射关系
     ii.编写一个符合springDataJpa的dao层接口
      * 只需要编写dao层接口,不需要编写dao层接口的实现类
      * dao层接口规范
       1.需要继承两个接口(JpaRepository,JpaSpecificationExecutor)
       2.需要提供响应的泛型

      findOne(id) :根据id查询
      save(customer):保存或者更新(依据:传递的实体类对象中,是否包含id属性)
      delete(id) :根据id删除
      findAll() : 查询全部

      技术图片

 

 

  5.2 原理分析

     1.通过JdkDynamicAopProxy的invoke方法创建了一个动态代理对象
     2.SimpleJpaRepository当中封装了JPA的操作(借助JPA的api完成数据库的CRUD)
     3.通过hibernate完成数据库操作(封装了jdbc)

  技术图片

  5.3 jpql方法    

    使用Spring Data JPA提供的查询方法已经可以解决大部分的应用场景,但是对于某些业务来说,我们还需要灵活的构造查询条件,这时就可以使用@Query注解,结合JPQL的语句方式完成查询

  5.4 sql查询

  1.特有的查询:需要在dao接口上配置方法
     2.在新添加的方法上,使用注解的形式配置sql查询语句
     3.注解 : @Query
        value :jpql语句 | sql语句
        nativeQuery :false(使用jpql查询) | true(使用本地查询:sql查询)
       是否使用本地查询

  5.5方法名称规则查询

  

springdata-jpa学习

标签:查询   sql查询语句   des   idt   加载   自动   mit   解决   引入   

原文地址:https://www.cnblogs.com/helloworldmybokeyuan/p/11601196.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!