Jpa,Orm,Hibernate概述,面向对象的数据 *** 作初学

Jpa,Orm,Hibernate概述,面向对象的数据 *** 作初学,第1张

Jpa,Orm,Hibernate概述,面向对象的数据 *** 作初学

【1】ORM:就是建立实体类和数据库表之间的关系,从而达到 *** 作实体类就相当于 *** 作数据库表的目的,而不是调用sql语句。

【2】为什么要有ORM:

        当实现一个应用程序时(不使用O/R Mapping),我们可能会写特别多数据访问层的代码,从数据库保存数据、修改数据、删除数据,而这些代码都是重复的。而使用ORM则会大大减少重复性代码。对象关系映射(Object Relational Mapping,简称ORM),主要实现程序对象到关系数据库数据的映射。

【3】Jpa:

        JPA的全称是Java Persistence API, 即Java 持久化API,是SUN公司推出的一套基于ORM的规范,内部是由一系列的接口和抽象类构成。

        JPA通过JDK 5.0注解描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。

【4】Jpa和Hibernate关系

        

         JPA和Hibernate的关系就像JDBC和JDBC驱动的关系,JPA是规范,Hibernate除了作为ORM框架之外,它也是一种JPA实现。JPA怎么取代Hibernate呢?JDBC规范可以驱动底层数据库吗?答案是否定的,也就是说,如果使用JPA规范进行数据库 *** 作,底层需要hibernate作为其实现类完成数据持久化工作。

【5】搭建环境-jar包地址


		UTF-8
		5.0.7.Final
	

	
		
		
			junit
			junit
			4.12
			test
		

		
		
			org.hibernate
			hibernate-entitymanager
			${project.hibernate.version}
		

		
		
			org.hibernate
			hibernate-c3p0
			${project.hibernate.version}
		

		
		
			log4j
			log4j
			1.2.17
		

		
		
			mysql
			mysql-connector-java
			5.1.6
		
	

【6】写一个实体类,对应数据库,包括表和实体类的映射,属性和字段的映射,并且写好getter/setter和toString

        @entity:声明实体类
        @table:实体类和表得映射关系

        @Id:声明主键配置
        @Generatevalue:配置主键得生成策略
            strategy
            Identity:自增,数据库这个字段必须支持数据增长,例如mysql
            Sequence:序列,底层数据库必须支持序列,例如oracle
            Table:jpa提供得机制,通过一张数据库表得形式,帮助我们主键自增
            Auto:程序自动帮助我们选择主键生成
        @Column:配置属性和字段得名称
            name:数据库中字段得名字

        

【7】配置核心XML文件

        



    
    
        
        org.hibernate.jpa.HibernatePersistenceProvider
        
        
            
            
            
            
            
            
            
            
        
    

【8】进行数据库 *** 作测试

        *** 作步骤:

                 1.加载配置文件,创建工程对象,填的参数就是我们在XML文件中配置的persistence-unit

  EntityManagerFactory factory = Persistence.createEntityManagerFactory("myJpa");

                2.通过工厂获取实体管理器

EntityManager entityManager = factory.createEntityManager();


                3.获取事务对象,开启事务

 EntityTransaction tx = entityManager.getTransaction();
 tx.begin()


                4,增删改查 *** 作

        Customer customer=new Customer();
        customer.setCust_Name("ppc");
        customer.setCust_Industry("中国石油大学");
        customer.setCust_Level("1");
        customer.setCust_Address("北京");
        customer.setCust_phone("188888885");
        //保存
        entityManager.persist(customer);


                5.提交事务(或者回滚事务)

tx.commit();


                6.释放资源,管理器是资源,工厂也是资源,都要关闭

entityManager.close();
factory.close();

【9】entityManager中给我们提供的方法

        1.entityManager.persistb 保存数据

        2.entityManager.find 查询数据(这里把Factory的创建交给一个JpaUtil(自定义类)中的静态代码块处理了,防止资源浪费)

@Test
    public void testFind(){
        EntityManager entityManager = JpaUtil.getEntityManager();
        EntityTransaction transaction = entityManager.getTransaction();
        transaction.begin();
        //参数1:我们要 *** 作的类,参数2:我们要查询数据的主键
        Customer customer = entityManager.find(Customer.class, 1l);
        System.out.println(customer);
        transaction.commit();
        entityManager.close();

    }

        3.entityManager.getReference

           和find方法的区别就是,getReference是延迟查询,什么时候用到我们查询出的customer的时候,什么时候执行,如果我们没有用到下面的customer这个查询到的类,getReference就不会执行。

@Test
    public void testReference(){
        EntityManager entityManager = JpaUtil.getEntityManager();
        EntityTransaction transaction = entityManager.getTransaction();
        transaction.begin();
        //参数1:我们要 *** 作的类,参数2:我们要查询数据的主键
        Customer customer = entityManager.getReference(Customer.class, 1l);
        System.out.println(customer);
        transaction.commit();
        entityManager.close();

    }

        4.entityManager.remove删除

           原理是先查询,后删除

 @Test
    public void testDel(){
        EntityManager entityManager = JpaUtil.getEntityManager();
        EntityTransaction transaction = entityManager.getTransaction();
        transaction.begin();
        //删除之前需要现根据id查询客户,然后才能删除
        Customer customer = entityManager.find(Customer.class, 2l);
        entityManager.remove(customer);
        transaction.commit();
        entityManager.close();

    }

        5.entityManager.merge更新

           原理:先查询后更新,和删除的原理一样。

 @Test
    public void upDate(){
        EntityManager entityManager = JpaUtil.getEntityManager();
        EntityTransaction transaction = entityManager.getTransaction();
        transaction.begin();
        //获取我们要修改的数据
        Customer customer = entityManager.find(Customer.class, 1l);
        customer.setCust_Source("一起加油");
        entityManager.merge(customer);
        transaction.commit();
        entityManager.close();
    }

【9】以上这些都是EntityManager给我们提供的方法

         显然是不够用的,所以我们需要学习另一种能 *** 作数据库的语言:jpql,也是用来 *** 作对象的

         同理我们还是需要利用EntityManager来创建出事务的管理,唯一不同的就是我们不用EntityManager的内部方法,我们需要自己写jpql语句来 *** 作实体类。

         注意:jpql的查询语句是 from 实体类的全限定类名,不过前面类所在的包可以省略

         例如:from cn.itcast.domain.Customer-->from Customer

         sql语句是 *** 作数据库中的表,而jpql是 *** 作我们的实体类,

         sql语句的字段是数据库路中的字段,而jpql是我们实体类中的私有属性名,别写错了,其他的和sql语句大同小异。

         spql的查询使用entityManager.createQuery(String jpql)

  
    @Test
    public void testFindAll(){
        EntityManager entityManager = JpaUtil.getEntityManager();
        EntityTransaction transaction = entityManager.getTransaction();
        transaction.begin();
        //利用jpql查询所有
        String jpql="from cn.itcast.domain.Customer";
        Query query = entityManager.createQuery(jpql);
        //发送查询,并封装结果集
        List resultList = query.getResultList();
        resultList.forEach(a-> System.out.println(a));
        transaction.commit();
        entityManager.close();
    }



    
    @Test
    public void testFindAllByOrder(){
        EntityManager entityManager = JpaUtil.getEntityManager();
        EntityTransaction transaction = entityManager.getTransaction();
        transaction.begin();
        //利用jpql查询所有
        String jpql="from  cn.itcast.domain.Customer order by cust_Id desc";
        Query query = entityManager.createQuery(jpql);
        //发送查询,并封装结果集
        List resultList = query.getResultList();
        resultList.forEach(a-> System.out.println(a));
        transaction.commit();
        entityManager.close();
    }



    
    @Test
    public void testCount(){
        EntityManager entityManager = JpaUtil.getEntityManager();
        EntityTransaction transaction = entityManager.getTransaction();
        transaction.begin();
        //利用jpql查询所有
        String jpql="select count(cust_Id) from Customer";
        Query query = entityManager.createQuery(jpql);
        //发送查询,并封装结果集
        Object singleResult = query.getSingleResult();
        System.out.println(singleResult);
        transaction.commit();
        entityManager.close();
    }



    
    @Test
    public void testFindByPage(){
        EntityManager entityManager = JpaUtil.getEntityManager();
        EntityTransaction transaction = entityManager.getTransaction();
        transaction.begin();
        //利用jpql查询所有
        String jpql="from Customer";
        Query query = entityManager.createQuery(jpql);
        //进行分页
        query.setFirstResult(0);//从那开始
        query.setMaxResults(1);//每页几个数据
        //发送查询,并封装结果集
        List resultList = query.getResultList();
        resultList.forEach(a-> System.out.println(a));
        transaction.commit();
        entityManager.close();
    }



    
    @Test
    public void testCondition(){
        EntityManager entityManager = JpaUtil.getEntityManager();
        EntityTransaction transaction = entityManager.getTransaction();
        transaction.begin();
        //利用jpql查询所有
        String jpql="from Customer where cust_Name like ?";
        Query query = entityManager.createQuery(jpql);
        //对参数赋值,第一个参数是占位符的索引位置,从1开始,第二个参数,取值
        query.setParameter(1,"马%");
        //发送查询,并封装结果集
        List resultList = query.getResultList();
        resultList.forEach(a-> System.out.println(a));
        transaction.commit();
        entityManager.close();
    }

        

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5677048.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存